diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2020-08-15 22:35:19 -0400 |
|---|---|---|
| committer | isanae <14251494+isanae@users.noreply.github.com> | 2020-11-03 11:39:07 -0500 |
| commit | a9772873d69b875f5617c0121c73a271d432a29c (patch) | |
| tree | a772e162e484ffb8e8c1e04dbe084a5c947c4fbf /src | |
| parent | 14d15070c8b24e73297a6f37132b8ad5c6e966ef (diff) | |
open ini button
update when renaming instance
update and select when creating instance
Diffstat (limited to 'src')
| -rw-r--r-- | src/createinstancedialog.cpp | 13 | ||||
| -rw-r--r-- | src/createinstancedialog.h | 2 | ||||
| -rw-r--r-- | src/instancemanagerdialog.cpp | 86 | ||||
| -rw-r--r-- | src/instancemanagerdialog.h | 5 | ||||
| -rw-r--r-- | src/instancemanagerdialog.ui | 19 |
5 files changed, 103 insertions, 22 deletions
diff --git a/src/createinstancedialog.cpp b/src/createinstancedialog.cpp index 935b9ee9..f4140e01 100644 --- a/src/createinstancedialog.cpp +++ b/src/createinstancedialog.cpp @@ -11,8 +11,9 @@ using namespace MOBase; CreateInstanceDialog::CreateInstanceDialog( - const PluginContainer& pc, QWidget *parent) - : QDialog(parent), ui(new Ui::CreateInstanceDialog), m_pc(pc) + const PluginContainer& pc, QWidget *parent) : + QDialog(parent), ui(new Ui::CreateInstanceDialog), m_pc(pc), + m_switching(false) { using namespace cid; @@ -302,8 +303,9 @@ void CreateInstanceDialog::finish() if (ui->launch->isChecked()) { InstanceManager::instance().switchToInstance(ci.instanceName); + m_switching = true; } else { - close(); + accept(); } } catch(Failed&) @@ -391,6 +393,11 @@ CreateInstanceDialog::Paths CreateInstanceDialog::paths() const return getSelected(&cid::Page::selectedPaths); } +bool CreateInstanceDialog::switching() const +{ + return m_switching; +} + void fixVarDir(QString& path, const std::wstring& defaultDir) { if (path.isEmpty()) { diff --git a/src/createinstancedialog.h b/src/createinstancedialog.h index 2f5774ae..95d4fa68 100644 --- a/src/createinstancedialog.h +++ b/src/createinstancedialog.h @@ -70,6 +70,7 @@ public: QString instanceName() const; QString dataPath() const; Paths paths() const; + bool switching() const; CreationInfo creationInfo() const; @@ -78,6 +79,7 @@ private: const PluginContainer& m_pc; std::vector<std::unique_ptr<cid::Page>> m_pages; QString m_originalNext; + bool m_switching; template <class T> T getSelected(T (cid::Page::*mf)() const) const diff --git a/src/instancemanagerdialog.cpp b/src/instancemanagerdialog.cpp index 5810a255..37bdea7b 100644 --- a/src/instancemanagerdialog.cpp +++ b/src/instancemanagerdialog.cpp @@ -20,7 +20,7 @@ void openInstanceManager(PluginContainer& pc, QWidget* parent) dlg.exec(); } -QString iniFile(const QDir& dir) +QString makeIniFile(const QDir& dir) { return dir.filePath(QString::fromStdWString(AppConfig::iniFileName())); } @@ -52,9 +52,16 @@ public: }; - InstanceInfo(QDir dir, bool isPortable) : - m_dir(std::move(dir)), m_portable(isPortable), m_settings(iniFile(dir)) + InstanceInfo(QDir dir, bool isPortable) + : m_portable(isPortable) { + setDir(dir); + } + + void setDir(const QDir& dir) + { + m_dir = dir; + m_settings.reset(new Settings(makeIniFile(dir))); } QString name() const @@ -68,8 +75,8 @@ public: QString gameName() const { - if (auto n=m_settings.game().name()) { - if (auto e=m_settings.game().edition()) { + if (auto n=m_settings->game().name()) { + if (auto e=m_settings->game().edition()) { if (!e->isEmpty()) { return *n + " (" + *e + ")"; } @@ -83,7 +90,7 @@ public: QString gamePath() const { - if (auto n=m_settings.game().directory()) { + if (auto n=m_settings->game().directory()) { return QDir::toNativeSeparators(*n); } else { return {}; @@ -97,7 +104,12 @@ public: QString baseDirectory() const { - return QDir::toNativeSeparators(m_settings.paths().base()); + return QDir::toNativeSeparators(m_settings->paths().base()); + } + + QString iniFile() const + { + return makeIniFile(m_dir); } bool isPortable() const @@ -169,7 +181,7 @@ public: const auto loc = location(); - const auto base = m_settings.paths().base(); + const auto base = m_settings->paths().base(); // directories that might contain the individual files and directories @@ -192,18 +204,18 @@ public: // all the directories that are part of an instance; none of them are // mandatory for deletion const std::vector<Object> dirs = { - m_settings.paths().downloads(), - m_settings.paths().mods(), - m_settings.paths().cache(), - m_settings.paths().profiles(), - m_settings.paths().overwrite(), + m_settings->paths().downloads(), + m_settings->paths().mods(), + m_settings->paths().cache(), + m_settings->paths().profiles(), + m_settings->paths().overwrite(), m_dir.filePath(QString::fromStdWString(AppConfig::dumpsDir())), m_dir.filePath(QString::fromStdWString(AppConfig::logPath())), }; // all the files that are part of an instance const std::vector<Object> files = { - {iniFile(m_dir), true}, // the ini file must be deleted + {iniFile(), true}, // the ini file must be deleted }; @@ -270,9 +282,9 @@ public: } private: + const bool m_portable; QDir m_dir; - bool m_portable; - Settings m_settings; + std::unique_ptr<Settings> m_settings; }; @@ -310,10 +322,11 @@ InstanceManagerDialog::InstanceManagerDialog( connect(ui->exploreLocation, &QPushButton::clicked, [&]{ exploreLocation(); }); connect(ui->exploreBaseDirectory, &QPushButton::clicked, [&]{ exploreBaseDirectory(); }); connect(ui->exploreGame, &QPushButton::clicked, [&]{ exploreGame(); }); - connect(ui->deleteInstance, &QPushButton::clicked, [&]{ deleteInstance(); }); connect(ui->convertToGlobal, &QPushButton::clicked, [&]{ convertToGlobal(); }); connect(ui->convertToPortable, &QPushButton::clicked, [&]{ convertToPortable(); }); + connect(ui->openINI, &QPushButton::clicked, [&]{ openINI(); }); + connect(ui->deleteInstance, &QPushButton::clicked, [&]{ deleteInstance(); }); connect(ui->switchToInstance, &QPushButton::clicked, [&]{ openSelectedInstance(); }); connect(ui->close, &QPushButton::clicked, [&]{ close(); }); @@ -387,6 +400,18 @@ void InstanceManagerDialog::select(std::size_t i) } } +void InstanceManagerDialog::select(const QString& name) +{ + for (std::size_t i=0; i<m_instances.size(); ++i) { + if (m_instances[i]->name() == name) { + select(i); + return; + } + } + + log::error("can't select instance {}, not in list", name); +} + void InstanceManagerDialog::selectActiveInstance() { const auto active = InstanceManager::instance().currentInstance(); @@ -492,6 +517,8 @@ void InstanceManagerDialog::rename() return; } + const auto selIndex = singleSelectionIndex(); + auto& m = InstanceManager::instance(); if (i->isActive()) { QMessageBox::information(this, @@ -519,6 +546,10 @@ void InstanceManagerDialog::rename() return; } + + m_model->item(selIndex)->setText(newName); + i->setDir(dest); + fillData(*i); } void InstanceManagerDialog::exploreLocation() @@ -542,6 +573,13 @@ void InstanceManagerDialog::exploreGame() } } +void InstanceManagerDialog::openINI() +{ + if (const auto* i=singleSelection()) { + shell::Open(i->iniFile()); + } +} + void InstanceManagerDialog::deleteInstance() { const auto* i = singleSelection(); @@ -665,7 +703,19 @@ void InstanceManagerDialog::onSelection() void InstanceManagerDialog::createNew() { CreateInstanceDialog dlg(m_pc, this); - dlg.exec(); + if (dlg.exec() != QDialog::Accepted) { + return; + } + + if (dlg.switching()) { + // restarting MO + return; + } + + updateInstances(); + updateList(); + + select(dlg.instanceName()); } std::size_t InstanceManagerDialog::singleSelectionIndex() const diff --git a/src/instancemanagerdialog.h b/src/instancemanagerdialog.h index 659710fe..477a7d01 100644 --- a/src/instancemanagerdialog.h +++ b/src/instancemanagerdialog.h @@ -20,6 +20,7 @@ public: ~InstanceManagerDialog(); void select(std::size_t i); + void select(const QString& name); void selectActiveInstance(); void openSelectedInstance(); @@ -27,9 +28,11 @@ public: void exploreLocation(); void exploreBaseDirectory(); void exploreGame(); - void deleteInstance(); + void convertToGlobal(); void convertToPortable(); + void openINI(); + void deleteInstance(); private: static const std::size_t NoSelection = -1; diff --git a/src/instancemanagerdialog.ui b/src/instancemanagerdialog.ui index 414d4982..410b58c1 100644 --- a/src/instancemanagerdialog.ui +++ b/src/instancemanagerdialog.ui @@ -107,6 +107,18 @@ <property name="editTriggers"> <set>QAbstractItemView::NoEditTriggers</set> </property> + <property name="verticalScrollMode"> + <enum>QAbstractItemView::ScrollPerPixel</enum> + </property> + <property name="horizontalScrollMode"> + <enum>QAbstractItemView::ScrollPerPixel</enum> + </property> + <property name="resizeMode"> + <enum>QListView::Adjust</enum> + </property> + <property name="uniformItemSizes"> + <bool>true</bool> + </property> </widget> </item> <item> @@ -309,6 +321,13 @@ </widget> </item> <item> + <widget class="QPushButton" name="openINI"> + <property name="text"> + <string>Open INI</string> + </property> + </widget> + </item> + <item> <widget class="QPushButton" name="deleteInstance"> <property name="text"> <string>Delete instance</string> |
