diff --git a/src/citra_qt/citra_qt.cpp b/src/citra_qt/citra_qt.cpp index 51e204200..6e78d0826 100644 --- a/src/citra_qt/citra_qt.cpp +++ b/src/citra_qt/citra_qt.cpp @@ -499,6 +499,7 @@ void GMainWindow::InitializeWidgets() { action_secondary_rotate_screen = new QAction(secondary_window); game_list = new GameList(*play_time_manager, this); + ui->horizontalLayout->addWidget(game_list); game_list_placeholder = new GameListPlaceholder(this); @@ -780,15 +781,13 @@ void GMainWindow::InitializeHotkeys() { hotkey_registry.LoadHotkeys(); hotkey_registry.buttonMonitor.start(16); LOG_DEBUG(Frontend, "Initializing hotkeys"); - const QString main_window = QStringLiteral("Main Window"); const QString fullscreen = QStringLiteral("Fullscreen"); - // QAction Hotkeys const auto link_action_shortcut = [&](QAction* action, const QString& action_name, - const bool primary_only = false) { - static const QString main_window = QStringLiteral("Main Window"); - auto context = hotkey_registry.GetShortcutContext(main_window, action_name); - auto shortcut = hotkey_registry.GetKeySequence(main_window, action_name); + const bool primary_only = false, + const QString group = QStringLiteral("Main Window")) { + auto context = hotkey_registry.GetShortcutContext(group, action_name); + auto shortcut = hotkey_registry.GetKeySequence(group, action_name); action->setShortcut(shortcut); action->setShortcutContext(context); action->setAutoRepeat(false); @@ -837,9 +836,13 @@ void GMainWindow::InitializeHotkeys() { link_action_shortcut(ui->action_Leave_Room, QStringLiteral("Multiplayer Leave Room")); // QShortcut Hotkeys - const auto connect_shortcut = [&](const QString& action_name, const auto& function) { - const auto* hotkey = hotkey_registry.GetHotkey(main_window, action_name, this); - connect(hotkey, &QShortcut::activated, this, function); + const auto connect_shortcut = [&](const QString& action_name, const auto& function, + const QString& group = QStringLiteral("Main Window"), + QObject* parent = nullptr) { + if (parent == nullptr) + parent = this; + const auto* hotkey = hotkey_registry.GetHotkey(group, action_name, parent); + connect(hotkey, &QShortcut::activated, parent, function); }; connect_shortcut(QStringLiteral("Toggle Screen Layout"), &GMainWindow::ToggleScreenLayout); @@ -900,6 +903,36 @@ void GMainWindow::InitializeHotkeys() { } }); + // Navigation Actions - send keyboard shortcuts from controller buttons, but only when + // a game window is NOT in focus + const auto connect_navigation_shortcut = + [&](const QString& action_name, Qt::Key key, Qt::KeyboardModifier mod = Qt::NoModifier, + const QString& group = QStringLiteral("Navigation"), QObject* parent = nullptr) { + if (parent == nullptr) + parent = this; + const auto* hotkey = hotkey_registry.GetHotkey(group, action_name, parent); + connect(hotkey, &QShortcut::activated, this, [this, key, mod] { + if (QApplication::focusWidget() == render_window || + QApplication::focusWidget() == secondary_window) + return; + QKeyEvent press(QEvent::KeyPress, key, mod); + QKeyEvent release(QEvent::KeyRelease, key, mod); + QApplication::sendEvent(QApplication::focusWidget(), &press); + QApplication::sendEvent(QApplication::focusWidget(), &release); + }); + }; + + // TODO: Improve keyboard navigation everywhere so these actually work everywhere + connect_navigation_shortcut(QStringLiteral("Move down (Down Arrow)"), Qt::Key_Down); + connect_navigation_shortcut(QStringLiteral("Move up (Up Arrow)"), Qt::Key_Up); + connect_navigation_shortcut(QStringLiteral("Move left (Left Arrow)"), Qt::Key_Left); + connect_navigation_shortcut(QStringLiteral("Move right (Right Arrow)"), Qt::Key_Right); + connect_navigation_shortcut(QStringLiteral("Confirm / Run game (Enter)"), Qt::Key_Enter); + connect_navigation_shortcut(QStringLiteral("Go back / Cancel (Esc)"), Qt::Key_Escape); + connect_navigation_shortcut(QStringLiteral("Change Focus Forward (Tab)"), Qt::Key_Tab); + connect_navigation_shortcut(QStringLiteral("Change Focus Backward (Shift+Tab)"), Qt::Key_Tab, + Qt::ShiftModifier); + // Secondary Window QAction Hotkeys const auto add_secondary_window_hotkey = [this](QAction* action, QKeySequence hotkey, const char* slot) { diff --git a/src/citra_qt/citra_qt.h b/src/citra_qt/citra_qt.h index cdf9eaff6..523d001b5 100644 --- a/src/citra_qt/citra_qt.h +++ b/src/citra_qt/citra_qt.h @@ -171,6 +171,7 @@ private: bool LoadROM(const QString& filename); void BootGame(const QString& filename); void ShutdownGame(); + std::vector> m_test_hotkeys; #ifdef USE_DISCORD_PRESENCE void SetDiscordEnabled(bool state); @@ -371,6 +372,7 @@ private: // Hotkeys bool turbo_mode_active = false; + std::vector> nav_hotkeys; // Whether emulation is currently running in Citra. bool emulation_running = false; diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp index 2b3e86cc8..762ef4196 100644 --- a/src/citra_qt/configuration/config.cpp +++ b/src/citra_qt/configuration/config.cpp @@ -52,50 +52,69 @@ const std::array, Settings::NativeAnalog::NumAnalogs> QtConfi }, }}; -// This shouldn't have anything except static initializers (no functions). So -// QKeySequence(...).toString() is NOT ALLOWED HERE. -// This must be in alphabetical order according to action name as it must have the same order as -// UISetting::values.shortcuts, which is alphabetically ordered. +// These will be alphabetized when displayed, but the order doesn't matter here. +// All hotkeys left at default context of Qt::ApplicationShortcut for now +// TODO: determine if some hotkeys should only be applied in certain widgets and update group and +// context + // clang-format off -const std::array QtConfig::default_hotkeys {{ - {QStringLiteral("Advance Frame"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Audio Mute/Unmute"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+M"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Audio Volume Down"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Audio Volume Up"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Capture Screenshot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+P"), QStringLiteral(""), Qt::WidgetWithChildrenShortcut}}, - {QStringLiteral("Continue/Pause Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F4"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Decrease 3D Factor"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+-"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Decrease Speed Limit"), QStringLiteral("Main Window"), {QStringLiteral("-"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Exit Azahar"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+Q"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Exit Fullscreen"), QStringLiteral("Main Window"), {QStringLiteral("Esc"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Fullscreen"), QStringLiteral("Main Window"), {QStringLiteral("F11"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Increase 3D Factor"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl++"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Increase Speed Limit"), QStringLiteral("Main Window"), {QStringLiteral("+"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Load Amiibo"), QStringLiteral("Main Window"), {QStringLiteral("F2"), QStringLiteral(""), Qt::WidgetWithChildrenShortcut}}, - {QStringLiteral("Load File"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+O"), QStringLiteral(""), Qt::WidgetWithChildrenShortcut}}, - {QStringLiteral("Load from Newest Non-Quicksave Slot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+V"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Multiplayer Browse Public Rooms"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+B"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Multiplayer Create Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+N"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Multiplayer Direct Connect to Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+Shift"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Multiplayer Leave Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+L"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Multiplayer Show Current Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+R"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Quick Save"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Quick Load"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Remove Amiibo"), QStringLiteral("Main Window"), {QStringLiteral("F3"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Restart Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F6"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Rotate Screens Upright"), QStringLiteral("Main Window"), {QStringLiteral("F8"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Save to Oldest Non-Quicksave Slot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+C"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Stop Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F5"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Swap Screens"), QStringLiteral("Main Window"), {QStringLiteral("F9"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Toggle 3D"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+3"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Toggle Custom Textures"), QStringLiteral("Main Window"), {QStringLiteral("F7"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Toggle Filter Bar"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Toggle Frame Advancing"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+A"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Toggle Per-Application Speed"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+Z"), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Toggle Screen Layout"), QStringLiteral("Main Window"), {QStringLiteral("F10"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Toggle Status Bar"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+S"), QStringLiteral(""), Qt::WindowShortcut}}, - {QStringLiteral("Toggle Texture Dumping"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral(""), Qt::ApplicationShortcut}}, - {QStringLiteral("Toggle Turbo Mode"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral(""), Qt::ApplicationShortcut}}, +const std::array QtConfig::default_hotkeys {{ + {QStringLiteral("Advance Frame"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral("")}}, + {QStringLiteral("Audio Mute/Unmute"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+M"), QStringLiteral("")}}, + {QStringLiteral("Audio Volume Down"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral("")}}, + {QStringLiteral("Audio Volume Up"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral("")}}, + {QStringLiteral("Capture Screenshot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+P"), QStringLiteral("")}}, + {QStringLiteral("Continue/Pause Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F4"), QStringLiteral("")}}, + {QStringLiteral("Decrease 3D Factor"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+-"), QStringLiteral("")}}, + {QStringLiteral("Decrease Speed Limit"), QStringLiteral("Main Window"), {QStringLiteral("-"), QStringLiteral("")}}, + {QStringLiteral("Exit Azahar"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+Q"), QStringLiteral("")}}, + {QStringLiteral("Exit Fullscreen"), QStringLiteral("Main Window"), {QStringLiteral("Esc"), QStringLiteral("")}}, + {QStringLiteral("Fullscreen"), QStringLiteral("Main Window"), {QStringLiteral("F11"), QStringLiteral("")}}, + {QStringLiteral("Increase 3D Factor"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl++"), QStringLiteral("")}}, + {QStringLiteral("Increase Speed Limit"), QStringLiteral("Main Window"), {QStringLiteral("+"), QStringLiteral("")}}, + {QStringLiteral("Load Amiibo"), QStringLiteral("Main Window"), {QStringLiteral("F2"), QStringLiteral("")}}, + {QStringLiteral("Load File"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+O"), QStringLiteral("")}}, + {QStringLiteral("Load from Newest Non-Quicksave Slot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+V"), QStringLiteral("")}}, + {QStringLiteral("Multiplayer Browse Public Rooms"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+B"), QStringLiteral("")}}, + {QStringLiteral("Multiplayer Create Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+N"), QStringLiteral("")}}, + {QStringLiteral("Multiplayer Direct Connect to Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+Shift"), QStringLiteral("")}}, + {QStringLiteral("Multiplayer Leave Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+L"), QStringLiteral("")}}, + {QStringLiteral("Multiplayer Show Current Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+R"), QStringLiteral("")}}, + {QStringLiteral("Quick Save"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral("")}}, + {QStringLiteral("Quick Load"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral("")}}, + {QStringLiteral("Remove Amiibo"), QStringLiteral("Main Window"), {QStringLiteral("F3"), QStringLiteral("")}}, + {QStringLiteral("Restart Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F6"), QStringLiteral("")}}, + {QStringLiteral("Rotate Screens Upright"), QStringLiteral("Main Window"), {QStringLiteral("F8"), QStringLiteral("")}}, + {QStringLiteral("Save to Oldest Non-Quicksave Slot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+C"), QStringLiteral("")}}, + {QStringLiteral("Stop Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F5"), QStringLiteral("")}}, + {QStringLiteral("Swap Screens"), QStringLiteral("Main Window"), {QStringLiteral("F9"), QStringLiteral("")}}, + {QStringLiteral("Toggle 3D"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+3"), QStringLiteral("")}}, + {QStringLiteral("Toggle Custom Textures"), QStringLiteral("Main Window"), {QStringLiteral("F7"), QStringLiteral("")}}, + {QStringLiteral("Toggle Filter Bar"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F"), QStringLiteral("")}}, + {QStringLiteral("Toggle Frame Advancing"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+A"), QStringLiteral("")}}, + {QStringLiteral("Toggle Per-Application Speed"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+Z"), QStringLiteral("")}}, + {QStringLiteral("Toggle Screen Layout"), QStringLiteral("Main Window"), {QStringLiteral("F10"), QStringLiteral("")}}, + {QStringLiteral("Toggle Status Bar"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+S"), QStringLiteral("")}}, + {QStringLiteral("Toggle Texture Dumping"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral("")}}, + {QStringLiteral("Toggle Turbo Mode"), QStringLiteral("Main Window"), {QStringLiteral(""), QStringLiteral("")}}, + // Navigation shortcuts will only be shown on the Controller Hotkeys pane, to duplicate keyboard navigation + // They will be ignored in the render_window and secondary_window at implementation, so still leave as default Qt::ApplicationShortcut context + {QStringLiteral("Move down (Down Arrow)"), QStringLiteral("Navigation"), {QStringLiteral(""), + QStringLiteral("api:controller,button:12,engine:sdl,maptype:all,name:D-Pad Down")}}, + {QStringLiteral("Move up (Up Arrow)"), QStringLiteral("Navigation"), {QStringLiteral(""), + QStringLiteral("api:controller,button:11,engine:sdl,maptype:all,name:D-Pad Up")}}, + {QStringLiteral("Move left (Left Arrow)"), QStringLiteral("Navigation"), {QStringLiteral(""), + QStringLiteral("api:controller,button:13,engine:sdl,maptype:all,name:D-Pad Left")}}, + {QStringLiteral("Move right (Right Arrow)"), QStringLiteral("Navigation"), {QStringLiteral(""), + QStringLiteral("api:controller,button:14,engine:sdl,maptype:all,name:D-Pad Right")}}, + {QStringLiteral("Confirm / Run game (Enter)"), QStringLiteral("Navigation"), {QStringLiteral(""), + QStringLiteral("api:controller,button:0,engine:sdl,maptype:all,name:A / ✖ Button")}}, + {QStringLiteral("Go back / Cancel (Esc)"), QStringLiteral("Navigation"), {QStringLiteral(""), + QStringLiteral("api:controller,button:1,engine:sdl,maptype:all,name:B / ● Button")}}, + {QStringLiteral("Change Focus Forward (Tab)"), QStringLiteral("Navigation"), {QStringLiteral(""), + QStringLiteral("api:controller,button:10,engine:sdl,maptype:all,name:RB")}}, + {QStringLiteral("Change Focus Backward (Shift+Tab)"), QStringLiteral("Navigation"), {QStringLiteral(""), + QStringLiteral("api:controller,button:9,engine:sdl,maptype:all,name:LB")}}, }}; // clang-format on @@ -227,7 +246,8 @@ void QtConfig::WriteBasicSetting(const Settings::Setting, rang } qt_config->setValue(name, stringList); } -// Explicit u16 definition: Qt would store it as QMetaType otherwise, which is not human-readable +// Explicit u16 definition: Qt would store it as QMetaType otherwise, which is not +// human-readable template <> void QtConfig::WriteBasicSetting(const Settings::Setting& setting) { const QString name = QString::fromStdString(setting.GetLabel()); @@ -507,7 +527,8 @@ void QtConfig::ReadDataStorageValues() { void QtConfig::ReadDebuggingValues() { qt_config->beginGroup(QStringLiteral("Debugging")); - // Intentionally not using the QT default setting as this is intended to be changed in the ini + // Intentionally not using the QT default setting as this is intended to be changed in the + // ini Settings::values.record_frame_times = qt_config->value(Settings::QKeys::record_frame_times, false).toBool(); ReadBasicSetting(Settings::values.use_gdbstub); @@ -742,9 +763,9 @@ void QtConfig::ReadShortcutValues() { for (const auto& [name, group, shortcut] : default_hotkeys) { qt_config->beginGroup(group); qt_config->beginGroup(name); - // No longer using ReadSetting for shortcut.second as it innacurately returns a value of 1 - // for WidgetWithChildrenShortcut which is a value of 3. Needed to fix shortcuts the open - // a file dialog in windowed mode + // No longer using ReadSetting for shortcut.second as it innacurately returns a value of + // 1 for WidgetWithChildrenShortcut which is a value of 3. Needed to fix shortcuts the + // open a file dialog in windowed mode UISettings::values.shortcuts.push_back( {name, group, @@ -1102,7 +1123,8 @@ void QtConfig::SaveDataStorageValues() { void QtConfig::SaveDebuggingValues() { qt_config->beginGroup(QStringLiteral("Debugging")); - // Intentionally not using the QT default setting as this is intended to be changed in the ini + // Intentionally not using the QT default setting as this is intended to be changed in the + // ini qt_config->setValue(Settings::QKeys::record_frame_times, Settings::values.record_frame_times); WriteBasicSetting(Settings::values.use_gdbstub); WriteBasicSetting(Settings::values.gdbstub_port); diff --git a/src/citra_qt/configuration/config.h b/src/citra_qt/configuration/config.h index 3fba498ed..f2f040262 100644 --- a/src/citra_qt/configuration/config.h +++ b/src/citra_qt/configuration/config.h @@ -26,7 +26,7 @@ public: static const std::array default_buttons; static const std::array, Settings::NativeAnalog::NumAnalogs> default_analogs; - static const std::array default_hotkeys; + static const std::array default_hotkeys; private: void Initialize(const std::string& config_name); diff --git a/src/citra_qt/configuration/configure_hotkeys.cpp b/src/citra_qt/configuration/configure_hotkeys.cpp index 16e762438..0f260c159 100644 --- a/src/citra_qt/configuration/configure_hotkeys.cpp +++ b/src/citra_qt/configuration/configure_hotkeys.cpp @@ -57,6 +57,9 @@ QList ConfigureHotkeys::GetUsedKeyList() const { void ConfigureHotkeys::Populate(const HotkeyRegistry& registry) { for (const auto& group : registry.hotkey_groups) { + // skip the controller navigation group in the keyboard hotkey config window + if (group.first == QStringLiteral("Navigation")) + continue; QStandardItem* parent_item = new QStandardItem(group.first); parent_item->setEditable(false); for (const auto& hotkey : group.second) { diff --git a/src/citra_qt/game_list.cpp b/src/citra_qt/game_list.cpp index 7713f18f1..84d057922 100644 --- a/src/citra_qt/game_list.cpp +++ b/src/citra_qt/game_list.cpp @@ -45,10 +45,11 @@ #include "core/hle/service/fs/archive.h" #include "qcursor.h" -// On Mac OS X, the Return key does not trigger the activation signal for some reason. Fix it. +// On Mac OS X, neither the Return nor Enter key triggers the activation signal for some reason. Fix +// it. void GameListTreeView::keyPressEvent(QKeyEvent* event) { - if (event->key() == Qt::Key_Return) { + if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) { const QModelIndex idx = currentIndex(); if (idx.isValid()) { emit activated(idx); diff --git a/src/citra_qt/game_list.h b/src/citra_qt/game_list.h index 5de9d43f1..f71f3849e 100644 --- a/src/citra_qt/game_list.h +++ b/src/citra_qt/game_list.h @@ -95,6 +95,10 @@ public: static const QStringList supported_file_extensions; + GameListTreeView* GetGameTreeView() { + return tree_view; + } + signals: void GameChosen(const QString& game_path); void ShouldCancelWorker(); @@ -138,6 +142,7 @@ private: void changeEvent(QEvent*) override; void RetranslateUI(); +protected: GameListSearchField* search_field; GMainWindow* main_window = nullptr; QVBoxLayout* layout = nullptr;