summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2020-08-15 22:35:19 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2020-11-03 11:39:07 -0500
commita9772873d69b875f5617c0121c73a271d432a29c (patch)
treea772e162e484ffb8e8c1e04dbe084a5c947c4fbf /src
parent14d15070c8b24e73297a6f37132b8ad5c6e966ef (diff)
open ini button
update when renaming instance update and select when creating instance
Diffstat (limited to 'src')
-rw-r--r--src/createinstancedialog.cpp13
-rw-r--r--src/createinstancedialog.h2
-rw-r--r--src/instancemanagerdialog.cpp86
-rw-r--r--src/instancemanagerdialog.h5
-rw-r--r--src/instancemanagerdialog.ui19
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>