added slider fine adjustment

This commit is contained in:
iZePlayz 2025-11-22 19:39:12 +01:00
parent 1a41b4a583
commit 7e960bc02f
14 changed files with 113 additions and 11 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -2,5 +2,6 @@
#include "djui.h"
void djui_panel_chat_create(struct DjuiBase* caller);
void djui_panel_chat_update_shift_hint(void);