#ifndef CEDITORAPPLICATION_H #define CEDITORAPPLICATION_H #include #include #include #include #include class CBasicViewport; class CProjectSettingsDialog; class CResourceBrowser; class CResourceEntry; class CWorldEditor; class IEditor; constexpr int gkTickFrequencyMS = 8; class CEditorApplication : public QApplication { Q_OBJECT std::unique_ptr mpActiveProject; CWorldEditor *mpWorldEditor = nullptr; CResourceBrowser *mpResourceBrowser = nullptr; CProjectSettingsDialog *mpProjectDialog = nullptr; QList mEditorWindows; QMap mEditingMap; bool mInitialized = false; QTimer mRefreshTimer; double mLastUpdate; public: CEditorApplication(int& rArgc, char **ppArgv); ~CEditorApplication() override; void InitEditor(); bool CloseAllEditors(); bool CloseProject(); bool OpenProject(const QString& rkProjPath); void EditResource(CResourceEntry *pEntry); void NotifyAssetsModified(); bool CookPackage(CPackage *pPackage); bool CookAllDirtyPackages(); bool CookPackageList(QList PackageList); bool HasAnyDirtyPackages(); bool RebuildResourceDatabase(); CResourceBrowser* ResourceBrowser() const { return mpResourceBrowser; } // Accessors CGameProject* ActiveProject() const { return mpActiveProject.get(); } CWorldEditor* WorldEditor() const { return mpWorldEditor; } CProjectSettingsDialog* ProjectDialog() const { return mpProjectDialog; } EGame CurrentGame() const { return mpActiveProject ? mpActiveProject->Game() : EGame::Invalid; } void SetEditorTicksEnabled(bool Enabled) { Enabled ? mRefreshTimer.start(gkTickFrequencyMS) : mRefreshTimer.stop(); } bool AreEditorTicksEnabled() const { return mRefreshTimer.isActive(); } public slots: void AddEditor(IEditor *pEditor); void TickEditors(); void OnEditorClose(); signals: void ActiveProjectChanged(CGameProject *pNewProj); void AssetsModified(); void PackagesCooked(); }; #define gpEdApp static_cast(qApp) #endif // CEDITORAPPLICATION_H