From 8b7ab3c35ca40966ecf7f43eb923147fbd5907ad Mon Sep 17 00:00:00 2001 From: MysterD Date: Mon, 28 Jun 2021 00:04:48 -0700 Subject: [PATCH] DJUI: Added host menu Added host message menu Refactored how panel menus are constructed Adjusted normal font's line height Adjusted how text boxes detect max lines --- build-windows-visual-studio/sm64ex.vcxproj | 6 + .../sm64ex.vcxproj.filters | 18 +++ src/pc/configfile.c | 4 +- src/pc/configfile.h | 2 +- src/pc/djui/djui.h | 3 + src/pc/djui/djui_checkbox.c | 2 +- src/pc/djui/djui_font.c | 2 +- src/pc/djui/djui_panel.h | 3 + src/pc/djui/djui_panel_camera.c | 105 +++++++----------- src/pc/djui/djui_panel_controls.c | 93 ++++++---------- src/pc/djui/djui_panel_display.c | 75 +++++-------- src/pc/djui/djui_panel_host.c | 60 ++++++++++ src/pc/djui/djui_panel_host.h | 4 + src/pc/djui/djui_panel_host_message.c | 76 +++++++++++++ src/pc/djui/djui_panel_host_message.h | 4 + src/pc/djui/djui_panel_main.c | 41 ++----- src/pc/djui/djui_panel_menu.c | 36 ++++++ src/pc/djui/djui_panel_menu.h | 5 + src/pc/djui/djui_panel_options.c | 82 +++++--------- src/pc/djui/djui_panel_quit.c | 63 ++++------- src/pc/djui/djui_panel_sound.c | 69 ++++-------- src/pc/djui/djui_text.c | 4 +- src/pc/djui/djui_three_panel.c | 36 +++++- src/pc/djui/djui_three_panel.h | 4 + 24 files changed, 445 insertions(+), 352 deletions(-) create mode 100644 src/pc/djui/djui_panel_host.c create mode 100644 src/pc/djui/djui_panel_host.h create mode 100644 src/pc/djui/djui_panel_host_message.c create mode 100644 src/pc/djui/djui_panel_host_message.h create mode 100644 src/pc/djui/djui_panel_menu.c create mode 100644 src/pc/djui/djui_panel_menu.h diff --git a/build-windows-visual-studio/sm64ex.vcxproj b/build-windows-visual-studio/sm64ex.vcxproj index 71f2bf18e..b4a724eab 100644 --- a/build-windows-visual-studio/sm64ex.vcxproj +++ b/build-windows-visual-studio/sm64ex.vcxproj @@ -3947,6 +3947,9 @@ + + + @@ -4385,6 +4388,9 @@ + + + diff --git a/build-windows-visual-studio/sm64ex.vcxproj.filters b/build-windows-visual-studio/sm64ex.vcxproj.filters index 3e25342b6..9c3a48da6 100644 --- a/build-windows-visual-studio/sm64ex.vcxproj.filters +++ b/build-windows-visual-studio/sm64ex.vcxproj.filters @@ -15240,6 +15240,15 @@ Source Files\src\pc\djui\component\compound + + Source Files\src\pc\djui\panel + + + Source Files\src\pc\djui\panel + + + Source Files\src\pc\djui\panel + @@ -16300,5 +16309,14 @@ Source Files\src\pc\djui\component\compound + + Source Files\src\pc\djui\panel + + + Source Files\src\pc\djui\panel + + + Source Files\src\pc\djui\panel + \ No newline at end of file diff --git a/src/pc/configfile.c b/src/pc/configfile.c index 853eb1c4b..a6428abb6 100644 --- a/src/pc/configfile.c +++ b/src/pc/configfile.c @@ -104,7 +104,7 @@ unsigned int configHostPort = DEFAULT_PORT; unsigned int configHostSaveSlot = 1; unsigned int configPlayerInteraction = 1; unsigned int configPlayerKnockbackStrength = 25; -unsigned int configStayInLevelAfterStar = 0; +bool configStayInLevelAfterStar = 0; unsigned int configNetworkSystem = 0; bool configLuigiSounds = true; @@ -164,7 +164,7 @@ static const struct ConfigOption options[] = { {.name = "coop_host_save_slot", .type = CONFIG_TYPE_UINT , .uintValue = &configHostSaveSlot}, {.name = "coop_player_interaction", .type = CONFIG_TYPE_UINT , .uintValue = &configPlayerInteraction}, {.name = "coop_player_knockback_strength", .type = CONFIG_TYPE_UINT , .uintValue = &configPlayerKnockbackStrength}, - {.name = "coop_stay_in_level_after_star", .type = CONFIG_TYPE_UINT , .uintValue = &configStayInLevelAfterStar}, + {.name = "coop_stay_in_level_after_star", .type = CONFIG_TYPE_UINT , .boolValue = &configStayInLevelAfterStar}, {.name = "coop_network_system", .type = CONFIG_TYPE_UINT , .uintValue = &configNetworkSystem}, {.name = "coop_luigi_sounds", .type = CONFIG_TYPE_BOOL , .boolValue = &configLuigiSounds}, }; diff --git a/src/pc/configfile.h b/src/pc/configfile.h index 610becd4a..91fbc60a8 100644 --- a/src/pc/configfile.h +++ b/src/pc/configfile.h @@ -70,7 +70,7 @@ extern unsigned int configHostPort; extern unsigned int configHostSaveSlot; extern unsigned int configPlayerInteraction; extern unsigned int configPlayerKnockbackStrength; -extern unsigned int configStayInLevelAfterStar; +extern bool configStayInLevelAfterStar; extern unsigned int configNetworkSystem; extern bool configLuigiSounds; diff --git a/src/pc/djui/djui.h b/src/pc/djui/djui.h index bab36d385..8c3e26f66 100644 --- a/src/pc/djui/djui.h +++ b/src/pc/djui/djui.h @@ -28,8 +28,11 @@ #include "djui_bind.h" #include "djui_panel.h" +#include "djui_panel_menu.h" #include "djui_panel_debug.h" #include "djui_panel_main.h" +#include "djui_panel_host.h" +#include "djui_panel_host_message.h" #include "djui_panel_options.h" #include "djui_panel_camera.h" #include "djui_panel_controls.h" diff --git a/src/pc/djui/djui_checkbox.c b/src/pc/djui/djui_checkbox.c index 6273c6f79..84bc2d2dc 100644 --- a/src/pc/djui/djui_checkbox.c +++ b/src/pc/djui/djui_checkbox.c @@ -64,7 +64,7 @@ struct DjuiCheckbox* djui_checkbox_create(struct DjuiBase* parent, const char* m struct DjuiText* text = djui_text_create(&checkbox->base, message); djui_base_set_alignment(&text->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_CENTER); djui_base_set_size_type(&text->base, DJUI_SVT_RELATIVE, DJUI_SVT_RELATIVE); - djui_base_set_size(&text->base, 0.5f, 1.0f); + djui_base_set_size(&text->base, 1.0f, 1.0f); djui_text_set_alignment(text, DJUI_HALIGN_LEFT, DJUI_VALIGN_BOTTOM); djui_text_set_drop_shadow(text, 120, 120, 120, 64); checkbox->text = text; diff --git a/src/pc/djui/djui_font.c b/src/pc/djui/djui_font.c index be0cb479f..d5d61505d 100644 --- a/src/pc/djui/djui_font.c +++ b/src/pc/djui/djui_font.c @@ -56,7 +56,7 @@ static f32 djui_font_normal_char_width(char c) { static const struct DjuiFont sDjuiFontNormal = { .charWidth = 0.5f, .charHeight = 1.0f, - .lineHeight = 0.8f, + .lineHeight = 0.8125f, .defaultFontScale = 32.0f, .rotatedUV = true, .textBeginDisplayList = djui_font_normal_text_begin, diff --git a/src/pc/djui/djui_panel.h b/src/pc/djui/djui_panel.h index 621cd709e..e802312cd 100644 --- a/src/pc/djui/djui_panel.h +++ b/src/pc/djui/djui_panel.h @@ -1,6 +1,9 @@ #pragma once #include "djui.h" +#define DJUI_DEFAULT_PANEL_WIDTH (400.0f + (16 * 2.0f)) +#define DJUI_PANEL_HEADER_OFFSET (-8) + void djui_panel_add(struct DjuiBase* caller, struct DjuiBase* panelBase, struct DjuiBase* defaultElementBase); void djui_panel_back(void); void djui_panel_update(void); diff --git a/src/pc/djui/djui_panel_camera.c b/src/pc/djui/djui_panel_camera.c index 6be7aa9d6..5ac42c338 100644 --- a/src/pc/djui/djui_panel_camera.c +++ b/src/pc/djui/djui_panel_camera.c @@ -2,85 +2,60 @@ #include "src/pc/utils/misc.h" #include "src/pc/configfile.h" -static void djui_panel_camera_back(struct DjuiBase* base) { - djui_panel_back(); -} - void djui_panel_camera_create(struct DjuiBase* caller) { f32 bodyHeight = 32 * 10 + 64 * 1 + 16 * 10; - - struct DjuiCheckbox* checkbox1 = NULL; - struct DjuiThreePanel* panel = djui_three_panel_create(&gDjuiRoot->base, 64, bodyHeight, 0); - djui_base_set_size_type(&panel->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE); - djui_base_set_size(&panel->base, 340.0f + (16 * 2.0f), 1.0f); - djui_base_set_color(&panel->base, 0, 0, 0, 240); - djui_base_set_border_color(&panel->base, 0, 0, 0, 200); - djui_base_set_border_width(&panel->base, 8); - djui_base_set_padding(&panel->base, 16, 16, 16, 16); + struct DjuiBase* defaultBase = NULL; + struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\C\\#1be700\\A\\#00b3ff\\M\\#ffef00\\E\\#ff0800\\R\\#1be700\\A"); + struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel); + { - struct DjuiText* header = djui_text_create(&panel->base, "\\#ff0800\\C\\#1be700\\A\\#00b3ff\\M\\#ffef00\\E\\#ff0800\\R\\#1be700\\A"); - djui_base_set_size_type(&header->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&header->base, 1.0f, 1.0f); - djui_base_set_color(&header->base, 255, 8, 0, 255); - djui_text_set_alignment(header, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - djui_text_set_font(header, &gDjuiFonts[1]); - djui_text_set_font_scale(header, gDjuiFonts[1].defaultFontScale); + struct DjuiCheckbox* checkbox1 = djui_checkbox_create(&body->base, "Free Camera", &configEnableCamera); + djui_base_set_size_type(&checkbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox1->base, 1.0f, 32); + defaultBase = &checkbox1->base; - struct DjuiFlowLayout* body = djui_flow_layout_create(&panel->base); - djui_base_set_alignment(&body->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - djui_base_set_size_type(&body->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&body->base, 1.0f, bodyHeight); - djui_base_set_color(&body->base, 0, 0, 0, 0); - djui_flow_layout_set_margin(body, 16); - djui_flow_layout_set_flow_direction(body, DJUI_FLOW_DIR_DOWN); - { - checkbox1 = djui_checkbox_create(&body->base, "Free Camera", &configEnableCamera); - djui_base_set_size_type(&checkbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&checkbox1->base, 1.0f, 32); + struct DjuiCheckbox* checkbox2 = djui_checkbox_create(&body->base, "Analog Camera", &configCameraAnalog); + djui_base_set_size_type(&checkbox2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox2->base, 1.0f, 32); - struct DjuiCheckbox* checkbox2 = djui_checkbox_create(&body->base, "Analog Camera", &configCameraAnalog); - djui_base_set_size_type(&checkbox2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&checkbox2->base, 1.0f, 32); + struct DjuiCheckbox* checkbox3 = djui_checkbox_create(&body->base, "Mouse Look", &configCameraMouse); + djui_base_set_size_type(&checkbox3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox3->base, 1.0f, 32); - struct DjuiCheckbox* checkbox3 = djui_checkbox_create(&body->base, "Mouse Look", &configCameraMouse); - djui_base_set_size_type(&checkbox3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&checkbox3->base, 1.0f, 32); + struct DjuiCheckbox* checkbox4 = djui_checkbox_create(&body->base, "Invert X", &configCameraInvertX); + djui_base_set_size_type(&checkbox4->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox4->base, 1.0f, 32); - struct DjuiCheckbox* checkbox4 = djui_checkbox_create(&body->base, "Invert X", &configCameraInvertX); - djui_base_set_size_type(&checkbox4->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&checkbox4->base, 1.0f, 32); + struct DjuiCheckbox* checkbox5 = djui_checkbox_create(&body->base, "Invert Y", &configCameraInvertY); + djui_base_set_size_type(&checkbox5->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox5->base, 1.0f, 32); - struct DjuiCheckbox* checkbox5 = djui_checkbox_create(&body->base, "Invert Y", &configCameraInvertY); - djui_base_set_size_type(&checkbox5->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&checkbox5->base, 1.0f, 32); + struct DjuiSlider* slider1 = djui_slider_create(&body->base, "X Sensitivity", &configCameraXSens, 1, 100); + djui_base_set_size_type(&slider1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider1->base, 1.0f, 32); - struct DjuiSlider* slider1 = djui_slider_create(&body->base, "X Sensitivity", &configCameraXSens, 1, 100); - djui_base_set_size_type(&slider1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&slider1->base, 1.0f, 32); + struct DjuiSlider* slider2 = djui_slider_create(&body->base, "Y Sensitivity", &configCameraYSens, 1, 100); + djui_base_set_size_type(&slider2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider2->base, 1.0f, 32); - struct DjuiSlider* slider2 = djui_slider_create(&body->base, "Y Sensitivity", &configCameraYSens, 1, 100); - djui_base_set_size_type(&slider2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&slider2->base, 1.0f, 32); + struct DjuiSlider* slider3 = djui_slider_create(&body->base, "Aggression", &configCameraAggr, 0, 100); + djui_base_set_size_type(&slider3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider3->base, 1.0f, 32); - struct DjuiSlider* slider3 = djui_slider_create(&body->base, "Aggression", &configCameraAggr, 0, 100); - djui_base_set_size_type(&slider3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&slider3->base, 1.0f, 32); + struct DjuiSlider* slider4 = djui_slider_create(&body->base, "Pan Level", &configCameraPan, 0, 100); + djui_base_set_size_type(&slider4->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider4->base, 1.0f, 32); - struct DjuiSlider* slider4 = djui_slider_create(&body->base, "Pan Level", &configCameraPan, 0, 100); - djui_base_set_size_type(&slider4->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&slider4->base, 1.0f, 32); + struct DjuiSlider* slider5 = djui_slider_create(&body->base, "Deceleration", &configCameraDegrade, 0, 100); + djui_base_set_size_type(&slider5->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider5->base, 1.0f, 32); - struct DjuiSlider* slider5 = djui_slider_create(&body->base, "Deceleration", &configCameraDegrade, 0, 100); - djui_base_set_size_type(&slider5->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&slider5->base, 1.0f, 32); - - struct DjuiButton* button6 = djui_button_create(&body->base, "Back"); - djui_base_set_size_type(&button6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button6->base, 1.0f, 64); - djui_interactable_hook_click(&button6->base, djui_panel_camera_back); - } + struct DjuiButton* button6 = djui_button_create(&body->base, "Back"); + djui_base_set_size_type(&button6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button6->base, 1.0f, 64); + djui_interactable_hook_click(&button6->base, djui_panel_menu_back); } - djui_panel_add(caller, &panel->base, &checkbox1->base); + djui_panel_add(caller, &panel->base, defaultBase); } diff --git a/src/pc/djui/djui_panel_controls.c b/src/pc/djui/djui_panel_controls.c index dc09550be..136565b13 100644 --- a/src/pc/djui/djui_panel_controls.c +++ b/src/pc/djui/djui_panel_controls.c @@ -2,72 +2,47 @@ #include "src/pc/utils/misc.h" #include "src/pc/configfile.h" -static void djui_panel_controls_back(struct DjuiBase* base) { - djui_panel_back(); -} - void djui_panel_controls_create(struct DjuiBase* caller) { f32 bindBodyHeight = 32 * 11 + 1 * 10; f32 bodyHeight = bindBodyHeight + 16 * 3 + 32 * 2 + 64; - struct DjuiBind* bind1 = NULL; - - struct DjuiThreePanel* panel = djui_three_panel_create(&gDjuiRoot->base, 64, bodyHeight, 0); - djui_base_set_size_type(&panel->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE); - djui_base_set_size(&panel->base, 340.0f + (16 * 2.0f), 1.0f); - djui_base_set_color(&panel->base, 0, 0, 0, 240); - djui_base_set_border_color(&panel->base, 0, 0, 0, 200); - djui_base_set_border_width(&panel->base, 8); - djui_base_set_padding(&panel->base, 16, 16, 16, 16); + struct DjuiBase* defaultBase = NULL; + struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\C\\#1be700\\O\\#00b3ff\\N\\#ffef00\\T\\#ff0800\\R\\#1be700\\O\\#00b3ff\\L\\#ffef00\\S"); + struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel); { - struct DjuiText* header = djui_text_create(&panel->base, "\\#ff0800\\C\\#1be700\\O\\#00b3ff\\N\\#ffef00\\T\\#ff0800\\R\\#1be700\\O\\#00b3ff\\L\\#ffef00\\S"); - djui_base_set_size_type(&header->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&header->base, 1.0f, 1.0f); - djui_base_set_color(&header->base, 255, 8, 0, 255); - djui_text_set_alignment(header, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - djui_text_set_font(header, &gDjuiFonts[1]); - djui_text_set_font_scale(header, gDjuiFonts[1].defaultFontScale); - - struct DjuiFlowLayout* body = djui_flow_layout_create(&panel->base); - djui_base_set_alignment(&body->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - djui_base_set_size_type(&body->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&body->base, 1.0f, bodyHeight); - djui_base_set_color(&body->base, 0, 0, 0, 0); - djui_flow_layout_set_margin(body, 16); + struct DjuiFlowLayout* bindBody = djui_flow_layout_create(&body->base); + djui_base_set_size_type(&bindBody->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&bindBody->base, 1.0f, bindBodyHeight); + djui_base_set_color(&bindBody->base, 0, 0, 0, 0); + djui_flow_layout_set_margin(bindBody, 1); { - struct DjuiFlowLayout* bindBody = djui_flow_layout_create(&body->base); - djui_base_set_size_type(&bindBody->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&bindBody->base, 1.0f, bindBodyHeight); - djui_base_set_color(&bindBody->base, 0, 0, 0, 0); - djui_flow_layout_set_margin(bindBody, 1); - { - bind1 = djui_bind_create(&bindBody->base, "A", configKeyA); - struct DjuiBind* bind2 = djui_bind_create(&bindBody->base, "B", configKeyB); - struct DjuiBind* bind3 = djui_bind_create(&bindBody->base, "Start", configKeyStart); - struct DjuiBind* bind4 = djui_bind_create(&bindBody->base, "L", configKeyL); - struct DjuiBind* bind5 = djui_bind_create(&bindBody->base, "R", configKeyR); - struct DjuiBind* bind6 = djui_bind_create(&bindBody->base, "Z", configKeyZ); - struct DjuiBind* bind7 = djui_bind_create(&bindBody->base, "C Up", configKeyCUp); - struct DjuiBind* bind8 = djui_bind_create(&bindBody->base, "C Down", configKeyCDown); - struct DjuiBind* bind9 = djui_bind_create(&bindBody->base, "C Left", configKeyCLeft); - struct DjuiBind* bind10 = djui_bind_create(&bindBody->base, "C Right", configKeyCRight); - struct DjuiBind* bind11 = djui_bind_create(&bindBody->base, "Chat", configKeyChat); - } - - struct DjuiSlider* slider1 = djui_slider_create(&body->base, "Deadzone", &configStickDeadzone, 0, 100); - djui_base_set_size_type(&slider1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&slider1->base, 1.0f, 32); - - struct DjuiSlider* slider2 = djui_slider_create(&body->base, "Rumble Strength", &configRumbleStrength, 0, 100); - djui_base_set_size_type(&slider2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&slider2->base, 1.0f, 32); - - struct DjuiButton* button6 = djui_button_create(&body->base, "Back"); - djui_base_set_size_type(&button6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button6->base, 1.0f, 64); - djui_interactable_hook_click(&button6->base, djui_panel_controls_back); + struct DjuiBind* bind1 = djui_bind_create(&bindBody->base, "A", configKeyA); + struct DjuiBind* bind2 = djui_bind_create(&bindBody->base, "B", configKeyB); + struct DjuiBind* bind3 = djui_bind_create(&bindBody->base, "Start", configKeyStart); + struct DjuiBind* bind4 = djui_bind_create(&bindBody->base, "L", configKeyL); + struct DjuiBind* bind5 = djui_bind_create(&bindBody->base, "R", configKeyR); + struct DjuiBind* bind6 = djui_bind_create(&bindBody->base, "Z", configKeyZ); + struct DjuiBind* bind7 = djui_bind_create(&bindBody->base, "C Up", configKeyCUp); + struct DjuiBind* bind8 = djui_bind_create(&bindBody->base, "C Down", configKeyCDown); + struct DjuiBind* bind9 = djui_bind_create(&bindBody->base, "C Left", configKeyCLeft); + struct DjuiBind* bind10 = djui_bind_create(&bindBody->base, "C Right", configKeyCRight); + struct DjuiBind* bind11 = djui_bind_create(&bindBody->base, "Chat", configKeyChat); + defaultBase = &bind1->buttons[0]->base; } + + struct DjuiSlider* slider1 = djui_slider_create(&body->base, "Deadzone", &configStickDeadzone, 0, 100); + djui_base_set_size_type(&slider1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider1->base, 1.0f, 32); + + struct DjuiSlider* slider2 = djui_slider_create(&body->base, "Rumble Strength", &configRumbleStrength, 0, 100); + djui_base_set_size_type(&slider2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider2->base, 1.0f, 32); + + struct DjuiButton* button6 = djui_button_create(&body->base, "Back"); + djui_base_set_size_type(&button6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button6->base, 1.0f, 64); + djui_interactable_hook_click(&button6->base, djui_panel_menu_back); } - djui_panel_add(caller, &panel->base, &bind1->base); + djui_panel_add(caller, &panel->base, defaultBase); } diff --git a/src/pc/djui/djui_panel_display.c b/src/pc/djui/djui_panel_display.c index db0899360..93755360b 100644 --- a/src/pc/djui/djui_panel_display.c +++ b/src/pc/djui/djui_panel_display.c @@ -2,68 +2,43 @@ #include "src/pc/utils/misc.h" #include "src/pc/configfile.h" -static void djui_panel_display_back(struct DjuiBase* base) { - djui_panel_back(); -} - static void djui_panel_display_apply(struct DjuiBase* caller) { configWindow.settings_changed = true; } void djui_panel_display_create(struct DjuiBase* caller) { f32 bodyHeight = 32 * 5 + 64 * 1 + 16 * 4; - - struct DjuiCheckbox* checkbox1 = NULL; - struct DjuiThreePanel* panel = djui_three_panel_create(&gDjuiRoot->base, 64, bodyHeight, 0); - djui_base_set_size_type(&panel->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE); - djui_base_set_size(&panel->base, 340.0f + (16 * 2.0f), 1.0f); - djui_base_set_color(&panel->base, 0, 0, 0, 240); - djui_base_set_border_color(&panel->base, 0, 0, 0, 200); - djui_base_set_border_width(&panel->base, 8); - djui_base_set_padding(&panel->base, 16, 16, 16, 16); + struct DjuiBase* defaultBase = NULL; + struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\D\\#1be700\\I\\#00b3ff\\S\\#ffef00\\P\\#ff0800\\L\\#1be700\\A\\#00b3ff\\Y"); + struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel); + { - struct DjuiText* header = djui_text_create(&panel->base, "\\#ff0800\\D\\#1be700\\I\\#00b3ff\\S\\#ffef00\\P\\#ff0800\\L\\#1be700\\A\\#00b3ff\\Y"); - djui_base_set_size_type(&header->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&header->base, 1.0f, 1.0f); - djui_base_set_color(&header->base, 255, 8, 0, 255); - djui_text_set_alignment(header, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - djui_text_set_font(header, &gDjuiFonts[1]); - djui_text_set_font_scale(header, gDjuiFonts[1].defaultFontScale); + struct DjuiCheckbox* checkbox1 = djui_checkbox_create(&body->base, "Fullscreen", &configWindow.fullscreen); + djui_base_set_size_type(&checkbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox1->base, 1.0f, 32); + djui_interactable_hook_value_change(&checkbox1->base, djui_panel_display_apply); + defaultBase = &checkbox1->base; - struct DjuiFlowLayout* body = djui_flow_layout_create(&panel->base); - djui_base_set_alignment(&body->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - djui_base_set_size_type(&body->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&body->base, 1.0f, bodyHeight); - djui_base_set_color(&body->base, 0, 0, 0, 0); - djui_flow_layout_set_margin(body, 16); - djui_flow_layout_set_flow_direction(body, DJUI_FLOW_DIR_DOWN); - { - checkbox1 = djui_checkbox_create(&body->base, "Fullscreen", &configWindow.fullscreen); - djui_base_set_size_type(&checkbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&checkbox1->base, 1.0f, 32); - djui_interactable_hook_value_change(&checkbox1->base, djui_panel_display_apply); + struct DjuiCheckbox* checkbox2 = djui_checkbox_create(&body->base, "VSync", &configWindow.vsync); + djui_base_set_size_type(&checkbox2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox2->base, 1.0f, 32); + djui_interactable_hook_value_change(&checkbox2->base, djui_panel_display_apply); - struct DjuiCheckbox* checkbox2 = djui_checkbox_create(&body->base, "VSync", &configWindow.vsync); - djui_base_set_size_type(&checkbox2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&checkbox2->base, 1.0f, 32); - djui_interactable_hook_value_change(&checkbox2->base, djui_panel_display_apply); + struct DjuiCheckbox* checkbox4 = djui_checkbox_create(&body->base, "HUD", &configHUD); + djui_base_set_size_type(&checkbox4->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox4->base, 1.0f, 32); - struct DjuiCheckbox* checkbox4 = djui_checkbox_create(&body->base, "HUD", &configHUD); - djui_base_set_size_type(&checkbox4->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&checkbox4->base, 1.0f, 32); + char* choices[3] = { "Nearest", "Linear", "Tripoint" }; + struct DjuiSelectionbox* selectionbox1 = djui_selectionbox_create(&body->base, "Filtering", choices, 3, &configFiltering); + djui_base_set_size_type(&selectionbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&selectionbox1->base, 1.0f, 32); - char* choices[3] = { "Nearest", "Linear", "Tripoint" }; - struct DjuiSelectionbox* selectionbox1 = djui_selectionbox_create(&body->base, "Filtering", choices, 3, &configFiltering); - djui_base_set_size_type(&selectionbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&selectionbox1->base, 1.0f, 32); - - struct DjuiButton* button6 = djui_button_create(&body->base, "Back"); - djui_base_set_size_type(&button6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button6->base, 1.0f, 64); - djui_interactable_hook_click(&button6->base, djui_panel_display_back); - } + struct DjuiButton* button6 = djui_button_create(&body->base, "Back"); + djui_base_set_size_type(&button6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button6->base, 1.0f, 64); + djui_interactable_hook_click(&button6->base, djui_panel_menu_back); } - djui_panel_add(caller, &panel->base, &checkbox1->base); + djui_panel_add(caller, &panel->base, defaultBase); } diff --git a/src/pc/djui/djui_panel_host.c b/src/pc/djui/djui_panel_host.c new file mode 100644 index 000000000..cf7019b94 --- /dev/null +++ b/src/pc/djui/djui_panel_host.c @@ -0,0 +1,60 @@ +#include "djui.h" +#include "src/pc/utils/misc.h" +#include "src/pc/configfile.h" + +void djui_panel_host_create(struct DjuiBase* caller) { +#ifdef DISCORD_SDK + f32 bodyHeight = 32 * 4 + 64 * 2 + 16 * 6; +#else + f32 bodyHeight = 32 * 3 + 64 * 2 + 16 * 5; +#endif + + struct DjuiBase* defaultBase = NULL; + struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\H\\#1be700\\O\\#00b3ff\\S\\#ffef00\\T"); + struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel); + { +#ifdef DISCORD_SDK + char* nChoices[2] = { "Discord", "Direct Connection" }; + 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); +#endif + 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); + djui_base_set_size(&selectionbox2->base, 1.0f, 32); + + struct DjuiCheckbox* checkbox1 = djui_checkbox_create(&body->base, "Stay in level after star", &configStayInLevelAfterStar); + djui_base_set_size_type(&checkbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox1->base, 1.0f, 32); + + struct DjuiCheckbox* checkbox2 = djui_checkbox_create(&body->base, "Play intro cutscene", &configSkipIntro); + djui_base_set_size_type(&checkbox2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox2->base, 1.0f, 32); + + struct DjuiCheckbox* checkbox3 = djui_checkbox_create(&body->base, "Share lives", &configShareLives); + 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 DjuiButton* button1 = djui_button_create(&rect1->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_interactable_hook_click(&button1->base, djui_panel_menu_back); + + struct DjuiButton* button2 = djui_button_create(&rect1->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); + defaultBase = &button2->base; + } + } + + djui_panel_add(caller, &panel->base, defaultBase); +} diff --git a/src/pc/djui/djui_panel_host.h b/src/pc/djui/djui_panel_host.h new file mode 100644 index 000000000..43fe9c25d --- /dev/null +++ b/src/pc/djui/djui_panel_host.h @@ -0,0 +1,4 @@ +#pragma once +#include "djui.h" + +void djui_panel_host_create(struct DjuiBase* caller); diff --git a/src/pc/djui/djui_panel_host_message.c b/src/pc/djui/djui_panel_host_message.c new file mode 100644 index 000000000..bb4338b50 --- /dev/null +++ b/src/pc/djui/djui_panel_host_message.c @@ -0,0 +1,76 @@ +#include +#include "djui.h" +#include "src/pc/utils/misc.h" +#include "src/pc/configfile.h" + +#ifdef DISCORD_SDK +static char* sWarningDiscord = "\ +Invite friends by right clicking their name on Discord and clicking on\n\ +'\\#d0d0ff\\Invite to Game\\#c8c8c8\\'.\n\n\ +You can invite channels of servers as well by clicking the \\#d0d0ff\\plus\\#c8c8c8\\ button next to the place where you enter chat.\n\n\ +Game Activity \\#ffa0a0\\must be\\#c8c8c8\\ enabled in your\nDiscord user settings.\n\n\ +Appearing offline \\#ffa0a0\\will prevent\\#c8c8c8\\ invites from being sent.\ +"; +#endif + +static char* sWarningSocket = "\ +Direct connections \\#ffa0a0\\require you\\#c8c8c8\\ to configure port forwarding in your router.\n\n\ +Forward port '\\#d0d0ff\\%d\\#c8c8c8\\' for UDP.\ +"; + +void djui_panel_host_message_create(struct DjuiBase* caller) { + f32 warningLines = 0; + char* warningMessage = NULL; + +#ifdef DISCORD_SDK + if (!configNetworkSystem) { + warningLines = 13; + warningMessage = sWarningDiscord; + } else +#endif + { + warningLines = 5; + warningMessage = malloc(sizeof(char) * 256); + sprintf(warningMessage, sWarningSocket, configHostPort); + } + + f32 textHeight = 32 * 0.8125f * warningLines + 8; + f32 bodyHeight = textHeight + 16 + 64; + + struct DjuiBase* defaultBase = NULL; + struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\I\\#1be700\\N\\#00b3ff\\F\\#ffef00\\O"); + struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel); + { + struct DjuiText* text1 = djui_text_create(&body->base, warningMessage); + djui_base_set_size_type(&text1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&text1->base, 1.0f, textHeight); + djui_base_set_color(&text1->base, 200, 200, 200, 255); + + 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 DjuiButton* button1 = djui_button_create(&rect1->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_interactable_hook_click(&button1->base, djui_panel_menu_back); + + struct DjuiButton* button2 = djui_button_create(&rect1->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_menu_back); + defaultBase = &button2->base; + } + } + + djui_panel_add(caller, &panel->base, defaultBase); +#ifdef DISCORD_SDK + if (configNetworkSystem) +#endif + { + free(warningMessage); + } +} diff --git a/src/pc/djui/djui_panel_host_message.h b/src/pc/djui/djui_panel_host_message.h new file mode 100644 index 000000000..6fcdc59f2 --- /dev/null +++ b/src/pc/djui/djui_panel_host_message.h @@ -0,0 +1,4 @@ +#pragma once +#include "djui.h" + +void djui_panel_host_message_create(struct DjuiBase* caller); diff --git a/src/pc/djui/djui_panel_main.c b/src/pc/djui/djui_panel_main.c index 02e76a613..3264a8445 100644 --- a/src/pc/djui/djui_panel_main.c +++ b/src/pc/djui/djui_panel_main.c @@ -9,35 +9,18 @@ static void djui_panel_main_close(struct DjuiBase* caller) { void djui_panel_main_create(struct DjuiBase* caller) { f32 bodyHeight = 64 * 4 + 16 * 3; - - struct DjuiButton* buttonHost = NULL; - - struct DjuiThreePanel* panel = djui_three_panel_create(&gDjuiRoot->base, 128, bodyHeight, 32); - djui_base_set_size_type(&panel->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE); - djui_base_set_size(&panel->base, 340.0f + (16 * 2.0f), 1.0f); - djui_base_set_color(&panel->base, 0, 0, 0, 240); - djui_base_set_border_color(&panel->base, 0, 0, 0, 200); - djui_base_set_border_width(&panel->base, 8); - djui_base_set_padding(&panel->base, 16, 16, 16, 16); + + struct DjuiBase* defaultBase = NULL; + struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\SM\\#1be700\\64\\#00b3ff\\EX\n\\#ffef00\\COOP"); { - struct DjuiText* header = djui_text_create(&panel->base, "\\#ff0800\\SM\\#1be700\\64\\#00b3ff\\EX\n\\#ffef00\\COOP"); - djui_base_set_color(&header->base, 255, 8, 0, 255); - djui_text_set_font(header, &gDjuiFonts[1]); - djui_text_set_font_scale(header, gDjuiFonts[1].defaultFontScale); - djui_text_set_alignment(header, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - - struct DjuiFlowLayout* body = djui_flow_layout_create(&panel->base); - djui_base_set_size_type(&body->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&body->base, 1.0f, bodyHeight); - djui_base_set_color(&body->base, 0, 0, 0, 0); - djui_flow_layout_set_margin(body, 16); - djui_flow_layout_set_flow_direction(body, DJUI_FLOW_DIR_DOWN); + struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel); { - buttonHost = djui_button_create(&body->base, "Host"); - djui_base_set_size_type(&buttonHost->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&buttonHost->base, 1.0f, 64); - djui_cursor_input_controlled_center(&buttonHost->base); - djui_interactable_hook_click(&buttonHost->base, djui_panel_main_close); + struct DjuiButton* button1 = djui_button_create(&body->base, "Host"); + djui_base_set_size_type(&button1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button1->base, 1.0f, 64); + djui_cursor_input_controlled_center(&button1->base); + djui_interactable_hook_click(&button1->base, djui_panel_host_create); + defaultBase = &button1->base; struct DjuiButton* button2 = djui_button_create(&body->base, "Join"); djui_base_set_size_type(&button2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); @@ -59,9 +42,9 @@ void djui_panel_main_create(struct DjuiBase* caller) { djui_base_set_size_type(&footer->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&footer->base, 1.0f, 1.0f); djui_base_set_color(&footer->base, 50, 50, 50, 255); - djui_text_set_alignment(footer, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + djui_text_set_alignment(footer, DJUI_HALIGN_CENTER, DJUI_VALIGN_BOTTOM); } - djui_panel_add(caller, &panel->base, &buttonHost->base); + djui_panel_add(caller, &panel->base, defaultBase); gInteractableOverridePad = true; } diff --git a/src/pc/djui/djui_panel_menu.c b/src/pc/djui/djui_panel_menu.c new file mode 100644 index 000000000..da82b96c1 --- /dev/null +++ b/src/pc/djui/djui_panel_menu.c @@ -0,0 +1,36 @@ +#include "djui.h" +#include "src/pc/utils/misc.h" +#include "src/pc/configfile.h" + +void djui_panel_menu_back(struct DjuiBase* base) { + djui_panel_back(); +} + +struct DjuiThreePanel* djui_panel_menu_create(f32 bodyHeight, char* headerText) { + struct DjuiThreePanel* panel = djui_three_panel_create(&gDjuiRoot->base, 64, bodyHeight, 0); + djui_base_set_size_type(&panel->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE); + djui_base_set_size(&panel->base, DJUI_DEFAULT_PANEL_WIDTH, 1.0f); + djui_base_set_color(&panel->base, 0, 0, 0, 240); + djui_base_set_border_color(&panel->base, 0, 0, 0, 200); + djui_base_set_border_width(&panel->base, 8); + djui_base_set_padding(&panel->base, 16, 16, 16, 16); + { + struct DjuiText* header = djui_text_create(&panel->base, headerText); + djui_base_set_size_type(&header->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&header->base, 1.0f, 1.0f); + djui_base_set_color(&header->base, 255, 8, 0, 255); + djui_base_set_location(&header->base, 0, DJUI_PANEL_HEADER_OFFSET); + djui_text_set_alignment(header, DJUI_HALIGN_CENTER, DJUI_VALIGN_BOTTOM); + djui_text_set_font(header, &gDjuiFonts[1]); + djui_text_set_font_scale(header, gDjuiFonts[1].defaultFontScale); + + struct DjuiFlowLayout* body = djui_flow_layout_create(&panel->base); + djui_base_set_alignment(&body->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + djui_base_set_size_type(&body->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&body->base, 1.0f, bodyHeight); + djui_base_set_color(&body->base, 0, 0, 0, 0); + djui_flow_layout_set_margin(body, 16); + djui_flow_layout_set_flow_direction(body, DJUI_FLOW_DIR_DOWN); + } + return panel; +} diff --git a/src/pc/djui/djui_panel_menu.h b/src/pc/djui/djui_panel_menu.h new file mode 100644 index 000000000..ac9ea52a8 --- /dev/null +++ b/src/pc/djui/djui_panel_menu.h @@ -0,0 +1,5 @@ +#pragma once +#include "djui.h" + +void djui_panel_menu_back(struct DjuiBase* base); +struct DjuiThreePanel* djui_panel_menu_create(f32 bodyHeight, char* headerText); diff --git a/src/pc/djui/djui_panel_options.c b/src/pc/djui/djui_panel_options.c index f87d91e57..1ba23d721 100644 --- a/src/pc/djui/djui_panel_options.c +++ b/src/pc/djui/djui_panel_options.c @@ -1,69 +1,43 @@ #include "djui.h" #include "src/pc/utils/misc.h" -static void djui_panel_options_back(struct DjuiBase* base) { - djui_panel_back(); -} - void djui_panel_options_create(struct DjuiBase* caller) { f32 bodyHeight = 64 * 6 + 16 * 5; - struct DjuiButton* buttonPlayer = NULL; - - struct DjuiThreePanel* panel = djui_three_panel_create(&gDjuiRoot->base, 64, bodyHeight, 0); - djui_base_set_size_type(&panel->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE); - djui_base_set_size(&panel->base, 340.0f + (16 * 2.0f), 1.0f); - djui_base_set_color(&panel->base, 0, 0, 0, 240); - djui_base_set_border_color(&panel->base, 0, 0, 0, 200); - djui_base_set_border_width(&panel->base, 8); - djui_base_set_padding(&panel->base, 16, 16, 16, 16); + struct DjuiBase* defaultBase = NULL; + struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\O\\#1be700\\P\\#00b3ff\\T\\#ffef00\\I\\#ff0800\\O\\#1be700\\N\\#00b3ff\\S"); + struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel); { - struct DjuiText* header = djui_text_create(&panel->base, "\\#ff0800\\O\\#1be700\\P\\#00b3ff\\T\\#ffef00\\I\\#ff0800\\O\\#1be700\\N\\#00b3ff\\S"); - djui_base_set_size_type(&header->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&header->base, 1.0f, 1.0f); - djui_base_set_color(&header->base, 255, 8, 0, 255); - djui_text_set_alignment(header, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - djui_text_set_font(header, &gDjuiFonts[1]); - djui_text_set_font_scale(header, gDjuiFonts[1].defaultFontScale); + struct DjuiButton* button1 = djui_button_create(&body->base, "Player"); + djui_base_set_size_type(&button1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button1->base, 1.0f, 64); + defaultBase = &button1->base; - struct DjuiFlowLayout* body = djui_flow_layout_create(&panel->base); - djui_base_set_alignment(&body->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - djui_base_set_size_type(&body->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&body->base, 1.0f, bodyHeight); - djui_base_set_color(&body->base, 0, 0, 0, 0); - djui_flow_layout_set_margin(body, 16); - djui_flow_layout_set_flow_direction(body, DJUI_FLOW_DIR_DOWN); - { - buttonPlayer = djui_button_create(&body->base, "Player"); - djui_base_set_size_type(&buttonPlayer->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&buttonPlayer->base, 1.0f, 64); + struct DjuiButton* button2 = djui_button_create(&body->base, "Camera"); + djui_base_set_size_type(&button2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button2->base, 1.0f, 64); + djui_interactable_hook_click(&button2->base, djui_panel_camera_create); - struct DjuiButton* button2 = djui_button_create(&body->base, "Camera"); - djui_base_set_size_type(&button2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button2->base, 1.0f, 64); - djui_interactable_hook_click(&button2->base, djui_panel_camera_create); + struct DjuiButton* button3 = djui_button_create(&body->base, "Controls"); + djui_base_set_size_type(&button3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button3->base, 1.0f, 64); + djui_interactable_hook_click(&button3->base, djui_panel_controls_create); - struct DjuiButton* button3 = djui_button_create(&body->base, "Controls"); - djui_base_set_size_type(&button3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button3->base, 1.0f, 64); - djui_interactable_hook_click(&button3->base, djui_panel_controls_create); + struct DjuiButton* button4 = djui_button_create(&body->base, "Display"); + djui_base_set_size_type(&button4->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button4->base, 1.0f, 64); + djui_interactable_hook_click(&button4->base, djui_panel_display_create); - struct DjuiButton* button4 = djui_button_create(&body->base, "Display"); - djui_base_set_size_type(&button4->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button4->base, 1.0f, 64); - djui_interactable_hook_click(&button4->base, djui_panel_display_create); + struct DjuiButton* button5 = djui_button_create(&body->base, "Sound"); + djui_base_set_size_type(&button5->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button5->base, 1.0f, 64); + djui_interactable_hook_click(&button5->base, djui_panel_sound_create); - struct DjuiButton* button5 = djui_button_create(&body->base, "Sound"); - djui_base_set_size_type(&button5->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button5->base, 1.0f, 64); - djui_interactable_hook_click(&button5->base, djui_panel_sound_create); - - struct DjuiButton* button6 = djui_button_create(&body->base, "Back"); - djui_base_set_size_type(&button6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button6->base, 1.0f, 64); - djui_interactable_hook_click(&button6->base, djui_panel_options_back); - } + struct DjuiButton* button6 = djui_button_create(&body->base, "Back"); + djui_base_set_size_type(&button6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button6->base, 1.0f, 64); + djui_interactable_hook_click(&button6->base, djui_panel_menu_back); } - djui_panel_add(caller, &panel->base, &buttonPlayer->base); + djui_panel_add(caller, &panel->base, defaultBase); } diff --git a/src/pc/djui/djui_panel_quit.c b/src/pc/djui/djui_panel_quit.c index e5da6086a..f554abf95 100644 --- a/src/pc/djui/djui_panel_quit.c +++ b/src/pc/djui/djui_panel_quit.c @@ -10,52 +10,37 @@ static void djui_panel_quit_no(struct DjuiBase* base) { } void djui_panel_quit_create(struct DjuiBase* caller) { - f32 bodyHeight = 64 * 3 + 16 * 2; + f32 bodyHeight = 64 * 2 + 16 * 1; - struct DjuiButton* buttonNo = NULL; - - struct DjuiThreePanel* panel = djui_three_panel_create(&gDjuiRoot->base, 64, bodyHeight, 0); - djui_base_set_size_type(&panel->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE); - djui_base_set_size(&panel->base, 340.0f + (16 * 2.0f), 1.0f); - djui_base_set_color(&panel->base, 0, 0, 0, 230); - djui_base_set_border_color(&panel->base, 0, 0, 0, 200); - djui_base_set_border_width(&panel->base, 8); - djui_base_set_padding(&panel->base, 16, 16, 16, 16); - djui_base_set_enabled(&panel->base, false); + struct DjuiBase* defaultBase = NULL; + struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\Q\\#1be700\\U\\#00b3ff\\I\\#ffef00\\T"); + struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel); { - struct DjuiText* header = djui_text_create(&panel->base, "\\#ff0800\\Q\\#1be700\\U\\#00b3ff\\I\\#ffef00\\T"); - djui_base_set_size_type(&header->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&header->base, 1.0f, 1.0f); - djui_base_set_color(&header->base, 255, 8, 0, 255); - djui_text_set_alignment(header, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - djui_text_set_font(header, &gDjuiFonts[1]); - djui_text_set_font_scale(header, gDjuiFonts[1].defaultFontScale); + struct DjuiText* text = djui_text_create(&body->base, "Are you sure you want to quit?"); + djui_base_set_size_type(&text->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&text->base, 1.0f, 64); + djui_base_set_color(&text->base, 200, 200, 200, 255); + djui_text_set_alignment(text, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - struct DjuiFlowLayout* body = djui_flow_layout_create(&panel->base); - djui_base_set_alignment(&body->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - djui_base_set_size_type(&body->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&body->base, 1.0f, bodyHeight); - djui_base_set_color(&body->base, 0, 0, 0, 0); - djui_flow_layout_set_margin(body, 16); - djui_flow_layout_set_flow_direction(body, DJUI_FLOW_DIR_DOWN); + 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 DjuiText* text = djui_text_create(&body->base, "Are you sure you want to quit?"); - djui_base_set_size_type(&text->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&text->base, 1.0f, 64); - djui_base_set_color(&text->base, 200, 200, 200, 255); - djui_text_set_alignment(text, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - - struct DjuiButton* button1 = djui_button_create(&body->base, "Yes"); + struct DjuiButton* button1 = djui_button_create(&rect1->base, "No"); djui_base_set_size_type(&button1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button1->base, 1.0f, 64); - djui_interactable_hook_click(&button1->base, djui_panel_quit_yes); + djui_base_set_size(&button1->base, 0.485f, 64); + djui_base_set_alignment(&button1->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_TOP); + djui_interactable_hook_click(&button1->base, djui_panel_quit_no); + defaultBase = &button1->base; - buttonNo = djui_button_create(&body->base, "No"); - djui_base_set_size_type(&buttonNo->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&buttonNo->base, 1.0f, 64); - djui_interactable_hook_click(&buttonNo->base, djui_panel_quit_no); + struct DjuiButton* button2 = djui_button_create(&rect1->base, "Yes"); + 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_quit_yes); } } - djui_panel_add(caller, &panel->base, &buttonNo->base); + djui_panel_add(caller, &panel->base, defaultBase); } diff --git a/src/pc/djui/djui_panel_sound.c b/src/pc/djui/djui_panel_sound.c index 6d47e1297..1cfbc56ca 100644 --- a/src/pc/djui/djui_panel_sound.c +++ b/src/pc/djui/djui_panel_sound.c @@ -2,61 +2,36 @@ #include "src/pc/utils/misc.h" #include "src/pc/configfile.h" -static void djui_panel_sound_back(struct DjuiBase* base) { - djui_panel_back(); -} - void djui_panel_sound_create(struct DjuiBase* caller) { f32 bodyHeight = 32 * 4 + 64 * 1 + 16 * 4; - - struct DjuiSlider* slider1 = NULL; - struct DjuiThreePanel* panel = djui_three_panel_create(&gDjuiRoot->base, 64, bodyHeight, 0); - djui_base_set_size_type(&panel->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE); - djui_base_set_size(&panel->base, 340.0f + (16 * 2.0f), 1.0f); - djui_base_set_color(&panel->base, 0, 0, 0, 240); - djui_base_set_border_color(&panel->base, 0, 0, 0, 200); - djui_base_set_border_width(&panel->base, 8); - djui_base_set_padding(&panel->base, 16, 16, 16, 16); + struct DjuiBase* defaultBase = NULL; + struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\S\\#1be700\\O\\#00b3ff\\U\\#ffef00\\N\\#ff0800\\D"); + struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel); + { - struct DjuiText* header = djui_text_create(&panel->base, "\\#ff0800\\S\\#1be700\\O\\#00b3ff\\U\\#ffef00\\N\\#ff0800\\D"); - djui_base_set_size_type(&header->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&header->base, 1.0f, 1.0f); - djui_base_set_color(&header->base, 255, 8, 0, 255); - djui_text_set_alignment(header, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - djui_text_set_font(header, &gDjuiFonts[1]); - djui_text_set_font_scale(header, gDjuiFonts[1].defaultFontScale); + struct DjuiSlider* slider1 = djui_slider_create(&body->base, "Master Volume", &configMasterVolume, 0, 127); + djui_base_set_size_type(&slider1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider1->base, 1.0f, 32); + defaultBase = &slider1->base; - struct DjuiFlowLayout* body = djui_flow_layout_create(&panel->base); - djui_base_set_alignment(&body->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - djui_base_set_size_type(&body->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&body->base, 1.0f, bodyHeight); - djui_base_set_color(&body->base, 0, 0, 0, 0); - djui_flow_layout_set_margin(body, 16); - djui_flow_layout_set_flow_direction(body, DJUI_FLOW_DIR_DOWN); - { - slider1 = djui_slider_create(&body->base, "Master Volume", &configMasterVolume, 0, 127); - djui_base_set_size_type(&slider1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&slider1->base, 1.0f, 32); + struct DjuiSlider* slider2 = djui_slider_create(&body->base, "Music Volume", &configMusicVolume, 0, 127); + djui_base_set_size_type(&slider2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider2->base, 1.0f, 32); - struct DjuiSlider* slider2 = djui_slider_create(&body->base, "Music Volume", &configMusicVolume, 0, 127); - djui_base_set_size_type(&slider2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&slider2->base, 1.0f, 32); + struct DjuiSlider* slider3 = djui_slider_create(&body->base, "Sfx Volume", &configSfxVolume, 0, 127); + djui_base_set_size_type(&slider3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider3->base, 1.0f, 32); - struct DjuiSlider* slider3 = djui_slider_create(&body->base, "Sfx Volume", &configSfxVolume, 0, 127); - djui_base_set_size_type(&slider3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&slider3->base, 1.0f, 32); + struct DjuiSlider* slider4 = djui_slider_create(&body->base, "Env Volume", &configEnvVolume, 0, 127); + djui_base_set_size_type(&slider4->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider4->base, 1.0f, 32); - struct DjuiSlider* slider4 = djui_slider_create(&body->base, "Env Volume", &configEnvVolume, 0, 127); - djui_base_set_size_type(&slider4->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&slider4->base, 1.0f, 32); - - struct DjuiButton* button6 = djui_button_create(&body->base, "Back"); - djui_base_set_size_type(&button6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button6->base, 1.0f, 64); - djui_interactable_hook_click(&button6->base, djui_panel_sound_back); - } + struct DjuiButton* button6 = djui_button_create(&body->base, "Back"); + djui_base_set_size_type(&button6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button6->base, 1.0f, 64); + djui_interactable_hook_click(&button6->base, djui_panel_menu_back); } - djui_panel_add(caller, &panel->base, &slider1->base); + djui_panel_add(caller, &panel->base, defaultBase); } diff --git a/src/pc/djui/djui_text.c b/src/pc/djui/djui_text.c index ce0b80961..9c56cf7d8 100644 --- a/src/pc/djui/djui_text.c +++ b/src/pc/djui/djui_text.c @@ -300,9 +300,9 @@ static void djui_text_render(struct DjuiBase* base) { // count lines u16 startIndex = 0; u16 endIndex = 0; - f32 maxLineWidth = comp->width / text->fontScale; + f32 maxLineWidth = comp->width / ((f32)text->fontScale); u16 lineCount = 0; - u16 maxLines = comp->height / ((f32)text->font->charHeight * text->fontScale); + u16 maxLines = comp->height / ((f32)text->font->lineHeight * text->fontScale); while (text->message[startIndex] != '\0') { bool onLastLine = lineCount + 1 >= maxLines; f32 lineWidth; diff --git a/src/pc/djui/djui_three_panel.c b/src/pc/djui/djui_three_panel.c index 9de079101..577cab973 100644 --- a/src/pc/djui/djui_three_panel.c +++ b/src/pc/djui/djui_three_panel.c @@ -1,5 +1,37 @@ #include "djui.h" +struct DjuiBase* djui_three_panel_get_header(struct DjuiThreePanel* threePanel) { + struct DjuiBase* children[3] = { NULL }; + struct DjuiBaseChild* child = threePanel->base.child; + for (int i = 0; i < 3; i++) { + if (child == NULL || child->base == NULL) { break; } + children[i] = child->base; + child = child->next; + } + return children[0]; +} + +struct DjuiBase* djui_three_panel_get_body(struct DjuiThreePanel* threePanel) { + struct DjuiBase* children[3] = { NULL }; + struct DjuiBaseChild* child = threePanel->base.child; + for (int i = 0; i < 3; i++) { + if (child == NULL || child->base == NULL) { break; } + children[i] = child->base; + child = child->next; + } + return children[1]; +} + +struct DjuiBase* djui_three_panel_get_footer(struct DjuiThreePanel* threePanel) { + struct DjuiBase* children[3] = { NULL }; + struct DjuiBaseChild* child = threePanel->base.child; + for (int i = 0; i < 3; i++) { + if (child == NULL || child->base == NULL) { break; } + children[i] = child->base; + child = child->next; + } + return children[2]; +} void djui_three_panel_set_min_header_size_type(struct DjuiThreePanel* threePanel, enum DjuiScreenValueType minHeaderSizeType) { threePanel->minHeaderSize.type = minHeaderSizeType; @@ -77,8 +109,8 @@ void djui_three_panel_render(struct DjuiBase* base) { } if (head != NULL) { - djui_base_set_location_type(head, DJUI_SVT_ABSOLUTE, DJUI_SVT_ABSOLUTE); - djui_base_set_location(head, 0, 0); + //djui_base_set_location_type(head, DJUI_SVT_ABSOLUTE, DJUI_SVT_ABSOLUTE); + //djui_base_set_location(head, 0, 0); djui_base_set_size_type(head, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(head, 1.0f, headerSize); djui_base_set_alignment(head, DJUI_HALIGN_LEFT, DJUI_VALIGN_TOP); diff --git a/src/pc/djui/djui_three_panel.h b/src/pc/djui/djui_three_panel.h index 889c539a5..a57c56290 100644 --- a/src/pc/djui/djui_three_panel.h +++ b/src/pc/djui/djui_three_panel.h @@ -9,6 +9,10 @@ struct DjuiThreePanel { struct DjuiScreenValue minFooterSize; }; +struct DjuiBase* djui_three_panel_get_header(struct DjuiThreePanel* threePanel); +struct DjuiBase* djui_three_panel_get_body(struct DjuiThreePanel* threePanel); +struct DjuiBase* djui_three_panel_get_footer(struct DjuiThreePanel* threePanel); + void djui_three_panel_set_min_header_size_type(struct DjuiThreePanel* threePanel, enum DjuiScreenValueType minHeaderSizeType); void djui_three_panel_set_min_header_size(struct DjuiThreePanel* threePanel, f32 minHeaderSize); void djui_three_panel_set_body_size_type(struct DjuiThreePanel* threePanel, enum DjuiScreenValueType bodySizeType);