vconfigmanager.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. #include "vconfigmanager.h"
  2. #include <QDir>
  3. #include <QFile>
  4. #include <QString>
  5. #include <QJsonArray>
  6. #include <QJsonObject>
  7. #include <QJsonDocument>
  8. #include <QtDebug>
  9. #include <QTextEdit>
  10. #include "utils/vutils.h"
  11. #include "vstyleparser.h"
  12. const QString VConfigManager::orgName = QString("tamlok");
  13. const QString VConfigManager::appName = QString("vnote");
  14. const QString VConfigManager::dirConfigFileName = QString(".vnote.json");
  15. const QString VConfigManager::defaultConfigFilePath = QString(":/resources/vnote.ini");
  16. VConfigManager::VConfigManager()
  17. : userSettings(NULL), defaultSettings(NULL)
  18. {
  19. }
  20. VConfigManager::~VConfigManager()
  21. {
  22. if (userSettings) {
  23. delete userSettings;
  24. }
  25. if (defaultSettings) {
  26. delete defaultSettings;
  27. }
  28. }
  29. void VConfigManager::initialize()
  30. {
  31. userSettings = new QSettings(QSettings::IniFormat, QSettings::UserScope, orgName, appName);
  32. defaultSettings = new QSettings(defaultConfigFilePath, QSettings::IniFormat);
  33. baseEditFont.setPointSize(11);
  34. baseEditPalette = QTextEdit().palette();
  35. welcomePagePath = getConfigFromSettings("global", "welcome_page_path").toString();
  36. templatePath = getConfigFromSettings("global", "template_path").toString();
  37. preTemplatePath = getConfigFromSettings("global", "pre_template_path").toString();
  38. postTemplatePath = getConfigFromSettings("global", "post_template_path").toString();
  39. templateCssUrl = getConfigFromSettings("global", "template_css_url").toString();
  40. curNotebookIndex = getConfigFromSettings("global", "current_notebook").toInt();
  41. markdownExtensions = hoedown_extensions(HOEDOWN_EXT_TABLES | HOEDOWN_EXT_FENCED_CODE |
  42. HOEDOWN_EXT_HIGHLIGHT | HOEDOWN_EXT_AUTOLINK |
  43. HOEDOWN_EXT_QUOTE | HOEDOWN_EXT_MATH);
  44. mdConverterType = (MarkdownConverterType)getConfigFromSettings("global", "markdown_converter").toInt();
  45. tabStopWidth = getConfigFromSettings("global", "tab_stop_width").toInt();
  46. isExpandTab = getConfigFromSettings("global", "is_expand_tab").toBool();
  47. m_highlightCursorLine = getConfigFromSettings("global", "highlight_cursor_line").toBool();
  48. m_highlightSelectedWord = getConfigFromSettings("global", "highlight_selected_word").toBool();
  49. m_highlightSearchedWord = getConfigFromSettings("global", "highlight_searched_word").toBool();
  50. readPredefinedColorsFromSettings();
  51. curBackgroundColor = getConfigFromSettings("global", "current_background_color").toString();
  52. updatePaletteColor();
  53. curRenderBackgroundColor = getConfigFromSettings("global",
  54. "current_render_background_color").toString();
  55. m_toolsDockChecked = getConfigFromSettings("session", "tools_dock_checked").toBool();
  56. m_mainWindowGeometry = getConfigFromSettings("session", "main_window_geometry").toByteArray();
  57. m_mainWindowState = getConfigFromSettings("session", "main_window_state").toByteArray();
  58. m_mainSplitterState = getConfigFromSettings("session", "main_splitter_state").toByteArray();
  59. updateMarkdownEditStyle();
  60. m_findCaseSensitive = getConfigFromSettings("global",
  61. "find_case_sensitive").toBool();
  62. m_findWholeWordOnly = getConfigFromSettings("global",
  63. "find_whole_word_only").toBool();
  64. m_findRegularExpression = getConfigFromSettings("global",
  65. "find_regular_expression").toBool();
  66. m_findIncrementalSearch = getConfigFromSettings("global",
  67. "find_incremental_search").toBool();
  68. m_language = getConfigFromSettings("global", "language").toString();
  69. }
  70. void VConfigManager::readPredefinedColorsFromSettings()
  71. {
  72. predefinedColors.clear();
  73. int size = defaultSettings->beginReadArray("predefined_colors");
  74. for (int i = 0; i < size; ++i) {
  75. defaultSettings->setArrayIndex(i);
  76. VColor color;
  77. color.name = defaultSettings->value("name").toString();
  78. color.rgb = defaultSettings->value("rgb").toString();
  79. predefinedColors.append(color);
  80. }
  81. defaultSettings->endArray();
  82. qDebug() << "read" << predefinedColors.size()
  83. << "pre-defined colors from [predefined_colors] section";
  84. }
  85. void VConfigManager::readNotebookFromSettings(QVector<VNotebook *> &p_notebooks, QObject *parent)
  86. {
  87. Q_ASSERT(p_notebooks.isEmpty());
  88. int size = userSettings->beginReadArray("notebooks");
  89. for (int i = 0; i < size; ++i) {
  90. userSettings->setArrayIndex(i);
  91. QString name = userSettings->value("name").toString();
  92. QString path = userSettings->value("path").toString();
  93. VNotebook *notebook = new VNotebook(name, path, parent);
  94. p_notebooks.append(notebook);
  95. }
  96. userSettings->endArray();
  97. qDebug() << "read" << p_notebooks.size()
  98. << "notebook items from [notebooks] section";
  99. }
  100. void VConfigManager::writeNotebookToSettings(const QVector<VNotebook *> &p_notebooks)
  101. {
  102. // Clear it first
  103. userSettings->beginGroup("notebooks");
  104. userSettings->remove("");
  105. userSettings->endGroup();
  106. userSettings->beginWriteArray("notebooks");
  107. for (int i = 0; i < p_notebooks.size(); ++i) {
  108. userSettings->setArrayIndex(i);
  109. const VNotebook &notebook = *p_notebooks[i];
  110. userSettings->setValue("name", notebook.getName());
  111. userSettings->setValue("path", notebook.getPath());
  112. }
  113. userSettings->endArray();
  114. qDebug() << "write" << p_notebooks.size()
  115. << "notebook items in [notebooks] section";
  116. }
  117. QVariant VConfigManager::getConfigFromSettings(const QString &section, const QString &key)
  118. {
  119. QString fullKey = section + "/" + key;
  120. // First, look up the user-scoped config file
  121. QVariant value = userSettings->value(fullKey);
  122. if (!value.isNull()) {
  123. qDebug() << "user config:" << fullKey << value.toString();
  124. return value;
  125. }
  126. // Second, look up the default config file
  127. value = defaultSettings->value(fullKey);
  128. qDebug() << "default config:" << fullKey << value.toString();
  129. return value;
  130. }
  131. void VConfigManager::setConfigToSettings(const QString &section, const QString &key, const QVariant &value)
  132. {
  133. // Set the user-scoped config file
  134. QString fullKey = section + "/" + key;
  135. userSettings->setValue(fullKey, value);
  136. qDebug() << "set user config:" << fullKey << value.toString();
  137. }
  138. QJsonObject VConfigManager::readDirectoryConfig(const QString &path)
  139. {
  140. QString configFile = QDir(path).filePath(dirConfigFileName);
  141. qDebug() << "read config file:" << configFile;
  142. QFile config(configFile);
  143. if (!config.open(QIODevice::ReadOnly)) {
  144. qWarning() << "fail to read directory configuration file:"
  145. << configFile;
  146. return QJsonObject();
  147. }
  148. QByteArray configData = config.readAll();
  149. return QJsonDocument::fromJson(configData).object();
  150. }
  151. bool VConfigManager::directoryConfigExist(const QString &path)
  152. {
  153. QString configFile = QDir(path).filePath(dirConfigFileName);
  154. QFile config(configFile);
  155. return config.exists();
  156. }
  157. bool VConfigManager::writeDirectoryConfig(const QString &path, const QJsonObject &configJson)
  158. {
  159. QString configFile = QDir(path).filePath(dirConfigFileName);
  160. qDebug() << "write config file:" << configFile;
  161. QFile config(configFile);
  162. if (!config.open(QIODevice::WriteOnly)) {
  163. qWarning() << "fail to open directory configuration file for write:"
  164. << configFile;
  165. return false;
  166. }
  167. QJsonDocument configDoc(configJson);
  168. config.write(configDoc.toJson());
  169. return true;
  170. }
  171. bool VConfigManager::deleteDirectoryConfig(const QString &path)
  172. {
  173. QString configFile = QDir(path).filePath(dirConfigFileName);
  174. QFile config(configFile);
  175. if (!config.remove()) {
  176. qWarning() << "fail to delete directory configuration file:"
  177. << configFile;
  178. return false;
  179. }
  180. qDebug() << "delete config file:" << configFile;
  181. return true;
  182. }
  183. void VConfigManager::updateMarkdownEditStyle()
  184. {
  185. // Read style file .mdhl
  186. QString file(":/resources/styles/default.mdhl");
  187. QString styleStr = VUtils::readFileFromDisk(file);
  188. if (styleStr.isEmpty()) {
  189. return;
  190. }
  191. VStyleParser parser;
  192. parser.parseMarkdownStyle(styleStr);
  193. mdHighlightingStyles = parser.fetchMarkdownStyles(baseEditFont);
  194. mdEditPalette = baseEditPalette;
  195. mdEditFont = baseEditFont;
  196. parser.fetchMarkdownEditorStyles(mdEditPalette, mdEditFont);
  197. }
  198. void VConfigManager::updatePaletteColor()
  199. {
  200. static const QColor defaultColor = baseEditPalette.color(QPalette::Base);
  201. QColor newColor = defaultColor;
  202. if (curBackgroundColor != "System") {
  203. for (int i = 0; i < predefinedColors.size(); ++i) {
  204. if (predefinedColors[i].name == curBackgroundColor) {
  205. QString rgb = predefinedColors[i].rgb;
  206. if (!rgb.isEmpty()) {
  207. newColor = QColor(VUtils::QRgbFromString(rgb));
  208. }
  209. break;
  210. }
  211. }
  212. }
  213. baseEditPalette.setColor(QPalette::Base, newColor);
  214. // Update markdown editor palette
  215. updateMarkdownEditStyle();
  216. }