diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/instancemanager.cpp | 59 | ||||
| -rw-r--r-- | src/instancemanager.h | 3 | ||||
| -rw-r--r-- | src/instancemanagerdialog.cpp | 19 | ||||
| -rw-r--r-- | src/settings.cpp | 5 | ||||
| -rw-r--r-- | src/settings.h | 4 |
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: |
