From e4972ddbe3f6aed114cd5876c18a3d1a106a50f5 Mon Sep 17 00:00:00 2001 From: Matthew Coppola Date: Wed, 4 Dec 2024 23:38:30 -0500 Subject: [PATCH 1/4] Allow adjusting sliders with mousescroll --- src/game/menuitem.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/game/menuitem.c b/src/game/menuitem.c index 914eeac22..e08f569ff 100644 --- a/src/game/menuitem.c +++ b/src/game/menuitem.c @@ -2608,6 +2608,12 @@ bool menuitemSliderTick(struct menuitem *item, struct menudialog *dialog, struct index = 0; } +#ifndef PLATFORM_N64 + if (g_MenuUsingMouse && inputs->mousescroll) { + index += -inputs->mousescroll; + } +#endif + if ((item->flags & MENUITEMFLAG_SLIDER_FAST) == 0 && g_Menus[g_MpPlayerNum].xrepeatmode == MENUREPEATMODE_SLOW) { index = index + inputs->leftright; From fbd9ef002e293b4d552fbd094044482b19151927 Mon Sep 17 00:00:00 2001 From: Matthew Coppola Date: Wed, 4 Dec 2024 23:39:41 -0500 Subject: [PATCH 2/4] Treat mousescroll as a mouse movement --- src/game/menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/menu.c b/src/game/menu.c index 970b62ddb..bec6ab807 100644 --- a/src/game/menu.c +++ b/src/game/menu.c @@ -4709,8 +4709,8 @@ void menuProcessInput(void) // ESC always acts as back inputs.back = inputKeyJustPressed(VK_ESCAPE); if (inputMouseIsEnabled() && !inputMouseIsLocked() && g_MenuMouseControl) { - inputs.mousemoved = inputMouseGetPosition(&inputs.mousex, &inputs.mousey); inputs.mousescroll = inputKeyPressed(VK_MOUSE_WHEEL_DN) - inputKeyPressed(VK_MOUSE_WHEEL_UP); + inputs.mousemoved = inputMouseGetPosition(&inputs.mousex, &inputs.mousey) || inputs.mousescroll; // aspect correct the X const f32 cx = ((f32)inputs.mousex - (f32)(SCREEN_WIDTH_LO / 2)) * (videoGetAspect() / SCREEN_ASPECT); inputs.mousex = (f32)(SCREEN_WIDTH_LO / 2) + cx; From a9752198c35ddd71440ff419c7428765fb439ea9 Mon Sep 17 00:00:00 2001 From: Matthew Coppola Date: Thu, 5 Dec 2024 00:47:15 -0500 Subject: [PATCH 3/4] Make mousescroll work effectively for fast sliders --- src/game/menuitem.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/game/menuitem.c b/src/game/menuitem.c index e08f569ff..ccd497189 100644 --- a/src/game/menuitem.c +++ b/src/game/menuitem.c @@ -2610,7 +2610,12 @@ bool menuitemSliderTick(struct menuitem *item, struct menudialog *dialog, struct #ifndef PLATFORM_N64 if (g_MenuUsingMouse && inputs->mousescroll) { - index += -inputs->mousescroll; + if ((item->flags & MENUITEMFLAG_SLIDER_FAST) == 0) { + index += -inputs->mousescroll; + } else { + s32 mult = item->param3 / 40; + index += -inputs->mousescroll * (mult ? mult : 1); + } } #endif From ea464ca6acb678a8232598226e475b24c1a3cbd3 Mon Sep 17 00:00:00 2001 From: Matthew Coppola Date: Thu, 5 Dec 2024 19:41:32 -0500 Subject: [PATCH 4/4] Allow dragging sliders with the mouse Additional code was introduced to handle edge cases. Sliders are always dimmed when clicked with the mouse, now. When the mouse button is release, dimmed mode is turned off. This was done to prevent adjacent slider items from being accidentally modified by moving the mouse over them with the left mouse button held down, as well as to allow proper functioning of deferred sliders with the mouse. --- src/game/menu.c | 18 ++++++++++++++++++ src/game/menuitem.c | 40 ++++++++++++++++++++++------------------ src/include/data.h | 3 +++ src/include/types.h | 5 +++-- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/game/menu.c b/src/game/menu.c index bec6ab807..1e9159cae 100644 --- a/src/game/menu.c +++ b/src/game/menu.c @@ -142,6 +142,9 @@ s32 g_MpPlayerNum = 0; s32 g_MenuMouseControl = true; s32 g_MenuUsingMouse = false; s32 g_MenuKeyboardPlayer = -1; +s32 g_AllowMouseHeld = true; +s32 g_MouseDimmedMode = false; +s32 g_MouseEndDeferredSlider = false; #endif void menuPlaySound(s32 menusound) @@ -1512,6 +1515,12 @@ void menuOpenDialog(struct menudialogdef *dialogdef, struct menudialog *dialog, void menuPushDialog(struct menudialogdef *dialogdef) { +#ifndef PLATFORM_N64 + // Prevent the mouse from immediately changing a slider's value, as was + // happening while entering the Audio menu. + g_AllowMouseHeld = false; +#endif + if (dialogdef) { menuUnsetModel(&g_Menus[g_MpPlayerNum].menumodel); @@ -4700,6 +4709,7 @@ void menuProcessInput(void) inputs.back2 = 0; #ifndef PLATFORM_N64 + inputs.mouseheld = false; inputs.mousemoved = false; inputs.mousescroll = 0; inputs.mousex = 0; @@ -4709,6 +4719,14 @@ void menuProcessInput(void) // ESC always acts as back inputs.back = inputKeyJustPressed(VK_ESCAPE); if (inputMouseIsEnabled() && !inputMouseIsLocked() && g_MenuMouseControl) { + inputs.mouseheld = inputKeyPressed(VK_MOUSE_LEFT); + if (!inputs.mouseheld) { + g_AllowMouseHeld = true; + if (g_MouseDimmedMode) { + g_MouseDimmedMode = false; + g_MouseEndDeferredSlider = true; + } + } inputs.mousescroll = inputKeyPressed(VK_MOUSE_WHEEL_DN) - inputKeyPressed(VK_MOUSE_WHEEL_UP); inputs.mousemoved = inputMouseGetPosition(&inputs.mousex, &inputs.mousey) || inputs.mousescroll; // aspect correct the X diff --git a/src/game/menuitem.c b/src/game/menuitem.c index ccd497189..72c24573a 100644 --- a/src/game/menuitem.c +++ b/src/game/menuitem.c @@ -2559,7 +2559,7 @@ bool menuitemSliderTick(struct menuitem *item, struct menudialog *dialog, struct if ((tickflags & MENUTICKFLAG_ITEMISFOCUSED)) { #ifndef PLATFORM_N64 - if (g_MenuUsingMouse && inputs->select) { + if (g_AllowMouseHeld && g_MenuUsingMouse && (inputs->select || inputs->mouseheld)) { // handle mouse struct menudialog *dialog = g_Menus[g_MpPlayerNum].curdialog; if (dialog) { @@ -2568,24 +2568,27 @@ bool menuitemSliderTick(struct menuitem *item, struct menudialog *dialog, struct const s32 size = right - left; const s32 delta = inputs->mousex - left; if (delta >= -8 && delta <= size + 8) { - index = (delta / (f32)size) * item->param3; - if (index < 0) { - index = 0; - } - if (index > item->param3) { - index = item->param3; - } - if (item->handler) { - if ((item->flags & MENUITEMFLAG_SLIDER_DEFERRED) && - (tickflags & MENUTICKFLAG_DIALOGISDIMMED)) { - deferredindex = index; - } else { - item->handler(MENUOP_GET, item, &handlerdata); - handlerdata.slider.value = index; - item->handler(MENUOP_SET, item, &handlerdata); + if ((tickflags & MENUTICKFLAG_DIALOGISDIMMED) == 0) { + g_MouseDimmedMode = true; + } else { + index = (delta / (f32)size) * item->param3; + if (index < 0) { + index = 0; } + if (index > item->param3) { + index = item->param3; + } + if (item->handler) { + if (item->flags & MENUITEMFLAG_SLIDER_DEFERRED) { + deferredindex = index; + } else { + item->handler(MENUOP_GET, item, &handlerdata); + handlerdata.slider.value = index; + item->handler(MENUOP_SET, item, &handlerdata); + } + } + return true; } - return true; } } } @@ -2702,7 +2705,8 @@ bool menuitemSliderTick(struct menuitem *item, struct menudialog *dialog, struct } } - if (inputs->select) { + if (inputs->select || g_MouseEndDeferredSlider) { + g_MouseEndDeferredSlider = false; if (item->flags & MENUITEMFLAG_SLIDER_DEFERRED) { deferredindex = -1; if (item->handler) { diff --git a/src/include/data.h b/src/include/data.h index d1bf537ca..0bc0f12b3 100644 --- a/src/include/data.h +++ b/src/include/data.h @@ -539,6 +539,9 @@ extern const struct weathercfg *g_CurWeatherConfig; extern s32 g_MenuUsingMouse; extern s32 g_MenuKeyboardPlayer; +extern s32 g_AllowMouseHeld; +extern s32 g_MouseDimmedMode; +extern s32 g_MouseEndDeferredSlider; extern f32 g_ViShakeIntensityMult; extern u32 g_TexFilter2D; diff --git a/src/include/types.h b/src/include/types.h index 58df9fd2e..1da61867b 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -4996,8 +4996,9 @@ struct menuinputs { /*0x10*/ s32 unk10; /*0x14*/ u8 unk14; #ifndef PLATFORM_N64 - /*0x15*/ u8 mousemoved; - /*0x16*/ s8 mousescroll; + /*0x15*/ u8 mouseheld; + /*0x16*/ u8 mousemoved; + /*0x17*/ s8 mousescroll; /*0x18*/ s32 mousex; /*0x1c*/ s32 mousey; #endif