mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
Added host port inputbox to host menu
This commit is contained in:
parent
46f905f4a3
commit
3395ba26f4
6 changed files with 106 additions and 15 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue