sessionconfig.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. #include "sessionconfig.h"
  2. #include <QDir>
  3. #include <QDebug>
  4. #include <QJsonArray>
  5. #include <QJsonDocument>
  6. #include <utils/fileutils.h>
  7. #include "configmgr.h"
  8. using namespace vnotex;
  9. bool SessionConfig::NotebookItem::operator==(const NotebookItem &p_other) const
  10. {
  11. return m_type == p_other.m_type
  12. && m_rootFolderPath == p_other.m_rootFolderPath
  13. && m_backend == p_other.m_backend;
  14. }
  15. void SessionConfig::NotebookItem::fromJson(const QJsonObject &p_jobj)
  16. {
  17. m_type = p_jobj[QStringLiteral("type")].toString();
  18. m_rootFolderPath = p_jobj[QStringLiteral("root_folder")].toString();
  19. m_backend = p_jobj[QStringLiteral("backend")].toString();
  20. }
  21. QJsonObject SessionConfig::NotebookItem::toJson() const
  22. {
  23. QJsonObject jobj;
  24. jobj[QStringLiteral("type")] = m_type;
  25. jobj[QStringLiteral("root_folder")] = m_rootFolderPath;
  26. jobj[QStringLiteral("backend")] = m_backend;
  27. return jobj;
  28. }
  29. SessionConfig::SessionConfig(ConfigMgr *p_mgr)
  30. : IConfig(p_mgr, nullptr)
  31. {
  32. }
  33. SessionConfig::~SessionConfig()
  34. {
  35. }
  36. void SessionConfig::init()
  37. {
  38. auto mgr = getMgr();
  39. auto sessionSettings = mgr->getSettings(ConfigMgr::Source::Session);
  40. const auto &sessionJobj = sessionSettings->getJson();
  41. loadCore(sessionJobj);
  42. }
  43. void SessionConfig::loadCore(const QJsonObject &p_session)
  44. {
  45. const auto coreObj = p_session.value(QStringLiteral("core")).toObject();
  46. m_newNotebookDefaultRootFolderPath = readString(coreObj,
  47. QStringLiteral("new_notebook_default_root_folder_path"));
  48. if (m_newNotebookDefaultRootFolderPath.isEmpty()) {
  49. m_newNotebookDefaultRootFolderPath = QDir::homePath();
  50. }
  51. m_currentNotebookRootFolderPath = readString(coreObj,
  52. QStringLiteral("current_notebook_root_folder_path"));
  53. {
  54. auto option = readString(coreObj, QStringLiteral("opengl"));
  55. m_openGL = stringToOpenGL(option);
  56. }
  57. if (!isUndefinedKey(coreObj, QStringLiteral("system_title_bar"))) {
  58. m_systemTitleBarEnabled = readBool(coreObj, QStringLiteral("system_title_bar"));
  59. } else {
  60. // Enable system title bar on macOS by default.
  61. #if defined(Q_OS_MACOS) || defined(Q_OS_MAC)
  62. m_systemTitleBarEnabled = true;
  63. #else
  64. m_systemTitleBarEnabled = false;
  65. #endif
  66. }
  67. if (!isUndefinedKey(coreObj, QStringLiteral("minimize_to_system_tray"))) {
  68. m_minimizeToSystemTray = readBool(coreObj, QStringLiteral("minimize_to_system_tray")) ? 1 : 0;
  69. }
  70. }
  71. QJsonObject SessionConfig::saveCore() const
  72. {
  73. QJsonObject coreObj;
  74. coreObj[QStringLiteral("new_notebook_default_root_folder_path")] = m_newNotebookDefaultRootFolderPath;
  75. coreObj[QStringLiteral("current_notebook_root_folder_path")] = m_currentNotebookRootFolderPath;
  76. coreObj[QStringLiteral("opengl")] = openGLToString(m_openGL);
  77. coreObj[QStringLiteral("system_title_bar")] = m_systemTitleBarEnabled;
  78. if (m_minimizeToSystemTray != -1) {
  79. coreObj[QStringLiteral("minimize_to_system_tray")] = m_minimizeToSystemTray > 0;
  80. }
  81. return coreObj;
  82. }
  83. const QString &SessionConfig::getNewNotebookDefaultRootFolderPath() const
  84. {
  85. return m_newNotebookDefaultRootFolderPath;
  86. }
  87. void SessionConfig::setNewNotebookDefaultRootFolderPath(const QString &p_path)
  88. {
  89. updateConfig(m_newNotebookDefaultRootFolderPath,
  90. p_path,
  91. this);
  92. }
  93. const QVector<SessionConfig::NotebookItem> &SessionConfig::getNotebooks()
  94. {
  95. if (m_notebooks.isEmpty()) {
  96. auto mgr = getMgr();
  97. auto sessionSettings = mgr->getSettings(ConfigMgr::Source::Session);
  98. const auto &sessionJobj = sessionSettings->getJson();
  99. loadNotebooks(sessionJobj);
  100. }
  101. return m_notebooks;
  102. }
  103. void SessionConfig::setNotebooks(const QVector<SessionConfig::NotebookItem> &p_notebooks)
  104. {
  105. updateConfig(m_notebooks,
  106. p_notebooks,
  107. this);
  108. }
  109. void SessionConfig::loadNotebooks(const QJsonObject &p_session)
  110. {
  111. const auto notebooksJson = p_session.value(QStringLiteral("notebooks")).toArray();
  112. m_notebooks.resize(notebooksJson.size());
  113. for (int i = 0; i < notebooksJson.size(); ++i) {
  114. m_notebooks[i].fromJson(notebooksJson[i].toObject());
  115. }
  116. }
  117. QJsonArray SessionConfig::saveNotebooks() const
  118. {
  119. QJsonArray nbArray;
  120. for (const auto &nb : m_notebooks) {
  121. nbArray.append(nb.toJson());
  122. }
  123. return nbArray;
  124. }
  125. const QString &SessionConfig::getCurrentNotebookRootFolderPath() const
  126. {
  127. return m_currentNotebookRootFolderPath;
  128. }
  129. void SessionConfig::setCurrentNotebookRootFolderPath(const QString &p_path)
  130. {
  131. updateConfig(m_currentNotebookRootFolderPath,
  132. p_path,
  133. this);
  134. }
  135. void SessionConfig::writeToSettings() const
  136. {
  137. getMgr()->writeSessionSettings(toJson());
  138. }
  139. QJsonObject SessionConfig::toJson() const
  140. {
  141. QJsonObject obj;
  142. obj[QStringLiteral("core")] = saveCore();
  143. obj[QStringLiteral("notebooks")] = saveNotebooks();
  144. obj[QStringLiteral("state_geometry")] = saveStateAndGeometry();
  145. return obj;
  146. }
  147. QJsonObject SessionConfig::saveStateAndGeometry() const
  148. {
  149. QJsonObject obj;
  150. writeByteArray(obj, QStringLiteral("main_window_state"), m_mainWindowStateGeometry.m_mainState);
  151. writeByteArray(obj, QStringLiteral("main_window_geometry"), m_mainWindowStateGeometry.m_mainGeometry);
  152. return obj;
  153. }
  154. SessionConfig::MainWindowStateGeometry SessionConfig::getMainWindowStateGeometry() const
  155. {
  156. auto sessionSettings = getMgr()->getSettings(ConfigMgr::Source::Session);
  157. const auto &sessionJobj = sessionSettings->getJson();
  158. const auto obj = sessionJobj.value(QStringLiteral("state_geometry")).toObject();
  159. MainWindowStateGeometry sg;
  160. sg.m_mainState = readByteArray(obj, QStringLiteral("main_window_state"));
  161. sg.m_mainGeometry = readByteArray(obj, QStringLiteral("main_window_geometry"));
  162. return sg;
  163. }
  164. void SessionConfig::setMainWindowStateGeometry(const SessionConfig::MainWindowStateGeometry &p_state)
  165. {
  166. m_mainWindowStateGeometry = p_state;
  167. ++m_revision;
  168. writeToSettings();
  169. }
  170. SessionConfig::OpenGL SessionConfig::getOpenGLAtBootstrap()
  171. {
  172. auto userConfigFile = ConfigMgr::locateSessionConfigFilePathAtBootstrap();
  173. if (!userConfigFile.isEmpty()) {
  174. auto bytes = FileUtils::readFile(userConfigFile);
  175. auto obj = QJsonDocument::fromJson(bytes).object();
  176. auto coreObj = obj.value(QStringLiteral("core")).toObject();
  177. auto str = coreObj.value(QStringLiteral("opengl")).toString();
  178. return stringToOpenGL(str);
  179. }
  180. return OpenGL::None;
  181. }
  182. SessionConfig::OpenGL SessionConfig::getOpenGL() const
  183. {
  184. return m_openGL;
  185. }
  186. void SessionConfig::setOpenGL(OpenGL p_option)
  187. {
  188. updateConfig(m_openGL, p_option, this);
  189. }
  190. QString SessionConfig::openGLToString(OpenGL p_option)
  191. {
  192. switch (p_option) {
  193. case OpenGL::Desktop:
  194. return QStringLiteral("desktop");
  195. case OpenGL::Angle:
  196. return QStringLiteral("angle");
  197. case OpenGL::Software:
  198. return QStringLiteral("software");
  199. default:
  200. return QStringLiteral("none");
  201. }
  202. }
  203. SessionConfig::OpenGL SessionConfig::stringToOpenGL(const QString &p_str)
  204. {
  205. auto option = p_str.toLower();
  206. if (option == QStringLiteral("software")) {
  207. return OpenGL::Software;
  208. } else if (option == QStringLiteral("desktop")) {
  209. return OpenGL::Desktop;
  210. } else if (option == QStringLiteral("angle")) {
  211. return OpenGL::Angle;
  212. } else {
  213. return OpenGL::None;
  214. }
  215. }
  216. bool SessionConfig::getSystemTitleBarEnabled() const
  217. {
  218. return m_systemTitleBarEnabled;
  219. }
  220. void SessionConfig::setSystemTitleBarEnabled(bool p_enabled)
  221. {
  222. updateConfig(m_systemTitleBarEnabled, p_enabled, this);
  223. }
  224. int SessionConfig::getMinimizeToSystemTray() const
  225. {
  226. return m_minimizeToSystemTray;
  227. }
  228. void SessionConfig::setMinimizeToSystemTray(bool p_enabled)
  229. {
  230. updateConfig(m_minimizeToSystemTray, p_enabled ? 1 : 0, this);
  231. }