#ifndef CONFIGMGR_H #define CONFIGMGR_H #include #include #include #include #include "noncopyable.h" class QTemporaryDir; namespace vnotex { class MainConfig; class SessionConfig; class CoreConfig; class EditorConfig; class WidgetConfig; class ConfigMgr : public QObject, private Noncopyable { Q_OBJECT public: enum class Source { Default, App, User, Session }; class Settings { public: Settings() = default; Settings(const QJsonObject &p_jobj) : m_jobj(p_jobj) { } const QJsonObject &getJson() const; void writeToFile(const QString &p_jsonFilePath) const; static QSharedPointer fromFile(const QString &p_jsonFilePath); private: QJsonObject m_jobj; }; ~ConfigMgr(); static ConfigMgr &getInst(bool p_isUnitTest = false); MainConfig &getConfig(); SessionConfig &getSessionConfig(); CoreConfig &getCoreConfig(); EditorConfig &getEditorConfig(); WidgetConfig &getWidgetConfig(); QString getAppFolder() const; QString getUserFolder() const; QString getLogFile() const; QString getAppThemeFolder() const; QString getUserThemeFolder() const; QString getAppWebStylesFolder() const; QString getUserWebStylesFolder() const; QString getAppDocsFolder() const; QString getUserDocsFolder() const; QString getAppSyntaxHighlightingFolder() const; QString getUserSyntaxHighlightingFolder() const; QString getAppDictsFolder() const; QString getUserDictsFolder() const; QString getUserTemplateFolder() const; QString getUserSnippetFolder() const; // web/css/user.css. QString getUserMarkdownUserStyleFile() const; // If @p_filePath is absolute, just return it. // Otherwise, first try to find it in user folder, then in app folder. QString getUserOrAppFile(const QString &p_filePath) const; QString getConfigFilePath(Source p_src) const; // Called at boostrap without QApplication instance. static QString locateSessionConfigFilePathAtBootstrap(); static QString getApplicationFilePath(); static QString getApplicationDirPath(); static QString getDocumentOrHomePath(); static QString getApplicationVersion(); static void initForUnitTest(); static const QString c_orgName; static const QString c_appName; public: // Used by IConfig. QSharedPointer getSettings(Source p_src) const; void writeUserSettings(const QJsonObject &p_jobj); void writeSessionSettings(const QJsonObject &p_jobj); signals: void editorConfigChanged(); private: ConfigMgr(bool p_isUnitTest, QObject *p_parent = nullptr); // Locate the folder path where the config file exists. void locateConfigFolder(); // Check if app config exists and is updated. // Update it if in need. // Return true if there is update. bool checkAppConfig(); void checkUserConfig(); static QString getDefaultConfigFilePath(); QScopedPointer m_config;; // Session config. QScopedPointer m_sessionConfig; // Absolute path of the app config folder. QString m_appConfigFolderPath; // Absolute path of the user config folder. QString m_userConfigFolderPath; // In UnitTest, we use a temp dir to hold the user files and app files. QScopedPointer m_dirForUnitTest; // Name of the core config file. static const QString c_configFileName; // Name of the session config file. static const QString c_sessionFileName; }; } // ns vnotex #endif // CONFIGMGR_H