Qt: Implement relative mouse mode

This commit is contained in:
Connor McLaughlin
2020-12-27 14:08:13 +10:00
parent 114d4a2c1d
commit ca42d027ac
13 changed files with 116 additions and 8 deletions

View File

@ -290,6 +290,22 @@ void MainWindow::focusDisplayWidget()
m_display_widget->setFocus();
}
void MainWindow::onMouseModeRequested(bool relative_mode, bool hide_cursor)
{
if (!m_display_widget)
return;
const bool paused = System::IsPaused();
if (hide_cursor)
m_display_widget->setCursor(Qt::BlankCursor);
else
m_display_widget->unsetCursor();
m_relative_mouse_mode = relative_mode;
m_display_widget->setRelativeMode(!paused && relative_mode);
}
void MainWindow::onEmulationStarting()
{
m_emulation_running = true;
@ -327,6 +343,9 @@ void MainWindow::onEmulationPaused(bool paused)
{
QSignalBlocker blocker(m_ui.actionPause);
m_ui.actionPause->setChecked(paused);
if (m_display_widget)
m_display_widget->setRelativeMode(!paused && m_relative_mouse_mode);
}
void MainWindow::onStateSaved(const QString& game_code, bool global, qint32 slot)
@ -372,6 +391,9 @@ void MainWindow::onApplicationStateChanged(Qt::ApplicationState state)
{
m_host_interface->pauseSystem(true);
m_was_paused_by_focus_loss = true;
if (m_display_widget)
m_display_widget->setRelativeMode(false);
}
}
else
@ -381,6 +403,9 @@ void MainWindow::onApplicationStateChanged(Qt::ApplicationState state)
if (System::IsPaused())
m_host_interface->pauseSystem(false);
m_was_paused_by_focus_loss = false;
if (m_display_widget)
m_display_widget->setRelativeMode(m_relative_mouse_mode);
}
}
}
@ -974,6 +999,7 @@ void MainWindow::connectSignals()
&MainWindow::onSystemPerformanceCountersUpdated);
connect(m_host_interface, &QtHostInterface::runningGameChanged, this, &MainWindow::onRunningGameChanged);
connect(m_host_interface, &QtHostInterface::exitRequested, this, &MainWindow::close);
connect(m_host_interface, &QtHostInterface::mouseModeRequested, this, &MainWindow::onMouseModeRequested);
// These need to be queued connections to stop crashing due to menus opening/closing and switching focus.
connect(m_game_list_widget, &GameListWidget::entrySelected, this, &MainWindow::onGameListEntrySelected,