From f2f9e11fdd876821107cff0c1c5b9d8ecf66691f Mon Sep 17 00:00:00 2001 From: Tannin Date: Fri, 21 Nov 2014 14:45:30 +0100 Subject: - started on a refactoring moving functionality out of the MainWindow class - started on support for game-plugins --- src/organizercore.h | 239 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 src/organizercore.h (limited to 'src/organizercore.h') diff --git a/src/organizercore.h b/src/organizercore.h new file mode 100644 index 00000000..b362a002 --- /dev/null +++ b/src/organizercore.h @@ -0,0 +1,239 @@ +#ifndef ORGANIZERCORE_H +#define ORGANIZERCORE_H + + +#include "profile.h" +#include "selfupdater.h" +#include "iuserinterface.h" +#include "settings.h" +#include "modlist.h" +#include "pluginlist.h" +#include "directoryrefresher.h" +#include "installationmanager.h" +#include "downloadmanager.h" +#include "modlistsortproxy.h" +#include "pluginlistsortproxy.h" +#include "executableslist.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +class PluginContainer; + + +class OrganizerCore : public QObject, public MOBase::IPluginDiagnose +{ + + Q_OBJECT + Q_INTERFACES(MOBase::IPluginDiagnose) + +private: + + struct SignalCombinerAnd + { + typedef bool result_type; + template + bool operator()(InputIterator first, InputIterator last) const + { + while (first != last) { + if (!(*first)) { + return false; + } + ++first; + } + return true; + } + }; + +private: + + typedef boost::signals2::signal SignalAboutToRunApplication; + typedef boost::signals2::signal SignalFinishedRunApplication; + typedef boost::signals2::signal SignalModInstalled; + +public: + + OrganizerCore(const QSettings &initSettings); + + ~OrganizerCore(); + + void setUserInterface(IUserInterface *userInterface, QWidget *widget); + void connectPlugins(PluginContainer *container); + void disconnectPlugins(); + + void updateExecutablesList(QSettings &settings); + + void startMOUpdate(); + + Settings &settings(); + SelfUpdater *updater() { return &m_Updater; } + InstallationManager *installationManager(); + MOShared::DirectoryEntry *directoryStructure() { return m_DirectoryStructure; } + DirectoryRefresher *directoryRefresher() { return &m_DirectoryRefresher; } + ExecutablesList *executablesList() { return &m_ExecutablesList; } + void setExecutablesDialog(const ExecutablesList &executablesList) { m_ExecutablesList = executablesList; } + + Profile *currentProfile() { return m_CurrentProfile; } + void setCurrentProfile(Profile *profile); + + void setExecutablesList(const ExecutablesList &executablesList); + + std::set enabledArchives(); + + MOBase::VersionInfo getVersion() const { return m_Updater.getVersion(); } + + ModListSortProxy *createModListProxyModel(); + PluginListSortProxy *createPluginListProxyModel(); + + bool isArchivesInit() const { return m_ArchivesInit; } + + bool saveCurrentLists(); + void savePluginList(); + + void prepareStart(); + + void refreshESPList(); + void refreshBSAList(); + + void refreshDirectoryStructure(); + void updateModInDirectoryStructure(unsigned int index, ModInfo::Ptr modInfo); + + void requestDownload(const QUrl &url, QNetworkReply *reply); + + void doAfterLogin(std::function &function) { m_PostLoginTasks.append(function); } + + void spawnBinary(const QFileInfo &binary, const QString &arguments = "", const QDir ¤tDirectory = QDir(), bool closeAfterStart = true, const QString &steamAppID = ""); + + void modStatusChanged(unsigned int index); + + void loginSuccessful(bool necessary); + void loginSuccessfulUpdate(bool necessary); + void loginFailed(const QString &message); + void loginFailedUpdate(const QString &message); + +public: + virtual MOBase::IGameInfo &gameInfo() const; + virtual MOBase::IModRepositoryBridge *createNexusBridge() const; + virtual QString profileName() const; + virtual QString profilePath() const; + virtual QString downloadsPath() const; + virtual MOBase::VersionInfo appVersion() const; + virtual MOBase::IModInterface *getMod(const QString &name); + virtual MOBase::IModInterface *createMod(MOBase::GuessedValue &name); + virtual bool removeMod(MOBase::IModInterface *mod); + virtual void modDataChanged(MOBase::IModInterface *mod); + virtual QVariant pluginSetting(const QString &pluginName, const QString &key) const; + virtual void setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value); + virtual QVariant persistent(const QString &pluginName, const QString &key, const QVariant &def) const; + virtual void setPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync); + virtual QString pluginDataPath() const; + virtual MOBase::IModInterface *installMod(const QString &fileName); + virtual QString resolvePath(const QString &fileName) const; + virtual QStringList listDirectories(const QString &directoryName) const; + virtual QStringList findFiles(const QString &path, const std::function &filter) const; + virtual QStringList getFileOrigins(const QString &fileName) const; + virtual QList findFileInfos(const QString &path, const std::function &filter) const; + virtual DownloadManager *downloadManager(); + virtual PluginList *pluginList(); + virtual ModList *modList(); + virtual HANDLE startApplication(const QString &executable, const QStringList &args, const QString &cwd, const QString &profile); + virtual bool waitForApplication(HANDLE handle, LPDWORD exitCode) const; + virtual bool onModInstalled(const std::function &func); + virtual bool onAboutToRun(const std::function &func); + virtual bool onFinishedRun(const std::function &func); + virtual void refreshModList(bool saveChanges = true); + +public: // IPluginDiagnose interface + + virtual std::vector activeProblems() const; + virtual QString shortDescription(unsigned int key) const; + virtual QString fullDescription(unsigned int key) const; + virtual bool hasGuidedFix(unsigned int key) const; + virtual void startGuidedFix(unsigned int key) const; + +public slots: + + void profileRefresh(); + void externalMessage(const QString &message); + + void refreshLists(); + +signals: + + /** + * @brief emitted after a mod has been installed + * @node this is currently only used for tutorials + */ + void modInstalled(); + +private: + + void storeSettings(); + + bool queryLogin(QString &username, QString &password); + + bool nexusLogin(); + + HANDLE spawnBinaryDirect(const QFileInfo &binary, const QString &arguments, const QString &profileName, const QDir ¤tDirectory, const QString &steamAppID); + void updateModActiveState(int index, bool active); + +private slots: + + void directory_refreshed(); + void downloadRequestedNXM(const QString &url); + void downloadRequested(QNetworkReply *reply, int modID, const QString &fileName); + void removeOrigin(const QString &name); + +private: + + static const unsigned int PROBLEM_TOOMANYPLUGINS = 1; + +private: + + MOBase::IGameInfo *m_GameInfo; + + IUserInterface *m_UserInterface; + PluginContainer *m_PluginContainer; + + Profile *m_CurrentProfile; + + Settings m_Settings; + + SelfUpdater m_Updater; + + SignalAboutToRunApplication m_AboutToRun; + SignalFinishedRunApplication m_FinishedRun; + SignalModInstalled m_ModInstalled; + + ModList m_ModList; + PluginList m_PluginList; + + QList> m_PostLoginTasks; + + ExecutablesList m_ExecutablesList; + QStringList m_PendingDownloads; + QStringList m_DefaultArchives; + QStringList m_ActiveArchives; + + DirectoryRefresher m_DirectoryRefresher; + MOShared::DirectoryEntry *m_DirectoryStructure; + + DownloadManager m_DownloadManager; + InstallationManager m_InstallationManager; + + QThread m_RefresherThread; + + bool m_AskForNexusPW; + bool m_DirectoryUpdate; + bool m_ArchivesInit; + +}; + +#endif // ORGANIZERCORE_H -- cgit v1.3.1