summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.cpp11
-rw-r--r--src/mainwindow.cpp28
-rw-r--r--src/nxmaccessmanager.cpp13
-rw-r--r--src/nxmaccessmanager.h2
-rw-r--r--src/pch.h1
-rw-r--r--src/settings.cpp86
-rw-r--r--src/settings.h19
7 files changed, 114 insertions, 46 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 506c6270..8eee41e4 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -697,16 +697,7 @@ int runApplication(MOApplication &application, SingleInstance &instance,
QPixmap pixmap(splashPath);
QSplashScreen splash(pixmap);
- const auto monitor = settings.geometry().getMainWindowMonitor();
- if (monitor && QGuiApplication::screens().size() > *monitor) {
- QGuiApplication::screens().at(*monitor)->geometry().center();
- const QPoint center = QGuiApplication::screens().at(*monitor)->geometry().center();
- splash.move(center - splash.rect().center());
- } else {
- const QPoint center = QGuiApplication::primaryScreen()->geometry().center();
- splash.move(center - splash.rect().center());
- }
-
+ settings.geometry().centerOnMainWindowMonitor(&splash);
splash.show();
splash.activateWindow();
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 85be8563..6e6e3d22 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -2261,14 +2261,8 @@ void MainWindow::readSettings(const Settings& settings)
{
settings.restoreGeometry(this);
settings.restoreState(this);
-
- if (auto v=settings.geometry().getToolbarSize()) {
- setToolbarSize(*v);
- }
-
- if (auto v=settings.geometry().getToolbarButtonStyle()) {
- setToolbarButtonStyle(*v);
- }
+ settings.geometry().restoreToolbars(this);
+ settings.restoreState(ui->splitter);
if (auto v=settings.geometry().getMenubarVisible()) {
showMenuBar(*v);
@@ -2278,10 +2272,6 @@ void MainWindow::readSettings(const Settings& settings)
showStatusBar(*v);
}
- if (auto v=settings.geometry().getMainSplitterState()) {
- ui->splitter->restoreState(*v);
- }
-
{
auto v = settings.geometry().getFiltersVisible().value_or(false);
setCategoryListVisible(v);
@@ -2366,14 +2356,12 @@ void MainWindow::storeSettings(Settings& s) {
s.saveState(this);
s.saveGeometry(this);
- settings.setValue("toolbar_size", ui->toolBar->iconSize());
- settings.setValue("toolbar_button_style", static_cast<int>(ui->toolBar->toolButtonStyle()));
- settings.setValue("menubar_visible", m_menuBarVisible);
- settings.setValue("statusbar_visible", m_statusBarVisible);
- settings.setValue("window_split", ui->splitter->saveState());
- QScreen *screen = this->window()->windowHandle()->screen();
- int screenId = QGuiApplication::screens().indexOf(screen);
- settings.setValue("window_monitor", screenId);
+ s.geometry().setMenubarVisible(m_menuBarVisible);
+ s.geometry().saveToolbars(this);
+ s.geometry().setStatusbarVisible(m_statusBarVisible);
+ s.saveState(ui->splitter);
+ s.geometry().saveMainWindowMonitor(this);
+
settings.setValue("browser_geometry", m_IntegratedBrowser.saveGeometry());
settings.setValue("filters_visible", ui->displayCategoriesBtn->isChecked());
diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp
index fd1dc0c1..16190ca4 100644
--- a/src/nxmaccessmanager.cpp
+++ b/src/nxmaccessmanager.cpp
@@ -48,8 +48,9 @@ const QString NexusSSO("wss://sso.nexusmods.com");
const QString NexusSSOPage("https://www.nexusmods.com/sso?id=%1&application=modorganizer2");
-ValidationProgressDialog::ValidationProgressDialog(std::chrono::seconds t)
- : m_timeout(t), m_bar(nullptr), m_buttons(nullptr), m_timer(nullptr)
+ValidationProgressDialog::ValidationProgressDialog(std::chrono::seconds t) :
+ m_timeout(t), m_bar(nullptr), m_buttons(nullptr), m_timer(nullptr),
+ m_first(true)
{
m_bar = new QProgressBar;
m_bar->setTextVisible(false);
@@ -103,6 +104,14 @@ void ValidationProgressDialog::stop()
hide();
}
+void ValidationProgressDialog::showEvent(QShowEvent* e)
+{
+ if (m_first) {
+ Settings::instance().geometry().centerOnMainWindowMonitor(this);
+ m_first = false;
+ }
+}
+
void ValidationProgressDialog::closeEvent(QCloseEvent* e)
{
hide();
diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h
index eed7c1c9..0c85153b 100644
--- a/src/nxmaccessmanager.h
+++ b/src/nxmaccessmanager.h
@@ -48,6 +48,7 @@ public:
using QDialog::show;
protected:
+ void showEvent(QShowEvent* e) override;
void closeEvent(QCloseEvent* e) override;
private:
@@ -56,6 +57,7 @@ private:
QDialogButtonBox* m_buttons;
QTimer* m_timer;
QElapsedTimer m_elapsed;
+ bool m_first;
void onButton(QAbstractButton* b);
void onTimer();
diff --git a/src/pch.h b/src/pch.h
index 504ef8f1..dd65efbe 100644
--- a/src/pch.h
+++ b/src/pch.h
@@ -189,6 +189,7 @@
#include <QSize>
#include <QSizePolicy>
#include <QSortFilterProxyModel>
+#include <QSplitter>
#include <QSpinBox>
#include <QSplashScreen>
#include <QSslSocket>
diff --git a/src/settings.cpp b/src/settings.cpp
index 91e667d5..a3d12070 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -958,7 +958,7 @@ bool Settings::restoreGeometry(QWidget* w) const
void Settings::saveState(const QMainWindow* w)
{
- m_Settings.setValue(stateSettingName(w), w->saveGeometry());
+ m_Settings.setValue(stateSettingName(w), w->saveState());
}
bool Settings::restoreState(QMainWindow* w) const
@@ -986,24 +986,61 @@ bool Settings::restoreState(QHeaderView* w) const
return false;
}
+void Settings::saveState(const QSplitter* w)
+{
+ m_Settings.setValue(stateSettingName(w), w->saveState());
+}
+
+bool Settings::restoreState(QSplitter* w) const
+{
+ if (auto v=getOptional<QByteArray>(m_Settings, stateSettingName(w))) {
+ w->restoreState(*v);
+ return true;
+ }
+
+ return false;
+}
+
GeometrySettings::GeometrySettings(QSettings& s)
: m_Settings(s)
{
}
-std::optional<QSize> GeometrySettings::getToolbarSize() const
+bool GeometrySettings::restoreToolbars(QMainWindow* w) const
{
- return getOptional<QSize>(m_Settings, "toolbar_size");
+ const auto size = getOptional<QSize>(m_Settings, "toolbar_size");
+ const auto style = getOptional<int>(m_Settings, "toolbar_button_style");
+
+ if (!size && !style) {
+ return false;
+ }
+
+ for (auto* tb : w->findChildren<QToolBar*>()) {
+ if (size) {
+ tb->setIconSize(*size);
+ }
+
+ if (style) {
+ tb->setToolButtonStyle(static_cast<Qt::ToolButtonStyle>(*style));
+ }
+ }
+
+ return true;
}
-std::optional<Qt::ToolButtonStyle> GeometrySettings::getToolbarButtonStyle() const
+void GeometrySettings::saveToolbars(const QMainWindow* w)
{
- if (auto v=getOptional<int>(m_Settings, "toolbar_button_style")) {
- return static_cast<Qt::ToolButtonStyle>(*v);
+ // all toolbars are identical, just save the first one
+ const auto tbs = w->findChildren<QToolBar*>();
+ if (tbs.isEmpty()) {
+ return;
}
- return {};
+ const auto* tb = tbs[0];
+
+ m_Settings.setValue("toolbar_size", tb->iconSize());
+ m_Settings.setValue("toolbar_button_style", static_cast<int>(tb->toolButtonStyle()));
}
std::optional<bool> GeometrySettings::getMenubarVisible() const
@@ -1011,14 +1048,19 @@ std::optional<bool> GeometrySettings::getMenubarVisible() const
return getOptional<bool>(m_Settings, "menubar_visible");
}
+void GeometrySettings::setMenubarVisible(bool b)
+{
+ m_Settings.setValue("menubar_visible", b);
+}
+
std::optional<bool> GeometrySettings::getStatusbarVisible() const
{
return getOptional<bool>(m_Settings, "statusbar_visible");
}
-std::optional<QByteArray> GeometrySettings::getMainSplitterState() const
+void GeometrySettings::setStatusbarVisible(bool b)
{
- return getOptional<QByteArray>(m_Settings, "window_split");
+ m_Settings.setValue("statusbar_visible", b);
}
std::optional<bool> GeometrySettings::getFiltersVisible() const
@@ -1064,7 +1106,31 @@ void GeometrySettings::setModInfoTabOrder(const QString& names)
std::optional<int> GeometrySettings::getMainWindowMonitor() const
{
- return getOptional<int>(m_Settings, "window_monitor");
+ return getOptional<int>(m_Settings, "geometry/window_monitor");
+}
+
+void GeometrySettings::centerOnMainWindowMonitor(QWidget* w)
+{
+ const auto monitor = getMainWindowMonitor();
+ QPoint center;
+
+ if (monitor && QGuiApplication::screens().size() > *monitor) {
+ center = QGuiApplication::screens().at(*monitor)->geometry().center();
+ } else {
+ center = QGuiApplication::primaryScreen()->geometry().center();
+ }
+
+ w->move(center - w->rect().center());
+}
+
+void GeometrySettings::saveMainWindowMonitor(const QMainWindow* w)
+{
+ if (auto* handle=w->windowHandle()) {
+ if (auto* screen = handle->screen()) {
+ const int screenId = QGuiApplication::screens().indexOf(screen);
+ m_Settings.setValue("geometry/window_monitor", screenId);
+ }
+ }
}
void GeometrySettings::setDockSize(const QString& name, int size)
diff --git a/src/settings.h b/src/settings.h
index 1575b3cd..bbf008f0 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -28,6 +28,8 @@ namespace MOBase {
class IPluginGame;
}
+class QSplitter;
+
class PluginContainer;
struct ServerInfo;
class Settings;
@@ -49,18 +51,24 @@ class GeometrySettings
public:
GeometrySettings(QSettings& s);
- std::optional<QSize> getToolbarSize() const;
- std::optional<Qt::ToolButtonStyle> getToolbarButtonStyle() const;
-
std::optional<bool> getMenubarVisible() const;
+ void setMenubarVisible(bool b);
+
+ bool restoreToolbars(QMainWindow* w) const;
+ void saveToolbars(const QMainWindow* w);
+
std::optional<bool> getStatusbarVisible() const;
- std::optional<QByteArray> getMainSplitterState() const;
+ void setStatusbarVisible(bool b);
+
std::optional<bool> getFiltersVisible() const;
QStringList getModInfoTabOrder() const;
void setModInfoTabOrder(const QString& names);
std::optional<int> getMainWindowMonitor() const;
+ void centerOnMainWindowMonitor(QWidget* w);
+ void saveMainWindowMonitor(const QMainWindow* w);
+
void setDockSize(const QString& name, int size);
std::optional<int> getDockSize(const QString& name) const;
@@ -215,6 +223,9 @@ public:
void saveState(const QToolBar* toolbar);
bool restoreState(QToolBar* toolbar) const;
+ void saveState(const QSplitter* splitter);
+ bool restoreState(QSplitter* splitter) const;
+
/**
* retrieve the directory where profiles stored (with native separators)