vconfigmanager.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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. readPredefinedColorsFromSettings();
  49. curBackgroundColor = getConfigFromSettings("global", "current_background_color").toString();
  50. updatePaletteColor();
  51. curRenderBackgroundColor = getConfigFromSettings("global",
  52. "current_render_background_color").toString();
  53. m_toolsDockChecked = getConfigFromSettings("session", "tools_dock_checked").toBool();
  54. m_mainWindowGeometry = getConfigFromSettings("session", "main_window_geometry").toByteArray();
  55. m_mainWindowState = getConfigFromSettings("session", "main_window_state").toByteArray();
  56. updateMarkdownEditStyle();
  57. }
  58. void VConfigManager::readPredefinedColorsFromSettings()
  59. {
  60. predefinedColors.clear();
  61. int size = defaultSettings->beginReadArray("predefined_colors");
  62. for (int i = 0; i < size; ++i) {
  63. defaultSettings->setArrayIndex(i);
  64. VColor color;
  65. color.name = defaultSettings->value("name").toString();
  66. color.rgb = defaultSettings->value("rgb").toString();
  67. predefinedColors.append(color);
  68. }
  69. defaultSettings->endArray();
  70. qDebug() << "read" << predefinedColors.size()
  71. << "pre-defined colors from [predefined_colors] section";
  72. }
  73. void VConfigManager::readNotebookFromSettings(QVector<VNotebook *> &p_notebooks, QObject *parent)
  74. {
  75. Q_ASSERT(p_notebooks.isEmpty());
  76. int size = userSettings->beginReadArray("notebooks");
  77. for (int i = 0; i < size; ++i) {
  78. userSettings->setArrayIndex(i);
  79. QString name = userSettings->value("name").toString();
  80. QString path = userSettings->value("path").toString();
  81. VNotebook *notebook = new VNotebook(name, path, parent);
  82. p_notebooks.append(notebook);
  83. }
  84. userSettings->endArray();
  85. qDebug() << "read" << p_notebooks.size()
  86. << "notebook items from [notebooks] section";
  87. }
  88. void VConfigManager::writeNotebookToSettings(const QVector<VNotebook *> &p_notebooks)
  89. {
  90. // Clear it first
  91. userSettings->beginGroup("notebooks");
  92. userSettings->remove("");
  93. userSettings->endGroup();
  94. userSettings->beginWriteArray("notebooks");
  95. for (int i = 0; i < p_notebooks.size(); ++i) {
  96. userSettings->setArrayIndex(i);
  97. const VNotebook &notebook = *p_notebooks[i];
  98. userSettings->setValue("name", notebook.getName());
  99. userSettings->setValue("path", notebook.getPath());
  100. }
  101. userSettings->endArray();
  102. qDebug() << "write" << p_notebooks.size()
  103. << "notebook items in [notebooks] section";
  104. }
  105. QVariant VConfigManager::getConfigFromSettings(const QString &section, const QString &key)
  106. {
  107. QString fullKey = section + "/" + key;
  108. // First, look up the user-scoped config file
  109. QVariant value = userSettings->value(fullKey);
  110. if (!value.isNull()) {
  111. qDebug() << "user config:" << fullKey << value.toString();
  112. return value;
  113. }
  114. // Second, look up the default config file
  115. value = defaultSettings->value(fullKey);
  116. qDebug() << "default config:" << fullKey << value.toString();
  117. return value;
  118. }
  119. void VConfigManager::setConfigToSettings(const QString &section, const QString &key, const QVariant &value)
  120. {
  121. // Set the user-scoped config file
  122. QString fullKey = section + "/" + key;
  123. userSettings->setValue(fullKey, value);
  124. qDebug() << "set user config:" << fullKey << value.toString();
  125. }
  126. QJsonObject VConfigManager::readDirectoryConfig(const QString &path)
  127. {
  128. QString configFile = QDir(path).filePath(dirConfigFileName);
  129. qDebug() << "read config file:" << configFile;
  130. QFile config(configFile);
  131. if (!config.open(QIODevice::ReadOnly)) {
  132. qWarning() << "error: fail to read directory configuration file:"
  133. << configFile;
  134. return QJsonObject();
  135. }
  136. QByteArray configData = config.readAll();
  137. return QJsonDocument::fromJson(configData).object();
  138. }
  139. bool VConfigManager::directoryConfigExist(const QString &path)
  140. {
  141. QString configFile = QDir(path).filePath(dirConfigFileName);
  142. QFile config(configFile);
  143. return config.exists();
  144. }
  145. bool VConfigManager::writeDirectoryConfig(const QString &path, const QJsonObject &configJson)
  146. {
  147. QString configFile = QDir(path).filePath(dirConfigFileName);
  148. qDebug() << "write config file:" << configFile;
  149. QFile config(configFile);
  150. if (!config.open(QIODevice::WriteOnly)) {
  151. qWarning() << "error: fail to open directory configuration file for write:"
  152. << configFile;
  153. return false;
  154. }
  155. QJsonDocument configDoc(configJson);
  156. config.write(configDoc.toJson());
  157. return true;
  158. }
  159. bool VConfigManager::deleteDirectoryConfig(const QString &path)
  160. {
  161. QString configFile = QDir(path).filePath(dirConfigFileName);
  162. QFile config(configFile);
  163. if (!config.remove()) {
  164. qWarning() << "error: fail to delete directory configuration file:"
  165. << configFile;
  166. return false;
  167. }
  168. qDebug() << "delete config file:" << configFile;
  169. return true;
  170. }
  171. void VConfigManager::updateMarkdownEditStyle()
  172. {
  173. // Read style file .mdhl
  174. QString file(":/resources/styles/default.mdhl");
  175. QString styleStr = VUtils::readFileFromDisk(file);
  176. if (styleStr.isEmpty()) {
  177. return;
  178. }
  179. VStyleParser parser;
  180. parser.parseMarkdownStyle(styleStr);
  181. mdHighlightingStyles = parser.fetchMarkdownStyles(baseEditFont);
  182. mdEditPalette = baseEditPalette;
  183. mdEditFont = baseEditFont;
  184. parser.fetchMarkdownEditorStyles(mdEditPalette, mdEditFont);
  185. }
  186. void VConfigManager::updatePaletteColor()
  187. {
  188. QString rgb;
  189. if (curBackgroundColor == "System") {
  190. return;
  191. } else {
  192. for (int i = 0; i < predefinedColors.size(); ++i) {
  193. if (predefinedColors[i].name == curBackgroundColor) {
  194. rgb = predefinedColors[i].rgb;
  195. break;
  196. }
  197. }
  198. }
  199. if (rgb.isEmpty()) {
  200. return;
  201. }
  202. baseEditPalette.setColor(QPalette::Base,
  203. QColor(VUtils::QRgbFromString(rgb)));
  204. // Update markdown editor palette
  205. updateMarkdownEditStyle();
  206. }