From 7e960bc02fffc1cef395cb5acf0cb24b766d3828 Mon Sep 17 00:00:00 2001 From: iZePlayz <69536095+iZePlayzYT@users.noreply.github.com> Date: Sat, 22 Nov 2025 19:39:12 +0100 Subject: [PATCH] added slider fine adjustment --- lang/Czech.ini | 2 + lang/Dutch.ini | 2 + lang/English.ini | 2 + lang/French.ini | 2 + lang/German.ini | 2 + lang/Italian.ini | 2 + lang/Japanese.ini | 2 + lang/Polish.ini | 2 + lang/Portuguese.ini | 2 + lang/Russian.ini | 2 + lang/Spanish.ini | 2 + src/pc/djui/djui_interactable.c | 26 ++++++++++++ src/pc/djui/djui_panel_chat.c | 75 ++++++++++++++++++++++++++++----- src/pc/djui/djui_panel_chat.h | 1 + 14 files changed, 113 insertions(+), 11 deletions(-) diff --git a/lang/Czech.ini b/lang/Czech.ini index 8cc02ee87..3a9634340 100644 --- a/lang/Czech.ini +++ b/lang/Czech.ini @@ -355,6 +355,8 @@ CHAT_CLOSED_MODE = "Zobrazit historii chatu" CHAT_CLOSED_DISABLED = "Skrytý" CHAT_CLOSED_LIFETIME = "Skrýt po: %us" CHAT_CLOSED_ALWAYS = "Vždy viditelný" +CHAT_SHIFT_HINT = "Podržte Shift pro jemné nastavení" +CHAT_SHIFT_HINT_ACTIVE = "Jemné nastavení aktivní" [INFORMATION] INFORMATION_TITLE = "INFORMACE" diff --git a/lang/Dutch.ini b/lang/Dutch.ini index e1bf057c8..a6de072b1 100644 --- a/lang/Dutch.ini +++ b/lang/Dutch.ini @@ -355,6 +355,8 @@ CHAT_CLOSED_MODE = "Chatgeschiedenis tonen" CHAT_CLOSED_DISABLED = "Verborgen" CHAT_CLOSED_LIFETIME = "Verbergen na: %us" CHAT_CLOSED_ALWAYS = "Altijd zichtbaar" +CHAT_SHIFT_HINT = "Houd Shift ingedrukt voor fijne aanpassing" +CHAT_SHIFT_HINT_ACTIVE = "Fijne aanpassing actief" [INFORMATION] INFORMATION_TITLE = "INFORMATIE" diff --git a/lang/English.ini b/lang/English.ini index baa96a339..6cc3161c2 100644 --- a/lang/English.ini +++ b/lang/English.ini @@ -354,6 +354,8 @@ CHAT_CLOSED_MODE = "Show Chat History" CHAT_CLOSED_DISABLED = "Hide immediately" CHAT_CLOSED_LIFETIME = "Fade after: %us" CHAT_CLOSED_ALWAYS = "Always visible" +CHAT_SHIFT_HINT = "Hold Shift for fine adjustment" +CHAT_SHIFT_HINT_ACTIVE = "Fine adjustment active" [INFORMATION] INFORMATION_TITLE = "INFO" diff --git a/lang/French.ini b/lang/French.ini index 008e54c49..739f90825 100644 --- a/lang/French.ini +++ b/lang/French.ini @@ -355,6 +355,8 @@ CHAT_CLOSED_MODE = "Afficher l'historique du chat" CHAT_CLOSED_DISABLED = "Masqué" CHAT_CLOSED_LIFETIME = "Masquer après : %us" CHAT_CLOSED_ALWAYS = "Toujours visible" +CHAT_SHIFT_HINT = "Maintenir Shift pour réglage fin" +CHAT_SHIFT_HINT_ACTIVE = "Réglage fin actif" [INFORMATION] INFORMATION_TITLE = "INFORMATION" diff --git a/lang/German.ini b/lang/German.ini index ad416e9e1..2abca8ec1 100644 --- a/lang/German.ini +++ b/lang/German.ini @@ -355,6 +355,8 @@ CHAT_CLOSED_MODE = "Chatverlauf anzeigen" CHAT_CLOSED_DISABLED = "Sofort ausblenden" CHAT_CLOSED_LIFETIME = "Ausblenden nach: %us" CHAT_CLOSED_ALWAYS = "Dauerhaft anzeigen" +CHAT_SHIFT_HINT = "Shift für Feinjustierung gedrückt halten" +CHAT_SHIFT_HINT_ACTIVE = "Feinjustierung aktiv" [INFORMATION] INFORMATION_TITLE = "INFORMATION" diff --git a/lang/Italian.ini b/lang/Italian.ini index adb7cc196..ca3ca2251 100644 --- a/lang/Italian.ini +++ b/lang/Italian.ini @@ -353,6 +353,8 @@ CHAT_CLOSED_MODE = "Mostrare la cronologia della chat" CHAT_CLOSED_DISABLED = "Disattivata" CHAT_CLOSED_LIFETIME = "Nascondi dopo: %us" CHAT_CLOSED_ALWAYS = "Sempre visibile" +CHAT_SHIFT_HINT = "Tieni premuto Shift per regolazione fine" +CHAT_SHIFT_HINT_ACTIVE = "Regolazione fine attiva" [INFORMATION] INFORMATION_TITLE = "INFO" diff --git a/lang/Japanese.ini b/lang/Japanese.ini index 4def7bdff..03298daea 100644 --- a/lang/Japanese.ini +++ b/lang/Japanese.ini @@ -356,6 +356,8 @@ CHAT_CLOSED_MODE = "チャット履歴の表示" CHAT_CLOSED_DISABLED = "非表示" CHAT_CLOSED_LIFETIME = "非表示まで: %us" CHAT_CLOSED_ALWAYS = "常に表示" +CHAT_SHIFT_HINT = "微調整にはShiftキーを押し続けてください" +CHAT_SHIFT_HINT_ACTIVE = "微調整が有効です" [INFORMATION] INFORMATION_TITLE = "INFO" diff --git a/lang/Polish.ini b/lang/Polish.ini index 44d3c57a7..d4fa0ec3f 100644 --- a/lang/Polish.ini +++ b/lang/Polish.ini @@ -355,6 +355,8 @@ CHAT_CLOSED_MODE = "Wyświetlanie historii czatu" CHAT_CLOSED_DISABLED = "Wyłączony" CHAT_CLOSED_LIFETIME = "Ukryj po: %us" CHAT_CLOSED_ALWAYS = "Zawsze widoczny" +CHAT_SHIFT_HINT = "Przytrzymaj Shift dla precyzyjnej regulacji" +CHAT_SHIFT_HINT_ACTIVE = "Precyzyjna regulacja aktywna" [INFORMATION] INFORMATION_TITLE = "INFORMACJA" diff --git a/lang/Portuguese.ini b/lang/Portuguese.ini index bd0fb35ec..1f6bc16be 100644 --- a/lang/Portuguese.ini +++ b/lang/Portuguese.ini @@ -355,6 +355,8 @@ CHAT_CLOSED_MODE = "Exibir histórico do chat" CHAT_CLOSED_DISABLED = "Oculto" CHAT_CLOSED_LIFETIME = "Ocultar após: %us" CHAT_CLOSED_ALWAYS = "Sempre visível" +CHAT_SHIFT_HINT = "Mantenha Shift pressionado para ajuste fino" +CHAT_SHIFT_HINT_ACTIVE = "Ajuste fino ativo" [INFORMATION] INFORMATION_TITLE = "INFORMAÇÃO" diff --git a/lang/Russian.ini b/lang/Russian.ini index a3d8d8066..a6f31b631 100644 --- a/lang/Russian.ini +++ b/lang/Russian.ini @@ -353,6 +353,8 @@ CHAT_CLOSED_MODE = "Показывать историю чата" CHAT_CLOSED_DISABLED = "Скрыт" CHAT_CLOSED_LIFETIME = "Скрывать через: %us" CHAT_CLOSED_ALWAYS = "Всегда виден" +CHAT_SHIFT_HINT = "Удерживайте Shift для точной настройки" +CHAT_SHIFT_HINT_ACTIVE = "Точная настройка активна" [INFORMATION] INFORMATION_TITLE = "INFORMATION" diff --git a/lang/Spanish.ini b/lang/Spanish.ini index 65f34a14f..e036c063b 100644 --- a/lang/Spanish.ini +++ b/lang/Spanish.ini @@ -355,6 +355,8 @@ CHAT_CLOSED_MODE = "Mostrar historial de chat" CHAT_CLOSED_DISABLED = "Oculto" CHAT_CLOSED_LIFETIME = "Ocultar tras: %us" CHAT_CLOSED_ALWAYS = "Siempre visible" +CHAT_SHIFT_HINT = "Mantén presionado Shift para ajuste fino" +CHAT_SHIFT_HINT_ACTIVE = "Ajuste fino activo" [INFORMATION] INFORMATION_TITLE = "INFORMACIÓN" diff --git a/src/pc/djui/djui_interactable.c b/src/pc/djui/djui_interactable.c index e3984e6e3..95b4d650b 100644 --- a/src/pc/djui/djui_interactable.c +++ b/src/pc/djui/djui_interactable.c @@ -4,6 +4,7 @@ #include "djui_panel_pause.h" #include "djui_panel_modlist.h" #include "djui_panel_playerlist.h" +#include "djui_panel_chat.h" #include "pc/controller/controller_sdl.h" #include "pc/controller/controller_mouse.h" @@ -198,6 +199,19 @@ bool djui_interactable_on_key_down(int scancode) { return true; } + switch (scancode) { + case SCANCODE_SHIFT_LEFT: gDjuiInputHeldShift |= (1 << 0); break; + case SCANCODE_SHIFT_RIGHT: gDjuiInputHeldShift |= (1 << 1); break; + case SCANCODE_CONTROL_LEFT: gDjuiInputHeldControl |= (1 << 0); break; + case SCANCODE_CONTROL_RIGHT: gDjuiInputHeldControl |= (1 << 1); break; + case SCANCODE_ALT_LEFT: gDjuiInputHeldAlt |= (1 << 0); break; + case SCANCODE_ALT_RIGHT: gDjuiInputHeldAlt |= (1 << 1); break; + } + + if ((scancode == SCANCODE_SHIFT_LEFT || scancode == SCANCODE_SHIFT_RIGHT) && djui_panel_is_active()) { + djui_panel_chat_update_shift_hint(); + } + bool keyFocused = (gInteractableFocus != NULL) && (gInteractableFocus->interactable != NULL) && (gInteractableFocus->interactable->on_key_down != NULL); @@ -285,6 +299,18 @@ bool djui_interactable_on_key_down(int scancode) { } void djui_interactable_on_key_up(int scancode) { + switch (scancode) { + case SCANCODE_SHIFT_LEFT: gDjuiInputHeldShift &= ~(1 << 0); break; + case SCANCODE_SHIFT_RIGHT: gDjuiInputHeldShift &= ~(1 << 1); break; + case SCANCODE_CONTROL_LEFT: gDjuiInputHeldControl &= ~(1 << 0); break; + case SCANCODE_CONTROL_RIGHT: gDjuiInputHeldControl &= ~(1 << 1); break; + case SCANCODE_ALT_LEFT: gDjuiInputHeldAlt &= ~(1 << 0); break; + case SCANCODE_ALT_RIGHT: gDjuiInputHeldAlt &= ~(1 << 1); break; + } + + if ((scancode == SCANCODE_SHIFT_LEFT || scancode == SCANCODE_SHIFT_RIGHT) && djui_panel_is_active()) { + djui_panel_chat_update_shift_hint(); + } bool keyFocused = (gInteractableFocus != NULL) && (gInteractableFocus->interactable != NULL) diff --git a/src/pc/djui/djui_panel_chat.c b/src/pc/djui/djui_panel_chat.c index 2ff09448b..7607694e5 100644 --- a/src/pc/djui/djui_panel_chat.c +++ b/src/pc/djui/djui_panel_chat.c @@ -46,6 +46,21 @@ static struct DjuiButton* sResetUseStdChatButton = NULL; static struct DjuiButton* sResetCharCounterButton = NULL; static struct DjuiButton* sResetClosedModeButton = NULL; +static f32 sChatSliderLastCursorX = 0.0f; +static bool sChatSliderFineAdjust = false; +static struct DjuiText* sChatShiftHintText = NULL; + +void djui_panel_chat_update_shift_hint(void) { + if (sChatShiftHintText == NULL) { return; } + if (gDjuiInputHeldShift) { + djui_text_set_text(sChatShiftHintText, DLANG(CHAT_OPTIONS, CHAT_SHIFT_HINT_ACTIVE)); + djui_base_set_color(&sChatShiftHintText->base, 255, 165, 0, 255); + } else { + djui_text_set_text(sChatShiftHintText, DLANG(CHAT_OPTIONS, CHAT_SHIFT_HINT)); + djui_base_set_color(&sChatShiftHintText->base, 128, 128, 128, 255); + } +} + static void djui_panel_chat_update_lifetime_slider_enabled(void); static void djui_panel_chat_update_closed_mode_lifetime_label(void); @@ -199,20 +214,41 @@ static void djui_panel_chat_slider_on_cursor_down(struct DjuiBase* base) { u32 min = slider->min; u32 max = slider->max; u32* value = slider->value; - f32 x = slider->rect->base.elem.x; - f32 w = slider->rect->base.elem.width; - f32 cursorX = gCursorX; - cursorX = fmax(cursorX, x); - cursorX = fmin(cursorX, x + w); - f32 t = 0.0f; - if (w > 0.0f) { - t = (cursorX - x) / w; + sChatSliderFineAdjust = (gDjuiInputHeldShift != 0); + djui_panel_chat_update_shift_hint(); + + int newValue = (int)*value; + + if (sChatSliderFineAdjust) { + f32 w = slider->rect->base.elem.width; + if (w <= 0.0f) { w = 1.0f; } + + f32 baseStepPerPixel = (f32)(max - min) / w; + f32 fineStepPerPixel = baseStepPerPixel * 0.1f; + + f32 cursorX = gCursorX; + f32 deltaX = cursorX - sChatSliderLastCursorX; + sChatSliderLastCursorX = cursorX; + + newValue = (int)((f32)newValue + deltaX * fineStepPerPixel + 0.5f); + } else { + f32 x = slider->rect->base.elem.x; + f32 w = slider->rect->base.elem.width; + f32 cursorX = gCursorX; + cursorX = fmax(cursorX, x); + cursorX = fmin(cursorX, x + w); + + f32 t = 0.0f; + if (w > 0.0f) { + t = (cursorX - x) / w; + } + if (t < 0.0f) t = 0.0f; + if (t > 1.0f) t = 1.0f; + + newValue = (int)(t * (f32)(max - min) + 0.5f) + (int)min; } - if (t < 0.0f) t = 0.0f; - if (t > 1.0f) t = 1.0f; - int newValue = (int)(t * (f32)(max - min) + 0.5f) + (int)min; if (newValue < (int)min) newValue = (int)min; if (newValue > (int)max) newValue = (int)max; *value = (u32)newValue; @@ -230,6 +266,9 @@ static void djui_panel_chat_slider_on_cursor_down_begin(struct DjuiBase* base, b if (inputCursor) { djui_interactable_set_input_focus(base); } else { + sChatSliderLastCursorX = gCursorX; + sChatSliderFineAdjust = (gDjuiInputHeldShift != 0); + djui_panel_chat_update_shift_hint(); slider->base.interactable->on_cursor_down = djui_panel_chat_slider_on_cursor_down; } } else { @@ -240,6 +279,8 @@ static void djui_panel_chat_slider_on_cursor_down_begin(struct DjuiBase* base, b static void djui_panel_chat_slider_on_cursor_down_end(struct DjuiBase* base) { struct DjuiSlider* slider = (struct DjuiSlider*)base; slider->base.interactable->on_cursor_down = NULL; + sChatSliderFineAdjust = false; + djui_panel_chat_update_shift_hint(); } static void djui_panel_chat_on_width_slider_change(UNUSED struct DjuiBase* b) { @@ -566,6 +607,18 @@ void djui_panel_chat_create(struct DjuiBase* caller) { djui_panel_chat_update_lifetime_slider_enabled(); djui_panel_chat_update_reset_buttons(); + struct DjuiRect* rowShiftHint = djui_rect_container_create(body, 32); + djui_base_set_color(&rowShiftHint->base, 0, 0, 0, 0); + + sChatShiftHintText = djui_text_create(&rowShiftHint->base, ""); + djui_base_set_alignment(&sChatShiftHintText->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + djui_base_set_size_type(&sChatShiftHintText->base, DJUI_SVT_RELATIVE, DJUI_SVT_RELATIVE); + djui_base_set_size(&sChatShiftHintText->base, 1.0f, 1.0f); + djui_text_set_alignment(sChatShiftHintText, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + djui_text_set_drop_shadow(sChatShiftHintText, 64, 64, 64, 100); + djui_base_set_visible(&sChatShiftHintText->base, true); + djui_panel_chat_update_shift_hint(); + djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back); } diff --git a/src/pc/djui/djui_panel_chat.h b/src/pc/djui/djui_panel_chat.h index 2aec51a3f..9d42ef17e 100644 --- a/src/pc/djui/djui_panel_chat.h +++ b/src/pc/djui/djui_panel_chat.h @@ -2,5 +2,6 @@ #include "djui.h" void djui_panel_chat_create(struct DjuiBase* caller); +void djui_panel_chat_update_shift_hint(void);