Qt: Fix toolbar position not saving

This commit is contained in:
Stenzek 2024-04-05 19:21:56 +10:00
parent 26979f5569
commit 26c76d184f
No known key found for this signature in database
2 changed files with 71 additions and 16 deletions

View File

@ -162,7 +162,7 @@ void MainWindow::initialize()
setupAdditionalUi(); setupAdditionalUi();
connectSignals(); connectSignals();
restoreGeometryFromConfig(); restoreStateFromConfig();
switchToGameListView(); switchToGameListView();
updateWindowTitle(); updateWindowTitle();
@ -2462,29 +2462,76 @@ void MainWindow::onSettingsResetToDefault(bool system, bool controller)
updateMenuSelectedTheme(); updateMenuSelectedTheme();
} }
void MainWindow::saveGeometryToConfig() void MainWindow::saveStateToConfig()
{ {
const QByteArray geometry = saveGeometry(); if (!isVisible() || ((windowState() & Qt::WindowFullScreen) != Qt::WindowNoState))
const QByteArray geometry_b64 = geometry.toBase64(); return;
const std::string old_geometry_b64 = Host::GetBaseStringSettingValue("UI", "MainWindowGeometry");
bool changed = false;
const QByteArray geometry(saveGeometry());
const QByteArray geometry_b64(geometry.toBase64());
const std::string old_geometry_b64(Host::GetBaseStringSettingValue("UI", "MainWindowGeometry"));
if (old_geometry_b64 != geometry_b64.constData()) if (old_geometry_b64 != geometry_b64.constData())
{ {
Host::SetBaseStringSettingValue("UI", "MainWindowGeometry", geometry_b64.constData()); Host::SetBaseStringSettingValue("UI", "MainWindowGeometry", geometry_b64.constData());
Host::CommitBaseSettingChanges(); changed = true;
} }
const QByteArray state(saveState());
const QByteArray state_b64(state.toBase64());
const std::string old_state_b64(Host::GetBaseStringSettingValue("UI", "MainWindowState"));
if (old_state_b64 != state_b64.constData())
{
Host::SetBaseStringSettingValue("UI", "MainWindowState", state_b64.constData());
changed = true;
}
if (changed)
Host::CommitBaseSettingChanges();
} }
void MainWindow::restoreGeometryFromConfig() void MainWindow::restoreStateFromConfig()
{ {
const std::string geometry_b64 = Host::GetBaseStringSettingValue("UI", "MainWindowGeometry"); {
const QByteArray geometry = QByteArray::fromBase64(QByteArray::fromStdString(geometry_b64)); const std::string geometry_b64 = Host::GetBaseStringSettingValue("UI", "MainWindowGeometry");
if (!geometry.isEmpty()) const QByteArray geometry = QByteArray::fromBase64(QByteArray::fromStdString(geometry_b64));
restoreGeometry(geometry); if (!geometry.isEmpty())
restoreGeometry(geometry);
}
{
const std::string state_b64 = Host::GetBaseStringSettingValue("UI", "MainWindowState");
const QByteArray state = QByteArray::fromBase64(QByteArray::fromStdString(state_b64));
if (!state.isEmpty())
{
restoreState(state);
// make sure we're not loading a dodgy config which had fullscreen set...
setWindowState(windowState() & ~(Qt::WindowFullScreen | Qt::WindowActive));
}
{
QSignalBlocker sb(m_ui.actionViewToolbar);
m_ui.actionViewToolbar->setChecked(!m_ui.toolBar->isHidden());
}
{
QSignalBlocker sb(m_ui.actionViewStatusBar);
m_ui.actionViewStatusBar->setChecked(!m_ui.statusBar->isHidden());
}
}
} }
void MainWindow::saveDisplayWindowGeometryToConfig() void MainWindow::saveDisplayWindowGeometryToConfig()
{ {
const QByteArray geometry = getDisplayContainer()->saveGeometry(); QWidget* container = getDisplayContainer();
if (container->windowState() & Qt::WindowFullScreen)
{
// if we somehow ended up here, don't save the fullscreen state to the config
return;
}
const QByteArray geometry = container->saveGeometry();
const QByteArray geometry_b64 = geometry.toBase64(); const QByteArray geometry_b64 = geometry.toBase64();
const std::string old_geometry_b64 = Host::GetBaseStringSettingValue("UI", "DisplayWindowGeometry"); const std::string old_geometry_b64 = Host::GetBaseStringSettingValue("UI", "DisplayWindowGeometry");
if (old_geometry_b64 != geometry_b64.constData()) if (old_geometry_b64 != geometry_b64.constData())
@ -2500,9 +2547,17 @@ void MainWindow::restoreDisplayWindowGeometryFromConfig()
const QByteArray geometry = QByteArray::fromBase64(QByteArray::fromStdString(geometry_b64)); const QByteArray geometry = QByteArray::fromBase64(QByteArray::fromStdString(geometry_b64));
QWidget* container = getDisplayContainer(); QWidget* container = getDisplayContainer();
if (!geometry.isEmpty()) if (!geometry.isEmpty())
{
container->restoreGeometry(geometry); container->restoreGeometry(geometry);
// make sure we're not loading a dodgy config which had fullscreen set...
container->setWindowState(container->windowState() & ~(Qt::WindowFullScreen | Qt::WindowActive));
}
else else
{
// default size
container->resize(640, 480); container->resize(640, 480);
}
} }
SettingsWindow* MainWindow::getSettingsDialog() SettingsWindow* MainWindow::getSettingsDialog()
@ -2640,7 +2695,7 @@ void MainWindow::closeEvent(QCloseEvent* event)
// If there's no VM, we can just exit as normal. // If there's no VM, we can just exit as normal.
if (!s_system_valid || !m_display_created) if (!s_system_valid || !m_display_created)
{ {
saveGeometryToConfig(); saveStateToConfig();
if (m_display_created) if (m_display_created)
g_emu_thread->stopFullscreenUI(); g_emu_thread->stopFullscreenUI();
destroySubWindows(); destroySubWindows();
@ -2657,7 +2712,7 @@ void MainWindow::closeEvent(QCloseEvent* event)
return; return;
// Application will be exited in VM stopped handler. // Application will be exited in VM stopped handler.
saveGeometryToConfig(); saveStateToConfig();
m_is_closing = true; m_is_closing = true;
} }

View File

@ -224,8 +224,8 @@ private:
void switchToGameListView(); void switchToGameListView();
void switchToEmulationView(); void switchToEmulationView();
void saveGeometryToConfig(); void saveStateToConfig();
void restoreGeometryFromConfig(); void restoreStateFromConfig();
void saveDisplayWindowGeometryToConfig(); void saveDisplayWindowGeometryToConfig();
void restoreDisplayWindowGeometryFromConfig(); void restoreDisplayWindowGeometryFromConfig();
void createDisplayWidget(bool fullscreen, bool render_to_main, bool use_main_window_pos); void createDisplayWidget(bool fullscreen, bool render_to_main, bool use_main_window_pos);