diff --git a/libs/vtextedit b/libs/vtextedit index 00b52913..58ad5d96 160000 --- a/libs/vtextedit +++ b/libs/vtextedit @@ -1 +1 @@ -Subproject commit 00b52913fe8f4ccf5ed5a0cbd3493b94fe354b25 +Subproject commit 58ad5d96359e2ab3f8f9255bd9194a0ebf1e6798 diff --git a/src/core/coreconfig.h b/src/core/coreconfig.h index 46977f45..4ec556de 100644 --- a/src/core/coreconfig.h +++ b/src/core/coreconfig.h @@ -143,7 +143,7 @@ namespace vnotex int m_historyMaxCount = 100; // Whether store history in each notebook. - bool m_perNotebookHistoryEnabled = true; + bool m_perNotebookHistoryEnabled = false; static QStringList s_availableLocales; }; diff --git a/src/core/global.h b/src/core/global.h index 74cc2b7d..50888941 100644 --- a/src/core/global.h +++ b/src/core/global.h @@ -94,8 +94,6 @@ namespace vnotex { Read, Edit, - FullPreview, - FocusPreview, Invalid }; diff --git a/src/core/mainconfig.cpp b/src/core/mainconfig.cpp index bc13a770..93f94a5a 100644 --- a/src/core/mainconfig.cpp +++ b/src/core/mainconfig.cpp @@ -118,4 +118,5 @@ QString MainConfig::getVersion(const QJsonObject &p_jobj) void MainConfig::doVersionSpecificOverride() { // In a new version, we may want to change one value by force. + m_coreConfig->m_perNotebookHistoryEnabled = false; } diff --git a/src/core/markdowneditorconfig.cpp b/src/core/markdowneditorconfig.cpp index b52e4a24..ed11181d 100644 --- a/src/core/markdowneditorconfig.cpp +++ b/src/core/markdowneditorconfig.cpp @@ -73,6 +73,8 @@ void MarkdownEditorConfig::init(const QJsonObject &p_app, const QJsonObject &p_u m_inplacePreviewSources |= stringToInplacePreviewSource(src); } } + + m_editViewMode = stringToEditViewMode(READSTR(QStringLiteral("edit_view_mode"))); } QJsonObject MarkdownEditorConfig::toJson() const @@ -122,6 +124,8 @@ QJsonObject MarkdownEditorConfig::toJson() const obj[QStringLiteral("inplace_preview_sources")] = srcs.join(QLatin1Char(';')); } + obj[QStringLiteral("edit_view_mode")] = editViewModeToString(m_editViewMode); + return obj; } @@ -519,3 +523,34 @@ void MarkdownEditorConfig::setInplacePreviewSources(InplacePreviewSources p_src) { updateConfig(m_inplacePreviewSources, p_src, this); } + +QString MarkdownEditorConfig::editViewModeToString(EditViewMode p_mode) const +{ + switch (p_mode) { + case EditViewMode::EditPreview: + return QStringLiteral("editpreview"); + + default: + return QStringLiteral("editonly"); + } +} + +MarkdownEditorConfig::EditViewMode MarkdownEditorConfig::stringToEditViewMode(const QString &p_str) const +{ + auto mode = p_str.toLower(); + if (mode == QStringLiteral("editpreview")) { + return EditViewMode::EditPreview; + } else { + return EditViewMode::EditOnly; + } +} + +MarkdownEditorConfig::EditViewMode MarkdownEditorConfig::getEditViewMode() const +{ + return m_editViewMode; +} + +void MarkdownEditorConfig::setEditViewMode(EditViewMode p_mode) +{ + updateConfig(m_editViewMode, p_mode, this); +} diff --git a/src/core/markdowneditorconfig.h b/src/core/markdowneditorconfig.h index 025fc19f..84ca9c7a 100644 --- a/src/core/markdowneditorconfig.h +++ b/src/core/markdowneditorconfig.h @@ -39,6 +39,12 @@ namespace vnotex }; Q_DECLARE_FLAGS(InplacePreviewSources, InplacePreviewSource); + enum EditViewMode + { + EditOnly, + EditPreview + }; + MarkdownEditorConfig(ConfigMgr *p_mgr, IConfig *p_topConfig, const QSharedPointer &p_textEditorConfig); @@ -130,6 +136,9 @@ namespace vnotex InplacePreviewSources getInplacePreviewSources() const; void setInplacePreviewSources(InplacePreviewSources p_src); + EditViewMode getEditViewMode() const; + void setEditViewMode(EditViewMode p_mode); + private: friend class MainConfig; @@ -148,6 +157,9 @@ namespace vnotex QString inplacePreviewSourceToString(InplacePreviewSource p_src) const; InplacePreviewSource stringToInplacePreviewSource(const QString &p_str) const; + QString editViewModeToString(EditViewMode p_mode) const; + EditViewMode stringToEditViewMode(const QString &p_str) const; + QSharedPointer m_textEditorConfig; WebResource m_viewerResource; @@ -227,6 +239,9 @@ namespace vnotex QString m_editorOverriddenFontFamily; InplacePreviewSources m_inplacePreviewSources = InplacePreviewSource::NoInplacePreview; + + // View mode in edit mode. + EditViewMode m_editViewMode = EditViewMode::EditOnly; }; } diff --git a/src/core/notebookconfigmgr/vxnotebookconfigmgr.cpp b/src/core/notebookconfigmgr/vxnotebookconfigmgr.cpp index 30bb9c16..c94f1687 100644 --- a/src/core/notebookconfigmgr/vxnotebookconfigmgr.cpp +++ b/src/core/notebookconfigmgr/vxnotebookconfigmgr.cpp @@ -826,7 +826,9 @@ bool VXNotebookConfigMgr::isBuiltInFolder(const Node *p_node, const QString &p_n if (name == nb->getImageFolder().toLower() || name == nb->getAttachmentFolder().toLower() || name == QStringLiteral("_v_images") - || name == QStringLiteral("_v_attachments")) { + || name == QStringLiteral("_v_attachments") + || name == QStringLiteral("vx_images") + || name == QStringLiteral("vx_attachments")) { return true; } return BundleNotebookConfigMgr::isBuiltInFolder(p_node, p_name); diff --git a/src/data/core/core.qrc b/src/data/core/core.qrc index 17dcb9bf..2bfdf372 100644 --- a/src/data/core/core.qrc +++ b/src/data/core/core.qrc @@ -13,6 +13,7 @@ icons/discard_editor.svg icons/edit_editor.svg icons/read_editor.svg + icons/view_mode_editor.svg icons/expand.svg icons/fullscreen.svg icons/tag_dock.svg diff --git a/src/data/core/icons/view_mode_editor.svg b/src/data/core/icons/view_mode_editor.svg new file mode 100644 index 00000000..f2cc25ab --- /dev/null +++ b/src/data/core/icons/view_mode_editor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/data/core/translations/vnote_zh_CN.ts b/src/data/core/translations/vnote_zh_CN.ts index 3a751098..a7453dee 100644 --- a/src/data/core/translations/vnote_zh_CN.ts +++ b/src/data/core/translations/vnote_zh_CN.ts @@ -4821,7 +4821,7 @@ Description: %3 Normal - 正常 + 普通 diff --git a/src/data/core/vnotex.json b/src/data/core/vnotex.json index 87322ba9..6c1637bc 100644 --- a/src/data/core/vnotex.json +++ b/src/data/core/vnotex.json @@ -76,7 +76,7 @@ "check_for_updates_on_start" : true, "//comment" : "Max count of the history items for each notebook and session config", "history_max_count" : 100, - "per_notebook_history" : true + "per_notebook_history" : false }, "editor" : { "core": { @@ -357,7 +357,9 @@ "editor_overridden_font_family" : "", "//comment" : "Sources to enable inplace preview, separated by ;", "//comment" : "imagelink/codeblock/math", - "inplace_preview_sources" : "imagelink;codeblock;math" + "inplace_preview_sources" : "imagelink;codeblock;math", + "//comment" : "view mode of edit mode: editonly/editpreview", + "edit_view_mode" : "editonly" }, "image_host" : { "hosts" : [ diff --git a/src/utils/widgetutils.cpp b/src/utils/widgetutils.cpp index de1ca843..9ea4a6bb 100644 --- a/src/utils/widgetutils.cpp +++ b/src/utils/widgetutils.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -418,3 +419,42 @@ void WidgetUtils::setContentsMargins(QLayout *p_layout) // Use 0 bottom margin to align dock widgets with the content area. p_layout->setContentsMargins(CONTENTS_MARGIN, CONTENTS_MARGIN, CONTENTS_MARGIN, 0); } + +bool WidgetUtils::distributeWidgetsOfSplitter(QSplitter *p_splitter) +{ + if (!p_splitter) { + return false; + } + + if (p_splitter->count() == 0) { + return false; + } else if (p_splitter->count() == 1) { + return true; + } + + auto sizes = p_splitter->sizes(); + int totalWidth = 0; + for (auto sz : sizes) { + totalWidth += sz; + } + + int newWidth = totalWidth / sizes.size(); + if (newWidth == 0) { + return false; + } + + bool changed = false; + for (int i = 0; i < sizes.size(); ++i) { + if (sizes[i] != newWidth) { + sizes[i] = newWidth; + changed = true; + } + } + + if (changed) { + p_splitter->setSizes(sizes); + return true; + } + + return false; +} diff --git a/src/utils/widgetutils.h b/src/utils/widgetutils.h index 9329e08a..797c141a 100644 --- a/src/utils/widgetutils.h +++ b/src/utils/widgetutils.h @@ -20,6 +20,7 @@ class QShortcut; class QLineEdit; class QLayout; class QPushButton; +class QSplitter; namespace vnotex { @@ -86,6 +87,8 @@ namespace vnotex static void setContentsMargins(QLayout *p_layout); + static bool distributeWidgetsOfSplitter(QSplitter *p_splitter); + private: static void resizeToHideScrollBar(QScrollArea *p_scroll, bool p_vertical, bool p_horizontal); }; diff --git a/src/widgets/dialogs/managenotebooksdialog.cpp b/src/widgets/dialogs/managenotebooksdialog.cpp index 37b10ae2..ad1beb13 100644 --- a/src/widgets/dialogs/managenotebooksdialog.cpp +++ b/src/widgets/dialogs/managenotebooksdialog.cpp @@ -251,10 +251,10 @@ bool ManageNotebooksDialog::saveChangesToNotebook() return true; } -void ManageNotebooksDialog::closeNotebook(const Notebook *p_notebook) +bool ManageNotebooksDialog::closeNotebook(const Notebook *p_notebook) { if (!p_notebook) { - return; + return false; } int ret = MessageBoxHelper::questionOkCancel(MessageBoxHelper::Question, @@ -264,7 +264,7 @@ void ManageNotebooksDialog::closeNotebook(const Notebook *p_notebook) tr("Notebook location: %1").arg(p_notebook->getRootFolderAbsolutePath()), this); if (ret != QMessageBox::Ok) { - return; + return false; } try @@ -274,11 +274,10 @@ void ManageNotebooksDialog::closeNotebook(const Notebook *p_notebook) MessageBoxHelper::notify(MessageBoxHelper::Warning, tr("Failed to close notebook (%1)").arg(p_e.what()), this); - loadNotebooks(nullptr); - return; } loadNotebooks(nullptr); + return true; } void ManageNotebooksDialog::removeNotebook(const Notebook *p_notebook) @@ -298,9 +297,9 @@ void ManageNotebooksDialog::removeNotebook(const Notebook *p_notebook) const auto rootFolder = p_notebook->getRootFolderAbsolutePath(); - closeNotebook(p_notebook); - - WidgetUtils::openUrlByDesktop(QUrl::fromLocalFile(rootFolder)); + if (closeNotebook(p_notebook)) { + WidgetUtils::openUrlByDesktop(QUrl::fromLocalFile(rootFolder)); + } } bool ManageNotebooksDialog::checkUnsavedChanges() diff --git a/src/widgets/dialogs/managenotebooksdialog.h b/src/widgets/dialogs/managenotebooksdialog.h index d3eda054..60b9a7d5 100644 --- a/src/widgets/dialogs/managenotebooksdialog.h +++ b/src/widgets/dialogs/managenotebooksdialog.h @@ -45,7 +45,7 @@ namespace vnotex Notebook *getNotebookFromItem(const QListWidgetItem *p_item) const; - void closeNotebook(const Notebook *p_notebook); + bool closeNotebook(const Notebook *p_notebook); void removeNotebook(const Notebook *p_notebook); diff --git a/src/widgets/editors/markdownvieweradapter.cpp b/src/widgets/editors/markdownvieweradapter.cpp index f17c8fbc..a0855b7d 100644 --- a/src/widgets/editors/markdownvieweradapter.cpp +++ b/src/widgets/editors/markdownvieweradapter.cpp @@ -74,7 +74,7 @@ void MarkdownViewerAdapter::setText(int p_revision, const QString &p_text, int p_lineNumber) { - if (p_revision == m_revision) { + if (p_revision == m_revision && p_revision != 0) { // Only sync line number position. scrollToPosition(Position(p_lineNumber, "")); return; @@ -92,16 +92,9 @@ void MarkdownViewerAdapter::setText(int p_revision, } } -void MarkdownViewerAdapter::setText(const QString &p_text) +void MarkdownViewerAdapter::setText(const QString &p_text, int p_lineNumber) { - m_revision = 0; - if (m_viewerReady) { - emit textUpdated(p_text); - } else { - m_pendingActions.append([this, p_text]() { - emit textUpdated(p_text); - }); - } + setText(0, p_text, p_lineNumber); } void MarkdownViewerAdapter::setReady(bool p_ready) diff --git a/src/widgets/editors/markdownvieweradapter.h b/src/widgets/editors/markdownvieweradapter.h index 23461513..531c8b3e 100644 --- a/src/widgets/editors/markdownvieweradapter.h +++ b/src/widgets/editors/markdownvieweradapter.h @@ -87,7 +87,8 @@ namespace vnotex const QString &p_text, int p_lineNumber); - void setText(const QString &p_text); + // @p_lineNumber: the line number needed to sync, -1 for invalid. + void setText(const QString &p_text, int p_lineNumber = -1); void scrollToPosition(const Position &p_pos); diff --git a/src/widgets/mainwindow.cpp b/src/widgets/mainwindow.cpp index c2d23428..f6f08381 100644 --- a/src/widgets/mainwindow.cpp +++ b/src/widgets/mainwindow.cpp @@ -525,11 +525,10 @@ void MainWindow::focusViewArea() void MainWindow::setupToolBar() { const int sz = ConfigMgr::getInst().getCoreConfig().getToolBarIconSize(); - const QSize iconSize(sz, sz); if (isFrameless()) { auto toolBar = new TitleToolBar(tr("Global"), this); - toolBar->setIconSize(iconSize); + toolBar->setIconSize(QSize(sz + 4, sz + 4)); ToolBarHelper::setupToolBars(this, toolBar); toolBar->addTitleBarIcons(ToolBarHelper::generateIcon(QStringLiteral("minimize.svg")), ToolBarHelper::generateIcon(QStringLiteral("maximize.svg")), @@ -540,7 +539,7 @@ void MainWindow::setupToolBar() toolBar, &TitleToolBar::updateMaximizeAct); } else { auto toolBar = new QToolBar(tr("Global"), this); - toolBar->setIconSize(iconSize); + toolBar->setIconSize(QSize(sz, sz)); ToolBarHelper::setupToolBars(this, toolBar); } diff --git a/src/widgets/markdownviewwindow.cpp b/src/widgets/markdownviewwindow.cpp index fca0eefb..a9287163 100644 --- a/src/widgets/markdownviewwindow.cpp +++ b/src/widgets/markdownviewwindow.cpp @@ -9,15 +9,17 @@ #include #include #include +#include +#include #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -130,7 +132,6 @@ void MarkdownViewWindow::setModeInternal(ViewWindowMode p_mode, bool p_syncBuffe toggleDebug(); } - bool hideViewer = m_viewerReady; if (!m_editor) { // We need viewer to preview. if (!m_viewer) { @@ -139,7 +140,6 @@ void MarkdownViewWindow::setModeInternal(ViewWindowMode p_mode, bool p_syncBuffe // Must show the viewer to let it init with the correct DPI. // Will hide it when viewerReady(). m_viewer->show(); - hideViewer = false; } setupTextEditor(); @@ -153,10 +153,7 @@ void MarkdownViewWindow::setModeInternal(ViewWindowMode p_mode, bool p_syncBuffe m_editor->show(); m_editor->setFocus(); - if (hideViewer) { - Q_ASSERT(m_viewer); - m_viewer->hide(); - } + setEditViewMode(m_editViewMode); getMainStatusWidget()->setCurrentWidget(m_textEditorStatusWidget.get()); break; @@ -167,7 +164,7 @@ void MarkdownViewWindow::setModeInternal(ViewWindowMode p_mode, bool p_syncBuffe break; } - // Let editor to show or scrollToLine will not work correctly. + // Let editor to show, or scrollToLine will not work correctly. QCoreApplication::processEvents(); if (p_syncBuffer) { @@ -267,6 +264,7 @@ void MarkdownViewWindow::setupToolBar() addAction(toolBar, ViewWindowToolBarHelper::EditReadDiscard); addAction(toolBar, ViewWindowToolBarHelper::Save); + addAction(toolBar, ViewWindowToolBarHelper::ViewMode); toolBar->addSeparator(); @@ -336,10 +334,13 @@ void MarkdownViewWindow::setupTextEditor() updateConfigRevision(); + m_editViewMode = markdownEditorConfig.getEditViewMode(); + m_editor = new MarkdownEditor(markdownEditorConfig, createMarkdownEditorConfig(editorConfig, markdownEditorConfig), createMarkdownEditorParameters(editorConfig, markdownEditorConfig), this); + // Always editor comes first. m_splitter->insertWidget(0, m_editor); TextViewWindowHelper::connectEditor(this); @@ -486,8 +487,9 @@ void MarkdownViewWindow::setupViewer() connect(adapter, &MarkdownViewerAdapter::viewerReady, this, [this]() { m_viewerReady = true; + if (m_mode == ViewWindowMode::Edit) { - m_viewer->hide(); + setEditViewMode(m_editViewMode); } }); } @@ -623,7 +625,7 @@ EditorMarkdownViewerAdapter *MarkdownViewWindow::adapter() const int MarkdownViewWindow::getEditLineNumber() const { - if (m_previousMode == ViewWindowMode::Edit || m_previousMode == ViewWindowMode::FocusPreview) { + if (m_previousMode == ViewWindowMode::Edit) { if (m_editor) { return m_editor->getTopLine(); } @@ -1153,10 +1155,6 @@ QString MarkdownViewWindow::selectedText() const return m_viewer->selectedText(); case ViewWindowMode::Edit: - Q_FALLTHROUGH(); - case ViewWindowMode::FullPreview: - Q_FALLTHROUGH(); - case ViewWindowMode::FocusPreview: Q_ASSERT(m_editor); return m_editor->getTextEdit()->selectedText(); @@ -1250,3 +1248,111 @@ void MarkdownViewWindow::setupDebugViewer() m_debugViewer->resize(m_splitter->width(), m_splitter->height() / 2); mainSplitter->addWidget(m_debugViewer); } + +void MarkdownViewWindow::updateViewModeMenu(QMenu *p_menu) +{ + p_menu->clear(); + + if (isReadMode()) { + auto act = p_menu->addAction(tr("View Mode Not Supported In Read Mode")); + act->setEnabled(false); + return; + } + + if (!m_viewModeActionGroup) { + m_viewModeActionGroup = new QActionGroup(this); + connect(m_viewModeActionGroup, &QActionGroup::triggered, + this, [this](QAction *act) { + auto mode = static_cast(act->data().toInt()); + if (mode != m_editViewMode) { + ConfigMgr::getInst().getEditorConfig().getMarkdownEditorConfig().setEditViewMode(mode); + setEditViewMode(mode); + } + }); + } + + { + auto act = p_menu->addAction(tr("Edit Only")); + act->setCheckable(true); + act->setData(static_cast(MarkdownEditorConfig::EditViewMode::EditOnly)); + m_viewModeActionGroup->addAction(act); + + if (act->data().toInt() == m_editViewMode) { + act->setChecked(true); + } + } + + { + auto act = p_menu->addAction(tr("Edit with Preview")); + act->setCheckable(true); + act->setData(static_cast(MarkdownEditorConfig::EditViewMode::EditPreview)); + m_viewModeActionGroup->addAction(act); + + if (act->data().toInt() == m_editViewMode) { + act->setChecked(true); + } + } +} + +void MarkdownViewWindow::setEditViewMode(MarkdownEditorConfig::EditViewMode p_mode) +{ + Q_ASSERT(m_mode == ViewWindowMode::Edit); + + m_editViewMode = p_mode; + + switch (p_mode) { + case MarkdownEditorConfig::EditViewMode::EditOnly: + { + if (m_viewerReady) { + m_viewer->hide(); + } + + disconnect(m_editor->getTextEdit(), &vte::VTextEdit::contentsChanged, + this, &MarkdownViewWindow::syncEditorContentsToPreview); + disconnect(m_editor, &MarkdownEditor::topLineChanged, + this, &MarkdownViewWindow::syncEditorPositionToPreview); + break; + } + + case MarkdownEditorConfig::EditViewMode::EditPreview: + { + m_viewer->show(); + WidgetUtils::distributeWidgetsOfSplitter(m_splitter); + + if (m_viewerReady) { + connect(m_editor->getTextEdit(), &vte::VTextEdit::contentsChanged, + this, &MarkdownViewWindow::syncEditorContentsToPreview, + Qt::UniqueConnection); + connect(m_editor, &MarkdownEditor::topLineChanged, + this, &MarkdownViewWindow::syncEditorPositionToPreview, + Qt::UniqueConnection); + + syncEditorContentsToPreview(); + } + + break; + } + + default: + Q_ASSERT(false); + break; + } +} + +void MarkdownViewWindow::syncEditorContentsToPreview() +{ + if (isReadMode() || m_editViewMode == MarkdownEditorConfig::EditViewMode::EditOnly) { + return; + } + + adapter()->setText(m_editor->getText(), m_editor->getTopLine()); +} + +void MarkdownViewWindow::syncEditorPositionToPreview() +{ + if (isReadMode() || m_editViewMode == MarkdownEditorConfig::EditViewMode::EditOnly) { + return; + } + + adapter()->scrollToPosition(MarkdownViewerAdapter::Position(m_editor->getTopLine(), QString())); +} diff --git a/src/widgets/markdownviewwindow.h b/src/widgets/markdownviewwindow.h index 4ca8cd81..b832147f 100644 --- a/src/widgets/markdownviewwindow.h +++ b/src/widgets/markdownviewwindow.h @@ -5,9 +5,12 @@ #include +#include + class QSplitter; class QStackedWidget; class QWebEngineView; +class QActionGroup; namespace vte { @@ -22,7 +25,6 @@ namespace vnotex class EditorMarkdownViewerAdapter; class PreviewHelper; struct Outline; - class MarkdownEditorConfig; class EditorConfig; class ImageHost; class SearchToken; @@ -98,6 +100,8 @@ namespace vnotex QString selectedText() const Q_DECL_OVERRIDE; + void updateViewModeMenu(QMenu *p_menu) Q_DECL_OVERRIDE; + private: void setupUI(); @@ -164,6 +168,12 @@ namespace vnotex void setupDebugViewer(); + void setEditViewMode(MarkdownEditorConfig::EditViewMode p_mode); + + void syncEditorContentsToPreview(); + + void syncEditorPositionToPreview(); + template static QSharedPointer headingsToOutline(const QVector &p_headings); @@ -210,6 +220,10 @@ namespace vnotex ImageHost *m_imageHost = nullptr; bool m_viewerReady = false; + + QActionGroup *m_viewModeActionGroup = nullptr; + + MarkdownEditorConfig::EditViewMode m_editViewMode = MarkdownEditorConfig::EditViewMode::EditOnly; }; } diff --git a/src/widgets/viewarea.cpp b/src/widgets/viewarea.cpp index 505ae145..b94b06bc 100644 --- a/src/widgets/viewarea.cpp +++ b/src/widgets/viewarea.cpp @@ -596,30 +596,10 @@ QSplitter *ViewArea::tryGetParentSplitter(const QWidget *p_widget) const void ViewArea::distributeViewSplitsOfSplitter(QSplitter *p_splitter) { - if (!p_splitter || p_splitter->count() <= 1) { + if (!WidgetUtils::distributeWidgetsOfSplitter(p_splitter)) { return; } - // Distribute the direct children of splitter. - { - auto sizes = p_splitter->sizes(); - int totalWidth = 0; - for (auto sz : sizes) { - totalWidth += sz; - } - - int newWidth = totalWidth / sizes.size(); - if (newWidth <= 0) { - return; - } - - for (int i = 0; i < sizes.size(); ++i) { - sizes[i] = newWidth; - } - - p_splitter->setSizes(sizes); - } - // Distribute child splitter. for (int i = 0; i < p_splitter->count(); ++i) { auto childSplitter = dynamic_cast(p_splitter->widget(i)); diff --git a/src/widgets/viewwindow.cpp b/src/widgets/viewwindow.cpp index eb79c2f4..2396b407 100644 --- a/src/widgets/viewwindow.cpp +++ b/src/widgets/viewwindow.cpp @@ -37,6 +37,7 @@ #include "editors/statuswidget.h" #include "propertydefs.h" #include "floatingwidget.h" +#include "widgetsfactory.h" using namespace vnotex; @@ -341,6 +342,25 @@ QAction *ViewWindow::addAction(QToolBar *p_toolBar, ViewWindowToolBarHelper::Act break; } + case ViewWindowToolBarHelper::ViewMode: + { + act = ViewWindowToolBarHelper::addAction(p_toolBar, p_action); + connect(this, &ViewWindow::bufferChanged, + this, [this, act]() { + act->setEnabled(getBuffer()); + }); + + auto toolBtn = dynamic_cast(p_toolBar->widgetForAction(act)); + Q_ASSERT(toolBtn); + auto menu = WidgetsFactory::createMenu(p_toolBar); + toolBtn->setMenu(menu); + connect(menu, &QMenu::aboutToShow, + this, [this, menu]() { + updateViewModeMenu(menu); + }); + break; + } + case ViewWindowToolBarHelper::TypeHeading: { act = ViewWindowToolBarHelper::addAction(p_toolBar, p_action); @@ -675,7 +695,7 @@ void ViewWindow::discardChangesAndRead() bool ViewWindow::inModeCanInsert() const { - return m_mode == ViewWindowMode::Edit || m_mode == ViewWindowMode::FocusPreview || m_mode == ViewWindowMode::FullPreview; + return m_mode == ViewWindowMode::Edit; } void ViewWindow::handleTypeAction(TypeAction p_action) @@ -1300,3 +1320,11 @@ void ViewWindow::toggleDebug() { qDebug() << "debug is not supported"; } + +void ViewWindow::updateViewModeMenu(QMenu *p_menu) +{ + p_menu->clear(); + + auto act = p_menu->addAction(tr("View Mode Not Supported")); + act->setEnabled(false); +} diff --git a/src/widgets/viewwindow.h b/src/widgets/viewwindow.h index a391c19b..32fe2188 100644 --- a/src/widgets/viewwindow.h +++ b/src/widgets/viewwindow.h @@ -252,6 +252,8 @@ namespace vnotex virtual QPoint getFloatingWidgetPosition(); + virtual void updateViewModeMenu(QMenu *p_menu); + static QToolBar *createToolBar(QWidget *p_parent = nullptr); // The revision of the buffer of the last sync content. diff --git a/src/widgets/viewwindowtoolbarhelper.cpp b/src/widgets/viewwindowtoolbarhelper.cpp index 6319f957..b1eeecee 100644 --- a/src/widgets/viewwindowtoolbarhelper.cpp +++ b/src/widgets/viewwindowtoolbarhelper.cpp @@ -118,6 +118,18 @@ QAction *ViewWindowToolBarHelper::addAction(QToolBar *p_tb, Action p_action) break; } + case Action::ViewMode: + { + act = p_tb->addAction(ToolBarHelper::generateIcon("view_mode_editor.svg"), + ViewWindow::tr("View Mode")); + + auto toolBtn = dynamic_cast(p_tb->widgetForAction(act)); + Q_ASSERT(toolBtn); + toolBtn->setPopupMode(QToolButton::InstantPopup); + toolBtn->setProperty(PropertyDefs::c_toolButtonWithoutMenuIndicator, true); + break; + } + case Action::TypeHeading: { act = p_tb->addAction(ToolBarHelper::generateIcon("type_heading_editor.svg"), diff --git a/src/widgets/viewwindowtoolbarhelper.h b/src/widgets/viewwindowtoolbarhelper.h index 108eefbe..e91ab546 100644 --- a/src/widgets/viewwindowtoolbarhelper.h +++ b/src/widgets/viewwindowtoolbarhelper.h @@ -17,6 +17,7 @@ namespace vnotex { Save, EditReadDiscard, + ViewMode, // Make sure they are put together. // Including Heading1-6 and HeadingNone.