summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/instancemanager.cpp59
-rw-r--r--src/instancemanager.h3
-rw-r--r--src/instancemanagerdialog.cpp19
-rw-r--r--src/settings.cpp5
-rw-r--r--src/settings.h4
5 files changed, 89 insertions, 1 deletions
diff --git a/src/instancemanager.cpp b/src/instancemanager.cpp
index 111f948b..4ad099ed 100644
--- a/src/instancemanager.cpp
+++ b/src/instancemanager.cpp
@@ -637,6 +637,65 @@ MOBase::IPluginGame* InstanceManager::determineCurrentGame(
return nullptr;
}
+const MOBase::IPluginGame* InstanceManager::gamePluginForDirectory(
+ const QDir& instanceDir, const PluginContainer& plugins) const
+{
+ const QString ini =
+ QDir(instanceDir).filePath(QString::fromStdWString(AppConfig::iniFileName()));
+
+
+ Settings s(ini);
+
+ if (s.iniStatus() != QSettings::NoError)
+ {
+ log::error("failed to load settings from {}", ini);
+ return nullptr;
+ }
+
+ const auto instanceGameName = s.game().name();
+
+ if (instanceGameName && !instanceGameName->isEmpty())
+ {
+ for (const IPluginGame* game : plugins.plugins<IPluginGame>()) {
+ if (instanceGameName->compare(game->gameName(), Qt::CaseInsensitive) == 0) {
+ return game;
+ }
+ }
+
+ log::error(
+ "no plugin reports game name '{}' found in ini {}",
+ *instanceGameName, ini);
+ }
+ else
+ {
+ log::error("no game name found in ini {}", ini);
+ }
+
+
+ log::error("falling back on looksValid check");
+
+ const auto gameDir = s.game().directory();
+
+ if (gameDir && !gameDir->isEmpty())
+ {
+ for (const IPluginGame* game : plugins.plugins<IPluginGame>()) {
+ if (game->looksValid(*gameDir)) {
+ return game;
+ }
+ }
+
+ log::error(
+ "no plugins appear to support game directory '{}' from ini {}",
+ *gameDir, ini);
+ }
+ else
+ {
+ log::error("no game directory found in ini {}", ini);
+ }
+
+ return nullptr;
+}
+
QString InstanceManager::makeUniqueName(const QString& instanceName) const
{
const QString sanitized = sanitizeInstanceName(instanceName);
diff --git a/src/instancemanager.h b/src/instancemanager.h
index 33e115a7..c2d1e0f4 100644
--- a/src/instancemanager.h
+++ b/src/instancemanager.h
@@ -47,6 +47,9 @@ public:
MOBase::IPluginGame* determineCurrentGame(
const QString& moPath, Settings& settings, const PluginContainer &plugins);
+ const MOBase::IPluginGame* gamePluginForDirectory(
+ const QDir& dir, const PluginContainer& plugins) const;
+
void clearCurrentInstance();
QString currentInstance() const;
void setCurrentInstance(const QString &name);
diff --git a/src/instancemanagerdialog.cpp b/src/instancemanagerdialog.cpp
index 7b8522ee..545b5c71 100644
--- a/src/instancemanagerdialog.cpp
+++ b/src/instancemanagerdialog.cpp
@@ -112,6 +112,19 @@ public:
return makeIniFile(m_dir);
}
+ QIcon icon(const PluginContainer& plugins) const
+ {
+ const auto* game = InstanceManager::instance().gamePluginForDirectory(
+ m_dir, plugins);
+
+ if (game)
+ return game->gameIcon();
+
+ QPixmap empty(32, 32);
+ empty.fill(QColor(0, 0, 0, 0));
+ return QIcon(empty);
+ }
+
bool isPortable() const
{
return m_portable;
@@ -376,7 +389,11 @@ void InstanceManagerDialog::updateList()
for (std::size_t i=0; i<m_instances.size(); ++i) {
const auto& ii = *m_instances[i];
- m_model->appendRow(new QStandardItem(ii.name()));
+
+ auto* item = new QStandardItem(ii.name());
+ item->setIcon(ii.icon(m_pc));
+
+ m_model->appendRow(item);
if (&ii == prevSel) {
sel = i;
diff --git a/src/settings.cpp b/src/settings.cpp
index 593d66bf..99b41e1f 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -465,6 +465,11 @@ QSettings::Status Settings::sync() const
return m_Settings.status();
}
+QSettings::Status Settings::iniStatus() const
+{
+ return m_Settings.status();
+}
+
void Settings::dump() const
{
static const QStringList ignore({
diff --git a/src/settings.h b/src/settings.h
index f71949d2..c8325ba2 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -778,6 +778,10 @@ public:
//
QSettings::Status sync() const;
+ // last status of the ini file
+ //
+ QSettings::Status iniStatus() const;
+
void dump() const;
public slots: