/* Copyright (C) 2012 Sebastian Herbord. All rights reserved. This file is part of Mod Organizer. Mod Organizer is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Mod Organizer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include #include #include #include #include #include #include #include "executableslist.h" #include "modlist.h" #include "pluginlist.h" #define WIN32_LEAN_AND_MEAN #include #include #include "directoryrefresher.h" #include #include #include #include "settings.h" #include "downloadmanager.h" #include "installationmanager.h" #include "selfupdater.h" #include "savegamegamebyro.h" #include "modlistsortproxy.h" #include "pluginlistsortproxy.h" #include "tutorialcontrol.h" #include "savegameinfowidgetgamebryo.h" #include #include namespace Ui { class MainWindow; } class QToolButton; class ModListSortProxy; class ModListGroupCategoriesProxy; class MainWindow : public QMainWindow, public MOBase::IOrganizer, public MOBase::IPluginDiagnose { Q_OBJECT Q_INTERFACES(MOBase::IPluginDiagnose) public: explicit MainWindow(const QString &exeName, QSettings &initSettings, QWidget *parent = 0); ~MainWindow(); void readSettings(); bool addProfile(); void refreshLists(); void refreshESPList(); void refreshBSAList(); void refreshDataTree(); void refreshSaveList(); void refreshModList(); void setExecutablesList(const ExecutablesList &executablesList); void setModListSorting(int index); void setESPListSorting(int index); void setCompactDownloads(bool compact); bool setCurrentProfile(int index); bool setCurrentProfile(const QString &name); void createFirstProfile(); void spawnProgram(const QString &fileName, const QString &argumentsArg, const QString &profileName, const QDir ¤tDirectory); void loadPlugins(); 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 QString pluginDataPath() const; virtual void installMod(const QString &fileName); virtual QString resolvePath(const QString &fileName) const; virtual MOBase::IDownloadManager *downloadManager(); 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; void addPrimaryCategoryCandidates(QMenu *primaryCategoryMenu, ModInfo::Ptr info); void saveArchiveList(); public slots: void displayColumnSelection(const QPoint &pos); void externalMessage(const QString &message); void modorder_changed(); void refresher_progress(int percent); void directory_refreshed(); void toolPluginInvoke(); signals: /** * @brief emitted after a mod has been installed * @node this is currently only used for tutorials */ void modInstalled(); /** * @brief emitted after the information dialog has been closed */ void modInfoDisplayed(); /** * @brief emitted when the selected style changes */ void styleChanged(const QString &styleFile); void modListDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); protected: virtual void showEvent(QShowEvent *event); virtual void closeEvent(QCloseEvent *event); virtual bool eventFilter(QObject *obj, QEvent *event); virtual void resizeEvent(QResizeEvent *event); private: void actionToToolButton(QAction *&sourceAction); bool verifyPlugin(MOBase::IPlugin *plugin); void registerPluginTool(MOBase::IPluginTool *tool); bool registerPlugin(QObject *pluginObj); void updateToolBar(); void activateSelectedProfile(); void setExecutableIndex(int index); bool nexusLogin(); void saveCurrentESPList(); bool testForSteam(); void startSteam(); HANDLE spawnBinaryDirect(const QFileInfo &binary, const QString &arguments, const QString &profileName, const QDir ¤tDirectory, const QString &steamAppID); void spawnBinary(const QFileInfo &binary, const QString &arguments = "", const QDir ¤tDirectory = QDir(), bool closeAfterStart = true, const QString &steamAppID = ""); void updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const MOShared::DirectoryEntry &directoryEntry, bool conflictsOnly); void refreshDirectoryStructure(); bool refreshProfiles(bool selectProfile = true); void refreshExecutablesList(); void installMod(); bool modifyExecutablesDialog(); void displayModInformation(ModInfo::Ptr modInfo, unsigned int index, int tab); void displayModInformation(int row, int tab = 0); void testExtractBSA(int modIndex); void writeDataToFile(QFile &file, const QString &directory, const MOShared::DirectoryEntry &directoryEntry); void renameModInList(QFile &modList, const QString &oldName, const QString &newName); void refreshFilters(); void saveCategoriesFromMenu(QMenu *menu, int modRow); bool addCategories(QMenu *menu, int targetID); void updateDownloadListDelegate(); // remove invalid category-references from mods void fixCategories(); void storeSettings(); bool queryLogin(QString &username, QString &password); void createHelpWidget(); bool extractProgress(QProgressDialog &extractProgress, int percentage, std::string fileName); bool checkForProblems(); int getBinaryExecuteInfo(const QFileInfo &targetInfo, QFileInfo &binaryInfo, QString &arguments); QTreeWidgetItem *addFilterItem(QTreeWidgetItem *root, const QString &name, int categoryID); void addCategoryFilters(QTreeWidgetItem *root, const std::set &categoriesUsed, int targetID); void setCategoryListVisible(bool visible); void updateProblemsButton(); SaveGameGamebryo *getSaveGame(const QString &name); SaveGameGamebryo *getSaveGame(QListWidgetItem *item); void displaySaveGameInfo(const SaveGameGamebryo *save, QPoint pos); HANDLE nextChildProcess(); bool errorReported(QString &logFile); QIcon iconForExecutable(const QString &filePath); void updateESPLock(bool locked); static void setupNetworkProxy(bool activate); void activateProxy(bool activate); private: static const unsigned int PROBLEM_PLUGINSNOTLOADED = 1; private: Ui::MainWindow *ui; MOBase::TutorialControl m_Tutorial; QString m_ExeName; int m_OldProfileIndex; QThread m_RefresherThread; DirectoryRefresher m_DirectoryRefresher; MOShared::DirectoryEntry *m_DirectoryStructure; std::vector m_ModNameList; // the mod-list to go with the directory structure QProgressBar *m_RefreshProgress; bool m_Refreshing; ModList m_ModList; QAbstractItemModel *m_ModListGroupingProxy; ModListSortProxy *m_ModListSortProxy; PluginList m_PluginList; PluginListSortProxy *m_PluginListSortProxy; ExecutablesList m_ExecutablesList; int m_OldExecutableIndex; QString m_GamePath; int m_ContextRow; QTreeWidgetItem *m_ContextItem; int m_SelectedSaveGame; Settings m_Settings; DownloadManager m_DownloadManager; InstallationManager m_InstallationManager; QTranslator *m_Translator; QTranslator *m_TranslatorQt; SelfUpdater m_Updater; CategoryFactory &m_CategoryFactory; Profile *m_CurrentProfile; int m_ModsToUpdate; QStringList m_PendingDownloads; QList > m_PostLoginTasks; bool m_AskForNexusPW; bool m_LoginAttempted; QStringList m_DefaultArchives; QStringList m_ActiveArchives; bool m_DirectoryUpdate; bool m_ArchivesInit; QTimer m_CheckBSATimer; QTime m_StartTime; SaveGameInfoWidget *m_CurrentSaveView; MOBase::IGameInfo *m_GameInfo; std::vector m_DiagnosisPlugins; std::vector m_UnloadedPlugins; private slots: void showMessage(const QString &message); void showError(const QString &message); // main window actions void helpTriggered(); void issueTriggered(); void wikiTriggered(); void tutorialTriggered(); void extractBSATriggered(); // modlist context menu void installMod_clicked(); void restoreBackup_clicked(); void renameMod_clicked(); void removeMod_clicked(); void reinstallMod_clicked(); void endorse_clicked(); void dontendorse_clicked(); void unendorse_clicked(); void ignoreMissingData_clicked(); void visitOnNexus_clicked(); void openExplorer_clicked(); void information_clicked(); // savegame context menu void fixMods_clicked(); // data-tree context menu void writeDataToFile(); void openDataFile(); void addAsExecutable(); void hideFile(); void unhideFile(); void linkToolbar(); void linkDesktop(); void linkMenu(); void languageChange(const QString &newLanguage); void modStatusChanged(unsigned int index); void saveSelectionChanged(QListWidgetItem *newItem); bool saveCurrentLists(); void windowTutorialFinished(const QString &windowName); BSA::EErrorCode extractBSA(BSA::Archive &archive, BSA::Folder::Ptr folder, const QString &destination, QProgressDialog &extractProgress); void syncOverwrite(); void createModFromOverwrite(); void removeOrigin(const QString &name); void procError(QProcess::ProcessError error); void procFinished(int exitCode, QProcess::ExitStatus exitStatus); // nexus related void checkModsForUpdates(); void nexusLinkActivated(const QString &link); void linkClicked(const QString &url); void loginSuccessful(bool necessary); void loginSuccessfulUpdate(bool necessary); void loginFailed(const QString &message); void loginFailedUpdate(const QString &message); void downloadRequestedNXM(const QString &url); void downloadRequested(QNetworkReply *reply, int modID, const QString &fileName); void installDownload(int index); void updateAvailable(); void motdReceived(const QString &motd); void notEndorsedYet(); void originModified(int originID); void saveCategories(); void savePrimaryCategory(); void addPrimaryCategoryCandidates(); void modDetailsUpdated(bool success); void modlistChanged(int row); void nxmUpdatesAvailable(const std::vector &modIDs, QVariant userData, QVariant resultData, int requestID); // void nxmEndorsementToggled(int, QVariant, QVariant resultData, int); void nxmDownloadURLs(int modID, int fileID, QVariant userData, QVariant resultData, int requestID); void nxmRequestFailed(int modID, QVariant userData, int requestID, const QString &errorString); void editCategories(); void displayModInformation(const QString &modName, int tab); void modOpenNext(); void modOpenPrev(); void modRenamed(const QString &oldName, const QString &newName); void modRemoved(const QString &fileName); void hideSaveGameInfo(); void hookUpWindowTutorials(); void endorseMod(ModInfo::Ptr mod); void cancelModListEditor(); void lockESPIndex(); void unlockESPIndex(); void enableVisibleMods(); void disableVisibleMods(); void exportModListCSV(); void startExeAction(); void checkBSAList(); void updateStyle(const QString &style); void modlistChanged(const QModelIndex &index, int role); void savePluginList(); void modFilterActive(bool active); void espFilterChanged(const QString &filter); void downloadFilterChanged(const QString &filter); void expandModList(const QModelIndex &index); private slots: // ui slots // actions void on_actionAdd_Profile_triggered(); void on_actionInstallMod_triggered(); void on_actionModify_Executables_triggered(); void on_actionNexus_triggered(); void on_actionProblems_triggered(); void on_actionSettings_triggered(); void on_actionUpdate_triggered(); void on_actionEndorseMO_triggered(); void on_bsaList_customContextMenuRequested(const QPoint &pos); void on_bsaList_itemChanged(QTreeWidgetItem *item, int column); void on_btnRefreshData_clicked(); void on_categoriesList_customContextMenuRequested(const QPoint &pos); void on_compactBox_toggled(bool checked); void on_conflictsCheckBox_toggled(bool checked); void on_dataTree_customContextMenuRequested(const QPoint &pos); void on_executablesListBox_currentIndexChanged(int index); void on_modList_customContextMenuRequested(const QPoint &pos); void on_modList_doubleClicked(const QModelIndex &index); void on_profileBox_currentIndexChanged(int index); void on_profileRefreshBtn_clicked(); void on_savegameList_customContextMenuRequested(const QPoint &pos); void on_startButton_clicked(); void on_tabWidget_currentChanged(int index); void on_espList_customContextMenuRequested(const QPoint &pos); void on_displayCategoriesBtn_toggled(bool checked); void on_groupCombo_currentIndexChanged(int index); void on_categoriesList_itemSelectionChanged(); }; #endif // MAINWINDOW_H