Added host port inputbox to host menu

This commit is contained in:
MysterD 2021-07-12 20:06:51 -07:00
parent 46f905f4a3
commit 3395ba26f4
6 changed files with 106 additions and 15 deletions

View file

@ -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) {

View file

@ -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;

View file

@ -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) {

View file

@ -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);

View file

@ -1,12 +1,58 @@
#include <stdio.h>
#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;
}
}

View file

@ -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) {