#ifndef SETTINGS_H #define SETTINGS_H #include #include #include #include #include "qsynedit/SynEdit.h" /** * use the following command to get gcc's default bin/library folders: * gcc -print-search-dirs */ #define SETTING_DIRS "Dirs" #define SETTING_EDITOR "Editor" #define SETTING_ENVIRONMENT "Environment" #define SETTING_EXECUTOR "Executor" #define SETTING_DEBUGGER "Debugger" #define SETTING_HISTORY "History" #define SETTING_CODE_COMPLETION "CodeCompletion" #define SETTING_COMPILTER_SETS "CompilerSets" #define SETTING_COMPILTER_SETS_DEFAULT_INDEX "defaultIndex" #define SETTING_COMPILTER_SETS_COUNT "count" #define SETTING_COMPILTER_SET "CompilerSet_%1" #define SETTING_EDITOR_DEFAULT_ENCODING "default_encoding" #define SETTING_EDITOR_AUTO_INDENT "default_auto_indent" extern const char ValueToChar[28]; class Settings; typedef struct { QString name; // language table index of "Generate debugging info" QString section; // language table index of "C options" bool isC; bool isCpp; // True (C++ option?) - can be both C and C++ option... bool isLinker; // Is it a linker param int value; // True QString setting; // "-g3" QStringList choices; // replaces "Yes/No" standard choices (max 30 different choices) } CompilerOption; using PCompilerOption = std::shared_ptr; using CompilerOptionList=std::vector>; class Settings { private: class _Base { public: explicit _Base(Settings* settings, const QString& groupName); void beginGroup(); void endGroup(); void saveValue(const QString &key, const QVariant &value); QVariant value(const QString &key, const QVariant& defaultValue); bool boolValue(const QString &key, bool defaultValue); int intValue(const QString &key, int defaultValue); QStringList stringListValue(const QString &key, const QStringList& defaultValue=QStringList()); QColor colorValue(const QString &key, const QColor& defaultValue); QString stringValue(const QString &key, const QString& defaultValue); void save(); void load(); protected: virtual void doSave() = 0; virtual void doLoad() = 0; protected: Settings* mSettings; QString mGroup; }; public: class Dirs: public _Base { public: enum class DataType { None, ColorSheme }; explicit Dirs(Settings * settings); QString app() const; QString data(DataType dataType = DataType::None) const; QString config(DataType dataType = DataType::None) const; // _Base interface protected: void doSave() override; void doLoad() override; }; class Editor: public _Base { public: explicit Editor(Settings * settings); QByteArray defaultEncoding(); void setDefaultEncoding(const QByteArray& value); bool autoIndent(); void setAutoIndent(bool value); bool addIndent() const; void setAddIndent(bool addIndent); bool tabToSpaces() const; void setTabToSpaces(bool tabToSpaces); int tabWidth() const; void setTabWidth(int tabWidth); bool showIndentLines() const; void setShowIndentLines(bool showIndentLines); QColor indentLineColor() const; void setIndentLineColor(const QColor &indentLineColor); bool enhanceHomeKey() const; void setEnhanceHomeKey(bool enhanceHomeKey); bool enhanceEndKey() const; void setEnhanceEndKey(bool enhanceEndKey); SynEditCaretType caretForInsert() const; void setCaretForInsert(const SynEditCaretType &caretForInsert); SynEditCaretType caretForOverwrite() const; void setCaretForOverwrite(const SynEditCaretType &caretForOverwrite); QColor caretColor() const; void setCaretColor(const QColor &caretColor); bool keepCaretX() const; void setKeepCaretX(bool keepCaretX); bool autoHideScrollbar() const; void setAutoHideScrollbar(bool autoHideScrollbar); bool scrollPastEof() const; void setScrollPastEof(bool scrollPastEof); bool scrollPastEol() const; void setScrollPastEol(bool scrollPastEol); bool scrollByOneLess() const; void setScrollByOneLess(bool scrollByOneLess); bool halfPageScroll() const; void setHalfPageScroll(bool halfPageScroll); QString fontName() const; void setFontName(const QString &fontName); int fontSize() const; void setFontSize(int fontSize); bool fontOnlyMonospaced() const; void setFontOnlyMonospaced(bool fontOnlyMonospaced); bool gutterVisible() const; void setGutterVisible(bool gutterVisible); bool gutterAutoSize() const; void setGutterAutoSize(bool gutterAutoSize); int gutterDigitsCount() const; void setGutterDigitsCount(int gutterDigitsCount); bool gutterShowLineNumbers() const; void setGutterShowLineNumbers(bool gutterShowLineNumbers); bool gutterAddLeadingZero() const; void setGutterAddLeadingZero(bool gutterAddLeadingZero); bool gutterLineNumbersStartZero() const; void setGutterLineNumbersStartZero(bool gutterLineNumbersStartZero); bool gutterUseCustomFont() const; void setGutterUseCustomFont(bool gutterUseCustomFont); QString gutterFontName() const; void setGutterFontName(const QString &gutterFontName); int gutterFontSize() const; void setGutterFontSize(int gutterFontSize); bool gutterFontOnlyMonospaced() const; void setGutterFontOnlyMonospaced(bool gutterFontOnlyMonospaced); int gutterLeftOffset() const; void setGutterLeftOffset(int gutterLeftOffset); int gutterRightOffset() const; void setGutterRightOffset(int gutterRightOffset); bool copySizeLimit() const; void setCopySizeLimit(bool copyLimit); int copyCharLimits() const; void setCopyCharLimits(int copyCharLimits); int copyLineLimits() const; void setCopyLineLimits(int copyLineLimits); bool copyRTFUseBackground() const; void setCopyRTFUseBackground(bool copyRTFUseBackground); bool copyRTFUseEditorColor() const; void setCopyRTFUseEditorColor(bool copyRTFUseEditorColor); QString copyRTFColorScheme() const; void setCopyRTFColorScheme(const QString ©RTFColorScheme); bool copyHTMLUseBackground() const; void setCopyHTMLUseBackground(bool copyHTMLUseBackground); bool copyHTMLUseEditorColor() const; void setCopyHTMLUseEditorColor(bool copyHTMLUseEditorColor); QString copyHTMLColorScheme() const; void setCopyHTMLColorScheme(const QString ©HTMLColorScheme); int copyWithFormatAs() const; void setCopyWithFormatAs(int copyWithFormatAs); QString colorScheme() const; void setColorScheme(const QString &colorScheme); bool completeSymbols() const; void setCompleteSymbols(bool completeSymbols); bool completeParenthese() const; void setCompleteParenthese(bool completeParenthese); bool completeBracket() const; void setCompleteBracket(bool completeBracket); bool completeBrace() const; void setCompleteBrace(bool completeBrace); bool completeComment() const; void setCompleteComment(bool completeComment); bool completeSingleQuote() const; void setCompleteSingleQuote(bool completeSingleQuote); bool completeDoubleQuote() const; void setCompleteDoubleQuote(bool completeDoubleQuote); bool completeGlobalInclude() const; void setCompleteGlobalInclude(bool completeGlobalInclude); bool overwriteSymbols() const; void setOverwriteSymbols(bool overwriteSymbols); bool removeSymbolPairs() const; void setRemoveSymbolPairs(bool value); bool syntaxCheck() const; void setSyntaxCheck(bool syntaxCheck); bool syntaxCheckWhenSave() const; void setSyntaxCheckWhenSave(bool syntaxCheckWhenSave); bool syntaxCheckWhenLineChanged() const; void setSyntaxCheckWhenLineChanged(bool syntaxCheckWhenLineChanged); bool readOnlySytemHeader() const; void setReadOnlySytemHeader(bool newReadOnlySytemHeader); private: QByteArray mDefaultEncoding; //General bool mReadOnlySytemHeader; // indents bool mAutoIndent; bool mAddIndent; bool mTabToSpaces; int mTabWidth; bool mShowIndentLines; QColor mIndentLineColor; // caret bool mEnhanceHomeKey; bool mEnhanceEndKey; bool mKeepCaretX; SynEditCaretType mCaretForInsert; SynEditCaretType mCaretForOverwrite; QColor mCaretColor; //scroll bool mAutoHideScrollbar; bool mScrollPastEof; bool mScrollPastEol; bool mScrollByOneLess; bool mHalfPageScroll; //Font //font QString mFontName; int mFontSize; bool mFontOnlyMonospaced; //gutter bool mGutterVisible; bool mGutterAutoSize; int mGutterLeftOffset; int mGutterRightOffset; int mGutterDigitsCount; bool mGutterShowLineNumbers; bool mGutterAddLeadingZero; bool mGutterLineNumbersStartZero; bool mGutterUseCustomFont; QString mGutterFontName; int mGutterFontSize; bool mGutterFontOnlyMonospaced; //copy bool mCopySizeLimit; int mCopyCharLimits; int mCopyLineLimits; int mCopyWithFormatAs; bool mCopyRTFUseBackground; bool mCopyRTFUseEditorColor; QString mCopyRTFColorScheme; bool mCopyHTMLUseBackground; bool mCopyHTMLUseEditorColor; QString mCopyHTMLColorScheme; //Color QString mColorScheme; //Symbol Completion bool mCompleteSymbols; bool mCompleteParenthese; bool mCompleteBracket; bool mCompleteBrace; bool mCompleteComment; bool mCompleteSingleQuote; bool mCompleteDoubleQuote; bool mCompleteGlobalInclude; bool mOverwriteSymbols; bool mRemoveSymbolPairs; //Auto Syntax Check bool mSyntaxCheck; bool mSyntaxCheckWhenSave; bool mSyntaxCheckWhenLineChanged; // _Base interface protected: void doSave() override; void doLoad() override; }; class Environment: public _Base { public: explicit Environment(Settings * settings); QString theme() const; void setTheme(const QString &theme); QString interfaceFont() const; void setInterfaceFont(const QString &interfaceFont); int interfaceFontSize() const; void setInterfaceFontSize(int interfaceFontSize); QString language() const; void setLanguage(const QString &language); private: //Appearence QString mTheme; QString mInterfaceFont; int mInterfaceFontSize; QString mLanguage; // _Base interface protected: void doSave() override; void doLoad() override; }; class CodeCompletion: public _Base { public: explicit CodeCompletion(Settings *settings); int width() const; void setWidth(int newWidth); int height() const; void setHeight(int newHeight); bool enabled() const; void setEnabled(bool newEnabled); bool parseLocalHeaders() const; void setParseLocalHeaders(bool newParseLocalHeaders); bool parseGlobalHeaders() const; void setParseGlobalHeaders(bool newParseGlobalHeaders); bool showCompletionWhileInput() const; void setShowCompletionWhileInput(bool newShowCompletionWhileInput); bool recordUsage() const; void setRecordUsage(bool newRecordUsage); bool sortByScope() const; void setSortByScope(bool newSortByScope); bool showKeywords() const; void setShowKeywords(bool newShowKeywords); bool ignoreCase() const; void setIgnoreCase(bool newIgnoreCase); bool appendFunc() const; void setAppendFunc(bool newAppendFunc); bool showCodeIns() const; void setShowCodeIns(bool newShowCodeIns); private: int mWidth; int mHeight; bool mEnabled; bool mParseLocalHeaders; bool mParseGlobalHeaders; bool mShowCompletionWhileInput; bool mRecordUsage; bool mSortByScope; bool mShowKeywords; bool mIgnoreCase; bool mAppendFunc; bool mShowCodeIns; // _Base interface protected: void doSave() override; void doLoad() override; }; class History: public _Base { public: explicit History(Settings *settings); const QStringList& openedFiles() const; const QStringList& openedProjects() const; bool addToOpenedFiles(const QString& filename); private: QStringList mOpenedFiles; QStringList mOpenedProjects; // _Base interface protected: void doSave() override; void doLoad() override; }; class Executor: public _Base { public: explicit Executor(Settings * settings); bool pauseConsole() const; void setPauseConsole(bool pauseConsole); bool minimizeOnRun() const; void setMinimizeOnRun(bool minimizeOnRun); private: // general bool mPauseConsole; bool mMinimizeOnRun; protected: void doSave() override; void doLoad() override; }; class Debugger: public _Base { public: explicit Debugger(Settings* settings); bool showCommandLog() const; void setShowCommandLog(bool showCommandLog); bool showAnnotations() const; void setShowAnnotations(bool showAnnotations); bool onlyShowMono() const; void setOnlyShowMono(bool onlyShowMono); int fontSize() const; void setFontSize(int fontSize); bool useIntelStyle() const; void setUseIntelStyle(bool useIntelStyle); QString fontName() const; void setFontName(const QString &fontName); bool blendMode() const; void setBlendMode(bool blendMode); private: bool mShowCommandLog; bool mShowAnnotations; QString mFontName; bool mOnlyShowMono; int mFontSize; bool mUseIntelStyle; bool mBlendMode; // _Base interface protected: void doSave() override; void doLoad() override; }; class CompilerSet { public: explicit CompilerSet(const QString& compilerFolder = QString()); explicit CompilerSet(const CompilerSet& set); CompilerSet& operator= (const CompilerSet& ) = delete; CompilerSet& operator= (const CompilerSet&& ) = delete; void addOption(const QString& name, const QString section, bool isC, bool isCpp, bool isLinker, int value, const QString& setting, const QStringList& choices = QStringList()); PCompilerOption findOption(const QString& setting); char getOptionValue(const QString& setting); void setOption(const QString& setting, char valueChar); void setOption(PCompilerOption& option, char valueChar); void setProperties(const QString& binDir); bool dirsValid(QString& msg); bool validateExes(QString& msg); //properties const QString& CCompiler() const; void setCCompiler(const QString& name); const QString& cppCompiler() const; void setCppCompiler(const QString& name); const QString& make() const; void setMake(const QString& name); const QString& debugger() const; void setDebugger(const QString& name); const QString& profiler() const; void setProfiler(const QString& name); const QString& resourceCompiler() const; void setResourceCompiler(const QString& name); QStringList& binDirs(); QStringList& CIncludeDirs(); QStringList& CppIncludeDirs(); QStringList& libDirs(); const QString& dumpMachine() const; void setDumpMachine(const QString& value); const QString& version() const; void setVersion(const QString& value); const QString& type() const; void setType(const QString& value); const QString& name() const; void setName(const QString& value); const QStringList& defines() const; const QString& target() const; void setTarget(const QString& value); bool useCustomCompileParams() const; void setUseCustomCompileParams(bool value); bool useCustomLinkParams() const; void setUseCustomLinkParams(bool value); const QString& customCompileParams() const; void setCustomCompileParams(const QString& value); const QString& customLinkParams() const; void setCustomLinkParams(const QString& value); bool autoAddCharsetParams() const; void setAutoAddCharsetParams(bool value); CompilerOptionList& options(); //Converts options to and from memory format QByteArray iniOptions() const; void setIniOptions(const QByteArray& value); //load hard defines void setDefines(); private: int charToValue(char valueChar); // Initialization void setExecutables(); void setDirectories(const QString& folder); void setUserInput(); void setOptions(); QString findProgramInBinDirs(const QString name); QByteArray getCompilerOutput(const QString& binDir, const QString& binFile, const QStringList& arguments); private: // Executables, most are hardcoded QString mCCompiler; QString mCppCompiler; QString mMake; QString mDebugger; QString mProfiler; QString mResourceCompiler; // Directories, mostly hardcoded too QStringList mBinDirs; QStringList mCIncludeDirs; QStringList mCppIncludeDirs; QStringList mLibDirs; // Misc. properties QString mDumpMachine; // "x86_64-w64-mingw32", "mingw32" etc QString mVersion; // "4.7.1" QString mType; // "TDM-GCC", "MinGW" QString mName; // "TDM-GCC 4.7.1 Release" QStringList mDefines; // list of predefined constants QString mTarget; // 'X86_64' / 'i686' // User settings bool mUseCustomCompileParams; bool mUseCustomLinkParams; QString mCustomCompileParams; QString mCustomLinkParams; bool mAutoAddCharsetParams; // Options CompilerOptionList mOptions; }; typedef std::shared_ptr PCompilerSet; typedef std::vector CompilerSetList; class CompilerSets { public: explicit CompilerSets(Settings* settings); PCompilerSet addSet(const CompilerSet& set); PCompilerSet addSet(const QString& folder=QString()); void addSets(const QString& folder); void clearSets(); void findSets(); void saveSets(); void loadSets(); void saveDefaultIndex(); void deleteSet(int index); void saveSet(int index); //properties CompilerSetList& list(); int size() const; int defaultIndex() const; void setDefaultIndex(int value); PCompilerSet defaultSet(); private: void savePath(const QString& name, const QString& path); void savePathList(const QString& name, const QStringList& pathList); QString loadPath(const QString& name); void loadPathList(const QString& name, QStringList& list); PCompilerSet loadSet(int index); CompilerSetList mList; int mDefaultIndex; Settings* mSettings; }; public: explicit Settings(const QString& filename); explicit Settings(Settings&& settings) = delete; explicit Settings(const Settings& settings) = delete; ~Settings(); Settings& operator= (const Settings& settings) = delete; Settings& operator= (const Settings&& settings) = delete; void beginGroup(const QString& group); void endGroup(); void saveValue(const QString& group, const QString &key, const QVariant &value); void saveValue(const QString &key, const QVariant &value); QVariant value(const QString& group, const QString &key, const QVariant& defaultValue); QVariant value(const QString &key, const QVariant& defaultValue); void load(); Dirs& dirs(); Editor& editor(); CompilerSets& compilerSets(); Environment& environment(); Executor& executor(); Debugger& debugger(); History& history(); CodeCompletion &codeCompletion(); QString filename() const; private: QString mFilename; QSettings mSettings; Dirs mDirs; Editor mEditor; Environment mEnvironment; CompilerSets mCompilerSets; Executor mExecutor; Debugger mDebugger; CodeCompletion mCodeCompletion; History mHistory; }; extern Settings* pSettings; #endif // SETTINGS_H