From e6a87a17987de5d8e462634777df31e2cae5c1a6 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Wed, 4 Nov 2020 20:57:50 -0500 Subject: added IPlugin::registered() removed useless dummy interfaces because init() isn't called anymore python plugins currently broken because init() isn't called on them fixed create instance dialog being shown on startup even if portable instance existed display a message when the last instance can't be found fixed instance manager dialog failing to open the portable instance --- src/instancemanager.cpp | 8 +- src/instancemanagerdialog.cpp | 6 +- src/main.cpp | 37 ++++++-- src/modlist.cpp | 71 --------------- src/modlist.h | 20 ---- src/organizerproxy.cpp | 206 ------------------------------------------ src/organizerproxy.h | 56 ------------ src/plugincontainer.cpp | 35 ++++--- src/plugincontainer.h | 2 +- src/pluginlist.cpp | 65 ------------- src/pluginlist.h | 19 ---- 11 files changed, 54 insertions(+), 471 deletions(-) (limited to 'src') diff --git a/src/instancemanager.cpp b/src/instancemanager.cpp index c79c5254..61c442be 100644 --- a/src/instancemanager.cpp +++ b/src/instancemanager.cpp @@ -334,13 +334,7 @@ std::optional InstanceManager::currentInstance() const } } - QString path = instancePath(name); - if (!QFileInfo::exists(path)) { - // the previously used instance doesn't exist anymore - return {}; - } - - return Instance(QDir(path), false, profile); + return Instance(QDir(instancePath(name)), false, profile); } void InstanceManager::clearCurrentInstance() diff --git a/src/instancemanagerdialog.cpp b/src/instancemanagerdialog.cpp index 231835ba..282329a5 100644 --- a/src/instancemanagerdialog.cpp +++ b/src/instancemanagerdialog.cpp @@ -462,7 +462,11 @@ void InstanceManagerDialog::openSelectedInstance() return; } - InstanceManager::instance().setCurrentInstance(m_instances[i]->name()); + if (m_instances[i]->isPortable()) { + InstanceManager::instance().setCurrentInstance(""); + } else { + InstanceManager::instance().setCurrentInstance(m_instances[i]->name()); + } if (m_restartOnSelect) { ExitModOrganizer(Exit::Restart); diff --git a/src/main.cpp b/src/main.cpp index 8f7af77d..7b489aee 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -272,22 +272,22 @@ std::optional handleCommandLine( return {}; } -void openInstanceManager(PluginContainer& pc, QWidget* parent); - std::optional selectInstance() { + auto& m = InstanceManager::instance(); + NexusInterface ni(nullptr); PluginContainer pc(nullptr); pc.loadPlugins(); - if (InstanceManager::instance().instancePaths().empty()) { + if (m.instancePaths().empty() && !m.portableInstanceExists()) { // no instances configured CreateInstanceDialog dlg(pc, nullptr); if (dlg.exec() != QDialog::Accepted) { return {}; } - return InstanceManager::instance().currentInstance(); + return m.currentInstance(); } @@ -302,7 +302,7 @@ std::optional selectInstance() return {}; } - return InstanceManager::instance().currentInstance(); + return m.currentInstance(); } enum class SetupInstanceResults @@ -650,13 +650,36 @@ int doOneRun( // resets things when MO is "restarted" resetForRestart(cl); - auto currentInstance = InstanceManager::instance().currentInstance(); + auto& m = InstanceManager::instance(); + auto currentInstance = m.currentInstance(); if (!currentInstance) { currentInstance = selectInstance(); - if (!currentInstance) + if (!currentInstance) { return 1; + } + } + else + { + if (!currentInstance->directory().exists()) { + // the previously used instance doesn't exist anymore + + if (m.instanceNames().empty() && !m.portableInstanceExists()) { + criticalOnTop(QObject::tr( + "Instance at '%1' not found. You must create a new instance") + .arg(currentInstance->directory().absolutePath())); + } else { + criticalOnTop(QObject::tr( + "Instance at '%1' not found. Select another instance.") + .arg(currentInstance->directory().absolutePath())); + } + + currentInstance = selectInstance(); + if (!currentInstance) { + return 1; + } + } } const QString dataPath = currentInstance->directory().path(); diff --git a/src/modlist.cpp b/src/modlist.cpp index c98464a9..04abfb01 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -1528,74 +1528,3 @@ void ModList::disableSelected(const QItemSelectionModel *selectionModel) m_Profile->setModsEnabled(QList(), modsToDisable); } } - - -QString DummyModList::displayName(const QString&) const -{ - return {}; -} - -QStringList DummyModList::allMods() const -{ - return {}; -} - -QStringList DummyModList::allModsByProfilePriority(MOBase::IProfile*) const -{ - return {}; -} - -IModInterface* DummyModList::getMod(const QString&) const -{ - return nullptr; -} - -bool DummyModList::removeMod(MOBase::IModInterface*) -{ - return true; -} - -IModList::ModStates DummyModList::state(const QString&) const -{ - return 0; -} - -bool DummyModList::setActive(const QString&, bool) -{ - return true; -} - -int DummyModList::setActive(const QStringList&, bool) -{ - return 0; -} - -int DummyModList::priority(const QString&) const -{ - return -1; -} - -bool DummyModList::setPriority(const QString&, int) -{ - return true; -} - -bool DummyModList::onModInstalled(const std::function&) -{ - return true; -} - -bool DummyModList::onModRemoved(const std::function&) -{ - return true; -} - -bool DummyModList::onModStateChanged(const std::function&)>&) -{ - return true; -} - -bool DummyModList::onModMoved(const std::function&) -{ - return true; -} diff --git a/src/modlist.h b/src/modlist.h index 1a469ee7..385ca04c 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -397,25 +397,5 @@ private: }; - -class DummyModList : public MOBase::IModList -{ -public: - QString displayName(const QString &internalName) const override; - QStringList allMods() const override; - QStringList allModsByProfilePriority(MOBase::IProfile *profile = nullptr) const override; - MOBase::IModInterface* getMod(const QString& name) const override; - bool removeMod(MOBase::IModInterface *mod) override; - ModStates state(const QString &name) const override; - bool setActive(const QString &name, bool active) override; - int setActive(const QStringList& names, bool active) override; - int priority(const QString &name) const override; - bool setPriority(const QString &name, int newPriority) override; - bool onModInstalled(const std::function& func) override; - bool onModRemoved(const std::function& func) override; - bool onModStateChanged(const std::function&)> &func) override; - bool onModMoved(const std::function &func) override; -}; - #endif // MODLIST_H diff --git a/src/organizerproxy.cpp b/src/organizerproxy.cpp index b2a4f791..45efc00c 100644 --- a/src/organizerproxy.cpp +++ b/src/organizerproxy.cpp @@ -287,209 +287,3 @@ bool OrganizerProxy::onPluginSettingChanged(std::functiononPluginSettingChanged(func); } - - - -DummyOrganizerProxy::DummyOrganizerProxy(MOBase::IPlugin* plugin) - : m_mods(new DummyModList), m_plugins(new DummyPluginList) -{ -} - -DummyOrganizerProxy::~DummyOrganizerProxy() = default; - -IModRepositoryBridge *DummyOrganizerProxy::createNexusBridge() const -{ - return nullptr; -} - -QString DummyOrganizerProxy::profileName() const -{ - return {}; -} - -QString DummyOrganizerProxy::profilePath() const -{ - return {}; -} - -QString DummyOrganizerProxy::downloadsPath() const -{ - return {}; -} - -QString DummyOrganizerProxy::overwritePath() const -{ - return {}; -} - -QString DummyOrganizerProxy::basePath() const -{ - return {}; -} - -QString DummyOrganizerProxy::modsPath() const -{ - return {}; -} - -VersionInfo DummyOrganizerProxy::appVersion() const -{ - return {}; -} - -IPluginGame *DummyOrganizerProxy::getGame(const QString &gameName) const -{ - return nullptr; -} - -IModInterface *DummyOrganizerProxy::createMod(MOBase::GuessedValue &name) -{ - return nullptr; -} - -void DummyOrganizerProxy::modDataChanged(IModInterface *mod) -{ -} - -QVariant DummyOrganizerProxy::pluginSetting(const QString &pluginName, const QString &key) const -{ - if (key == "enabled") { - return true; - } - - return {}; -} - -void DummyOrganizerProxy::setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value) -{ -} - -QVariant DummyOrganizerProxy::persistent(const QString &pluginName, const QString &key, const QVariant &def) const -{ - return {}; -} - -void DummyOrganizerProxy::setPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync) -{ -} - -QString DummyOrganizerProxy::pluginDataPath() const -{ - return qApp->applicationDirPath() + "/" + ToQString(AppConfig::pluginPath()) + "/data"; -} - -HANDLE DummyOrganizerProxy::startApplication( - const QString& exe, const QStringList& args, const QString &cwd, - const QString& profile, const QString &overwrite, bool ignoreOverwrite) -{ - return INVALID_HANDLE_VALUE; -} - -bool DummyOrganizerProxy::waitForApplication(HANDLE handle, LPDWORD exitCode) const -{ - return true; -} - -bool DummyOrganizerProxy::onAboutToRun(const std::function &func) -{ - return true; -} - -bool DummyOrganizerProxy::onFinishedRun(const std::function &func) -{ - return true; -} - -bool DummyOrganizerProxy::onUserInterfaceInitialized(std::function const& func) -{ - return true; -} - -bool DummyOrganizerProxy::onProfileCreated(std::function const& func) -{ - return true; -} - -bool DummyOrganizerProxy::onProfileRenamed(std::function const& func) -{ - return true; -} - -bool DummyOrganizerProxy::onProfileRemoved(std::function const& func) -{ - return true; -} - -bool DummyOrganizerProxy::onProfileChanged(std::function const& func) -{ - return true; -} - -bool DummyOrganizerProxy::onPluginSettingChanged(std::function const& func) -{ - return true; -} - -void DummyOrganizerProxy::refresh(bool saveChanges) -{ -} - -IModInterface *DummyOrganizerProxy::installMod(const QString &fileName, const QString &nameSuggestion) -{ - return nullptr; -} - -QString DummyOrganizerProxy::resolvePath(const QString &fileName) const -{ - return {}; -} - -QStringList DummyOrganizerProxy::listDirectories(const QString &directoryName) const -{ - return {}; -} - -QStringList DummyOrganizerProxy::findFiles(const QString &path, const std::function &filter) const -{ - return {}; -} - -QStringList DummyOrganizerProxy::findFiles(const QString& path, const QStringList& globFilters) const -{ - return {}; -} - -QStringList DummyOrganizerProxy::getFileOrigins(const QString &fileName) const -{ - return {}; -} - -QList DummyOrganizerProxy::findFileInfos(const QString &path, const std::function &filter) const -{ - return {}; -} - -MOBase::IDownloadManager *DummyOrganizerProxy::downloadManager() const -{ - return nullptr; -} - -MOBase::IPluginList *DummyOrganizerProxy::pluginList() const -{ - return m_plugins.get(); -} - -MOBase::IModList *DummyOrganizerProxy::modList() const -{ - return m_mods.get(); -} - -MOBase::IProfile *DummyOrganizerProxy::profile() const -{ - return nullptr; -} - -MOBase::IPluginGame const *DummyOrganizerProxy::managedGame() const -{ - return nullptr; -} diff --git a/src/organizerproxy.h b/src/organizerproxy.h index 144a7732..6690d612 100644 --- a/src/organizerproxy.h +++ b/src/organizerproxy.h @@ -81,60 +81,4 @@ private: }; - -class DummyOrganizerProxy : public MOBase::IOrganizer -{ -public: - DummyOrganizerProxy(MOBase::IPlugin* plugin); - ~DummyOrganizerProxy(); - - MOBase::IModRepositoryBridge *createNexusBridge() const override; - QString profileName() const override; - QString profilePath() const override; - QString downloadsPath() const override; - QString overwritePath() const override; - QString basePath() const override; - QString modsPath() const override; - MOBase::VersionInfo appVersion() const override; - MOBase::IPluginGame *getGame(const QString &gameName) const override; - MOBase::IModInterface *createMod(MOBase::GuessedValue &name) override; - void modDataChanged(MOBase::IModInterface *mod) override; - QVariant pluginSetting(const QString &pluginName, const QString &key) const override; - void setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value) override; - QVariant persistent(const QString &pluginName, const QString &key, const QVariant &def = QVariant()) const override; - void setPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync = true) override; - QString pluginDataPath() const override; - MOBase::IModInterface *installMod(const QString &fileName, const QString &nameSuggestion = QString()) override; - QString resolvePath(const QString &fileName) const override; - QStringList listDirectories(const QString &directoryName) const override; - QStringList findFiles(const QString &path, const std::function &filter) const override; - QStringList findFiles(const QString &path, const QStringList &globFilters) const override; - QStringList getFileOrigins(const QString &fileName) const override; - QList findFileInfos(const QString &path, const std::function &filter) const override; - - MOBase::IDownloadManager *downloadManager() const override; - MOBase::IPluginList *pluginList() const override; - MOBase::IModList *modList() const override; - MOBase::IProfile *profile() const override; - HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", - const QString &profile = "", const QString &forcedCustomOverwrite = "", bool ignoreCustomOverwrite = false) override; - bool waitForApplication(HANDLE handle, LPDWORD exitCode = nullptr) const override; - void refresh(bool saveChanges = true) override; - - bool onAboutToRun(const std::function &func) override; - bool onFinishedRun(const std::function &func) override; - bool onUserInterfaceInitialized(std::function const& func) override; - bool onProfileCreated(std::function const& func) override; - bool onProfileRenamed(std::function const& func) override; - bool onProfileRemoved(std::function const& func) override; - bool onProfileChanged(std::function const& func) override; - bool onPluginSettingChanged(std::function const& func) override; - - MOBase::IPluginGame const *managedGame() const override; - -private: - std::unique_ptr m_plugins; - std::unique_ptr m_mods; -}; - #endif // ORGANIZERPROXY_H diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp index 6f2670dd..0c71e491 100644 --- a/src/plugincontainer.cpp +++ b/src/plugincontainer.cpp @@ -169,23 +169,19 @@ QObject* PluginContainer::as_qobject(MOBase::IPlugin* plugin) const return *it; } -bool PluginContainer::verifyPlugin(IPlugin *plugin) +bool PluginContainer::initPlugin(IPlugin *plugin) { if (plugin == nullptr) { return false; } - IOrganizer* proxy = nullptr; - if (m_Organizer) { - proxy = new OrganizerProxy(m_Organizer, this, plugin); - } else { - proxy = new DummyOrganizerProxy(plugin); - } + auto* proxy = new OrganizerProxy(m_Organizer, this, plugin); - if (!plugin->init(proxy)) { - log::warn("plugin failed to initialize"); - return false; + if (!plugin->init(proxy)) { + log::warn("plugin failed to initialize"); + return false; + } } return true; @@ -197,7 +193,6 @@ void PluginContainer::registerGame(IPluginGame *game) m_SupportedGames.insert({ game->gameName(), game }); } - bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName) { // Storing the original QObject* is a bit of a hack as I couldn't figure out any @@ -210,10 +205,14 @@ bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName) log::debug("not an IPlugin"); return false; } + plugin->setProperty("filename", fileName); + if (m_Organizer) { m_Organizer->settings().plugins().registerPlugin(pluginObj); } + + pluginObj->registered(); } { // diagnosis plugin @@ -233,14 +232,14 @@ bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName) } { // mod page plugin IPluginModPage *modPage = qobject_cast(plugin); - if (verifyPlugin(modPage)) { + if (initPlugin(modPage)) { bf::at_key(m_Plugins).push_back(modPage); return true; } } { // game plugin IPluginGame *game = qobject_cast(plugin); - if (verifyPlugin(game)) { + if (initPlugin(game)) { bf::at_key(m_Plugins).push_back(game); registerGame(game); return true; @@ -248,14 +247,14 @@ bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName) } { // tool plugins IPluginTool *tool = qobject_cast(plugin); - if (verifyPlugin(tool)) { + if (initPlugin(tool)) { bf::at_key(m_Plugins).push_back(tool); return true; } } { // installer plugins IPluginInstaller *installer = qobject_cast(plugin); - if (verifyPlugin(installer)) { + if (initPlugin(installer)) { bf::at_key(m_Plugins).push_back(installer); if (m_Organizer) { m_Organizer->installationManager()->registerInstaller(installer); @@ -265,7 +264,7 @@ bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName) } { // preview plugins IPluginPreview *preview = qobject_cast(plugin); - if (verifyPlugin(preview)) { + if (initPlugin(preview)) { bf::at_key(m_Plugins).push_back(preview); m_PreviewGenerator.registerPlugin(preview); return true; @@ -273,7 +272,7 @@ bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName) } { // proxy plugins IPluginProxy *proxy = qobject_cast(plugin); - if (verifyPlugin(proxy)) { + if (initPlugin(proxy)) { bf::at_key(m_Plugins).push_back(proxy); QStringList pluginNames = proxy->pluginList( QCoreApplication::applicationDirPath() + "/" + ToQString(AppConfig::pluginPath())); @@ -305,7 +304,7 @@ bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName) { // dummy plugins // only initialize these, no processing otherwise IPlugin *dummy = qobject_cast(plugin); - if (verifyPlugin(dummy)) { + if (initPlugin(dummy)) { bf::at_key(m_Plugins).push_back(dummy); return true; } diff --git a/src/plugincontainer.h b/src/plugincontainer.h index 07363ee7..bfbf1fa8 100644 --- a/src/plugincontainer.h +++ b/src/plugincontainer.h @@ -168,7 +168,7 @@ private: QObject* as_qobject(MOBase::IPlugin* plugin) const; - bool verifyPlugin(MOBase::IPlugin *plugin); + bool initPlugin(MOBase::IPlugin *plugin); void registerGame(MOBase::IPluginGame *game); bool registerPlugin(QObject *pluginObj, const QString &fileName); bool unregisterPlugin(QObject *pluginObj, const QString &fileName); diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index bda360ba..8d04b592 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -1671,68 +1671,3 @@ void PluginList::managedGameChanged(const IPluginGame *gamePlugin) { m_GamePlugin = gamePlugin; } - - - -QStringList DummyPluginList::pluginNames() const -{ - return {}; -} - -IPluginList::PluginStates DummyPluginList::state(const QString &name) const -{ - return 0; -} - -void DummyPluginList::setState(const QString &name, PluginStates state) -{ -} - -int DummyPluginList::priority(const QString &name) const -{ - return -1; -} - -int DummyPluginList::loadOrder(const QString &name) const -{ - return -1; -} - -void DummyPluginList::setLoadOrder(const QStringList &pluginList) -{ -} - -bool DummyPluginList::setPriority(const QString&, int) -{ - return true; -} - -bool DummyPluginList::isMaster(const QString &name) const -{ - return false; -} - -QStringList DummyPluginList::masters(const QString &name) const -{ - return {}; -} - -QString DummyPluginList::origin(const QString &name) const -{ - return {}; -} - -bool DummyPluginList::onRefreshed(const std::function &callback) -{ - return true; -} - -bool DummyPluginList::onPluginMoved(const std::function &func) -{ - return true; -} - -bool DummyPluginList::onPluginStateChanged(const std::function&)> &func) -{ - return true; -} diff --git a/src/pluginlist.h b/src/pluginlist.h index 27c15056..0b49b86f 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -410,25 +410,6 @@ private: bool hasInfo(const ESPInfo& esp, const AdditionalInfo* info) const; }; - -class DummyPluginList : public MOBase::IPluginList -{ -public: - QStringList pluginNames() const override; - PluginStates state(const QString &name) const override; - void setState(const QString &name, PluginStates state) override; - int priority(const QString &name) const override; - int loadOrder(const QString &name) const override; - void setLoadOrder(const QStringList &pluginList) override; - bool setPriority(const QString& name, int newPriority) override; - bool isMaster(const QString &name) const override; - QStringList masters(const QString &name) const override; - QString origin(const QString &name) const override; - bool onRefreshed(const std::function &callback) override; - bool onPluginMoved(const std::function &func) override; - bool onPluginStateChanged(const std::function&)> &func) override; -}; - #pragma warning(pop) #endif // PLUGINLIST_H -- cgit v1.3.1