diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/instancemanagerdialog.cpp | 102 | ||||
| -rw-r--r-- | src/instancemanagerdialog.h | 6 | ||||
| -rw-r--r-- | src/instancemanagerdialog.ui | 6 |
3 files changed, 88 insertions, 26 deletions
diff --git a/src/instancemanagerdialog.cpp b/src/instancemanagerdialog.cpp index aa6bdb04..99ade7ad 100644 --- a/src/instancemanagerdialog.cpp +++ b/src/instancemanagerdialog.cpp @@ -21,15 +21,19 @@ void openInstanceManager(PluginContainer& pc, QWidget* parent) class InstanceInfo { public: - InstanceInfo(QDir dir) : - m_dir(std::move(dir)), + InstanceInfo(QDir dir, bool isPortable) : + m_dir(std::move(dir)), m_portable(isPortable), m_settings(dir.filePath(QString::fromStdWString(AppConfig::iniFileName()))) { } QString name() const { - return m_dir.dirName(); + if (m_portable) { + return QObject::tr("Portable"); + } else { + return m_dir.dirName(); + } } QString gameName() const @@ -66,52 +70,83 @@ public: return m_settings.paths().base(); } + bool isPortable() const + { + return m_portable; + } + private: QDir m_dir; + bool m_portable; Settings m_settings; }; +InstanceManagerDialog::~InstanceManagerDialog() = default; + InstanceManagerDialog::InstanceManagerDialog( - const PluginContainer& pc, QWidget *parent) - : QDialog(parent), ui(new Ui::InstanceManagerDialog), m_pc(pc) + const PluginContainer& pc, QWidget *parent) : + QDialog(parent), ui(new Ui::InstanceManagerDialog), m_pc(pc), + m_model(nullptr) { ui->setupUi(this); ui->splitter->setSizes({200, 1}); ui->splitter->setStretchFactor(0, 0); ui->splitter->setStretchFactor(1, 1); - auto* model = new QStandardItemModel; - ui->list->setModel(model); + m_model = new QStandardItemModel; + ui->list->setModel(m_model); m_filter.setEdit(ui->filter); m_filter.setList(ui->list); m_filter.setUpdateDelay(false); m_filter.setFilteredBorder(false); - auto& m = InstanceManager::instance(); - - for (auto&& d : m.instancePaths()) { - auto ii = std::make_unique<InstanceInfo>(d); - - model->appendRow(new QStandardItem(ii->name())); - m_instances.push_back(std::move(ii)); - } - - if (!m_instances.empty()) { - select(0); - } + updateInstances(); + updateList(); connect(ui->createNew, &QPushButton::clicked, [&]{ createNew(); }); + connect(ui->list->selectionModel(), &QItemSelectionModel::selectionChanged, [&]{ onSelection(); }); //connect(ui->list, &QListWidget::itemActivated, [&]{ openSelectedInstance(); }); + connect(ui->rename, &QPushButton::clicked, [&]{ rename(); }); connect(ui->exploreLocation, &QPushButton::clicked, [&]{ exploreLocation(); }); connect(ui->exploreBaseDirectory, &QPushButton::clicked, [&]{ exploreBaseDirectory(); }); connect(ui->exploreGame, &QPushButton::clicked, [&]{ exploreGame(); }); + + connect(ui->switchToInstance, &QPushButton::clicked, [&]{ openSelectedInstance(); }); + connect(ui->close, &QPushButton::clicked, [&]{ close(); }); } -InstanceManagerDialog::~InstanceManagerDialog() = default; +void InstanceManagerDialog::updateInstances() +{ + auto& m = InstanceManager::instance(); + + m_instances.clear(); + + if (m.portableInstanceExists()) { + m_instances.push_back(std::make_unique<InstanceInfo>( + m.portablePath(), true)); + } + + for (auto&& d : m.instancePaths()) { + m_instances.push_back(std::make_unique<InstanceInfo>(d, false)); + } +} + +void InstanceManagerDialog::updateList() +{ + m_model->clear(); + + for (auto&& ii : m_instances) { + m_model->appendRow(new QStandardItem(ii->name())); + } + + if (!m_instances.empty()) { + select(0); + } +} void InstanceManagerDialog::select(std::size_t i) { @@ -120,7 +155,7 @@ void InstanceManagerDialog::select(std::size_t i) } const auto& ii = m_instances[i]; - fill(*ii); + fillData(*ii); ui->list->selectionModel()->select( m_filter.mapFromSource(m_filter.sourceModel()->index(i, 0)), @@ -212,6 +247,8 @@ void InstanceManagerDialog::rename() return; } + + } void InstanceManagerDialog::exploreLocation() @@ -283,11 +320,32 @@ const InstanceInfo* InstanceManagerDialog::singleSelection() const return m_instances[i].get(); } -void InstanceManagerDialog::fill(const InstanceInfo& ii) +void InstanceManagerDialog::fillData(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()); + + const auto& m = InstanceManager::instance(); + + ui->rename->setEnabled(!ii.isPortable()); + + if (ii.isPortable()) { + ui->convertToPortable->setVisible(false); + ui->convertToGlobal->setVisible(true); + ui->convertToGlobal->setEnabled(true); + } else { + ui->convertToPortable->setVisible(true); + ui->convertToGlobal->setVisible(false); + + if (m.portableInstanceExists()) { + ui->convertToPortable->setEnabled(false); + ui->convertToPortable->setToolTip(tr("A portable instance already exists.")); + } else { + ui->convertToPortable->setEnabled(false); + ui->convertToPortable->setToolTip(""); + } + } } diff --git a/src/instancemanagerdialog.h b/src/instancemanagerdialog.h index 529a99b8..d102facb 100644 --- a/src/instancemanagerdialog.h +++ b/src/instancemanagerdialog.h @@ -34,6 +34,9 @@ private: const PluginContainer& m_pc; std::vector<std::unique_ptr<InstanceInfo>> m_instances; MOBase::FilterWidget m_filter; + QStandardItemModel* m_model; + + void updateInstances(); void onSelection(); void createNew(); @@ -42,7 +45,8 @@ private: InstanceInfo* singleSelection(); const InstanceInfo* singleSelection() const; - void fill(const InstanceInfo& ii); + void updateList(); + void fillData(const InstanceInfo& ii); }; #endif // MODORGANIZER_INSTANCEMANAGERDIALOG_INCLUDED diff --git a/src/instancemanagerdialog.ui b/src/instancemanagerdialog.ui index 08894ec1..8bf28ed6 100644 --- a/src/instancemanagerdialog.ui +++ b/src/instancemanagerdialog.ui @@ -382,7 +382,7 @@ </spacer> </item> <item> - <widget class="QPushButton" name="ok"> + <widget class="QPushButton" name="switchToInstance"> <property name="text"> <string>Switch to this instance</string> </property> @@ -393,9 +393,9 @@ </widget> </item> <item> - <widget class="QPushButton" name="cancel"> + <widget class="QPushButton" name="close"> <property name="text"> - <string>Cancel</string> + <string>Close</string> </property> <property name="default"> <bool>true</bool> |
