diff --git a/libs/vtextedit b/libs/vtextedit index ac58baf5..77cf6684 160000 --- a/libs/vtextedit +++ b/libs/vtextedit @@ -1 +1 @@ -Subproject commit ac58baf5f07643f57a2a208629b7056c24516ffc +Subproject commit 77cf66845ac2dee3e49cee440f5a6b40b777e8bd diff --git a/src/core/editorconfig.cpp b/src/core/editorconfig.cpp index 59df7b30..37672e39 100644 --- a/src/core/editorconfig.cpp +++ b/src/core/editorconfig.cpp @@ -6,6 +6,8 @@ #include "texteditorconfig.h" #include "markdowneditorconfig.h" +#include + using namespace vnotex; #define READINT(key) readInt(appObj, userObj, (key)) @@ -58,6 +60,9 @@ void EditorConfig::init(const QJsonObject &p_app, loadImageHost(appObj, userObj); + m_viConfig = QSharedPointer::create(); + m_viConfig->fromJson(read(appObj, userObj, QStringLiteral("vi")).toObject()); + m_textEditorConfig->init(appObj, userObj); m_markdownEditorConfig->init(appObj, userObj); } @@ -139,6 +144,7 @@ QJsonObject EditorConfig::toJson() const obj[m_markdownEditorConfig->getSessionName()] = m_markdownEditorConfig->toJson(); obj[QStringLiteral("core")] = saveCore(); obj[QStringLiteral("image_host")] = saveImageHost(); + obj[QStringLiteral("vi")] = m_viConfig->toJson(); return obj; } @@ -304,3 +310,8 @@ void EditorConfig::setClearObsoleteImageAtImageHostEnabled(bool p_enabled) { updateConfig(m_clearObsoleteImageAtImageHost, p_enabled, this); } + +const QSharedPointer &EditorConfig::getViConfig() const +{ + return m_viConfig; +} diff --git a/src/core/editorconfig.h b/src/core/editorconfig.h index bce830c2..04659a44 100644 --- a/src/core/editorconfig.h +++ b/src/core/editorconfig.h @@ -8,6 +8,11 @@ #include #include +namespace vte +{ + class ViConfig; +} + namespace vnotex { class TextEditorConfig; @@ -120,6 +125,8 @@ namespace vnotex bool isClearObsoleteImageAtImageHostEnabled() const; void setClearObsoleteImageAtImageHostEnabled(bool p_enabled); + const QSharedPointer &getViConfig() const; + private: friend class MainConfig; @@ -165,6 +172,8 @@ namespace vnotex QString m_defaultImageHost; bool m_clearObsoleteImageAtImageHost = false; + + QSharedPointer m_viConfig; }; } diff --git a/src/data/core/core.qrc b/src/data/core/core.qrc index 066a15af..74756f66 100644 --- a/src/data/core/core.qrc +++ b/src/data/core/core.qrc @@ -36,8 +36,6 @@ icons/manage_notebooks.svg icons/up_parent_node.svg icons/properties.svg - icons/remove_notebook.svg - icons/close_notebook.svg icons/recycle_bin.svg icons/search_location_list.svg icons/save_editor.svg diff --git a/src/data/core/icons/clear.svg b/src/data/core/icons/clear.svg index 8ef1d82f..382a85ce 100644 --- a/src/data/core/icons/clear.svg +++ b/src/data/core/icons/clear.svg @@ -1 +1,10 @@ - \ No newline at end of file + + + + + + diff --git a/src/data/core/icons/remove_notebook.svg b/src/data/core/icons/remove_notebook.svg deleted file mode 100644 index 382a85ce..00000000 --- a/src/data/core/icons/remove_notebook.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - diff --git a/src/data/core/vnotex.json b/src/data/core/vnotex.json index f18b578f..2187420f 100644 --- a/src/data/core/vnotex.json +++ b/src/data/core/vnotex.json @@ -344,6 +344,9 @@ ], "default_image_host" : "", "clear_obsolete_image" : false + }, + "vi" : { + "control_c_to_copy" : false } }, "widget" : { diff --git a/src/widgets/dialogs/settings/settingsdialog.cpp b/src/widgets/dialogs/settings/settingsdialog.cpp index a091dbe8..50003566 100644 --- a/src/widgets/dialogs/settings/settingsdialog.cpp +++ b/src/widgets/dialogs/settings/settingsdialog.cpp @@ -18,6 +18,7 @@ #include "quickaccesspage.h" #include "themepage.h" #include "imagehostpage.h" +#include "vipage.h" using namespace vnotex; @@ -118,6 +119,12 @@ void SettingsDialog::setupPages() addSubPage(subPage, item); } + // Vi. + { + auto subPage = new ViPage(this); + addSubPage(subPage, item); + } + // Text Editor. { auto subPage = new TextEditorPage(this); diff --git a/src/widgets/dialogs/settings/vipage.cpp b/src/widgets/dialogs/settings/vipage.cpp new file mode 100644 index 00000000..aec61ecb --- /dev/null +++ b/src/widgets/dialogs/settings/vipage.cpp @@ -0,0 +1,62 @@ +#include "vipage.h" + +#include +#include + +#include + +#include +#include +#include +#include + +#include "editorpage.h" + +using namespace vnotex; + +ViPage::ViPage(QWidget *p_parent) + : SettingsPage(p_parent) +{ + setupUI(); +} + +void ViPage::setupUI() +{ + auto mainLayout = WidgetsFactory::createFormLayout(this); + + { + const QString label(tr("Control-C to copy")); + m_controlCToCopyCheckBox = WidgetsFactory::createCheckBox(label, this); + m_controlCToCopyCheckBox->setToolTip(tr("Use Control-C to copy text")); + mainLayout->addRow(m_controlCToCopyCheckBox); + addSearchItem(label, m_controlCToCopyCheckBox->toolTip(), m_controlCToCopyCheckBox); + connect(m_controlCToCopyCheckBox, &QCheckBox::stateChanged, + this, &ViPage::pageIsChanged); + } +} + +void ViPage::loadInternal() +{ + const auto &viConfig = ConfigMgr::getInst().getEditorConfig().getViConfig(); + + m_controlCToCopyCheckBox->setChecked(viConfig->m_controlCToCopy); +} + +bool ViPage::saveInternal() +{ + auto &editorConfig = ConfigMgr::getInst().getEditorConfig(); + auto &viConfig = editorConfig.getViConfig(); + + viConfig->m_controlCToCopy = m_controlCToCopyCheckBox->isChecked(); + + editorConfig.update(); + + EditorPage::notifyEditorConfigChange(); + + return true; +} + +QString ViPage::title() const +{ + return tr("Vi Input Mode"); +} diff --git a/src/widgets/dialogs/settings/vipage.h b/src/widgets/dialogs/settings/vipage.h new file mode 100644 index 00000000..a7531676 --- /dev/null +++ b/src/widgets/dialogs/settings/vipage.h @@ -0,0 +1,30 @@ +#ifndef VIPAGE_H +#define VIPAGE_H + +#include "settingspage.h" + +class QCheckBox; + +namespace vnotex +{ + class ViPage : public SettingsPage + { + Q_OBJECT + public: + explicit ViPage(QWidget *p_parent = nullptr); + + QString title() const Q_DECL_OVERRIDE; + + protected: + void loadInternal() Q_DECL_OVERRIDE; + + bool saveInternal() Q_DECL_OVERRIDE; + + private: + void setupUI(); + + QCheckBox *m_controlCToCopyCheckBox = nullptr; + }; +} + +#endif // VIPAGE_H diff --git a/src/widgets/markdownviewwindow.cpp b/src/widgets/markdownviewwindow.cpp index 65e746f5..56411b4f 100644 --- a/src/widgets/markdownviewwindow.cpp +++ b/src/widgets/markdownviewwindow.cpp @@ -181,15 +181,13 @@ void MarkdownViewWindow::handleEditorConfigChange() const auto &editorConfig = ConfigMgr::getInst().getEditorConfig(); const auto &markdownEditorConfig = editorConfig.getMarkdownEditorConfig(); - if (markdownEditorConfig.revision() != m_markdownEditorConfigRevision) { - m_markdownEditorConfigRevision = markdownEditorConfig.revision(); - + if (updateConfigRevision()) { updatePreviewHelperFromConfig(markdownEditorConfig); HtmlTemplateHelper::updateMarkdownViewerTemplate(markdownEditorConfig); if (m_editor) { - auto config = createMarkdownEditorConfig(markdownEditorConfig); + auto config = createMarkdownEditorConfig(editorConfig, markdownEditorConfig); m_editor->setConfig(config); m_editor->updateFromConfig(); @@ -316,11 +314,10 @@ void MarkdownViewWindow::setupTextEditor() const auto &editorConfig = ConfigMgr::getInst().getEditorConfig(); const auto &markdownEditorConfig = editorConfig.getMarkdownEditorConfig(); - m_editorConfigRevision = editorConfig.revision(); - m_markdownEditorConfigRevision = markdownEditorConfig.revision(); + updateConfigRevision(); m_editor = new MarkdownEditor(markdownEditorConfig, - createMarkdownEditorConfig(markdownEditorConfig), + createMarkdownEditorConfig(editorConfig, markdownEditorConfig), createMarkdownEditorParameters(editorConfig, markdownEditorConfig), this); m_splitter->insertWidget(0, m_editor); @@ -405,8 +402,7 @@ void MarkdownViewWindow::setupViewer() const auto &editorConfig = ConfigMgr::getInst().getEditorConfig(); const auto &markdownEditorConfig = editorConfig.getMarkdownEditorConfig(); - m_editorConfigRevision = editorConfig.revision(); - m_markdownEditorConfigRevision = markdownEditorConfig.revision(); + updateConfigRevision(); HtmlTemplateHelper::updateMarkdownViewerTemplate(markdownEditorConfig); @@ -852,11 +848,12 @@ void MarkdownViewWindow::setupOutlineProvider() }); } -QSharedPointer MarkdownViewWindow::createMarkdownEditorConfig(const MarkdownEditorConfig &p_config) +QSharedPointer MarkdownViewWindow::createMarkdownEditorConfig(const EditorConfig &p_editorConfig, const MarkdownEditorConfig &p_config) { const auto &themeMgr = VNoteX::getInst().getThemeMgr(); auto textEditorConfig = TextViewWindowHelper::createTextEditorConfig(p_config.getTextEditorConfig(), + p_editorConfig.getViConfig(), themeMgr.getFile(Theme::File::MarkdownEditorStyle), themeMgr.getMarkdownEditorHighlightTheme()); @@ -883,7 +880,7 @@ QSharedPointer MarkdownViewWindow::createMarkdownEdit return editorConfig; } -QSharedPointer MarkdownViewWindow::createMarkdownEditorParameters(const EditorConfig& p_editorConfig, const MarkdownEditorConfig &p_config) +QSharedPointer MarkdownViewWindow::createMarkdownEditorParameters(const EditorConfig &p_editorConfig, const MarkdownEditorConfig &p_config) { auto paras = QSharedPointer::create(); paras->m_spellCheckEnabled = p_config.isSpellCheckEnabled(); @@ -1126,3 +1123,27 @@ void MarkdownViewWindow::removeFromImageHost(const QString &p_url) this); } } + +bool MarkdownViewWindow::updateConfigRevision() +{ + bool changed = false; + + const auto &editorConfig = ConfigMgr::getInst().getEditorConfig(); + + if (m_editorConfigRevision != editorConfig.revision()) { + changed = true; + m_editorConfigRevision = editorConfig.revision(); + } + + if (m_textEditorConfigRevision != editorConfig.getTextEditorConfig().revision()) { + changed = true; + m_textEditorConfigRevision = editorConfig.getTextEditorConfig().revision(); + } + + if (m_markdownEditorConfigRevision != editorConfig.getMarkdownEditorConfig().revision()) { + changed = true; + m_markdownEditorConfigRevision = editorConfig.getMarkdownEditorConfig().revision(); + } + + return changed; +} diff --git a/src/widgets/markdownviewwindow.h b/src/widgets/markdownviewwindow.h index 0e3c5cd4..37b6486a 100644 --- a/src/widgets/markdownviewwindow.h +++ b/src/widgets/markdownviewwindow.h @@ -152,12 +152,14 @@ namespace vnotex void removeFromImageHost(const QString &p_url); + bool updateConfigRevision(); + template static QSharedPointer headingsToOutline(const QVector &p_headings); - static QSharedPointer createMarkdownEditorConfig(const MarkdownEditorConfig &p_config); + static QSharedPointer createMarkdownEditorConfig(const EditorConfig &p_editorConfig, const MarkdownEditorConfig &p_config); - static QSharedPointer createMarkdownEditorParameters(const EditorConfig& p_editorConfig, const MarkdownEditorConfig &p_config); + static QSharedPointer createMarkdownEditorParameters(const EditorConfig &p_editorConfig, const MarkdownEditorConfig &p_config); // Splitter to hold editor and viewer. QSplitter *m_splitter = nullptr; @@ -184,6 +186,8 @@ namespace vnotex int m_viewerBufferRevision = 0; + int m_textEditorConfigRevision = 0; + int m_markdownEditorConfigRevision = 0; ViewWindowMode m_previousMode = ViewWindowMode::Invalid; diff --git a/src/widgets/textviewwindow.cpp b/src/widgets/textviewwindow.cpp index 76902e8b..13543d24 100644 --- a/src/widgets/textviewwindow.cpp +++ b/src/widgets/textviewwindow.cpp @@ -30,12 +30,11 @@ void TextViewWindow::setupUI() const auto &editorConfig = ConfigMgr::getInst().getEditorConfig(); const auto &textEditorConfig = editorConfig.getTextEditorConfig(); - m_editorConfigRevision = editorConfig.revision(); - m_textEditorConfigRevision = textEditorConfig.revision(); + updateConfigRevision(); // Central widget. { - m_editor = new TextEditor(createTextEditorConfig(textEditorConfig), + m_editor = new TextEditor(createTextEditorConfig(editorConfig, textEditorConfig), createTextEditorParameters(editorConfig, textEditorConfig), this); setCentralWidget(m_editor); @@ -133,15 +132,33 @@ void TextViewWindow::handleEditorConfigChange() const auto &editorConfig = ConfigMgr::getInst().getEditorConfig(); const auto &textEditorConfig = editorConfig.getTextEditorConfig(); - if (m_textEditorConfigRevision != textEditorConfig.revision()) { - m_textEditorConfigRevision = textEditorConfig.revision(); - auto config = createTextEditorConfig(textEditorConfig); + if (updateConfigRevision()) { + auto config = createTextEditorConfig(editorConfig, textEditorConfig); m_editor->setConfig(config); updateEditorFromConfig(); } } +bool TextViewWindow::updateConfigRevision() +{ + bool changed = false; + + const auto &editorConfig = ConfigMgr::getInst().getEditorConfig(); + + if (m_editorConfigRevision != editorConfig.revision()) { + changed = true; + m_editorConfigRevision = editorConfig.revision(); + } + + if (m_textEditorConfigRevision != editorConfig.getTextEditorConfig().revision()) { + changed = true; + m_textEditorConfigRevision = editorConfig.getTextEditorConfig().revision(); + } + + return changed; +} + void TextViewWindow::setBufferRevisionAfterInvalidation(int p_bufferRevision) { m_bufferRevision = p_bufferRevision; @@ -153,16 +170,17 @@ void TextViewWindow::setMode(ViewWindowMode p_mode) Q_ASSERT(false); } -QSharedPointer TextViewWindow::createTextEditorConfig(const TextEditorConfig &p_config) +QSharedPointer TextViewWindow::createTextEditorConfig(const EditorConfig &p_editorConfig, const TextEditorConfig &p_config) { const auto &themeMgr = VNoteX::getInst().getThemeMgr(); auto config = TextViewWindowHelper::createTextEditorConfig(p_config, + p_editorConfig.getViConfig(), themeMgr.getFile(Theme::File::TextEditorStyle), themeMgr.getEditorHighlightTheme()); return config; } -QSharedPointer TextViewWindow::createTextEditorParameters(const EditorConfig& p_editorConfig, const TextEditorConfig &p_config) +QSharedPointer TextViewWindow::createTextEditorParameters(const EditorConfig &p_editorConfig, const TextEditorConfig &p_config) { auto paras = QSharedPointer::create(); paras->m_spellCheckEnabled = p_config.isSpellCheckEnabled(); diff --git a/src/widgets/textviewwindow.h b/src/widgets/textviewwindow.h index 1af81465..4c597704 100644 --- a/src/widgets/textviewwindow.h +++ b/src/widgets/textviewwindow.h @@ -80,9 +80,11 @@ namespace vnotex void handleFileOpenParameters(const QSharedPointer &p_paras); - static QSharedPointer createTextEditorConfig(const TextEditorConfig &p_config); + bool updateConfigRevision(); - static QSharedPointer createTextEditorParameters(const EditorConfig& p_editorConfig, const TextEditorConfig &p_config); + static QSharedPointer createTextEditorConfig(const EditorConfig &p_editorConfig, const TextEditorConfig &p_config); + + static QSharedPointer createTextEditorParameters(const EditorConfig &p_editorConfig, const TextEditorConfig &p_config); // Managed by QObject. TextEditor *m_editor = nullptr; diff --git a/src/widgets/textviewwindowhelper.h b/src/widgets/textviewwindowhelper.h index dd21b403..cc3d9c58 100644 --- a/src/widgets/textviewwindowhelper.h +++ b/src/widgets/textviewwindowhelper.h @@ -14,6 +14,11 @@ #include "quickselector.h" +namespace vte +{ + class ViConfig; +} + namespace vnotex { class TextEditorConfig; @@ -57,11 +62,14 @@ namespace vnotex } static QSharedPointer createTextEditorConfig(const TextEditorConfig &p_config, + const QSharedPointer &p_viConfig, const QString &p_themeFile, const QString &p_syntaxTheme) { auto editorConfig = QSharedPointer::create(); + editorConfig->m_viConfig = p_viConfig; + if (!p_themeFile.isEmpty()) { editorConfig->m_theme = vte::Theme::createThemeFromFile(p_themeFile); } diff --git a/src/widgets/widgets.pri b/src/widgets/widgets.pri index d9549624..6b721084 100644 --- a/src/widgets/widgets.pri +++ b/src/widgets/widgets.pri @@ -28,6 +28,7 @@ SOURCES += \ $$PWD/dialogs/settings/settingsdialog.cpp \ $$PWD/dialogs/settings/texteditorpage.cpp \ $$PWD/dialogs/settings/themepage.cpp \ + $$PWD/dialogs/settings/vipage.cpp \ $$PWD/dialogs/snippetinfowidget.cpp \ $$PWD/dialogs/snippetpropertiesdialog.cpp \ $$PWD/dialogs/sortdialog.cpp \ @@ -140,6 +141,7 @@ HEADERS += \ $$PWD/dialogs/settings/settingsdialog.h \ $$PWD/dialogs/settings/texteditorpage.h \ $$PWD/dialogs/settings/themepage.h \ + $$PWD/dialogs/settings/vipage.h \ $$PWD/dialogs/snippetinfowidget.h \ $$PWD/dialogs/snippetpropertiesdialog.h \ $$PWD/dialogs/sortdialog.h \