diff --git a/app/gui/sdlgamepadkeynavigation.cpp b/app/gui/sdlgamepadkeynavigation.cpp index e048e4f4..3c0fc84a 100644 --- a/app/gui/sdlgamepadkeynavigation.cpp +++ b/app/gui/sdlgamepadkeynavigation.cpp @@ -205,6 +205,31 @@ void SdlGamepadKeyNavigation::onPollingTimerFired() sendKey(QEvent::Type::KeyRelease, Qt::Key_Right); m_LastAxisNavigationEventTime = SDL_GetTicks(); } + + // In UI navigation mode (settings page), use the right stick to scroll + if (m_UiNavMode) { + short rightX = SDL_GameControllerGetAxis(gc, SDL_CONTROLLER_AXIS_RIGHTX); + short rightY = SDL_GameControllerGetAxis(gc, SDL_CONTROLLER_AXIS_RIGHTY); + + QPoint wheelDelta; + if (rightX > 30000) { + wheelDelta.setX(30); + } + else if (rightX < -30000) { + wheelDelta.setX(-30); + } + + if (rightY > 30000) { + wheelDelta.setY(-30); + } + else if (rightY < -30000) { + wheelDelta.setY(30); + } + + if (!wheelDelta.isNull()) { + sendWheel(wheelDelta); + } + } } } @@ -218,6 +243,18 @@ void SdlGamepadKeyNavigation::sendKey(QEvent::Type type, Qt::Key key, Qt::Keyboa } } +void SdlGamepadKeyNavigation::sendWheel(QPoint& angleDelta) +{ + QGuiApplication* app = static_cast(QGuiApplication::instance()); + QWindow* focusWindow = app->focusWindow(); + if (focusWindow != nullptr) { + QPoint mousePos(focusWindow->width() / 2, focusWindow->height() / 2); + QPoint globalPos(focusWindow->mapToGlobal(mousePos)); + QWheelEvent wheelEvent(mousePos, globalPos, QPoint(), angleDelta, 0, 0, Qt::NoScrollPhase, false, Qt::MouseEventSynthesizedByApplication); + app->sendEvent(focusWindow, &wheelEvent); + } +} + void SdlGamepadKeyNavigation::setUiNavMode(bool uiNavMode) { m_UiNavMode = uiNavMode; diff --git a/app/gui/sdlgamepadkeynavigation.h b/app/gui/sdlgamepadkeynavigation.h index afb8154d..bdec990d 100644 --- a/app/gui/sdlgamepadkeynavigation.h +++ b/app/gui/sdlgamepadkeynavigation.h @@ -24,6 +24,7 @@ public: private: void sendKey(QEvent::Type type, Qt::Key key, Qt::KeyboardModifiers modifiers = Qt::NoModifier); + void sendWheel(QPoint& angleDelta); private slots: void onPollingTimerFired();