summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2020-07-23 07:32:06 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2020-11-03 11:39:04 -0500
commit60b59ddf097fffa846a4d28e0d9256630da5149c (patch)
tree625f9efc16325f691f5e8a9931dec14a2b19d12e
parent5513b273c679b9edda951f418ef013a762ca587a (diff)
started create instance dialog
allow for multiple instances of Settings fill in information in instance manager
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/createinstancedialog.cpp176
-rw-r--r--src/createinstancedialog.h30
-rw-r--r--src/createinstancedialog.ui655
-rw-r--r--src/instancemanager.h2
-rw-r--r--src/instancemanagerdialog.cpp102
-rw-r--r--src/instancemanagerdialog.h16
-rw-r--r--src/instancemanagerdialog.ui116
-rw-r--r--src/main.cpp9
-rw-r--r--src/settings.cpp19
-rw-r--r--src/settings.h1
11 files changed, 1064 insertions, 63 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 1f048be8..af350584 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -84,6 +84,7 @@ add_filter(NAME src/executables GROUPS
)
add_filter(NAME src/instances GROUPS
+ createinstancedialog
instancemanager
instancemanagerdialog
)
diff --git a/src/createinstancedialog.cpp b/src/createinstancedialog.cpp
new file mode 100644
index 00000000..d43fba1c
--- /dev/null
+++ b/src/createinstancedialog.cpp
@@ -0,0 +1,176 @@
+#include "createinstancedialog.h"
+#include "ui_createinstancedialog.h"
+#include "instancemanager.h"
+
+namespace cid
+{
+
+class Page
+{
+public:
+ Page(CreateInstanceDialog& dlg, std::size_t i)
+ : ui(dlg.getUI()), m_dlg(dlg), m_index(i)
+ {
+ }
+
+ virtual bool ready() const
+ {
+ return true;
+ }
+
+ void next()
+ {
+ m_dlg.next();
+ }
+
+protected:
+ Ui::CreateInstanceDialog* ui;
+
+private:
+ CreateInstanceDialog& m_dlg;
+ std::size_t m_index;
+};
+
+class TypePage : public Page
+{
+public:
+ TypePage(CreateInstanceDialog& dlg, std::size_t i)
+ : Page(dlg, i)
+ {
+ ui->createGlobal->setDescription(
+ ui->createGlobal->description()
+ .arg(InstanceManager::instance().instancesPath()));
+
+ ui->createPortable->setDescription(
+ ui->createPortable->description()
+ .arg(qApp->applicationDirPath()));
+
+ QObject::connect(
+ ui->createGlobal, &QAbstractButton::clicked, [&]{ global(); });
+
+ QObject::connect(
+ ui->createPortable, &QAbstractButton::clicked, [&]{ portable(); });
+ }
+
+ bool ready() const override
+ {
+ return m_global.has_value();
+ }
+
+ void global()
+ {
+ m_global = true;
+
+ ui->createGlobal->setChecked(true);
+ ui->createPortable->setChecked(false);
+
+ next();
+ }
+
+ void portable()
+ {
+ m_global = false;
+
+ ui->createGlobal->setChecked(false);
+ ui->createPortable->setChecked(true);
+
+ next();
+ }
+
+private:
+ std::optional<bool> m_global;
+};
+
+
+class GamePage : public Page
+{
+public:
+ GamePage(CreateInstanceDialog& dlg, std::size_t i)
+ : Page(dlg, i)
+ {
+ }
+};
+
+
+class NamePage : public Page
+{
+public:
+ NamePage(CreateInstanceDialog& dlg, std::size_t i)
+ : Page(dlg, i)
+ {
+ }
+};
+
+
+class PathsPage : public Page
+{
+public:
+ PathsPage(CreateInstanceDialog& dlg, std::size_t i)
+ : Page(dlg, i)
+ {
+ }
+};
+
+} // namespace
+
+
+CreateInstanceDialog::CreateInstanceDialog(QWidget *parent)
+ : QDialog(parent), ui(new Ui::CreateInstanceDialog)
+{
+ using namespace cid;
+
+ ui->setupUi(this);
+
+ m_pages.push_back(std::make_unique<TypePage>(*this, 0));
+ m_pages.push_back(std::make_unique<GamePage>(*this, 1));
+ m_pages.push_back(std::make_unique<NamePage>(*this, 2));
+ m_pages.push_back(std::make_unique<PathsPage>(*this, 3));
+
+ ui->pages->setCurrentIndex(0);
+
+ updateNavigationButtons();
+
+ connect(ui->next, &QPushButton::clicked, [&]{ next(); });
+ connect(ui->back, &QPushButton::clicked, [&]{ back(); });
+
+ //
+ //SelectionDialog games(tr("Select a game to manage."));
+ //
+ //for (auto* game : m_pc.plugins<MOBase::IPluginGame>()) {
+ // if (game->isInstalled()) {
+ // games.addChoice(game->gameName(), game->gameDirectory().path(), {});
+ // } else {
+ // games.addChoice(game->gameName(), "", {});
+ // }
+ //}
+ //
+ //games.exec();
+}
+
+CreateInstanceDialog::~CreateInstanceDialog() = default;
+
+Ui::CreateInstanceDialog* CreateInstanceDialog::getUI()
+{
+ return ui.get();
+}
+
+void CreateInstanceDialog::next()
+{
+ ui->pages->setCurrentIndex(ui->pages->currentIndex() + 1);
+ updateNavigationButtons();
+}
+
+void CreateInstanceDialog::back()
+{
+ ui->pages->setCurrentIndex(ui->pages->currentIndex() - 1);
+ updateNavigationButtons();
+}
+
+void CreateInstanceDialog::updateNavigationButtons()
+{
+ const auto i = ui->pages->currentIndex();
+ const auto last = (i == (ui->pages->count() - 1));
+
+ ui->next->setEnabled(m_pages[i]->ready() && !last);
+ ui->back->setEnabled(i > 0);
+}
diff --git a/src/createinstancedialog.h b/src/createinstancedialog.h
new file mode 100644
index 00000000..03e9de01
--- /dev/null
+++ b/src/createinstancedialog.h
@@ -0,0 +1,30 @@
+#ifndef MODORGANIZER_CREATEINSTANCEDIALOG_INCLUDED
+#define MODORGANIZER_CREATEINSTANCEDIALOG_INCLUDED
+
+#include <QDialog>
+
+namespace Ui { class CreateInstanceDialog; };
+namespace cid { class Page; }
+
+class CreateInstanceDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit CreateInstanceDialog(QWidget *parent = nullptr);
+
+ ~CreateInstanceDialog();
+
+ Ui::CreateInstanceDialog* getUI();
+
+ void next();
+ void back();
+
+private:
+ std::unique_ptr<Ui::CreateInstanceDialog> ui;
+ std::vector<std::unique_ptr<cid::Page>> m_pages;
+
+ void updateNavigationButtons();
+};
+
+#endif // MODORGANIZER_CREATEINSTANCEDIALOG_INCLUDED
diff --git a/src/createinstancedialog.ui b/src/createinstancedialog.ui
new file mode 100644
index 00000000..bcfddb20
--- /dev/null
+++ b/src/createinstancedialog.ui
@@ -0,0 +1,655 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>CreateInstanceDialog</class>
+ <widget class="QDialog" name="CreateInstanceDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>493</width>
+ <height>423</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Creating an instance</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QWidget" name="widget" native="true">
+ <layout class="QVBoxLayout" name="verticalLayout_15">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>&lt;h2&gt;Creating a new instance&lt;/h2&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>10</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QStackedWidget" name="pages">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="page">
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QWidget" name="widget_7" native="true">
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>&lt;h3&gt;Select the type of instance to create.&lt;/h3&gt;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_3" native="true">
+ <layout class="QVBoxLayout" name="verticalLayout_2" stretch="1">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QWidget" name="widget_4" native="true">
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QCommandLinkButton" name="createGlobal">
+ <property name="text">
+ <string>Create a global instance</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="description">
+ <string>Global instances are stored in %1, but some paths can be changed to be on a different drive if necessary. A single installation of Mod Organizer can manage multiple global instances.</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCommandLinkButton" name="createPortable">
+ <property name="text">
+ <string>Create a portable instance</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="description">
+ <string>A portable instance stores everything in Mod Organizer's installation folder, currently %1. There can only be one portable instance per installation of Mod Organizer.</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_2">
+ <layout class="QVBoxLayout" name="verticalLayout_7">
+ <item>
+ <widget class="QWidget" name="widget_5" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>&lt;h3&gt;Select the game to manage.&lt;/h3&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="showAllGames">
+ <property name="text">
+ <string>Show all supported games</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_6" native="true">
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QListWidget" name="games"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_5">
+ <layout class="QVBoxLayout" name="verticalLayout_9">
+ <item>
+ <widget class="QWidget" name="widget_8" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>&lt;h3&gt;Pick a name for this instance.&lt;/h3&gt;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_9" native="true">
+ <layout class="QVBoxLayout" name="verticalLayout_8">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLineEdit" name="instanceName">
+ <property name="placeholderText">
+ <string>Instance name</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_6">
+ <layout class="QVBoxLayout" name="verticalLayout_14">
+ <item>
+ <widget class="QWidget" name="widget_10" native="true">
+ <layout class="QVBoxLayout" name="verticalLayout_10">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>&lt;h3&gt;Select a folder where the data should be stored.&lt;/h3&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_7">
+ <property name="text">
+ <string>This includes downloads, mods, profiles and overwrite. If there is enough space on this drive, you should use the default folder.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_13" native="true">
+ <layout class="QVBoxLayout" name="verticalLayout_11">
+ <item>
+ <widget class="QStackedWidget" name="pathPages">
+ <property name="currentIndex">
+ <number>1</number>
+ </property>
+ <widget class="QWidget" name="page_7">
+ <layout class="QVBoxLayout" name="verticalLayout_12">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QWidget" name="widget_11" native="true">
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="2">
+ <widget class="QToolButton" name="browseLocation">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>Location</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <spacer name="verticalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="location"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_8">
+ <layout class="QVBoxLayout" name="verticalLayout_13">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QWidget" name="widget_12" native="true">
+ <layout class="QGridLayout" name="gridLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_13">
+ <property name="text">
+ <string>Overwrite</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_10">
+ <property name="text">
+ <string>Mods</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>Base directory</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <spacer name="verticalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_12">
+ <property name="text">
+ <string>Profiles</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLineEdit" name="mods"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_9">
+ <property name="text">
+ <string>Downloads</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLineEdit" name="downloads"/>
+ </item>
+ <item row="3" column="2">
+ <widget class="QLineEdit" name="profiles"/>
+ </item>
+ <item row="4" column="2">
+ <widget class="QLineEdit" name="overwrite"/>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLineEdit" name="base"/>
+ </item>
+ <item row="5" column="0" colspan="4">
+ <widget class="QLabel" name="label_11">
+ <property name="text">
+ <string>Use &lt;code&gt;%BASE_DIR%&lt;/code&gt; to refer to the Base Directory.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QToolButton" name="browseBase">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QToolButton" name="browseDownloads">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3">
+ <widget class="QToolButton" name="browseOverwrite">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3">
+ <widget class="QToolButton" name="browseProfiles">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="QToolButton" name="browseMods">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_14" native="true">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>292</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="advancedPathOptions">
+ <property name="text">
+ <string>Show advanced options</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_2" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="back">
+ <property name="text">
+ <string>&lt; Back</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="next">
+ <property name="text">
+ <string>Next &gt;</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancel">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/instancemanager.h b/src/instancemanager.h
index 8bbbbee9..d53f4391 100644
--- a/src/instancemanager.h
+++ b/src/instancemanager.h
@@ -49,6 +49,7 @@ public:
bool allowedToChangeInstance() const;
static bool isPortablePath(const QString& dataPath);
+ QString instancesPath() const;
QStringList instanceNames() const;
std::vector<QDir> instancePaths() const;
@@ -56,7 +57,6 @@ private:
InstanceManager();
- QString instancesPath() const;
QString instancePath(const QString& instanceName) const;
bool deleteLocalInstance(const QString &instanceId) const;
diff --git a/src/instancemanagerdialog.cpp b/src/instancemanagerdialog.cpp
index 1b482099..c7042aa8 100644
--- a/src/instancemanagerdialog.cpp
+++ b/src/instancemanagerdialog.cpp
@@ -1,12 +1,19 @@
#include "instancemanagerdialog.h"
#include "ui_instancemanagerdialog.h"
#include "instancemanager.h"
+#include "createinstancedialog.h"
+#include "settings.h"
+#include "selectiondialog.h"
+#include "plugincontainer.h"
+#include "shared/appconfig.h"
+#include <iplugingame.h>
class InstanceInfo
{
public:
- InstanceInfo(QDir dir)
- : m_dir(std::move(dir))
+ InstanceInfo(QDir dir) :
+ m_dir(std::move(dir)),
+ m_settings(dir.filePath(QString::fromStdWString(AppConfig::iniFileName())))
{
}
@@ -15,22 +22,105 @@ public:
return m_dir.dirName();
}
+ QString gameName() const
+ {
+ if (auto n=m_settings.game().name()) {
+ if (auto e=m_settings.game().edition()) {
+ if (!e->isEmpty()) {
+ return *n + " (" + *e + ")";
+ }
+ }
+
+ return *n;
+ } else {
+ return {};
+ }
+ }
+
+ QString gamePath() const
+ {
+ if (auto n=m_settings.game().directory()) {
+ return *n;
+ } else {
+ return {};
+ }
+ }
+
+ QString location() const
+ {
+ return m_dir.path();
+ }
+
+ QString baseDirectory() const
+ {
+ return m_settings.paths().base();
+ }
+
private:
QDir m_dir;
+ Settings m_settings;
};
-InstanceManagerDialog::InstanceManagerDialog(QWidget *parent)
- : QDialog(parent), ui(new Ui::InstanceManagerDialog)
+InstanceManagerDialog::InstanceManagerDialog(
+ const PluginContainer& pc, QWidget *parent)
+ : QDialog(parent), ui(new Ui::InstanceManagerDialog), m_pc(pc)
{
ui->setupUi(this);
+ ui->splitter->setSizes({200, 1});
+ ui->splitter->setStretchFactor(0, 0);
+ ui->splitter->setStretchFactor(1, 1);
auto& m = InstanceManager::instance();
for (auto&& d : m.instancePaths()) {
- InstanceInfo i(d);
- ui->list->addItem(i.name());
+ auto ii = std::make_unique<InstanceInfo>(d);
+
+ ui->list->addItem(ii->name());
+ m_instances.push_back(std::move(ii));
+ }
+
+ if (!m_instances.empty()) {
+ select(0);
}
+
+ connect(ui->createNew, &QPushButton::clicked, [&]{ createNew(); });
+ connect(ui->list, &QListWidget::itemSelectionChanged, [&]{ onSelection(); });
}
InstanceManagerDialog::~InstanceManagerDialog() = default;
+
+void InstanceManagerDialog::select(std::size_t i)
+{
+ if (i >= m_instances.size()) {
+ return;
+ }
+
+ const auto& ii = m_instances[i];
+ fill(*ii);
+}
+
+void InstanceManagerDialog::onSelection()
+{
+ const auto sel = ui->list->selectionModel()->selectedIndexes();
+ if (sel.size() != 1) {
+ return;
+ }
+
+ select(static_cast<std::size_t>(sel[0].row()));
+}
+
+void InstanceManagerDialog::createNew()
+{
+ CreateInstanceDialog dlg(this);
+ dlg.exec();
+}
+
+void InstanceManagerDialog::fill(const InstanceInfo& ii)
+{
+ ui->name->setText(ii.name());
+ ui->location->setText(ii.location());
+ ui->baseDirectory->setText(ii.baseDirectory());
+ ui->gameName->setText(ii.gameName());
+ ui->gameDir->setText(ii.gamePath());
+}
diff --git a/src/instancemanagerdialog.h b/src/instancemanagerdialog.h
index ea1cfc48..c3e947dd 100644
--- a/src/instancemanagerdialog.h
+++ b/src/instancemanagerdialog.h
@@ -5,16 +5,30 @@
namespace Ui { class InstanceManagerDialog; };
+class InstanceInfo;
+class PluginContainer;
+
class InstanceManagerDialog : public QDialog
{
Q_OBJECT
public:
- explicit InstanceManagerDialog(QWidget *parent = nullptr);
+ explicit InstanceManagerDialog(
+ const PluginContainer& pc, QWidget *parent = nullptr);
+
~InstanceManagerDialog();
+ void select(std::size_t i);
+
private:
std::unique_ptr<Ui::InstanceManagerDialog> ui;
+ const PluginContainer& m_pc;
+ std::vector<std::unique_ptr<InstanceInfo>> m_instances;
+
+ void onSelection();
+ void createNew();
+
+ void fill(const InstanceInfo& ii);
};
#endif // MODORGANIZER_INSTANCEMANAGERDIALOG_INCLUDED
diff --git a/src/instancemanagerdialog.ui b/src/instancemanagerdialog.ui
index b35d2e58..146b5fb5 100644
--- a/src/instancemanagerdialog.ui
+++ b/src/instancemanagerdialog.ui
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>531</width>
+ <width>689</width>
<height>413</height>
</rect>
</property>
@@ -41,17 +41,6 @@
</widget>
</item>
<item>
- <widget class="QPushButton" name="createPortable">
- <property name="text">
- <string>Create portable instance</string>
- </property>
- <property name="icon">
- <iconset resource="resources.qrc">
- <normaloff>:/MO/gui/package</normaloff>:/MO/gui/package</iconset>
- </property>
- </widget>
- </item>
- <item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@@ -65,9 +54,9 @@
</spacer>
</item>
<item>
- <widget class="QLabel" name="whatis">
+ <widget class="LinkLabel" name="whatis">
<property name="text">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/ModOrganizer2/modorganizer/wiki/Instance&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;What is an instance?&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/ModOrganizer2/modorganizer/wiki/Instance&quot;&gt;What is an instance?&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
@@ -134,7 +123,7 @@
</property>
<item>
<widget class="QWidget" name="widget_7" native="true">
- <layout class="QGridLayout" name="gridLayout" columnstretch="0,1,0">
+ <layout class="QGridLayout" name="gridLayout" columnstretch="0,0,0">
<property name="leftMargin">
<number>0</number>
</property>
@@ -148,33 +137,51 @@
<number>0</number>
</property>
<item row="0" column="1">
- <widget class="QLabel" name="name">
+ <widget class="QLineEdit" name="name">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_2">
<property name="text">
- <string notr="true">instance name</string>
+ <string>Name</string>
</property>
- <property name="textInteractionFlags">
- <set>Qt::TextBrowserInteraction</set>
+ </widget>
+ </item>
+ <item row="4" column="2">
+ <widget class="QPushButton" name="exploreLocation">
+ <property name="text">
+ <string>Explore</string>
</property>
</widget>
</item>
- <item row="2" column="0">
+ <item row="6" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
- <string>Game:</string>
+ <string>Game</string>
</property>
</widget>
</item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Name:</string>
+ <item row="6" column="1">
+ <widget class="QLineEdit" name="gameName">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLineEdit" name="location">
+ <property name="readOnly">
+ <bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
- <string>Location:</string>
+ <string>Location</string>
</property>
</widget>
</item>
@@ -185,30 +192,24 @@
</property>
</widget>
</item>
- <item row="4" column="1">
- <widget class="QLabel" name="location">
+ <item row="7" column="0">
+ <widget class="QLabel" name="label">
<property name="text">
- <string notr="true">location path</string>
- </property>
- <property name="textInteractionFlags">
- <set>Qt::TextBrowserInteraction</set>
+ <string>Game location</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
- <string>Base folder:</string>
+ <string>Base folder</string>
</property>
</widget>
</item>
<item row="5" column="1">
- <widget class="QLabel" name="baseDirectory">
- <property name="text">
- <string notr="true">base folder path</string>
- </property>
- <property name="textInteractionFlags">
- <set>Qt::TextBrowserInteraction</set>
+ <widget class="QLineEdit" name="baseDirectory">
+ <property name="readOnly">
+ <bool>true</bool>
</property>
</widget>
</item>
@@ -219,20 +220,17 @@
</property>
</widget>
</item>
- <item row="4" column="2">
- <widget class="QPushButton" name="exploreLocation">
- <property name="text">
- <string>Explore</string>
+ <item row="7" column="1">
+ <widget class="QLineEdit" name="gameDir">
+ <property name="readOnly">
+ <bool>true</bool>
</property>
</widget>
</item>
- <item row="2" column="1" colspan="2">
- <widget class="QLabel" name="gameName">
+ <item row="7" column="2">
+ <widget class="QPushButton" name="exploreGame">
<property name="text">
- <string notr="true">game name</string>
- </property>
- <property name="textInteractionFlags">
- <set>Qt::TextBrowserInteraction</set>
+ <string>Explore</string>
</property>
</widget>
</item>
@@ -292,6 +290,19 @@
</property>
</widget>
</item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
</layout>
</widget>
</item>
@@ -371,6 +382,13 @@
</item>
</layout>
</widget>
+ <customwidgets>
+ <customwidget>
+ <class>LinkLabel</class>
+ <extends>QLabel</extends>
+ <header location="global">linklabel.h</header>
+ </customwidget>
+ </customwidgets>
<resources>
<include location="resources.qrc"/>
</resources>
diff --git a/src/main.cpp b/src/main.cpp
index 08d70dd9..71fb0bbd 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -25,6 +25,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "tutorialmanager.h"
#include "nxmaccessmanager.h"
#include "instancemanager.h"
+#include "instancemanagerdialog.h"
#include "organizercore.h"
#include "env.h"
#include "envmodule.h"
@@ -298,6 +299,8 @@ int runApplication(
try
{
Settings settings(dataPath + "/" + QString::fromStdWString(AppConfig::iniFileName()));
+ settings.setGlobalInstance();
+
log::getDefault().setLevel(settings.diagnostics().logLevel());
log::debug("using ini at '{}'", settings.filename());
@@ -429,6 +432,12 @@ int runApplication(
tt.stop();
+ QTimer::singleShot(std::chrono::milliseconds(1), [&]
+ {
+ InstanceManagerDialog dlg(*pluginContainer, &mainWindow);
+ dlg.exec();
+ });
+
res = application.exec();
mainWindow.close();
diff --git a/src/settings.cpp b/src/settings.cpp
index d37f0d99..43e7a4fa 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -68,17 +68,24 @@ Settings::Settings(const QString& path) :
m_Network(m_Settings), m_Nexus(*this, m_Settings), m_Steam(*this, m_Settings),
m_Interface(m_Settings), m_Diagnostics(m_Settings)
{
- if (s_Instance != nullptr) {
- throw std::runtime_error("second instance of \"Settings\" created");
- } else {
- s_Instance = this;
- }
}
Settings::~Settings()
{
MOBase::QuestionBoxMemory::setCallbacks({}, {}, {});
- s_Instance = nullptr;
+
+ if (s_Instance == this) {
+ s_Instance = nullptr;
+ }
+}
+
+void Settings::setGlobalInstance()
+{
+ if (s_Instance != nullptr) {
+ throw std::runtime_error("second instance of \"Settings\" created");
+ } else {
+ s_Instance = this;
+ }
}
Settings &Settings::instance()
diff --git a/src/settings.h b/src/settings.h
index a1b30462..84102c72 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -681,6 +681,7 @@ public:
~Settings();
static Settings &instance();
+ void setGlobalInstance();
// name of the ini file
//