From 17ef22875920219db61ed89e24811feee54585a0 Mon Sep 17 00:00:00 2001 From: Zection6V Date: Thu, 6 Mar 2025 11:25:19 +0900 Subject: [PATCH] Resolution of Input Configuration Dialog Display Issues Overview Fixed an issue where users with smaller display areas couldn't properly configure settings in the InputConfigDialog due to the dialog being too large. Solution Split the configuration interface into two separate tabs instead of displaying all items on a single tab. This change ensures proper functionality even on smaller displays. --- src/frontend/qt_sdl/EmuThread.cpp | 17 +++- .../qt_sdl/InputConfig/InputConfigDialog.cpp | 51 +++++++++++- .../qt_sdl/InputConfig/InputConfigDialog.h | 78 +++++++++++-------- .../qt_sdl/InputConfig/InputConfigDialog.ui | 18 +++++ 4 files changed, 130 insertions(+), 34 deletions(-) diff --git a/src/frontend/qt_sdl/EmuThread.cpp b/src/frontend/qt_sdl/EmuThread.cpp index d397ffce..37493c00 100644 --- a/src/frontend/qt_sdl/EmuThread.cpp +++ b/src/frontend/qt_sdl/EmuThread.cpp @@ -787,23 +787,36 @@ void EmuThread::run() bool enableAim = true; bool wasLastFrameFocused = false; + /** + * @brief Function to show or hide the cursor on MelonPrimeDS + * + * Controls the mouse cursor visibility state on MelonPrimeDS. Does nothing if + * the requested state is the same as the current state. When changing cursor + * visibility, uses Qt::QueuedConnection to safely execute on the UI thread. + * + * @param show true to show the cursor, false to hide it + */ auto showCursorOnMelonPrimeDS = [&](bool show) { + // Do nothing if the requested state is the same as current state (optimization) if (show == isCursorVisible) return; + // Get and verify panel exists auto* panel = emuInstance->getMainWindow()->panel; if (!panel) return; + // Use Qt::QueuedConnection to safely execute on the UI thread QMetaObject::invokeMethod(panel, [panel, show]() { + // Set cursor visibility (normal ArrowCursor or invisible BlankCursor) panel->setCursor(show ? Qt::ArrowCursor : Qt::BlankCursor); }, Qt::ConnectionType::QueuedConnection ); + // Record the state change isCursorVisible = show; }; - // #define STYLUS_MODE 1 // this is for stylus user #define INPUT_A 0 @@ -971,6 +984,8 @@ void EmuThread::run() (uint32_t(emuInstance->hotkeyDown(HK_MetroidMoveRight)) << 3); if (localCfg.GetBool("Metroid.Operation.SnapTap")) { + // SnapTap mode + // Detect newly pressed keys uint32_t newlyPressed = currentInputBitmap & ~lastInputBitmap; diff --git a/src/frontend/qt_sdl/InputConfig/InputConfigDialog.cpp b/src/frontend/qt_sdl/InputConfig/InputConfigDialog.cpp index 407ea9eb..79b807ce 100644 --- a/src/frontend/qt_sdl/InputConfig/InputConfigDialog.cpp +++ b/src/frontend/qt_sdl/InputConfig/InputConfigDialog.cpp @@ -49,14 +49,19 @@ InputConfigDialog::InputConfigDialog(QWidget* parent) : QDialog(parent), ui(new Config::Table keycfg = instcfg.GetTable("Keyboard"); Config::Table joycfg = instcfg.GetTable("Joystick"); + /* + * MelonPrimeDS remove DSKeypadTab for (int i = 0; i < keypad_num; i++) { const char* btn = EmuInstance::buttonNames[dskeyorder[i]]; keypadKeyMap[i] = keycfg.GetInt(btn); keypadJoyMap[i] = joycfg.GetInt(btn); } + */ int i = 0; + /* + * MelonPrimeDS remove SolarFunctionTab for (int hotkey : hk_addons) { const char* btn = EmuInstance::hotkeyNames[hotkey]; @@ -65,7 +70,9 @@ InputConfigDialog::InputConfigDialog(QWidget* parent) : QDialog(parent), ui(new i++; } + i = 0; + */ for (int hotkey : hk_general) { const char* btn = EmuInstance::hotkeyNames[hotkey]; @@ -74,7 +81,11 @@ InputConfigDialog::InputConfigDialog(QWidget* parent) : QDialog(parent), ui(new i++; } + /* + * MelonPrimeDS remove SolarFunctionTab populatePage(ui->tabAddons, hk_addons_labels, addonsKeyMap, addonsJoyMap); + */ + populatePage(ui->tabHotkeysGeneral, hk_general_labels, hkGeneralKeyMap, hkGeneralJoyMap); // MelonPrimeDS { // load Config @@ -92,8 +103,18 @@ InputConfigDialog::InputConfigDialog(QWidget* parent) : QDialog(parent), ui(new i++; } + i = 0; + for (int hotkey : hk_tabAddonsMetroid2) + { + const char* btn = EmuInstance::hotkeyNames[hotkey]; + addonsMetroid2KeyMap[i] = keycfg.GetInt(btn); + addonsMetroid2JoyMap[i] = joycfg.GetInt(btn); + i++; + } + // load labels populatePage(ui->tabAddonsMetroid, hk_tabAddonsMetroid_labels, addonsMetroidKeyMap, addonsMetroidJoyMap); + populatePage(ui->tabAddonsMetroid2, hk_tabAddonsMetroid2_labels, addonsMetroid2KeyMap, addonsMetroid2JoyMap); // Other Metroid Settings Tab @@ -122,7 +143,7 @@ InputConfigDialog::InputConfigDialog(QWidget* parent) : QDialog(parent), ui(new ui->cbxJoystick->setEnabled(false); } - setupKeypadPage(); + // setupKeypadPage(); //MelonPrimeDS remove DSKeypadConfig int inst = emuInstance->getInstanceID(); if (inst > 0) @@ -136,8 +157,11 @@ InputConfigDialog::~InputConfigDialog() delete ui; } +/* +* MelonPrimeDS remove DSKeypadConfig void InputConfigDialog::setupKeypadPage() { + return;// MelonPrimeDS remove DSKeypadConfig for (int i = 0; i < keypad_num; i++) { QPushButton* pushButtonKey = this->findChild(QStringLiteral("btnKey") + dskeylabels[i]); @@ -158,13 +182,15 @@ void InputConfigDialog::setupKeypadPage() } } } +*/ void InputConfigDialog::populatePage(QWidget* page, const std::initializer_list& labels, int* keymap, int* joymap) { // kind of a hack - bool ishotkey = (page != ui->tabInput); + bool ishotkey = true; // MelonPrimeDS remove DSKeypadConfig + //(page != ui->tabInput); // MelonPrimeDS remove DSKeypadConfig QHBoxLayout* main_layout = new QHBoxLayout(); @@ -216,14 +242,20 @@ void InputConfigDialog::on_InputConfigDialog_accepted() Config::Table keycfg = instcfg.GetTable("Keyboard"); Config::Table joycfg = instcfg.GetTable("Joystick"); + /* + * MelonPrimeDS remove DSKeypadTab for (int i = 0; i < keypad_num; i++) { const char* btn = EmuInstance::buttonNames[dskeyorder[i]]; keycfg.SetInt(btn, keypadKeyMap[i]); joycfg.SetInt(btn, keypadJoyMap[i]); } + */ + int i = 0; + /* + * MelonPrimeDS remove SolarFunctionTab for (int hotkey : hk_addons) { const char* btn = EmuInstance::hotkeyNames[hotkey]; @@ -232,7 +264,9 @@ void InputConfigDialog::on_InputConfigDialog_accepted() i++; } + i = 0; + */ for (int hotkey : hk_general) { const char* btn = EmuInstance::hotkeyNames[hotkey]; @@ -254,6 +288,16 @@ void InputConfigDialog::on_InputConfigDialog_accepted() i++; } + i = 0; + for (int hotkey : hk_tabAddonsMetroid2) + { + const char* btn = EmuInstance::hotkeyNames[hotkey]; + keycfg.SetInt(btn, addonsMetroid2KeyMap[i]); + joycfg.SetInt(btn, addonsMetroid2JoyMap[i]); + i++; + } + + // Sensitivities instcfg.SetInt("Metroid.Sensitivity.Aim", ui->metroidAimSensitvitySpinBox->value()); instcfg.SetBool("Metroid.Operation.SnapTap", ui->cbMetroidEnableSnapTap->checkState() == Qt::Checked); @@ -276,6 +320,8 @@ void InputConfigDialog::on_InputConfigDialog_rejected() closeDlg(); } +/* + * MelonPrimeDS remove DSKeypadConfig void InputConfigDialog::on_btnKeyMapSwitch_clicked() { ui->stackMapping->setCurrentIndex(0); @@ -285,6 +331,7 @@ void InputConfigDialog::on_btnJoyMapSwitch_clicked() { ui->stackMapping->setCurrentIndex(1); } +*/ void InputConfigDialog::on_cbxJoystick_currentIndexChanged(int id) { diff --git a/src/frontend/qt_sdl/InputConfig/InputConfigDialog.h b/src/frontend/qt_sdl/InputConfig/InputConfigDialog.h index 4dc5d3b0..522d62dd 100644 --- a/src/frontend/qt_sdl/InputConfig/InputConfigDialog.h +++ b/src/frontend/qt_sdl/InputConfig/InputConfigDialog.h @@ -91,32 +91,22 @@ static constexpr std::initializer_list hk_tabAddonsMetroid = HK_MetroidMoveBack, HK_MetroidMoveLeft, HK_MetroidMoveRight, - HK_MetroidJump, - HK_MetroidMorphBall, - HK_MetroidZoom, - HK_MetroidHoldMorphBallBoost, - HK_MetroidScanVisor, - HK_MetroidUILeft, - HK_MetroidUIRight, - HK_MetroidUIOk, - HK_MetroidUIYes, - HK_MetroidUINo, HK_MetroidShootScan, HK_MetroidScanShoot, + HK_MetroidZoom, + HK_MetroidJump, + HK_MetroidMorphBall, + HK_MetroidHoldMorphBallBoost, HK_MetroidWeaponBeam, HK_MetroidWeaponMissile, - HK_MetroidWeaponSpecial, - HK_MetroidWeaponNext, - HK_MetroidWeaponPrevious, HK_MetroidWeapon1, HK_MetroidWeapon2, HK_MetroidWeapon3, HK_MetroidWeapon4, HK_MetroidWeapon5, HK_MetroidWeapon6, + HK_MetroidWeaponSpecial, HK_MetroidMenu, - HK_MetroidIngameSensiUp, - HK_MetroidIngameSensiDown }; @@ -126,35 +116,57 @@ static constexpr std::initializer_list hk_tabAddonsMetroid_labels = "[Metroid] (S) Move Back", "[Metroid] (A) Move Left", "[Metroid] (D) Move Right", - "[Metroid] (Space) Jump", - "[Metroid] (L. Ctrl) Transform", - "[Metroid] (Mouse Right) Imperialist Zoom, Map Zoom Out, Morph Ball Boost", - "[Metroid] (Shift) Hold to Fast Morph Ball Boost", - "[Metroid] (C) Scan Visor", - "[Metroid] (Z) UI Left (Adventure Left Arrow / Hunter License L)", - "[Metroid] (X) UI Right (Adventure Right Arrow / Hunter License R)", - "[Metroid] (F) UI Ok", - "[Metroid] (G) UI Yes (Enter Starship)", - "[Metroid] (H) UI No (Enter Starship)", "[Metroid] (Mouse Left) Shoot/Scan, Map Zoom In", "[Metroid] (V) Scan/Shoot, Map Zoom In", + "[Metroid] (Mouse Right) Imperialist Zoom, Map Zoom Out, Morph Ball Boost", + "[Metroid] (Space) Jump", + "[Metroid] (L. Ctrl) Transform", + "[Metroid] (Shift) Hold to Fast Morph Ball Boost", "[Metroid] (Mouse 5, Side Top) Weapon Beam", "[Metroid] (Mouse 4, Side Bottom) Weapon Missile", - "[Metroid] (R) SpecialWeapon (Last used Weapon, Omega cannon)", - "[Metroid] (J) Next Weapon in the sorted order", - "[Metroid] (K) Previous Weapon in the sorted order", "[Metroid] (1) Weapon 1", "[Metroid] (2) Weapon 2", "[Metroid] (3) Weapon 3", "[Metroid] (4) Weapon 4", "[Metroid] (5) Weapon 5", "[Metroid] (6) Weapon 6", + "[Metroid] (R) SpecialWeapon (Last used Weapon, Omega cannon)", "[Metroid] (Tab) Menu/Map", - "[Metroid] (PgUp) AimSensitivity Up", - "[Metroid] (PgDown) AimSensitivity Down" }; static_assert(hk_tabAddonsMetroid.size() == hk_tabAddonsMetroid_labels.size()); + + +static constexpr std::initializer_list hk_tabAddonsMetroid2 = +{ + HK_MetroidIngameSensiUp, + HK_MetroidIngameSensiDown, + HK_MetroidWeaponNext, + HK_MetroidWeaponPrevious, + HK_MetroidScanVisor, + HK_MetroidUILeft, + HK_MetroidUIRight, + HK_MetroidUIOk, + HK_MetroidUIYes, + HK_MetroidUINo, +}; + +static constexpr std::initializer_list hk_tabAddonsMetroid2_labels = +{ + + "[Metroid] (PgUp) AimSensitivity Up", + "[Metroid] (PgDown) AimSensitivity Down", + "[Metroid] (J) Next Weapon in the sorted order", + "[Metroid] (K) Previous Weapon in the sorted order", + "[Metroid] (C) Scan Visor", + "[Metroid] (Z) UI Left (Adventure Left Arrow / Hunter License L)", + "[Metroid] (X) UI Right (Adventure Right Arrow / Hunter License R)", + "[Metroid] (F) UI Ok", + "[Metroid] (G) UI Yes (Enter Starship)", + "[Metroid] (H) UI No (Enter Starship)", +}; + +static_assert(hk_tabAddonsMetroid2.size() == hk_tabAddonsMetroid2_labels.size()); // } MelonPrimeDS @@ -198,8 +210,11 @@ private slots: void on_InputConfigDialog_accepted(); void on_InputConfigDialog_rejected(); + /* + * MelonPrimeDS remove DSKeypadConfig void on_btnKeyMapSwitch_clicked(); void on_btnJoyMapSwitch_clicked(); + */ void on_cbxJoystick_currentIndexChanged(int id); /* MelonPrimeDS { */ @@ -216,7 +231,7 @@ private: void populatePage(QWidget* page, const std::initializer_list& labels, int* keymap, int* joymap); - void setupKeypadPage(); + // void setupKeypadPage(); // MelonPrimeDS remove DSKeypadConfig Ui::InputConfigDialog* ui; @@ -225,6 +240,7 @@ private: int keypadKeyMap[12], keypadJoyMap[12]; int addonsKeyMap[hk_addons.size()], addonsJoyMap[hk_addons.size()]; int addonsMetroidKeyMap[hk_tabAddonsMetroid.size()], addonsMetroidJoyMap[hk_tabAddonsMetroid.size()]; // MelonPrimeDS + int addonsMetroid2KeyMap[hk_tabAddonsMetroid2.size()], addonsMetroid2JoyMap[hk_tabAddonsMetroid2.size()]; // MelonPrimeDS int hkGeneralKeyMap[hk_general.size()], hkGeneralJoyMap[hk_general.size()]; int joystickID; }; diff --git a/src/frontend/qt_sdl/InputConfig/InputConfigDialog.ui b/src/frontend/qt_sdl/InputConfig/InputConfigDialog.ui index ba134810..f0526983 100644 --- a/src/frontend/qt_sdl/InputConfig/InputConfigDialog.ui +++ b/src/frontend/qt_sdl/InputConfig/InputConfigDialog.ui @@ -35,6 +35,8 @@ 0 + + + General hotkeys @@ -2286,6 +2293,13 @@ + + + + Add-ons (Metroid) 2 + + + @@ -2428,6 +2442,8 @@ + +