From 3395ba26f498e07bd602096ea2b9ecaa72935365 Mon Sep 17 00:00:00 2001 From: MysterD Date: Mon, 12 Jul 2021 20:06:51 -0700 Subject: [PATCH] Added host port inputbox to host menu --- src/pc/djui/djui_base.c | 3 ++ src/pc/djui/djui_inputbox.c | 11 ++-- src/pc/djui/djui_interactable.c | 6 +++ src/pc/djui/djui_interactable.h | 4 ++ src/pc/djui/djui_panel_host.c | 95 +++++++++++++++++++++++++++++---- src/pc/djui/djui_panel_join.c | 2 +- 6 files changed, 106 insertions(+), 15 deletions(-) diff --git a/src/pc/djui/djui_base.c b/src/pc/djui/djui_base.c index 361aaf92d..cb6413ee9 100644 --- a/src/pc/djui/djui_base.c +++ b/src/pc/djui/djui_base.c @@ -11,6 +11,9 @@ void djui_base_set_visible(struct DjuiBase* base, bool visible) { void djui_base_set_enabled(struct DjuiBase* base, bool enabled) { base->enabled = enabled; + if (base->interactable != NULL && base->interactable->on_enabled_change != NULL) { + base->interactable->on_enabled_change(base); + } } void djui_base_set_location(struct DjuiBase* base, f32 x, f32 y) { diff --git a/src/pc/djui/djui_inputbox.c b/src/pc/djui/djui_inputbox.c index 76a62a18b..36d214859 100644 --- a/src/pc/djui/djui_inputbox.c +++ b/src/pc/djui/djui_inputbox.c @@ -44,8 +44,13 @@ void djui_inputbox_hook_enter_press(struct DjuiInputbox* inputbox, void (*on_ent static void djui_inputbox_set_default_style(struct DjuiBase* base) { struct DjuiInputbox* inputbox = (struct DjuiInputbox*)base; - djui_base_set_border_color(base, 150, 150, 150, 255); - djui_base_set_color(&inputbox->base, 240, 240, 240, 255); + if (inputbox->base.enabled) { + djui_base_set_border_color(base, 150, 150, 150, 255); + djui_base_set_color(&inputbox->base, 240, 240, 240, 255); + } else { + djui_base_set_border_color(base, 90, 90, 90, 255); + djui_base_set_color(&inputbox->base, 140, 140, 140, 255); + } } static void djui_inputbox_on_hover(struct DjuiBase* base) { @@ -521,7 +526,7 @@ struct DjuiInputbox* djui_inputbox_create(struct DjuiBase* parent, u16 bufferSiz djui_interactable_hook_key(base, djui_inputbox_on_key_down, djui_inputbox_on_key_up); djui_interactable_hook_focus(base, djui_inputbox_on_focus_begin, NULL, djui_inputbox_on_focus_end); djui_interactable_hook_text_input(base, djui_inputbox_on_text_input); - + djui_interactable_hook_enabled_change(base, djui_inputbox_set_default_style); djui_inputbox_set_default_style(base); return inputbox; diff --git a/src/pc/djui/djui_interactable.c b/src/pc/djui/djui_interactable.c index 525a620a8..02774fc9b 100644 --- a/src/pc/djui/djui_interactable.c +++ b/src/pc/djui/djui_interactable.c @@ -395,6 +395,12 @@ void djui_interactable_hook_text_input(struct DjuiBase *base, interactable->on_text_input = on_text_input; } +void djui_interactable_hook_enabled_change(struct DjuiBase *base, + void (*on_enabled_change)(struct DjuiBase*)) { + struct DjuiInteractable *interactable = base->interactable; + interactable->on_enabled_change = on_enabled_change; +} + void djui_interactable_create(struct DjuiBase* base) { if (base->interactable != NULL) { diff --git a/src/pc/djui/djui_interactable.h b/src/pc/djui/djui_interactable.h index 32c59d7df..e16508b19 100644 --- a/src/pc/djui/djui_interactable.h +++ b/src/pc/djui/djui_interactable.h @@ -24,6 +24,7 @@ struct DjuiInteractable { bool (*on_key_down)(struct DjuiBase*, int scancode); void (*on_key_up)(struct DjuiBase*, int scancode); void (*on_text_input)(struct DjuiBase*, char* text); + void (*on_enabled_change)(struct DjuiBase*); }; extern bool gInteractableOverridePad; @@ -69,4 +70,7 @@ void djui_interactable_hook_key(struct DjuiBase* base, void djui_interactable_hook_text_input(struct DjuiBase* base, void (*on_text_input)(struct DjuiBase*, char*)); +void djui_interactable_hook_enabled_change(struct DjuiBase *base, + void (*on_enabled_change)(struct DjuiBase*)); + void djui_interactable_create(struct DjuiBase* base); diff --git a/src/pc/djui/djui_panel_host.c b/src/pc/djui/djui_panel_host.c index 145d692d8..5b6044054 100644 --- a/src/pc/djui/djui_panel_host.c +++ b/src/pc/djui/djui_panel_host.c @@ -1,12 +1,58 @@ +#include #include "djui.h" -#include "src/pc/utils/misc.h" -#include "src/pc/configfile.h" +#include "pc/network/network.h" +#include "pc/utils/misc.h" +#include "pc/configfile.h" + +#ifdef DISCORD_SDK +#define DJUI_HOST_NS_IS_SOCKET (configNetworkSystem == 1) +#else +#define DJUI_HOST_NS_IS_SOCKET (true) +#endif + +struct DjuiInputbox* sInputboxPort = NULL; + +static void djui_panel_host_network_system_change(struct DjuiBase* base) { + struct DjuiSelectionbox* selectionbox = (struct DjuiSelectionbox*)base; + djui_base_set_enabled(&sInputboxPort->base, DJUI_HOST_NS_IS_SOCKET); +} + +static bool djui_panel_host_port_valid(void) { + char* buffer = sInputboxPort->buffer; + int port = 0; + while (*buffer != '\0') { + if (*buffer < '0' || *buffer > '9') { return false; } + port *= 10; + port += (*buffer - '0'); + buffer++; + } + return port >= 1024 && port <= 65535; +} + +static void djui_panel_host_port_text_change(struct DjuiBase* caller) { + struct DjuiInputbox* inputbox1 = (struct DjuiInputbox*)caller; + if (djui_panel_host_port_valid()) { + djui_inputbox_set_text_color(inputbox1, 0, 0, 0, 255); + } else { + djui_inputbox_set_text_color(inputbox1, 255, 0, 0, 255); + } +} + +static void djui_panel_host_do_host(struct DjuiBase* caller) { + if (!djui_panel_host_port_valid()) { + djui_interactable_set_input_focus(&sInputboxPort->base); + djui_inputbox_select_all(sInputboxPort); + return; + } + configHostPort = atoi(sInputboxPort->buffer); + djui_panel_host_message_create(caller); +} void djui_panel_host_create(struct DjuiBase* caller) { #ifdef DISCORD_SDK - f32 bodyHeight = 32 * 4 + 64 * 2 + 16 * 6; + f32 bodyHeight = 32 * 5 + 64 * 2 + 16 * 7; #else - f32 bodyHeight = 32 * 3 + 64 * 2 + 16 * 5; + f32 bodyHeight = 32 * 4 + 64 * 2 + 16 * 6; #endif struct DjuiBase* defaultBase = NULL; @@ -18,7 +64,34 @@ void djui_panel_host_create(struct DjuiBase* caller) { struct DjuiSelectionbox* selectionbox1 = djui_selectionbox_create(&body->base, "Network system", nChoices, 2, &configNetworkSystem); djui_base_set_size_type(&selectionbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&selectionbox1->base, 1.0f, 32); + djui_interactable_hook_value_change(&selectionbox1->base, djui_panel_host_network_system_change); #endif + + struct DjuiRect* rect1 = djui_rect_create(&body->base); + djui_base_set_size_type(&rect1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&rect1->base, 1.0f, 32); + djui_base_set_color(&rect1->base, 0, 0, 0, 0); + { + struct DjuiText* text1 = djui_text_create(&rect1->base, "Port"); + djui_base_set_size_type(&text1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_color(&text1->base, 200, 200, 200, 255); + djui_base_set_size(&text1->base, 0.485f, 64); + djui_base_set_alignment(&text1->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_TOP); + + struct DjuiInputbox* inputbox1 = djui_inputbox_create(&rect1->base, 32); + djui_base_set_size_type(&inputbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&inputbox1->base, 0.5f, 32); + djui_base_set_alignment(&inputbox1->base, DJUI_HALIGN_RIGHT, DJUI_VALIGN_TOP); + char portString[32] = { 0 }; + snprintf(portString, 32, "%d", configHostPort); + djui_inputbox_set_text(inputbox1, portString); + djui_interactable_hook_value_change(&inputbox1->base, djui_panel_host_port_text_change); +#ifdef DISCORD_SDK + djui_base_set_enabled(&inputbox1->base, DJUI_HOST_NS_IS_SOCKET); +#endif + sInputboxPort = inputbox1; + } + char* iChoices[3] = { "Non-solid", "Solid", "Friendly Fire" }; struct DjuiSelectionbox* selectionbox2 = djui_selectionbox_create(&body->base, "Player interaction", iChoices, 3, &configFiltering); djui_base_set_size_type(&selectionbox2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); @@ -36,23 +109,23 @@ void djui_panel_host_create(struct DjuiBase* caller) { djui_base_set_size_type(&checkbox3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&checkbox3->base, 1.0f, 32); - struct DjuiRect* rect1 = djui_rect_create(&body->base); - djui_base_set_size_type(&rect1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&rect1->base, 1.0f, 64); - djui_base_set_color(&rect1->base, 0, 0, 0, 0); + struct DjuiRect* rect2 = djui_rect_create(&body->base); + djui_base_set_size_type(&rect2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&rect2->base, 1.0f, 64); + djui_base_set_color(&rect2->base, 0, 0, 0, 0); { - struct DjuiButton* button1 = djui_button_create(&rect1->base, "Back"); + struct DjuiButton* button1 = djui_button_create(&rect2->base, "Back"); djui_base_set_size_type(&button1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&button1->base, 0.485f, 64); djui_base_set_alignment(&button1->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_TOP); djui_button_set_style(button1, 1); djui_interactable_hook_click(&button1->base, djui_panel_menu_back); - struct DjuiButton* button2 = djui_button_create(&rect1->base, "Host"); + struct DjuiButton* button2 = djui_button_create(&rect2->base, "Host"); djui_base_set_size_type(&button2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&button2->base, 0.485f, 64); djui_base_set_alignment(&button2->base, DJUI_HALIGN_RIGHT, DJUI_VALIGN_TOP); - djui_interactable_hook_click(&button2->base, djui_panel_host_message_create); + djui_interactable_hook_click(&button2->base, djui_panel_host_do_host); defaultBase = &button2->base; } } diff --git a/src/pc/djui/djui_panel_join.c b/src/pc/djui/djui_panel_join.c index 1dbc8f1dd..c90b175e1 100644 --- a/src/pc/djui/djui_panel_join.c +++ b/src/pc/djui/djui_panel_join.c @@ -67,7 +67,7 @@ static bool djui_panel_join_ip_parse_port(char** msg) { } } - return num >= 1 && num <= 65535; + return num >= 1024 && num <= 65535; } static bool djui_panel_join_ip_valid(char* buffer) {