mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
DJUI: Added checkbox and camera panel
This commit is contained in:
parent
bf54a305d4
commit
1e4acef2e0
12 changed files with 222 additions and 6 deletions
|
|
@ -23,11 +23,13 @@
|
|||
#include "djui_button.h"
|
||||
#include "djui_flow_layout.h"
|
||||
#include "djui_slider.h"
|
||||
#include "djui_checkbox.h"
|
||||
|
||||
#include "djui_panel.h"
|
||||
#include "djui_panel_debug.h"
|
||||
#include "djui_panel_main.h"
|
||||
#include "djui_panel_options.h"
|
||||
#include "djui_panel_camera.h"
|
||||
#include "djui_panel_sound.h"
|
||||
#include "djui_panel_quit.h"
|
||||
|
||||
|
|
|
|||
87
src/pc/djui/djui_checkbox.c
Normal file
87
src/pc/djui/djui_checkbox.c
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
#include "djui.h"
|
||||
|
||||
static void djui_checkbox_set_default_style(struct DjuiBase* base) {
|
||||
struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base;
|
||||
djui_base_set_border_color(&checkbox->rect->base, 173, 173, 173, 255);
|
||||
djui_base_set_color(&checkbox->rect->base, 0, 0, 0, 0);
|
||||
djui_base_set_color(&checkbox->text->base, 200, 200, 200, 255);
|
||||
djui_base_set_color(&checkbox->rectValue->base, 200, 200, 200, 255);
|
||||
}
|
||||
|
||||
static void djui_checkbox_on_hover(struct DjuiBase* base) {
|
||||
struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base;
|
||||
djui_base_set_border_color(&checkbox->rect->base, 0, 120, 215, 255);
|
||||
djui_base_set_color(&checkbox->text->base, 229, 241, 251, 255);
|
||||
djui_base_set_color(&checkbox->rectValue->base, 229, 241, 251, 255);
|
||||
}
|
||||
|
||||
static void djui_checkbox_on_hover_end(struct DjuiBase* base) {
|
||||
djui_checkbox_set_default_style(base);
|
||||
}
|
||||
|
||||
static void djui_checkbox_on_cursor_down_begin(struct DjuiBase* base, bool inputCursor) {
|
||||
struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base;
|
||||
djui_base_set_border_color(&checkbox->rect->base, 20, 170, 255, 255);
|
||||
djui_base_set_color(&checkbox->rect->base, 255, 255, 255, 32);
|
||||
djui_base_set_color(&checkbox->text->base, 229, 241, 251, 255);
|
||||
djui_base_set_color(&checkbox->rectValue->base, 255, 255, 255, 255);
|
||||
*checkbox->value = !(*checkbox->value);
|
||||
djui_base_set_visible(&checkbox->rectValue->base, *checkbox->value);
|
||||
}
|
||||
|
||||
static void djui_checkbox_on_cursor_down_end(struct DjuiBase* base) {
|
||||
struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base;
|
||||
djui_checkbox_set_default_style(base);
|
||||
}
|
||||
|
||||
static void djui_checkbox_on_focus_begin(struct DjuiBase* base) {
|
||||
struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base;
|
||||
djui_base_set_border_color(&checkbox->rect->base, 20, 170, 255, 255);
|
||||
djui_base_set_color(&checkbox->rect->base, 255, 255, 255, 32);
|
||||
djui_base_set_color(&checkbox->text->base, 229, 241, 251, 255);
|
||||
djui_base_set_color(&checkbox->rectValue->base, 255, 255, 255, 255);
|
||||
}
|
||||
|
||||
static void djui_checkbox_destroy(struct DjuiBase* base) {
|
||||
struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base;
|
||||
free(checkbox);
|
||||
}
|
||||
|
||||
struct DjuiCheckbox* djui_checkbox_create(struct DjuiBase* parent, const char* message, bool* value) {
|
||||
struct DjuiCheckbox* checkbox = malloc(sizeof(struct DjuiCheckbox));
|
||||
struct DjuiBase* base = &checkbox->base;
|
||||
|
||||
checkbox->value = value;
|
||||
|
||||
djui_base_init(parent, base, NULL, djui_checkbox_destroy);
|
||||
djui_interactable_create(base);
|
||||
djui_interactable_hook_hover(base, djui_checkbox_on_hover, djui_checkbox_on_hover_end);
|
||||
djui_interactable_hook_cursor_down(base, djui_checkbox_on_cursor_down_begin, NULL, djui_checkbox_on_cursor_down_end);
|
||||
|
||||
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_text_set_alignment(text, DJUI_HALIGN_LEFT, DJUI_VALIGN_BOTTOM);
|
||||
djui_text_set_drop_shadow(text, 120, 120, 120, 64);
|
||||
checkbox->text = text;
|
||||
|
||||
struct DjuiRect* rect = djui_rect_create(&checkbox->base);
|
||||
djui_base_set_alignment(&rect->base, DJUI_HALIGN_RIGHT, DJUI_VALIGN_CENTER);
|
||||
djui_base_set_size_type(&rect->base, DJUI_SVT_ASPECT_RATIO, DJUI_SVT_RELATIVE);
|
||||
djui_base_set_size(&rect->base, 1.0f, 1.0f);
|
||||
djui_base_set_color(&rect->base, 0, 0, 0, 0);
|
||||
djui_base_set_border_width(&rect->base, 2);
|
||||
checkbox->rect = rect;
|
||||
|
||||
struct DjuiRect* rectValue = djui_rect_create(&rect->base);
|
||||
djui_base_set_size_type(&rectValue->base, DJUI_SVT_RELATIVE, DJUI_SVT_RELATIVE);
|
||||
djui_base_set_size(&rectValue->base, 0.8f, 0.8f);
|
||||
djui_base_set_alignment(&rectValue->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER);
|
||||
djui_base_set_visible(&rectValue->base, *value);
|
||||
checkbox->rectValue = rectValue;
|
||||
|
||||
djui_checkbox_set_default_style(base);
|
||||
|
||||
return checkbox;
|
||||
}
|
||||
13
src/pc/djui/djui_checkbox.h
Normal file
13
src/pc/djui/djui_checkbox.h
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#pragma once
|
||||
#include "djui.h"
|
||||
|
||||
#pragma pack(1)
|
||||
struct DjuiCheckbox {
|
||||
struct DjuiBase base;
|
||||
struct DjuiRect* rect;
|
||||
struct DjuiRect* rectValue;
|
||||
struct DjuiText* text;
|
||||
bool* value;
|
||||
};
|
||||
|
||||
struct DjuiCheckbox* djui_checkbox_create(struct DjuiBase* parent, const char* message, bool* value);
|
||||
|
|
@ -128,7 +128,7 @@ void djui_cursor_update(void) {
|
|||
djui_base_set_location(&sMouseCursor->base, gCursorX - 13, gCursorY - 13);
|
||||
|
||||
// set cursor sprite
|
||||
if (mouse_window_buttons & 0b0001) {
|
||||
if ((gInteractablePad.button & PAD_BUTTON_A) || (mouse_window_buttons & MOUSE_BUTTON_1)) {
|
||||
djui_image_set_image(sMouseCursor, texture_hand_closed, 32, 32, 16);
|
||||
} else {
|
||||
djui_image_set_image(sMouseCursor, texture_hand_open, 32, 32, 16);
|
||||
|
|
|
|||
|
|
@ -6,11 +6,6 @@
|
|||
#include "src/pc/controller/controller_mouse.h"
|
||||
#include "src/pc/controller/controller_keyboard.h"
|
||||
|
||||
#define PAD_BUTTON_A ((u16)(1 << 15))
|
||||
#define PAD_BUTTON_B ((u16)(1 << 14))
|
||||
|
||||
#define MOUSE_BUTTON_1 ((u16)(1 << 0))
|
||||
|
||||
#define SCANCODE_UP 328
|
||||
#define SCANCODE_DOWN 336
|
||||
#define SCANCODE_LEFT 331
|
||||
|
|
|
|||
|
|
@ -2,6 +2,11 @@
|
|||
#include "djui.h"
|
||||
#include "djui_base.h"
|
||||
|
||||
#define PAD_BUTTON_A ((u16)(1 << 15))
|
||||
#define PAD_BUTTON_B ((u16)(1 << 14))
|
||||
|
||||
#define MOUSE_BUTTON_1 ((u16)(1 << 0))
|
||||
|
||||
#pragma pack(1)
|
||||
struct DjuiInteractable {
|
||||
bool enabled;
|
||||
|
|
|
|||
|
|
@ -108,4 +108,19 @@ void djui_panel_update(void) {
|
|||
activeBase->y.value = moveMax * smoothstep(0, moveMax, sMoveAmount) - moveMax;
|
||||
parentBase->y.value = activeBase->y.value + moveMax;
|
||||
}
|
||||
}
|
||||
|
||||
void djui_panel_shutdown(void) {
|
||||
struct DjuiPanel* panel = sPanelList;
|
||||
while (panel != NULL) {
|
||||
struct DjuiPanel* next = panel->parent;
|
||||
djui_base_destroy(panel->base);
|
||||
free(panel);
|
||||
panel = next;
|
||||
}
|
||||
|
||||
sPanelList = NULL;
|
||||
sPanelRemoving = NULL;
|
||||
sMoveAmount = 0;
|
||||
|
||||
}
|
||||
|
|
@ -4,3 +4,4 @@
|
|||
void djui_panel_add(struct DjuiBase* caller, struct DjuiBase* panelBase, struct DjuiBase* defaultElementBase);
|
||||
void djui_panel_back(void);
|
||||
void djui_panel_update(void);
|
||||
void djui_panel_shutdown(void);
|
||||
|
|
|
|||
86
src/pc/djui/djui_panel_camera.c
Normal file
86
src/pc/djui/djui_panel_camera.c
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
#include "djui.h"
|
||||
#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 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 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* 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* 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* 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* 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 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);
|
||||
button6->base.interactable->on_click = djui_panel_camera_back;
|
||||
}
|
||||
}
|
||||
|
||||
djui_panel_add(caller, &panel->base, &checkbox1->base);
|
||||
}
|
||||
4
src/pc/djui/djui_panel_camera.h
Normal file
4
src/pc/djui/djui_panel_camera.h
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#pragma once
|
||||
#include "djui.h"
|
||||
|
||||
void djui_panel_camera_create(struct DjuiBase* caller);
|
||||
|
|
@ -1,6 +1,12 @@
|
|||
#include "djui.h"
|
||||
#include "src/pc/controller/controller_sdl.h"
|
||||
|
||||
static void djui_panel_main_close(struct DjuiBase* caller) {
|
||||
gInteractableOverridePad = false;
|
||||
djui_panel_shutdown();
|
||||
djui_cursor_set_visible(false);
|
||||
}
|
||||
|
||||
void djui_panel_main_create(struct DjuiBase* caller) {
|
||||
f32 bodyHeight = 64 * 4 + 16 * 3;
|
||||
|
||||
|
|
@ -31,6 +37,7 @@ void djui_panel_main_create(struct DjuiBase* caller) {
|
|||
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);
|
||||
buttonHost->base.interactable->on_click = djui_panel_main_close;
|
||||
|
||||
struct DjuiButton* button2 = djui_button_create(&body->base, "Join");
|
||||
djui_base_set_size_type(&button2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE);
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ void djui_panel_options_create(struct DjuiBase* caller) {
|
|||
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);
|
||||
button2->base.interactable->on_click = 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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue