editorpage.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #include "editorpage.h"
  2. #include <QComboBox>
  3. #include <QFormLayout>
  4. #include <QTimer>
  5. #include <QSpinBox>
  6. #include <QHBoxLayout>
  7. #include <QPushButton>
  8. #include <QUrl>
  9. #include <widgets/widgetsfactory.h>
  10. #include <core/editorconfig.h>
  11. #include <core/configmgr.h>
  12. #include <utils/widgetutils.h>
  13. #include <vtextedit/spellchecker.h>
  14. #include <widgets/messageboxhelper.h>
  15. using namespace vnotex;
  16. EditorPage::EditorPage(QWidget *p_parent)
  17. : SettingsPage(p_parent)
  18. {
  19. setupUI();
  20. }
  21. void EditorPage::setupUI()
  22. {
  23. auto mainLayout = WidgetsFactory::createFormLayout(this);
  24. {
  25. m_autoSavePolicyComboBox = WidgetsFactory::createComboBox(this);
  26. m_autoSavePolicyComboBox->setToolTip(tr("Auto save policy"));
  27. m_autoSavePolicyComboBox->addItem(tr("None"), (int)EditorConfig::AutoSavePolicy::None);
  28. m_autoSavePolicyComboBox->addItem(tr("Auto Save"), (int)EditorConfig::AutoSavePolicy::AutoSave);
  29. m_autoSavePolicyComboBox->addItem(tr("Backup File"), (int)EditorConfig::AutoSavePolicy::BackupFile);
  30. const QString label(tr("Auto save policy:"));
  31. mainLayout->addRow(label, m_autoSavePolicyComboBox);
  32. addSearchItem(label, m_autoSavePolicyComboBox->toolTip(), m_autoSavePolicyComboBox);
  33. connect(m_autoSavePolicyComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
  34. this, &EditorPage::pageIsChanged);
  35. }
  36. {
  37. m_lineEndingComboBox = WidgetsFactory::createComboBox(this);
  38. m_lineEndingComboBox->setToolTip(tr("Line ending"));
  39. m_lineEndingComboBox->addItem(tr("Follow Platform"), (int)LineEndingPolicy::Platform);
  40. m_lineEndingComboBox->addItem(tr("Follow File"), (int)LineEndingPolicy::File);
  41. m_lineEndingComboBox->addItem(tr("LF (Linux/macOS)"), (int)LineEndingPolicy::LF);
  42. m_lineEndingComboBox->addItem(tr("CR LF (Windows)"), (int)LineEndingPolicy::CRLF);
  43. m_lineEndingComboBox->addItem(tr("CR"), (int)LineEndingPolicy::CR);
  44. const QString label(tr("Line ending:"));
  45. mainLayout->addRow(label, m_lineEndingComboBox);
  46. addSearchItem(label, m_lineEndingComboBox->toolTip(), m_lineEndingComboBox);
  47. connect(m_lineEndingComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
  48. this, &EditorPage::pageIsChanged);
  49. }
  50. {
  51. m_toolBarIconSizeSpinBox = WidgetsFactory::createSpinBox(this);
  52. m_toolBarIconSizeSpinBox->setToolTip(tr("Icon size of the editor tool bar"));
  53. m_toolBarIconSizeSpinBox->setRange(1, 48);
  54. m_toolBarIconSizeSpinBox->setSingleStep(1);
  55. const QString label(tr("Tool bar icon size:"));
  56. mainLayout->addRow(label, m_toolBarIconSizeSpinBox);
  57. addSearchItem(label, m_toolBarIconSizeSpinBox->toolTip(), m_toolBarIconSizeSpinBox);
  58. connect(m_toolBarIconSizeSpinBox, QOverload<int>::of(&QSpinBox::valueChanged),
  59. this, &EditorPage::pageIsChanged);
  60. }
  61. {
  62. auto lineLayout = new QHBoxLayout();
  63. m_spellCheckDictComboBox = WidgetsFactory::createComboBox(this);
  64. m_spellCheckDictComboBox->setToolTip(tr("Default dictionary used for spell check"));
  65. lineLayout->addWidget(m_spellCheckDictComboBox);
  66. {
  67. auto dicts = vte::SpellChecker::getInst().availableDictionaries();
  68. for (auto it = dicts.constBegin(); it != dicts.constEnd(); ++it) {
  69. m_spellCheckDictComboBox->addItem(it.key(), it.value());
  70. }
  71. }
  72. auto addBtn = new QPushButton(tr("Add Dictionary"), this);
  73. connect(addBtn, &QPushButton::clicked,
  74. this, [this]() {
  75. const auto dictsFolder = ConfigMgr::getInst().getUserDictsFolder();
  76. MessageBoxHelper::notify(
  77. MessageBoxHelper::Information,
  78. tr("VNote uses [Hunspell](http://hunspell.github.io/) for spell check."),
  79. tr("Please download Hunspell's dictionaries, put them under (%1) and restart VNote.").arg(dictsFolder),
  80. QString(),
  81. this);
  82. WidgetUtils::openUrlByDesktop(QUrl::fromLocalFile(dictsFolder));
  83. });
  84. lineLayout->addWidget(addBtn);
  85. lineLayout->addStretch();
  86. const QString label(tr("Spell check dictionary:"));
  87. mainLayout->addRow(label, lineLayout);
  88. addSearchItem(label, m_spellCheckDictComboBox->toolTip(), m_spellCheckDictComboBox);
  89. connect(m_spellCheckDictComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
  90. this, &EditorPage::pageIsChanged);
  91. }
  92. }
  93. void EditorPage::loadInternal()
  94. {
  95. const auto &editorConfig = ConfigMgr::getInst().getEditorConfig();
  96. {
  97. int idx = m_autoSavePolicyComboBox->findData(static_cast<int>(editorConfig.getAutoSavePolicy()));
  98. Q_ASSERT(idx != -1);
  99. m_autoSavePolicyComboBox->setCurrentIndex(idx);
  100. }
  101. {
  102. int idx = m_lineEndingComboBox->findData(static_cast<int>(editorConfig.getLineEndingPolicy()));
  103. Q_ASSERT(idx != -1);
  104. m_lineEndingComboBox->setCurrentIndex(idx);
  105. }
  106. m_toolBarIconSizeSpinBox->setValue(editorConfig.getToolBarIconSize());
  107. {
  108. int idx = m_spellCheckDictComboBox->findData(editorConfig.getSpellCheckDefaultDictionary());
  109. m_spellCheckDictComboBox->setCurrentIndex(idx == -1 ? 0 : idx);
  110. }
  111. }
  112. bool EditorPage::saveInternal()
  113. {
  114. auto &editorConfig = ConfigMgr::getInst().getEditorConfig();
  115. {
  116. auto policy = m_autoSavePolicyComboBox->currentData().toInt();
  117. editorConfig.setAutoSavePolicy(static_cast<EditorConfig::AutoSavePolicy>(policy));
  118. }
  119. {
  120. auto ending = m_lineEndingComboBox->currentData().toInt();
  121. editorConfig.setLineEndingPolicy(static_cast<LineEndingPolicy>(ending));
  122. }
  123. editorConfig.setToolBarIconSize(m_toolBarIconSizeSpinBox->value());
  124. {
  125. editorConfig.setSpellCheckDefaultDictionary(m_spellCheckDictComboBox->currentData().toString());
  126. }
  127. notifyEditorConfigChange();
  128. return true;
  129. }
  130. QString EditorPage::title() const
  131. {
  132. return tr("Editor");
  133. }
  134. void EditorPage::notifyEditorConfigChange()
  135. {
  136. static QTimer *timer = nullptr;
  137. if (!timer) {
  138. timer = new QTimer();
  139. timer->setSingleShot(true);
  140. timer->setInterval(1000);
  141. auto& configMgr = ConfigMgr::getInst();
  142. connect(timer, &QTimer::timeout,
  143. &configMgr, &ConfigMgr::editorConfigChanged);
  144. }
  145. timer->start();
  146. }