nddsetting.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. #include "nddsetting.h"
  2. #include <QObject>
  3. #include <QtDebug>
  4. #include <QCoreApplication>
  5. #include <QDate>
  6. #include <QFile>
  7. #include <QStorageInfo>
  8. #include <QSettings>
  9. static short version_num = 29; //1.22.0 是29
  10. //配置文件是否存在。如果初始化失败,则不存在
  11. bool NddSetting::s_isExistDb = false;
  12. int NddSetting::s_reference = 0;
  13. bool NddSetting::s_isContentChanged = false;
  14. QSettings* NddSetting::s_nddSet = nullptr;
  15. QSettings* NddSetting::s_nddDelaySet = nullptr;
  16. //如果key不存在,则新增key-value。存在:返回true
  17. bool NddSetting::checkNoExistAdd(QString key, QVariant& value)
  18. {
  19. //每次新加字段后,这里要检查一下,不存在则新增
  20. if (!s_nddSet->contains(key))
  21. {
  22. s_nddSet->setValue(key, value);
  23. if (!s_isContentChanged)
  24. {
  25. s_isContentChanged = true;
  26. }
  27. return false;
  28. }
  29. return true;
  30. }
  31. //20220402这里隐含了一个前置条件:数据库句柄是在主线程创建的,最好不要在子线程中调用。
  32. //避免因为跨线程访问和多线程冲突访问引发的闪退问题。所以最好配置文件的读写都在主线程中进行
  33. void NddSetting::init()
  34. {
  35. ++s_reference;
  36. //如果已经初始化过了,则直接返回
  37. if (s_isExistDb)
  38. {
  39. return;
  40. }
  41. QString settingDir = QString("notepad/nddsets");
  42. QSettings qs(QSettings::IniFormat, QSettings::UserScope, settingDir);
  43. QString qsSetPath = qs.fileName();
  44. s_nddSet = new QSettings(QSettings::IniFormat, QSettings::UserScope, settingDir);
  45. s_nddSet->setIniCodec("UTF-8");
  46. bool initOk = true;
  47. auto initNddSet = []() {
  48. QString key = "signdate";
  49. //QString date = QDate::currentDate().toString(QString("yyyy/M/d"));
  50. //不写今天的时间,否则第一次运行,无条件不会发送心跳。
  51. //直接写一个过去的时间,让第一次运行,总是要签到
  52. addKeyValueToSets(key, "2022/2/20");
  53. QString str;
  54. //tab的长度,默认为4
  55. addKeyValueToNumSets("tablens", 4);
  56. //space replace tab空格替换tab,默认0, 1为true,0为false
  57. addKeyValueToNumSets("tabnouse", 0);
  58. addKeyValueToSets("mac", "0");
  59. addKeyValueToNumSets("padtimes", 0);
  60. addKeyValueToNumSets("serverip", 0);
  61. //是否高亮不同处背景
  62. addKeyValueToNumSets("hexhigh", 1);
  63. addKeyValueToNumSets(VERSION, version_num);
  64. //皮肤id
  65. addKeyValueToNumSets(SKIN_KEY, 0);
  66. //语言index 0:自动选择 1:中文 2 英文
  67. addKeyValueToNumSets(LANGS_KEY, 0);
  68. //开启自动换行
  69. addKeyValueToNumSets(AUTOWARP_KEY, 0);
  70. //开启自动缩进
  71. addKeyValueToNumSets(INDENT_KEY, 0);
  72. //显示空白。0都不显示 1 单显示空格 2 单显示行尾 3 都显示
  73. addKeyValueToNumSets(SHOWSPACE_KEY, 0);
  74. //最大文本文件的门限。默认100M.(50-600)
  75. addKeyValueToNumSets(MAX_BIG_TEXT, 100);
  76. addKeyValueToSets(SOFT_KEY, "0");
  77. addKeyValueToNumSets(RESTORE_CLOSE_FILE, 1);
  78. //0 24 1 36 2 48
  79. addKeyValueToNumSets(ICON_SIZE, 1);
  80. addKeyValueToNumSets(ZOOMVALUE, 100);
  81. addKeyValueToNumSets(FINDRESULTPOS, Qt::BottomDockWidgetArea);
  82. addKeyValueToNumSets(FILELISTPOS, Qt::LeftDockWidgetArea);
  83. //默认0不显示
  84. addKeyValueToNumSets(FILELISTSHOW, 0);
  85. //默认显示工具栏
  86. addKeyValueToNumSets(TOOLBARSHOW, 1);
  87. //打开网页,默认不勾选,资源耗费多
  88. addKeyValueToNumSets(SHOWWEBADDR, 0);
  89. //查找结果框的默认字体大小
  90. addKeyValueToNumSets(FIND_RESULT_FONT_SIZE, 14);
  91. };
  92. if (!s_nddSet->contains(VERSION))
  93. {
  94. //不存在走初始化流程
  95. initNddSet();
  96. s_isContentChanged = true;
  97. }
  98. else
  99. {
  100. do {
  101. {
  102. QVariant v(VERSION);
  103. if (checkNoExistAdd(VERSION, v))
  104. {
  105. //如果存在,而且版本是最新,不需要走后面自动检查流程了
  106. int curVersion = s_nddSet->value(VERSION).toInt();
  107. if (curVersion == version_num)
  108. {
  109. break;
  110. }
  111. else if (curVersion < version_num)
  112. {
  113. //更新版本到最新
  114. updataKeyValueFromNumSets(VERSION, version_num);
  115. }
  116. }
  117. }
  118. //每次新加字段后,这里要检查一下,不存在则新增
  119. {
  120. QVariant v(1);
  121. checkNoExistAdd(SKIN_KEY, v);
  122. }
  123. {
  124. QVariant langs(0);
  125. checkNoExistAdd(LANGS_KEY, langs);
  126. }
  127. {
  128. QVariant v(0);
  129. checkNoExistAdd(AUTOWARP_KEY, v);
  130. }
  131. {
  132. QVariant v(0);
  133. checkNoExistAdd(INDENT_KEY, v);
  134. }
  135. {
  136. QVariant v(0);
  137. checkNoExistAdd(SHOWSPACE_KEY, v);
  138. }
  139. {
  140. QVariant v(100);
  141. checkNoExistAdd(MAX_BIG_TEXT, v);
  142. }
  143. {
  144. QVariant v(0);
  145. checkNoExistAdd(SOFT_STATUS, v);
  146. }
  147. {
  148. QVariant v("0");
  149. checkNoExistAdd(SOFT_KEY, v);
  150. }
  151. {
  152. QVariant v(1);
  153. checkNoExistAdd(RESTORE_CLOSE_FILE, v);
  154. }
  155. {
  156. QVariant v(1);
  157. checkNoExistAdd(ICON_SIZE, v);
  158. }
  159. {
  160. QVariant v(100);
  161. checkNoExistAdd(ZOOMVALUE, v);
  162. }
  163. {
  164. QVariant v(Qt::BottomDockWidgetArea);
  165. checkNoExistAdd(FINDRESULTPOS, v);
  166. }
  167. {
  168. QVariant v(Qt::LeftDockWidgetArea);
  169. checkNoExistAdd(FILELISTPOS, v);
  170. }
  171. {
  172. QVariant v(0);
  173. checkNoExistAdd(FILELISTSHOW, v);
  174. }
  175. {
  176. QVariant v(1);
  177. checkNoExistAdd(TOOLBARSHOW, v);
  178. }
  179. {
  180. QVariant v(0);
  181. checkNoExistAdd(SHOWWEBADDR, v);
  182. }
  183. {
  184. QVariant v(14);
  185. checkNoExistAdd(FIND_RESULT_FONT_SIZE, v);
  186. }
  187. {
  188. QVariant v(0);
  189. checkNoExistAdd(LAST_ACTION_TAB_INDEX, v);
  190. }
  191. } while (false);
  192. }
  193. s_isExistDb = initOk;
  194. }
  195. //写一个总的获取配置的接口,避免以后每个字段都需要写一个读写接口
  196. QString NddSetting::getKeyValueFromSets(QString key)
  197. {
  198. return s_nddSet->value(key,"").toString();
  199. }
  200. bool NddSetting::updataKeyValueFromSets(QString key, QString value)
  201. {
  202. s_nddSet->setValue(key,value);
  203. s_isContentChanged = true;
  204. return true;
  205. }
  206. //写一个总的获取配置的接口,避免以后每个字段都需要写一个读写接口
  207. QByteArray NddSetting::getKeyByteArrayValue(QString key)
  208. {
  209. return s_nddSet->value(key, "").toByteArray();
  210. }
  211. void NddSetting::updataKeyByteArrayValue(QString key, QByteArray& value)
  212. {
  213. s_nddSet->setValue(key, QVariant(value));
  214. s_isContentChanged = true;
  215. }
  216. //第一次加一条记录,用于初始化
  217. void NddSetting::addKeyValueToSets(QString key, QString value)
  218. {
  219. s_nddSet->setValue(key, QVariant(value));
  220. }
  221. //写一个总的获取配置的接口,避免以后每个字段都需要写一个读写接口.0做默认值,外部最好不用0做初始化值
  222. int NddSetting::getKeyValueFromNumSets(const QString key)
  223. {
  224. QVariant v = s_nddSet->value(key, QVariant(0));
  225. return v.toInt();
  226. }
  227. bool NddSetting::updataKeyValueFromNumSets(const QString key, int value)
  228. {
  229. s_nddSet->setValue(key, QVariant(value));
  230. return true;
  231. }
  232. //第一次加一条记录,用于初始化
  233. void NddSetting::addKeyValueToNumSets(QString key, int value)
  234. {
  235. s_nddSet->setValue(key, QVariant(value));
  236. }
  237. void NddSetting::close()
  238. {
  239. if (s_reference > 0)
  240. {
  241. --s_reference;
  242. if (s_reference == 0)
  243. {
  244. s_isExistDb = false;
  245. //做一次真正的保存
  246. if (s_isContentChanged)
  247. {
  248. s_nddSet->sync();
  249. delete s_nddSet;
  250. s_nddSet = nullptr;
  251. s_isContentChanged = false;
  252. }
  253. //在这里保存一下子窗口的位置。不排除有可能子窗口还在,主窗口已经退出的情况,不过问题不大。
  254. if (s_nddDelaySet != nullptr)
  255. {
  256. s_nddDelaySet->sync();
  257. s_nddDelaySet = nullptr;
  258. }
  259. }
  260. }
  261. }
  262. //子窗口的位置,单独放在一个winpos.ini文件中,而且启动程序时,不需要读取,可避免启动时拖慢速度
  263. QByteArray NddSetting::getWinPos(QString key)
  264. {
  265. nddDelaySetInit();
  266. return s_nddDelaySet->value(key, "").toByteArray();
  267. }
  268. void NddSetting::updataWinPos(QString key, QByteArray& value)
  269. {
  270. nddDelaySetInit();
  271. s_nddDelaySet->setValue(key, QVariant(value));
  272. }
  273. void NddSetting::nddDelaySetInit()
  274. {
  275. if (s_nddDelaySet == nullptr)
  276. {
  277. QString settingDir = QString("notepad/delayset");
  278. QSettings qs(QSettings::IniFormat, QSettings::UserScope, settingDir);
  279. QString qsSetPath = qs.fileName();
  280. s_nddDelaySet = new QSettings(QSettings::IniFormat, QSettings::UserScope, settingDir);
  281. s_nddDelaySet->setIniCodec("UTF-8");
  282. }
  283. }
  284. //写一个总的获取配置的接口,避免以后每个字段都需要写一个读写接口
  285. QString NddSetting::getKeyValueFromDelaySets(QString key)
  286. {
  287. nddDelaySetInit();
  288. return s_nddDelaySet->value(key, "").toString();
  289. }
  290. bool NddSetting::updataKeyValueFromDelaySets(QString key, QString value)
  291. {
  292. nddDelaySetInit();
  293. s_nddDelaySet->setValue(key, value);
  294. s_isContentChanged = true;
  295. return true;
  296. }
  297. //写一个总的获取配置的接口,避免以后每个字段都需要写一个读写接口
  298. int NddSetting::getKeyValueFromDelayNumSets(QString key)
  299. {
  300. nddDelaySetInit();
  301. return s_nddDelaySet->value(key, "").toInt();
  302. }
  303. bool NddSetting::updataKeyValueFromDelayNumSets(QString key, int value)
  304. {
  305. nddDelaySetInit();
  306. s_nddDelaySet->setValue(key, value);
  307. s_isContentChanged = true;
  308. return true;
  309. }