1 #ifndef Header_Config_Manager 2 #define Header_Config_Manager 3 4 #include "mostQtHeaders.h" 5 6 #include "buildmanager.h" 7 #include "configmanagerinterface.h" 8 #include "smallUsefulFunctions.h" 9 10 class ConfigDialog; 11 class LatexCompleterConfig; 12 class LatexEditorViewConfig; 13 class WebPublishDialogConfig; 14 class InsertGraphicsConfig; 15 struct PDFDocumentConfig; 16 class GrammarCheckerConfig; 17 class InternalTerminalConfig; 18 19 #ifdef Q_OS_WIN 20 const QKeySequence::SequenceFormat SHORTCUT_FORMAT = QKeySequence::PortableText; 21 #else 22 const QKeySequence::SequenceFormat SHORTCUT_FORMAT = QKeySequence::NativeText; 23 #endif 24 25 struct ManagedToolBar { 26 QString name; 27 QStringList defaults; 28 QStringList actualActions; 29 QToolBar *toolbar; 30 ManagedToolBar(const QString &newName, const QStringList &defs); 31 }; 32 33 class ConfigManager: public QObject, public ConfigManagerInterface 34 { 35 Q_OBJECT 36 37 public: 38 static const int MAX_NUM_MACROS = 5000; 39 40 ConfigManager(QObject *parent = nullptr); 41 ~ConfigManager(); 42 43 QString iniPath(); 44 static QString portableConfigDir(); 45 bool isPortableMode(); 46 47 QSettings *newQSettings(); 48 QSettings *readSettings(bool reread = false); 49 QSettings *saveSettings(const QString &saveName = ""); 50 QSettings *getSettings(); 51 52 void saveMacros(); 53 54 bool execConfigDialog(QWidget *parentToDialog); 55 56 //public configuration 57 58 static QTextCodec *newFileEncoding; 59 QString newFileEncodingName; 60 bool autoDetectEncodingFromChars; 61 bool autoDetectEncodingFromLatex; 62 QStringList commonEncodings; 63 64 QHash<QString, int> editorKeys; 65 QSet<int> editorAvailableOperations; 66 67 //startup 68 bool checkLatexConfiguration; 69 70 //build 71 BuildManager *buildManager; 72 bool showMessagesWhenCompiling; 73 bool runLaTeXBibTeXLaTeX; 74 int showStdoutOption; //never = 0, user commands, always 75 76 //svn 77 //bool autoCheckinAfterSave; 78 int autoCheckinAfterSaveLevel; 79 int useVCS; // 0 SVN 1 GIT 80 bool svnUndo; 81 bool svnKeywordSubstitution; 82 int svnSearchPathDepth; 83 84 85 //appearance 86 QPalette systemPalette; 87 QString interfaceStyle; 88 QString interfaceFontFamily; 89 int guiToolbarIconSize, guiSymbolGridIconSize; 90 int guiSecondaryToolbarIconSize; 91 int guiPDFToolbarIconSize; 92 int guiConfigShortcutColumnWidth; 93 bool useTexmakerPalette; 94 int interfaceFontSize; 95 bool mruDocumentChooser; 96 bool configShowAdvancedOptions, configRiddled; 97 bool centralVisible; 98 bool showStatusbar; 99 bool showLineNumbersInStructure; 100 int indentationInStructure; 101 bool indentIncludesInStructure; 102 bool showCommentedElementsInStructure; 103 bool markStructureElementsBeyondEnd; 104 bool markStructureElementsInAppendix; 105 int globalTOCbackgroundOptions; 106 QString referenceCommandsInContextMenu; 107 bool structureShowSingleDoc; 108 bool structureScrollToCurrentPosition; 109 110 bool macroEditorUsesLineWrap; 111 112 //update 113 bool autoUpdateCheck; 114 int updateLevel; 115 int autoUpdateCheckIntervalDays; 116 QDateTime lastUpdateCheck; 117 118 //language 119 QString language, lastLanguage; 120 QTranslator *appTranslator; 121 QTranslator *basicTranslator; 122 123 //editor 124 LatexEditorViewConfig *const editorConfig; 125 //completion 126 LatexCompleterConfig *const completerConfig; 127 128 //webpublish dialog 129 WebPublishDialogConfig *const webPublishDialogConfig; 130 //pdf preview 131 PDFDocumentConfig *const pdfDocumentConfig; 132 133 //other dialogs 134 int lastHardWrapColumn; 135 bool lastHardWrapSmartScopeSelection; 136 bool lastHardWrapJoinLines; 137 138 //insert graphics dialog 139 InsertGraphicsConfig *const insertGraphicsConfig; 140 141 //Grammar check 142 GrammarCheckerConfig *const grammarCheckerConfig; 143 144 //Terminal 145 InternalTerminalConfig *const terminalConfig; 146 147 //bool autoReplaceCommands; // moved to static codesnippet 148 149 int tabstop; 150 151 bool useEscForClosingLog; 152 bool useEscForClosingEmbeddedViewer; 153 bool useEscForClosingFullscreen; 154 bool showShortcutsInTooltips; 155 int replaceQuotes; //0: none, 1: ``..'', 2: \"< \"> 3: \"`..\"' , 4: \\og..\\fg{} 5: \"> \"< 156 157 // table autoformat 158 QString tableAutoFormatSpecialCommands; // colon separated 159 int tableAutoFormatSpecialCommandPos; 160 bool tableAutoFormatOneLinePerCell; 161 162 // LogView 163 double logViewWarnIfFileSizeLargerMB; 164 int logViewRememberChoice; 165 166 //preview 167 enum PreviewMode {PM_TOOLTIP_AS_FALLBACK = 0, PM_PANEL, PM_TOOLTIP, PM_BOTH, PM_INLINE, PM_EMBEDDED}; 168 enum AutoPreviewMode {AP_NEVER = 0, AP_PREVIOUSLY = 1}; 169 PreviewMode previewMode; 170 AutoPreviewMode autoPreview; 171 int autoPreviewDelay; 172 int segmentPreviewScalePercent; 173 174 // embedded viewer 175 bool viewerEnlarged; 176 177 //files 178 QString lastDocument; //last opened document, for file open directory 179 QStringList recentFilesList, recentProjectList, recentSessionList; 180 QMap<QString, QString> recentFileHighlightLanguage; 181 int maxRecentFiles, maxRecentProjects, maxRecentSessions; 182 bool rememberFileFilter, useNativeFileDialog; 183 bool sessionRestore; 184 bool sessionStoreRelativePaths; 185 bool parseBibTeX, parseMaster; 186 QString logFileEncoding, bibFileEncoding; 187 bool autoLoadChildren; 188 189 // insert cite command, when no context available 190 QString citeCommand; 191 192 //autosave 193 int autosaveEveryMinutes; 194 195 bool addRecentFile(const QString &fileName, bool asMaster); //adds a recent file 196 void updateRecentFiles(bool alwaysRecreateMenuItems = false); 197 QMenu *updateListMenu(const QString &menuName, const QStringList &items, const QString &namePrefix, bool prefixNumber, const char *slotName, const int baseShortCut, bool alwaysRecreateMenuItems = false, int additionalEntries = 2, const QList<QVariant> data=QList<QVariant>()); 198 void updateUserMacroMenu(); 199 void updateUserMacroShortcuts(); 200 201 QString additionalBibPaths; 202 QString additionalImagePaths; 203 204 //dictionaries 205 QString spellDictDir; 206 QString spellLanguage; 207 QString spell_dic, thesaurus_database; 208 209 //debug 210 #ifndef QT_NO_DEBUG 211 QDateTime debugLastFileModification; 212 QDateTime debugLastFullTestRun; 213 #endif 214 215 bool goToErrorWhenDisplayingLog; 216 bool showLogMarkersWhenClickingLogEntry; 217 bool scanInstalledLatexPackages; 218 219 // input unicode instead of latex command from symbolgrid (if available) 220 bool insertSymbolsAsUnicode; 221 QByteArray stateSymbolsWidget; 222 223 // macro repository 224 QString URLmacroRepository; 225 //menus 226 QObjectList menuParents; 227 QObject *menuParent; //lets assume there is only one 228 QMenuBar *menuParentsBar; //that's ugly, but faster as long as there is only one (both values could be extracted from the action's name) 229 QList<QMenu *> managedMenus; 230 QHash<QString, QKeySequence> managedMenuShortcuts; 231 QList<QPair<QString, QString> > managedMenuNewShortcuts; 232 #if (QT_VERSION <= 0x050700) && (defined(Q_OS_MAC)) 233 //workaround that osx/qt does not support alt+key/esc as shortcuts 234 QMultiMap<QKeySequence, QAction *> specialShortcuts; 235 #endif 236 237 QMenu *newManagedMenu(const QString &id, const QString &text); 238 QMenu *newManagedMenu(QMenu *menu, const QString &id, const QString &text); 239 QMenu *newManagedMenu(QWidget *menuParent,QMenuBar *menuParentsBar,const QString &id, const QString &text); 240 QAction *newManagedAction(QWidget *menu, const QString &id, const QString &text, const char *slotName, const QList<QKeySequence> &shortCuts = QList<QKeySequence>(), const QString &iconFile = ""); 241 QAction *newManagedAction(QObject *rootMenu,QWidget *menu, const QString &id, const QString &text, QObject *obj,const char *slotName, const QList<QKeySequence> &shortCuts = QList<QKeySequence>(), const QString &iconFile = ""); 242 QAction *newManagedAction(QWidget *menu, const QString &id, QAction *act); 243 QAction *newOrLostOldManagedAction(QWidget *menu, const QString &id, const QString &text, const char *slotName, const QList<QKeySequence> *shortCuts = nullptr, const QString &iconFile = ""); 244 QAction *getManagedAction(const QString &id); 245 QList<QAction *> getManagedActions(const QString &id); 246 QList<QAction *> getManagedActions(const QStringList &ids, const QString &commonPrefix = ""); 247 QMenu *getManagedMenu(const QString &id); 248 void removeManagedMenus(); 249 void triggerManagedAction(const QString &id); 250 251 static QString configDirOverride; 252 static bool dontRestoreSession; 253 static int RUNAWAYLIMIT; 254 private: 255 void setupDirectoryStructure(); 256 void moveCwls(); 257 void connectExtendedSlot(QAction *act, const QString &slot); 258 bool modifyMenuContentsFirstCall; 259 void modifyMenuContent(QStringList &ids, const QString &id); 260 void clearMenu(QMenu *menu); 261 public: 262 void modifyMenuContents(); 263 void modifyManagedShortcuts(QString startsWith=""); 264 void setManagedShortCut(QAction *act, int num, const QKeySequence &key); 265 void loadManagedMenu(QMenu *parent, const QDomElement &f); 266 void loadManagedMenus(const QString &f); 267 QStringList possibleMenuSlots; 268 private: 269 void managedMenuToTreeWidget(QTreeWidgetItem *parent, QMenu *menu); 270 void treeWidgetToManagedMenuTo(QTreeWidgetItem *item); 271 272 QTreeWidgetItem *managedLatexMenuToTreeWidget(QTreeWidgetItem *parent, QMenu *menu); 273 void treeWidgetToManagedLatexMenuTo(); 274 275 public: 276 // custom toolbar 277 QList<ManagedToolBar> managedToolBars; 278 QStringList watchedMenus; //list of all sub menus mapped on toolbars 279 QMap<QString, QVariant> replacedIconsOnMenus; 280 281 void populateCustomActions(QListWidget *parent, QMenu *menu, bool go = false); 282 283 signals: 284 void watchedMenuChanged(const QString &menuId); 285 void iconSizeChanged(int value); 286 void secondaryIconSizeChanged(int value); 287 void pdfIconSizeChanged(int value); 288 void symbolGridIconSizeChanged(int value); 289 public: 290 //private: 291 QString configFileName, configFileNameBase, defaultStyleName, configBaseDir; 292 enum CommmandGridWidgetType {CG_ID, CG_RERUN, CG_CMD, CG_PROGRAM, CG_RESET, CG_CONFIG, CG_DEL, CG_MOVEUP, CG_MOVEDOWN, CG_ADD}; 293 CommandMapping tempCommands; 294 QList<QPushButton *> rerunButtons; // only for non-user commands 295 QList<QWidget *> commandInputs; // only for non-user commands 296 QGridLayout *userGridLayout; 297 QLineEdit *pdflatexEdit; 298 void loadTranslations(QString locale); 299 300 void registerOption(const QString &name, void *storage, PropertyType type, QVariant def, void *displayWidgetOffset); 301 virtual void registerOption(const QString &name, void *storage, PropertyType type, QVariant def); 302 303 #define REGISTER_OPTION(TYPE, dummy) \ 304 void registerOption(const QString& name, TYPE* storage, QVariant def, void* displayWidgetOffset); \ 305 virtual void registerOption(const QString& name, TYPE* storage, QVariant def=QVariant()); 306 PROPERTY_TYPE_FOREACH_MACRO(REGISTER_OPTION) 307 #undef REGISTER_OPTION 308 309 //virtual void registerOption(const QString& name, QVariant* storage, QVariant def); 310 virtual void setOption(const QString &name, const QVariant &value); 311 virtual QVariant getOption(const QString &name, const QVariant &defaultValue = QVariant()) const; 312 virtual bool existsOption(const QString &name) const; 313 virtual void linkOptionToDialogWidget(const void *optionStorage, QWidget *widget); 314 virtual void linkOptionToObject(const void *optionStorage, QObject *widget, LinkOptions options); 315 virtual void updateAllLinkedObjects(const void *optionStorage); 316 317 static void getDefaultEncoding(const QByteArray &unused, QTextCodec *&guess, int &sure); 318 319 QString parseDir(QString s) const; 320 QStringList parseDirList(const QString &s) const; 321 QString reverseParseDir(QString s) const; 322 QString reverseParseDir(const QStringList &s) const; 323 private: 324 void setInterfaceStyle(); 325 326 QSettings *persistentConfig; 327 328 QList<QTreeWidgetItem *> changedItemsList, superAdvancedItems; 329 QHash<QString, QTreeWidgetItem *> manipulatedMenuTree; 330 331 QMap<QString, QVariant> manipulatedMenus; 332 333 QList<ManagedProperty> managedProperties; 334 335 QMap<QWidget *, QList<QWidget *> > managedOptionDialogs; 336 ManagedProperty *getManagedProperty(const void *storage); 337 ManagedProperty *getManagedProperty(const QString &name); 338 const ManagedProperty *getManagedProperty(const QString &name) const; 339 340 QMap<ManagedProperty *, QPair<LinkOptions, QList<QObject *> > > managedOptionObjects; 341 342 int userCommandRowCount(); 343 void addCommandRow(QGridLayout *parent, const CommandInfo &cmd, int row); 344 void createCommandList(QGroupBox *box, const QStringList &order, bool user, bool meta); 345 void setFirstRowMoveUpEnable(bool enable); 346 void setLastRowMoveDownEnable(bool enable); 347 private slots: 348 void browseCommand(); 349 void undoCommand(); 350 void editCommand(); 351 void addCommand(); 352 void removeCommand(); 353 void moveUpCommand(); 354 void moveDownCommand(); 355 void moveCommand(int dir, int atRow = -1); 356 357 void menuTreeItemChanged(QTreeWidgetItem *item, int l); 358 void menuTreeNewItem(bool menu = false); 359 void menuTreeNewMenuItem(); 360 void menuTreeRevertItem(); 361 void toggleVisibleTreeItems(bool show); 362 void activateInternalViewer(bool activated); 363 364 void managedOptionDialogAccepted(); 365 void managedOptionObjectDestroyed(QObject *obj); 366 void managedOptionBoolToggled(); 367 private: 368 void updateManagedOptionObjects(ManagedProperty *property); 369 }; 370 #endif 371