summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mainwindow.cpp18
-rw-r--r--src/modinfodialog.cpp72
-rw-r--r--src/modinfodialog.h26
-rw-r--r--src/overwriteinfodialog.cpp19
-rw-r--r--src/overwriteinfodialog.h11
-rw-r--r--src/settings.cpp66
-rw-r--r--src/settings.h9
7 files changed, 137 insertions, 84 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index ac86d9d8..32f728d8 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -3165,9 +3165,6 @@ void MainWindow::overwriteClosed(int)
OverwriteInfoDialog *dialog = this->findChild<OverwriteInfoDialog*>("__overwriteDialog");
if (dialog != nullptr) {
m_OrganizerCore.modList()->modInfoChanged(dialog->modInfo());
- QSettings &settings = m_OrganizerCore.settings().directInterface();
- QString key = QString("geometry/%1").arg(dialog->objectName());
- settings.setValue(key, dialog->saveGeometry());
dialog->deleteLater();
}
m_OrganizerCore.refreshDirectoryStructure();
@@ -3191,11 +3188,7 @@ void MainWindow::displayModInformation(
} else {
qobject_cast<OverwriteInfoDialog*>(dialog)->setModInfo(modInfo);
}
- QSettings &settings = m_OrganizerCore.settings().directInterface();
- QString key = QString("geometry/%1").arg(dialog->objectName());
- if (settings.contains(key)) {
- dialog->restoreGeometry(settings.value(key).toByteArray());
- }
+
dialog->show();
dialog->raise();
dialog->activateWindow();
@@ -3214,16 +3207,7 @@ void MainWindow::displayModInformation(
dialog.selectTab(tabID);
}
- dialog.restoreState(m_OrganizerCore.settings());
- QSettings &settings = m_OrganizerCore.settings().directInterface();
- QString key = QString("geometry/%1").arg(dialog.objectName());
- if (settings.contains(key)) {
- dialog.restoreGeometry(settings.value(key).toByteArray());
- }
-
dialog.exec();
- dialog.saveState(m_OrganizerCore.settings());
- settings.setValue(key, dialog.saveGeometry());
modInfo->saveMeta();
emit modInfoDisplayed();
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index 4b1e2f76..5e614358 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -210,6 +210,11 @@ void ModInfoDialog::createTabs()
int ModInfoDialog::exec()
{
+ restoreState();
+ if (auto v=m_core->settings().geometry().getModInfoDialog()) {
+ restoreGeometry(*v);
+ }
+
// whether to select the first tab; if the main window requested a specific
// tab, it is selected when encountered in update()
const auto selectFirst = (m_initialTab == ModInfoTabIDs::None);
@@ -220,7 +225,12 @@ int ModInfoDialog::exec()
ui->tabWidget->setCurrentIndex(0);
}
- return TutorableDialog::exec();
+ const int r = TutorableDialog::exec();
+
+ saveState();
+ m_core->settings().geometry().setModInfoDialog(saveGeometry());
+
+ return r;
}
void ModInfoDialog::setMod(ModInfo::Ptr mod)
@@ -356,7 +366,7 @@ void ModInfoDialog::setTabsVisibility(bool firstTime)
if (!firstTime) {
// but don't do it the first time visibility is set because the tabs are
// in the default order, which will clobber the current settings
- saveTabOrder(Settings::instance());
+ saveTabOrder();
}
// remember selection, if any
@@ -375,7 +385,7 @@ void ModInfoDialog::reAddTabs(
Q_ASSERT(visibility.size() == m_tabs.size());
// ordered tab names from settings
- const auto orderedNames = getOrderedTabNames();
+ const auto orderedNames = m_core->settings().geometry().getModInfoTabOrder();
// whether the tabs can be sorted; if the object name of a tab widget is not
// found in orderedNames, the list cannot be sorted safely
@@ -575,37 +585,28 @@ MOShared::FilesOrigin* ModInfoDialog::getOrigin()
return origin;
}
-void ModInfoDialog::saveState(Settings& s) const
+void ModInfoDialog::saveState() const
{
- saveTabOrder(s);
-
- // remove 2.2.0 settings
- s.directInterface().remove("mod_info_tabs");
- s.directInterface().remove("mod_info_conflict_expanders");
- s.directInterface().remove("mod_info_conflicts");
- s.directInterface().remove("mod_info_advanced_conflicts");
- s.directInterface().remove("mod_info_conflicts_overwrite");
- s.directInterface().remove("mod_info_conflicts_noconflict");
- s.directInterface().remove("mod_info_conflicts_overwritten");
+ saveTabOrder();
// save state for each tab
for (const auto& tabInfo : m_tabs) {
- tabInfo.tab->saveState(s);
+ tabInfo.tab->saveState(m_core->settings());
}
}
-void ModInfoDialog::restoreState(const Settings& s)
+void ModInfoDialog::restoreState()
{
// tab order is not restored here, it will be picked up if tabs have to be
// removed and re-added
// restore state for each tab
for (const auto& tabInfo : m_tabs) {
- tabInfo.tab->restoreState(s);
+ tabInfo.tab->restoreState(m_core->settings());
}
}
-void ModInfoDialog::saveTabOrder(Settings& s) const
+void ModInfoDialog::saveTabOrder() const
{
if (static_cast<int>(m_tabs.size()) != ui->tabWidget->count()) {
// only save tab state when all tabs are visible
@@ -629,40 +630,7 @@ void ModInfoDialog::saveTabOrder(Settings& s) const
names += ui->tabWidget->widget(i)->objectName();
}
- s.directInterface().setValue("mod_info_tab_order", names);
-}
-
-std::vector<QString> ModInfoDialog::getOrderedTabNames() const
-{
- const auto& settings = Settings::instance().directInterface();
-
- std::vector<QString> v;
-
- if (settings.contains("mod_info_tabs")) {
- // old byte array from 2.2.0
- QDataStream stream(settings.value("mod_info_tabs").toByteArray());
-
- int count = 0;
- stream >> count;
-
- for (int i=0; i<count; ++i) {
- QString s;
- stream >> s;
- v.emplace_back(std::move(s));
- }
- } else {
- // string list
- QString string = settings.value("mod_info_tab_order").toString();
- QTextStream stream(&string);
-
- while (!stream.atEnd()) {
- QString s;
- stream >> s;
- v.emplace_back(std::move(s));
- }
- }
-
- return v;
+ m_core->settings().geometry().setModInfoTabOrder(names);
}
void ModInfoDialog::onOriginModified(int originID)
diff --git a/src/modinfodialog.h b/src/modinfodialog.h
index 34555b0c..48680ca4 100644
--- a/src/modinfodialog.h
+++ b/src/modinfodialog.h
@@ -61,18 +61,11 @@ public:
//
void selectTab(ModInfoTabIDs id);
- // updates all tabs, selects the initial tab and opens the dialog
+ // updates all tabs, selects the initial tab, opens the dialog and
+ // saves/restores geometry
//
int exec() override;
- // saves the dialog state and calls saveState() on all tabs
- //
- void saveState(Settings& s) const;
-
- // restores the dialog state and calls restoreState() on all tabs
- //
- void restoreState(const Settings& s);
-
signals:
// emitted when a tab changes the origin
//
@@ -146,6 +139,15 @@ private:
void createTabs();
+ // saves the dialog state and calls saveState() on all tabs
+ //
+ void saveState() const;
+
+ // restores the dialog state and calls restoreState() on all tabs
+ //
+ void restoreState();
+
+
// sets the currently selected mod; resets first activation, but doesn't
// update anything
//
@@ -213,11 +215,7 @@ private:
// setTabsVisibility() to make sure any changes to order are saved before
// re-adding tabs
//
- void saveTabOrder(Settings& s) const;
-
- // returns a list of tab names in the order they should appear on the widget
- //
- std::vector<QString> getOrderedTabNames() const;
+ void saveTabOrder() const;
// asks all the tabs if they accept closing the dialog, returns false if one
// objected
diff --git a/src/overwriteinfodialog.cpp b/src/overwriteinfodialog.cpp
index 715e11e3..f3ae0ff5 100644
--- a/src/overwriteinfodialog.cpp
+++ b/src/overwriteinfodialog.cpp
@@ -104,6 +104,25 @@ OverwriteInfoDialog::~OverwriteInfoDialog()
delete ui;
}
+void OverwriteInfoDialog::showEvent(QShowEvent* e)
+{
+ const auto& settings = Settings::instance();
+
+ if (auto v=settings.geometry().getOverwriteDialog()) {
+ restoreGeometry(*v);
+ }
+
+ QDialog::showEvent(e);
+}
+
+void OverwriteInfoDialog::done(int r)
+{
+ auto& settings = Settings::instance();
+ settings.geometry().setOverwriteDialog(saveGeometry());
+
+ QDialog::done(r);
+}
+
void OverwriteInfoDialog::setModInfo(ModInfo::Ptr modInfo)
{
m_ModInfo = modInfo;
diff --git a/src/overwriteinfodialog.h b/src/overwriteinfodialog.h
index 4b731736..bedb779a 100644
--- a/src/overwriteinfodialog.h
+++ b/src/overwriteinfodialog.h
@@ -31,7 +31,7 @@ class OverwriteInfoDialog;
class OverwriteInfoDialog : public QDialog
{
Q_OBJECT
-
+
public:
explicit OverwriteInfoDialog(ModInfo::Ptr modInfo, QWidget *parent = 0);
@@ -39,8 +39,17 @@ public:
ModInfo::Ptr modInfo() const { return m_ModInfo; }
+ // saves geometry
+ //
+ void done(int r) override;
+
void setModInfo(ModInfo::Ptr modInfo);
+protected:
+ // restores geometry
+ //
+ void showEvent(QShowEvent* e) override;
+
private:
void openFile(const QModelIndex &index);
diff --git a/src/settings.cpp b/src/settings.cpp
index 1f5abb2a..73595ac9 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -120,6 +120,16 @@ void Settings::processUpdates(
m_Settings.endGroup();
}
+ if (lastVersion < QVersionNumber(2, 2, 1)) {
+ m_Settings.remove("mod_info_tabs");
+ m_Settings.remove("mod_info_conflict_expanders");
+ m_Settings.remove("mod_info_conflicts");
+ m_Settings.remove("mod_info_advanced_conflicts");
+ m_Settings.remove("mod_info_conflicts_overwrite");
+ m_Settings.remove("mod_info_conflicts_noconflict");
+ m_Settings.remove("mod_info_conflicts_overwritten");
+ }
+
if (lastVersion < QVersionNumber(2, 2, 2)) {
// log splitter is gone, it's a dock now
m_Settings.remove("log_split");
@@ -876,6 +886,62 @@ void GeometrySettings::setProfilesDialog(const QByteArray& v)
m_Settings.setValue("geometry/ProfilesDialog", v);
}
+std::optional<QByteArray> GeometrySettings::getOverwriteDialog() const
+{
+ return getOptional<QByteArray>(m_Settings, "geometry/__overwriteDialog");
+}
+
+void GeometrySettings::setOverwriteDialog(const QByteArray& v)
+{
+ m_Settings.setValue("geometry/__overwriteDialog", v);
+}
+
+std::optional<QByteArray> GeometrySettings::getModInfoDialog() const
+{
+ return getOptional<QByteArray>(m_Settings, "geometry/ModInfoDialog");
+}
+
+void GeometrySettings::setModInfoDialog(const QByteArray& v) const
+{
+ m_Settings.setValue("geometry/ModInfoDialog", v);
+}
+
+QStringList GeometrySettings::getModInfoTabOrder() const
+{
+ QStringList v;
+
+ if (m_Settings.contains("mod_info_tabs")) {
+ // old byte array from 2.2.0
+ QDataStream stream(m_Settings.value("mod_info_tabs").toByteArray());
+
+ int count = 0;
+ stream >> count;
+
+ for (int i=0; i<count; ++i) {
+ QString s;
+ stream >> s;
+ v.push_back(s);
+ }
+ } else {
+ // string list since 2.2.1
+ QString string = m_Settings.value("mod_info_tab_order").toString();
+ QTextStream stream(&string);
+
+ while (!stream.atEnd()) {
+ QString s;
+ stream >> s;
+ v.push_back(s);
+ }
+ }
+
+ return v;
+}
+
+void GeometrySettings::setModInfoTabOrder(const QString& names)
+{
+ m_Settings.setValue("mod_info_tab_order", names);
+}
+
std::optional<int> GeometrySettings::getMainWindowMonitor() const
{
return getOptional<int>(m_Settings, "window_monitor");
diff --git a/src/settings.h b/src/settings.h
index 6d51c610..f4e36b2a 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -52,6 +52,15 @@ public:
std::optional<QByteArray> getProfilesDialog() const;
void setProfilesDialog(const QByteArray& v);
+ std::optional<QByteArray> getOverwriteDialog() const;
+ void setOverwriteDialog(const QByteArray& v);
+
+ std::optional<QByteArray> getModInfoDialog() const;
+ void setModInfoDialog(const QByteArray& v) const;
+
+ QStringList getModInfoTabOrder() const;
+ void setModInfoTabOrder(const QString& names);
+
std::optional<int> getMainWindowMonitor() const;
void setDockSize(const QString& name, int size);