diff --git a/src/core/buffer/buffer.cpp b/src/core/buffer/buffer.cpp index c331538b..830cd972 100644 --- a/src/core/buffer/buffer.cpp +++ b/src/core/buffer/buffer.cpp @@ -75,7 +75,7 @@ ViewWindow *Buffer::createViewWindow(const QSharedPointer &p { auto window = createViewWindowInternal(p_paras, p_parent); Q_ASSERT(window); - window->attachToBuffer(this); + window->attachToBuffer(this, p_paras); return window; } diff --git a/src/core/buffer/markdownbuffer.cpp b/src/core/buffer/markdownbuffer.cpp index 409cd846..f2daa0ce 100644 --- a/src/core/buffer/markdownbuffer.cpp +++ b/src/core/buffer/markdownbuffer.cpp @@ -18,7 +18,8 @@ MarkdownBuffer::MarkdownBuffer(const BufferParameters &p_parameters, ViewWindow *MarkdownBuffer::createViewWindowInternal(const QSharedPointer &p_paras, QWidget *p_parent) { - return new MarkdownViewWindow(p_paras, p_parent); + Q_UNUSED(p_paras); + return new MarkdownViewWindow(p_parent); } QString MarkdownBuffer::insertImage(const QString &p_srcImagePath, const QString &p_imageFileName) diff --git a/src/core/fileopenparameters.h b/src/core/fileopenparameters.h index d32818ed..1eaf2133 100644 --- a/src/core/fileopenparameters.h +++ b/src/core/fileopenparameters.h @@ -1,22 +1,15 @@ #ifndef FILEOPENPARAMETERS_H #define FILEOPENPARAMETERS_H +#include "global.h" + namespace vnotex { class Node; struct FileOpenParameters { - // Some modes may be not supported by some editors. - enum Mode - { - Read, - Edit, - FullPreview, - FocusPreview - }; - - Mode m_mode = Mode::Read; + ViewWindowMode m_mode = ViewWindowMode::Read; // Whether focus to the opened window. bool m_focus = true; diff --git a/src/core/global.h b/src/core/global.h index a828442e..bb6d7baf 100644 --- a/src/core/global.h +++ b/src/core/global.h @@ -89,6 +89,15 @@ namespace vnotex Center, Right }; + + enum class ViewWindowMode + { + Read, + Edit, + FullPreview, + FocusPreview, + Invalid + }; } // ns vnotex Q_DECLARE_OPERATORS_FOR_FLAGS(vnotex::FindOptions); diff --git a/src/core/widgetconfig.cpp b/src/core/widgetconfig.cpp index d59ba8cb..79a57122 100644 --- a/src/core/widgetconfig.cpp +++ b/src/core/widgetconfig.cpp @@ -28,6 +28,7 @@ void WidgetConfig::init(const QJsonObject &p_app, m_nodeExplorerRecycleBinNodeVisible = READBOOL(QStringLiteral("node_explorer_recycle_bin_node_visible")); m_nodeExplorerExternalFilesVisible = READBOOL(QStringLiteral("node_explorer_external_files_visible")); m_nodeExplorerAutoImportExternalFilesEnabled = READBOOL(QStringLiteral("node_explorer_auto_import_external_files_enabled")); + m_searchPanelAdvancedSettingsVisible = READBOOL(QStringLiteral("search_panel_advanced_settings_visible")); } QJsonObject WidgetConfig::toJson() const @@ -39,6 +40,7 @@ QJsonObject WidgetConfig::toJson() const obj[QStringLiteral("node_explorer_recycle_bin_node_visible")] = m_nodeExplorerRecycleBinNodeVisible; obj[QStringLiteral("node_explorer_external_files_visible")] = m_nodeExplorerExternalFilesVisible; obj[QStringLiteral("node_explorer_auto_import_external_files_enabled")] = m_nodeExplorerAutoImportExternalFilesEnabled; + obj[QStringLiteral("search_panel_advanced_settings_visible")] = m_searchPanelAdvancedSettingsVisible; return obj; } @@ -101,3 +103,13 @@ void WidgetConfig::setNodeExplorerAutoImportExternalFilesEnabled(bool p_enabled) { updateConfig(m_nodeExplorerAutoImportExternalFilesEnabled, p_enabled, this); } + +bool WidgetConfig::isSearchPanelAdvancedSettingsVisible() const +{ + return m_searchPanelAdvancedSettingsVisible; +} + +void WidgetConfig::setSearchPanelAdvancedSettingsVisible(bool p_visible) +{ + updateConfig(m_searchPanelAdvancedSettingsVisible, p_visible, this); +} diff --git a/src/core/widgetconfig.h b/src/core/widgetconfig.h index 3de57a58..9ede9d7a 100644 --- a/src/core/widgetconfig.h +++ b/src/core/widgetconfig.h @@ -36,6 +36,9 @@ namespace vnotex bool getNodeExplorerAutoImportExternalFilesEnabled() const; void setNodeExplorerAutoImportExternalFilesEnabled(bool p_enabled); + bool isSearchPanelAdvancedSettingsVisible() const; + void setSearchPanelAdvancedSettingsVisible(bool p_visible); + private: int m_outlineAutoExpandedLevel = 6; @@ -48,6 +51,8 @@ namespace vnotex bool m_nodeExplorerExternalFilesVisible = true; bool m_nodeExplorerAutoImportExternalFilesEnabled = true; + + bool m_searchPanelAdvancedSettingsVisible = true; }; } diff --git a/src/data/core/core.qrc b/src/data/core/core.qrc index 8624bbfa..e9dadd1d 100644 --- a/src/data/core/core.qrc +++ b/src/data/core/core.qrc @@ -8,6 +8,7 @@ icons/import_notebook_of_vnote2.svg icons/new_notebook.svg icons/notebook_menu.svg + icons/advanced_settings.svg icons/new_notebook_from_folder.svg icons/discard_editor.svg icons/edit_editor.svg @@ -35,6 +36,7 @@ icons/remove_notebook.svg icons/close_notebook.svg icons/recycle_bin.svg + icons/search_location_list.svg icons/save_editor.svg icons/buffer.svg icons/attachment_editor.svg diff --git a/src/data/core/icons/advanced_settings.svg b/src/data/core/icons/advanced_settings.svg new file mode 100644 index 00000000..71ead32d --- /dev/null +++ b/src/data/core/icons/advanced_settings.svg @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/src/data/core/icons/search_location_list.svg b/src/data/core/icons/search_location_list.svg new file mode 100644 index 00000000..5b303164 --- /dev/null +++ b/src/data/core/icons/search_location_list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/data/core/vnotex.json b/src/data/core/vnotex.json index 189fe07f..563d6140 100644 --- a/src/data/core/vnotex.json +++ b/src/data/core/vnotex.json @@ -301,6 +301,7 @@ "node_explorer_view_order" : 0, "node_explorer_recycle_bin_node_visible" : false, "node_explorer_external_files_visible" : true, - "node_explorer_auto_import_external_files_enabled" : true + "node_explorer_auto_import_external_files_enabled" : true, + "search_panel_advanced_settings_visible" : true } } diff --git a/src/widgets/editors/markdownvieweradapter.cpp b/src/widgets/editors/markdownvieweradapter.cpp index a0955d28..6ea5b921 100644 --- a/src/widgets/editors/markdownvieweradapter.cpp +++ b/src/widgets/editors/markdownvieweradapter.cpp @@ -130,7 +130,11 @@ void MarkdownViewerAdapter::scrollToLine(int p_lineNumber) } if (!m_viewerReady) { - qWarning() << "Markdown viewer is not ready"; + if (m_pendingData) { + m_pendingData->m_position = Position(p_lineNumber, QString()); + } else { + qWarning() << "Markdown viewer is not ready"; + } return; } diff --git a/src/widgets/mainwindow.cpp b/src/widgets/mainwindow.cpp index 4b3515e2..1ec6d435 100644 --- a/src/widgets/mainwindow.cpp +++ b/src/widgets/mainwindow.cpp @@ -748,3 +748,9 @@ void MainWindow::setLocationListVisible(bool p_visible) m_docks[DockIndex::LocationListDock]->hide(); } } + +void MainWindow::toggleLocationListVisible() +{ + bool visible = m_docks[DockIndex::LocationListDock]->isVisible(); + setLocationListVisible(!visible); +} diff --git a/src/widgets/mainwindow.h b/src/widgets/mainwindow.h index 5a92f7f2..e79ad3a1 100644 --- a/src/widgets/mainwindow.h +++ b/src/widgets/mainwindow.h @@ -61,6 +61,8 @@ namespace vnotex void setLocationListVisible(bool p_visible); + void toggleLocationListVisible(); + signals: void mainWindowStarted(); diff --git a/src/widgets/markdownviewwindow.cpp b/src/widgets/markdownviewwindow.cpp index 8152f49e..da35a81c 100644 --- a/src/widgets/markdownviewwindow.cpp +++ b/src/widgets/markdownviewwindow.cpp @@ -32,9 +32,8 @@ using namespace vnotex; -MarkdownViewWindow::MarkdownViewWindow(const QSharedPointer &p_paras, QWidget *p_parent) - : ViewWindow(p_parent), - m_openParas(p_paras) +MarkdownViewWindow::MarkdownViewWindow(QWidget *p_parent) + : ViewWindow(p_parent) { // Need to setup before setupUI() since the tool bar action will need the provider. setupOutlineProvider(); @@ -42,10 +41,6 @@ MarkdownViewWindow::MarkdownViewWindow(const QSharedPointer setupUI(); m_previewHelper = new PreviewHelper(nullptr, this); - - setModeInternal(modeFromOpenParameters(*p_paras)); - - m_initialized = true; } MarkdownViewWindow::~MarkdownViewWindow() @@ -86,16 +81,12 @@ void MarkdownViewWindow::setupUI() setupToolBar(); } -void MarkdownViewWindow::setMode(Mode p_mode) +void MarkdownViewWindow::setMode(ViewWindowMode p_mode) { - setModeInternal(p_mode); - - if (m_findAndReplace && m_findAndReplace->isVisible()) { - m_findAndReplace->setReplaceEnabled(m_mode != Mode::Read); - } + setModeInternal(p_mode, true); } -void MarkdownViewWindow::setModeInternal(Mode p_mode) +void MarkdownViewWindow::setModeInternal(ViewWindowMode p_mode, bool p_syncBuffer) { if (p_mode == m_mode) { return; @@ -105,11 +96,11 @@ void MarkdownViewWindow::setModeInternal(Mode p_mode) m_mode = p_mode; switch (m_mode) { - case Mode::Read: + case ViewWindowMode::Read: { if (!m_viewer) { setupViewer(); - if (m_initialized) { + if (p_syncBuffer) { syncViewerFromBuffer(true); } } @@ -126,7 +117,7 @@ void MarkdownViewWindow::setModeInternal(Mode p_mode) break; } - case Mode::Edit: + case ViewWindowMode::Edit: { if (!m_editor) { // We need viewer to preview. @@ -136,7 +127,7 @@ void MarkdownViewWindow::setModeInternal(Mode p_mode) setupTextEditor(); - if (m_initialized) { + if (p_syncBuffer) { syncTextEditorFromBuffer(true); } } @@ -160,11 +151,15 @@ void MarkdownViewWindow::setModeInternal(Mode p_mode) // Let editor to show or scrollToLine will not work correctly. QCoreApplication::processEvents(); - if (m_initialized) { + if (p_syncBuffer) { doSyncEditorFromBufferContent(true); } emit modeChanged(); + + if (m_findAndReplace && m_findAndReplace->isVisible()) { + m_findAndReplace->setReplaceEnabled(!isReadMode()); + } } void MarkdownViewWindow::setModified(bool p_modified) @@ -219,11 +214,11 @@ void MarkdownViewWindow::doSyncEditorFromBufferContent(bool p_syncPosition) // case we will call editor or viewer to update its content. m_bufferRevision = buffer->getRevision(); switch (m_mode) { - case Mode::Read: + case ViewWindowMode::Read: syncViewerFromBufferContent(p_syncPosition); break; - case Mode::Edit: + case ViewWindowMode::Edit: syncTextEditorFromBufferContent(p_syncPosition); break; @@ -232,21 +227,16 @@ void MarkdownViewWindow::doSyncEditorFromBufferContent(bool p_syncPosition) } } -void MarkdownViewWindow::handleBufferChangedInternal() +void MarkdownViewWindow::handleBufferChangedInternal(const QSharedPointer &p_paras) { - TextViewWindowHelper::handleBufferChanged(this); - - auto buffer = getBuffer(); - if (m_openParas && m_openParas->m_newFile) { - Q_ASSERT(m_mode != Mode::Read); - const auto &markdownEditorConfig = ConfigMgr::getInst().getEditorConfig().getMarkdownEditorConfig(); - if (markdownEditorConfig.getInsertFileNameAsTitle() && buffer->getContent().isEmpty()) { - const auto title = QString("# %1\n").arg(QFileInfo(buffer->getName()).completeBaseName()); - m_editor->insertText(title); - } + if (getBuffer()) { + // Will sync buffer right behind this. + setModeInternal(p_paras ? p_paras->m_mode : ViewWindowMode::Read, false); } - m_openParas.clear(); + TextViewWindowHelper::handleBufferChanged(this); + + handleFileOpenParameters(p_paras); } void MarkdownViewWindow::setupToolBar() @@ -329,14 +319,14 @@ void MarkdownViewWindow::setupTextEditor() // Connect outline pipeline. connect(m_editor, &MarkdownEditor::headingsChanged, this, [this]() { - if (getMode() != Mode::Read) { + if (!isReadMode()) { auto outline = headingsToOutline(m_editor->getHeadings()); m_outlineProvider->setOutline(outline); } }); connect(m_editor, &MarkdownEditor::currentHeadingChanged, this, [this]() { - if (getMode() != Mode::Read) { + if (!isReadMode()) { m_outlineProvider->setCurrentHeadingIndex(m_editor->getCurrentHeadingIndex()); } }); @@ -366,11 +356,11 @@ bool MarkdownViewWindow::eventFilter(QObject *p_obj, QEvent *p_event) void MarkdownViewWindow::focusEditor() { switch (m_mode) { - case Mode::Read: + case ViewWindowMode::Read: m_viewer->setFocus(); break; - case Mode::Edit: + case ViewWindowMode::Edit: m_editor->setFocus(); break; @@ -430,14 +420,14 @@ void MarkdownViewWindow::setupViewer() // Connect outline pipeline. connect(adapter, &MarkdownViewerAdapter::headingsChanged, this, [this]() { - if (getMode() == Mode::Read) { + if (isReadMode()) { auto outline = headingsToOutline(this->adapter()->getHeadings()); m_outlineProvider->setOutline(outline); } }); connect(adapter, &MarkdownViewerAdapter::currentHeadingChanged, this, [this]() { - if (getMode() == Mode::Read) { + if (isReadMode()) { m_outlineProvider->setCurrentHeadingIndex(this->adapter()->getCurrentHeadingIndex()); } }); @@ -554,11 +544,11 @@ void MarkdownViewWindow::setBufferRevisionAfterInvalidation(int p_bufferRevision { m_bufferRevision = p_bufferRevision; switch (m_mode) { - case Mode::Edit: + case ViewWindowMode::Edit: m_textEditorBufferRevision = p_bufferRevision; break; - case Mode::Read: + case ViewWindowMode::Read: m_viewerBufferRevision = p_bufferRevision; break; @@ -578,7 +568,7 @@ EditorMarkdownViewerAdapter *MarkdownViewWindow::adapter() const int MarkdownViewWindow::getEditLineNumber() const { - if (m_previousMode == Mode::Edit || m_previousMode == Mode::FocusPreview) { + if (m_previousMode == ViewWindowMode::Edit || m_previousMode == ViewWindowMode::FocusPreview) { if (m_editor) { return m_editor->getTopLine(); } @@ -589,7 +579,7 @@ int MarkdownViewWindow::getEditLineNumber() const int MarkdownViewWindow::getReadLineNumber() const { - if (m_previousMode == Mode::Read) { + if (m_previousMode == ViewWindowMode::Read) { if (m_viewer) { return adapter()->getTopLineNumber(); } @@ -693,7 +683,7 @@ void MarkdownViewWindow::handleTypeAction(TypeAction p_action) void MarkdownViewWindow::handleSectionNumberOverride(OverrideState p_state) { - if (m_mode != Mode::Read) { + if (!isReadMode()) { m_editor->overrideSectionNumber(p_state); } } @@ -772,7 +762,7 @@ void MarkdownViewWindow::setupOutlineProvider() connect(m_outlineProvider.data(), &OutlineProvider::headingClicked, this, [this](int p_idx) { switch (getMode()) { - case Mode::Read: + case ViewWindowMode::Read: adapter()->scrollToHeading(p_idx); break; @@ -796,7 +786,7 @@ QSharedPointer MarkdownViewWindow::createMarkdownEdit void MarkdownViewWindow::scrollUp() { - if (m_mode == Mode::Read) { + if (isReadMode()) { adapter()->scroll(true); } else { QScrollBar *vbar = m_editor->getTextEdit()->verticalScrollBar(); @@ -808,7 +798,7 @@ void MarkdownViewWindow::scrollUp() void MarkdownViewWindow::scrollDown() { - if (m_mode == Mode::Read) { + if (isReadMode()) { adapter()->scroll(false); } else { QScrollBar *vbar = m_editor->getTextEdit()->verticalScrollBar(); @@ -830,7 +820,7 @@ void MarkdownViewWindow::updateWebViewerConfig(const MarkdownEditorConfig &p_con void MarkdownViewWindow::zoom(bool p_zoomIn) { // Only editor will receive the wheel event. - Q_ASSERT(m_mode != Mode::Read); + Q_ASSERT(!isReadMode()); m_editor->zoom(m_editor->zoomDelta() + (p_zoomIn ? 1 : -1)); auto &textEditorConfig = ConfigMgr::getInst().getEditorConfig().getMarkdownEditorConfig().getTextEditorConfig(); textEditorConfig.setZoomDelta(m_editor->zoomDelta()); @@ -839,7 +829,7 @@ void MarkdownViewWindow::zoom(bool p_zoomIn) void MarkdownViewWindow::handleFindTextChanged(const QString &p_text, FindOptions p_options) { - if (m_mode == Mode::Read) { + if (isReadMode()) { if (p_options & FindOption::IncrementalSearch) { adapter()->findText(p_text, p_options); } @@ -850,7 +840,7 @@ void MarkdownViewWindow::handleFindTextChanged(const QString &p_text, FindOption void MarkdownViewWindow::handleFindNext(const QString &p_text, FindOptions p_options) { - if (m_mode == Mode::Read) { + if (isReadMode()) { adapter()->findText(p_text, p_options); } else { TextViewWindowHelper::handleFindNext(this, p_text, p_options); @@ -859,7 +849,7 @@ void MarkdownViewWindow::handleFindNext(const QString &p_text, FindOptions p_opt void MarkdownViewWindow::handleReplace(const QString &p_text, FindOptions p_options, const QString &p_replaceText) { - if (m_mode == Mode::Read) { + if (isReadMode()) { VNoteX::getInst().showStatusMessageShort(tr("Replace is not supported in read mode")); } else { TextViewWindowHelper::handleReplace(this, p_text, p_options, p_replaceText); @@ -868,7 +858,7 @@ void MarkdownViewWindow::handleReplace(const QString &p_text, FindOptions p_opti void MarkdownViewWindow::handleReplaceAll(const QString &p_text, FindOptions p_options, const QString &p_replaceText) { - if (m_mode == Mode::Read) { + if (isReadMode()) { VNoteX::getInst().showStatusMessageShort(tr("Replace is not supported in read mode")); } else { TextViewWindowHelper::handleReplaceAll(this, p_text, p_options, p_replaceText); @@ -887,5 +877,44 @@ void MarkdownViewWindow::handleFindAndReplaceWidgetClosed() void MarkdownViewWindow::handleFindAndReplaceWidgetOpened() { Q_ASSERT(m_findAndReplace); - m_findAndReplace->setReplaceEnabled(m_mode != Mode::Read); + m_findAndReplace->setReplaceEnabled(!isReadMode()); +} + +void MarkdownViewWindow::handleFileOpenParameters(const QSharedPointer &p_paras) +{ + if (!p_paras) { + return; + } + + auto buffer = getBuffer(); + if (p_paras->m_newFile) { + Q_ASSERT(!isReadMode()); + const auto &markdownEditorConfig = ConfigMgr::getInst().getEditorConfig().getMarkdownEditorConfig(); + if (markdownEditorConfig.getInsertFileNameAsTitle() && buffer->getContent().isEmpty()) { + const auto title = QString("# %1\n").arg(QFileInfo(buffer->getName()).completeBaseName()); + m_editor->insertText(title); + } + } + + scrollToLine(p_paras->m_lineNumber); +} + +void MarkdownViewWindow::scrollToLine(int p_lineNumber) +{ + if (p_lineNumber < 0) { + return; + } + + if (isReadMode()) { + Q_ASSERT(m_viewer); + adapter()->scrollToPosition(MarkdownViewerAdapter::Position(p_lineNumber, QString())); + } else { + Q_ASSERT(m_editor); + m_editor->scrollToLine(p_lineNumber, true); + } +} + +bool MarkdownViewWindow::isReadMode() const +{ + return m_mode == ViewWindowMode::Read; } diff --git a/src/widgets/markdownviewwindow.h b/src/widgets/markdownviewwindow.h index 22ba9355..487d0266 100644 --- a/src/widgets/markdownviewwindow.h +++ b/src/widgets/markdownviewwindow.h @@ -15,7 +15,6 @@ namespace vte namespace vnotex { - struct FileOpenParameters; class MarkdownEditor; class MarkdownViewer; class EditorMarkdownViewerAdapter; @@ -29,13 +28,13 @@ namespace vnotex public: friend class TextViewWindowHelper; - MarkdownViewWindow(const QSharedPointer &p_paras, QWidget *p_parent = nullptr); + MarkdownViewWindow(QWidget *p_parent = nullptr); ~MarkdownViewWindow(); QString getLatestContent() const Q_DECL_OVERRIDE; - void setMode(Mode p_mode) Q_DECL_OVERRIDE; + void setMode(ViewWindowMode p_mode) Q_DECL_OVERRIDE; QSharedPointer getOutlineProvider() Q_DECL_OVERRIDE; @@ -45,7 +44,7 @@ namespace vnotex protected slots: void setModified(bool p_modified) Q_DECL_OVERRIDE; - void handleBufferChangedInternal() Q_DECL_OVERRIDE; + void handleBufferChangedInternal(const QSharedPointer &p_paras) Q_DECL_OVERRIDE; void handleTypeAction(TypeAction p_action) Q_DECL_OVERRIDE; @@ -110,9 +109,6 @@ namespace vnotex EditorMarkdownViewerAdapter *adapter() const; - // We need a non-virtual version for constructor. - void setModeInternal(Mode p_mode); - // Get the position to sync from editor. // Return -1 for an invalid position. int getEditLineNumber() const; @@ -127,13 +123,19 @@ namespace vnotex void updateWebViewerConfig(const MarkdownEditorConfig &p_config); + void setModeInternal(ViewWindowMode p_mode, bool p_syncBuffer); + + void handleFileOpenParameters(const QSharedPointer &p_paras); + + void scrollToLine(int p_lineNumber); + + bool isReadMode() const; + template static QSharedPointer headingsToOutline(const QVector &p_headings); static QSharedPointer createMarkdownEditorConfig(const MarkdownEditorConfig &p_config); - bool m_initialized = false; - // Splitter to hold editor and viewer. QSplitter *m_splitter = nullptr; @@ -161,9 +163,7 @@ namespace vnotex int m_markdownEditorConfigRevision = 0; - Mode m_previousMode = Mode::Invalid; - - QSharedPointer m_openParas; + ViewWindowMode m_previousMode = ViewWindowMode::Invalid; QSharedPointer m_outlineProvider; }; diff --git a/src/widgets/notebookexplorer.cpp b/src/widgets/notebookexplorer.cpp index 993c6ef2..acac2a4b 100644 --- a/src/widgets/notebookexplorer.cpp +++ b/src/widgets/notebookexplorer.cpp @@ -235,7 +235,7 @@ void NotebookExplorer::newNote() // Open it right now. auto paras = QSharedPointer::create(); - paras->m_mode = FileOpenParameters::Mode::Edit; + paras->m_mode = ViewWindowMode::Edit; paras->m_newFile = true; emit VNoteX::getInst().openNodeRequested(dialog.getNewNode().data(), paras); } diff --git a/src/widgets/searchpanel.cpp b/src/widgets/searchpanel.cpp index 1a488337..9a54c716 100644 --- a/src/widgets/searchpanel.cpp +++ b/src/widgets/searchpanel.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -55,7 +56,7 @@ void SearchPanel::setupUI() mainLayout->addWidget(titleBar); } - auto inputsLayout = new QFormLayout(); + auto inputsLayout = WidgetsFactory::createFormLayout(); mainLayout->addLayout(inputsLayout); m_keywordComboBox = WidgetsFactory::createComboBox(this); @@ -77,21 +78,31 @@ void SearchPanel::setupUI() m_searchScopeComboBox->addItem(tr("All Notebooks"), static_cast(SearchScope::AllNotebooks)); inputsLayout->addRow(tr("Scope:"), m_searchScopeComboBox); - setupSearchObject(inputsLayout); + { + // Advanced settings. + m_advancedSettings = new QWidget(this); + inputsLayout->addRow(m_advancedSettings); - setupSearchTarget(inputsLayout); + auto advLayout = WidgetsFactory::createFormLayout(m_advancedSettings); + advLayout->setContentsMargins(0, 0, 0, 0); - m_filePatternComboBox = WidgetsFactory::createComboBox(this); - m_filePatternComboBox->setEditable(true); - m_filePatternComboBox->setLineEdit(WidgetsFactory::createLineEdit(this)); - m_filePatternComboBox->lineEdit()->setPlaceholderText(tr("Wildcard pattern of files and folders to search")); - m_filePatternComboBox->lineEdit()->setProperty(PropertyDefs::c_embeddedLineEdit, true); - m_filePatternComboBox->completer()->setCaseSensitivity(Qt::CaseSensitive); - inputsLayout->addRow(tr("File pattern:"), m_filePatternComboBox); + setupSearchObject(advLayout); - setupFindOption(inputsLayout); + setupSearchTarget(advLayout); + + m_filePatternComboBox = WidgetsFactory::createComboBox(m_advancedSettings); + m_filePatternComboBox->setEditable(true); + m_filePatternComboBox->setLineEdit(WidgetsFactory::createLineEdit(m_advancedSettings)); + m_filePatternComboBox->lineEdit()->setPlaceholderText(tr("Wildcard pattern of files to search")); + m_filePatternComboBox->lineEdit()->setProperty(PropertyDefs::c_embeddedLineEdit, true); + m_filePatternComboBox->completer()->setCaseSensitivity(Qt::CaseSensitive); + advLayout->addRow(tr("File pattern:"), m_filePatternComboBox); + + setupFindOption(advLayout); + } { + // TODO: use a global progress bar. m_progressBar = new QProgressBar(this); m_progressBar->setRange(0, 0); m_progressBar->hide(); @@ -115,10 +126,17 @@ TitleBar *SearchPanel::setupTitleBar(const QString &p_title, QWidget *p_parent) connect(cancelBtn, &QToolButton::triggered, this, &SearchPanel::stopSearch); - auto closeLocationListBtn = titleBar->addActionButton(QStringLiteral("close.svg"), tr("Close Location List")); - connect(closeLocationListBtn, &QToolButton::triggered, + auto toggleLocationListBtn = titleBar->addActionButton(QStringLiteral("search_location_list.svg"), tr("Toggle Location List")); + connect(toggleLocationListBtn, &QToolButton::triggered, this, [this]() { + VNoteX::getInst().getMainWindow()->toggleLocationListVisible(); + }); + m_advancedSettingsBtn = titleBar->addActionButton(QStringLiteral("advanced_settings.svg"), tr("Advanced Settings")); + m_advancedSettingsBtn->defaultAction()->setCheckable(true); + connect(m_advancedSettingsBtn, &QToolButton::triggered, + this, [this](QAction *p_act) { + m_advancedSettings->setVisible(p_act->isChecked()); }); } @@ -192,7 +210,7 @@ void SearchPanel::setupFindOption(QFormLayout *p_layout) void SearchPanel::initOptions() { - // Read it from config. + // Read search option from config. m_option = QSharedPointer::create(ConfigMgr::getInst().getSessionConfig().getSearchOption()); connect(VNoteX::getInst().getMainWindow(), &MainWindow::mainWindowClosedOnQuit, @@ -200,6 +218,10 @@ void SearchPanel::initOptions() saveFields(*m_option); ConfigMgr::getInst().getSessionConfig().setSearchOption(*m_option); }); + + // Init layout. + const auto &widgetConfig = ConfigMgr::getInst().getWidgetConfig(); + m_advancedSettingsBtn->defaultAction()->setChecked(widgetConfig.isSearchPanelAdvancedSettingsVisible()); } void SearchPanel::restoreFields(const SearchOption &p_option) @@ -303,6 +325,7 @@ void SearchPanel::appendLog(const QString &p_text) if (!m_infoTextEdit) { m_infoTextEdit = WidgetsFactory::createPlainTextConsole(this); m_infoTextEdit->setMaximumHeight(m_infoTextEdit->minimumSizeHint().height()); + // Before progress bar. static_cast(layout())->insertWidget(layout()->count() - 1, m_infoTextEdit); } diff --git a/src/widgets/searchpanel.h b/src/widgets/searchpanel.h index b00dd764..2a441725 100644 --- a/src/widgets/searchpanel.h +++ b/src/widgets/searchpanel.h @@ -94,6 +94,8 @@ namespace vnotex QToolButton *m_searchBtn = nullptr; + QToolButton *m_advancedSettingsBtn = nullptr; + QComboBox *m_keywordComboBox = nullptr; QComboBox *m_searchScopeComboBox = nullptr; @@ -127,6 +129,8 @@ namespace vnotex QRadioButton *m_regularExpressionRadioBtn = nullptr; + QWidget *m_advancedSettings = nullptr; + QProgressBar *m_progressBar = nullptr; QPlainTextEdit *m_infoTextEdit = nullptr; diff --git a/src/widgets/textviewwindow.cpp b/src/widgets/textviewwindow.cpp index 481e904b..2262f930 100644 --- a/src/widgets/textviewwindow.cpp +++ b/src/widgets/textviewwindow.cpp @@ -20,7 +20,7 @@ using namespace vnotex; TextViewWindow::TextViewWindow(QWidget *p_parent) : ViewWindow(p_parent) { - m_mode = Mode::Edit; + m_mode = ViewWindowMode::Edit; setupUI(); } @@ -72,8 +72,9 @@ void TextViewWindow::setupToolBar() addAction(toolBar, ViewWindowToolBarHelper::FindAndReplace); } -void TextViewWindow::handleBufferChangedInternal() +void TextViewWindow::handleBufferChangedInternal(const QSharedPointer &p_paras) { + Q_UNUSED(p_paras); TextViewWindowHelper::handleBufferChanged(this); } @@ -142,7 +143,7 @@ void TextViewWindow::setBufferRevisionAfterInvalidation(int p_bufferRevision) m_bufferRevision = p_bufferRevision; } -void TextViewWindow::setMode(Mode p_mode) +void TextViewWindow::setMode(ViewWindowMode p_mode) { Q_UNUSED(p_mode); Q_ASSERT(false); diff --git a/src/widgets/textviewwindow.h b/src/widgets/textviewwindow.h index 9a2dc1f0..8c0963a9 100644 --- a/src/widgets/textviewwindow.h +++ b/src/widgets/textviewwindow.h @@ -23,7 +23,7 @@ namespace vnotex QString getLatestContent() const Q_DECL_OVERRIDE; - void setMode(Mode p_mode) Q_DECL_OVERRIDE; + void setMode(ViewWindowMode p_mode) Q_DECL_OVERRIDE; public slots: void handleEditorConfigChange() Q_DECL_OVERRIDE; @@ -31,7 +31,7 @@ namespace vnotex protected slots: void setModified(bool p_modified) Q_DECL_OVERRIDE; - void handleBufferChangedInternal() Q_DECL_OVERRIDE; + void handleBufferChangedInternal(const QSharedPointer &p_paras) Q_DECL_OVERRIDE; void handleFindTextChanged(const QString &p_text, FindOptions p_options) Q_DECL_OVERRIDE; diff --git a/src/widgets/viewwindow.cpp b/src/widgets/viewwindow.cpp index ed43806d..36d927e6 100644 --- a/src/widgets/viewwindow.cpp +++ b/src/widgets/viewwindow.cpp @@ -70,30 +70,6 @@ ViewWindow::ViewWindow(QWidget *p_parent) syncEditorFromBufferContent(); } }); - - connect(this, &ViewWindow::bufferChanged, - this, [this]() { - auto buffer = getBuffer(); - if (buffer) { - connect(buffer, &Buffer::modified, - this, &ViewWindow::statusChanged); - - // To make it convenient to disconnect, do not connect directly to - // the timer. - connect(buffer, &Buffer::contentsChanged, - this, [this]() { - m_syncBufferContentTimer->start(); - }); - - connect(buffer, &Buffer::nameChanged, - this, &ViewWindow::nameChanged); - - connect(buffer, &Buffer::attachmentChanged, - this, &ViewWindow::attachmentChanged); - } - - handleBufferChangedInternal(); - }); } ViewWindow::~ViewWindow() @@ -140,7 +116,33 @@ Buffer *ViewWindow::getBuffer() const return m_buffer; } -void ViewWindow::attachToBuffer(Buffer *p_buffer) +void ViewWindow::handleBufferChanged(const QSharedPointer &p_paras) +{ + auto buffer = getBuffer(); + if (buffer) { + connect(buffer, &Buffer::modified, + this, &ViewWindow::statusChanged); + + // To make it convenient to disconnect, do not connect directly to + // the timer. + connect(buffer, &Buffer::contentsChanged, + this, [this]() { + m_syncBufferContentTimer->start(); + }); + + connect(buffer, &Buffer::nameChanged, + this, &ViewWindow::nameChanged); + + connect(buffer, &Buffer::attachmentChanged, + this, &ViewWindow::attachmentChanged); + } + + handleBufferChangedInternal(p_paras); + + emit bufferChanged(); +} + +void ViewWindow::attachToBuffer(Buffer *p_buffer, const QSharedPointer &p_paras) { Q_ASSERT(p_buffer); Q_ASSERT(m_buffer != p_buffer); @@ -150,7 +152,7 @@ void ViewWindow::attachToBuffer(Buffer *p_buffer) m_buffer = p_buffer; m_buffer->attachViewWindow(this); - emit bufferChanged(); + handleBufferChanged(p_paras); if (m_buffer->getAttachViewWindowCount() == 1) { QTimer::singleShot(1000, this, &ViewWindow::checkBackupFileOfPreviousSession); @@ -172,7 +174,7 @@ void ViewWindow::detachFromBuffer(bool p_quiet) m_buffer = nullptr; if (!p_quiet) { - emit bufferChanged(); + handleBufferChanged(nullptr); } } @@ -530,20 +532,7 @@ bool ViewWindow::aboutToClose(bool p_force) return true; } -ViewWindow::Mode ViewWindow::modeFromOpenParameters(const FileOpenParameters &p_paras) -{ - switch (p_paras.m_mode) { - case FileOpenParameters::Mode::Edit: - return ViewWindow::Mode::Edit; - - case FileOpenParameters::Mode::Read: - Q_FALLTHROUGH(); - default: - return ViewWindow::Mode::Read; - } -} - -ViewWindow::Mode ViewWindow::getMode() const +ViewWindowMode ViewWindow::getMode() const { return m_mode; } @@ -595,12 +584,12 @@ void ViewWindow::discardChangesAndRead() return; } } - setMode(Mode::Read); + setMode(ViewWindowMode::Read); } bool ViewWindow::inModeCanInsert() const { - return m_mode == Mode::Edit || m_mode == Mode::FocusPreview || m_mode == Mode::FullPreview; + return m_mode == ViewWindowMode::Edit || m_mode == ViewWindowMode::FocusPreview || m_mode == ViewWindowMode::FullPreview; } void ViewWindow::handleTypeAction(TypeAction p_action) @@ -829,7 +818,7 @@ bool ViewWindow::save(bool p_force) void ViewWindow::updateEditReadDiscardActionState(EditReadDiscardAction *p_act) { switch (getMode()) { - case Mode::Read: + case ViewWindowMode::Read: p_act->setState(BiAction::State::Default); break; @@ -1057,7 +1046,7 @@ void ViewWindow::edit() return; } - setMode(Mode::Edit); + setMode(ViewWindowMode::Edit); setFocus(); } @@ -1072,7 +1061,7 @@ void ViewWindow::read(bool p_save) if (p_save) { if (save(false)) { - setMode(Mode::Read); + setMode(ViewWindowMode::Read); } } else { discardChangesAndRead(); diff --git a/src/widgets/viewwindow.h b/src/widgets/viewwindow.h index 0c0ab8a1..d52fa8b4 100644 --- a/src/widgets/viewwindow.h +++ b/src/widgets/viewwindow.h @@ -6,6 +6,7 @@ #include #include +#include #include "viewwindowtoolbarhelper.h" @@ -28,22 +29,13 @@ namespace vnotex { Q_OBJECT public: - enum Mode - { - Read, - Edit, - FullPreview, - FocusPreview, - Invalid - }; - explicit ViewWindow(QWidget *p_parent = nullptr); virtual ~ViewWindow(); Buffer *getBuffer() const; - void attachToBuffer(Buffer *p_buffer); + void attachToBuffer(Buffer *p_buffer, const QSharedPointer &p_paras); void detachFromBuffer(bool p_quiet = false); @@ -68,8 +60,8 @@ namespace vnotex // Return true if it is OK to proceed. bool aboutToClose(bool p_force); - ViewWindow::Mode getMode() const; - virtual void setMode(Mode p_mode) = 0; + ViewWindowMode getMode() const; + virtual void setMode(ViewWindowMode p_mode) = 0; virtual QSharedPointer getOutlineProvider(); @@ -134,7 +126,7 @@ namespace vnotex protected slots: // Handle current buffer change. - virtual void handleBufferChangedInternal() = 0; + virtual void handleBufferChangedInternal(const QSharedPointer &p_paras) = 0; // Handle all kinds of type action. virtual void handleTypeAction(TypeAction p_action); @@ -218,8 +210,6 @@ namespace vnotex void read(bool p_save); - static ViewWindow::Mode modeFromOpenParameters(const FileOpenParameters &p_paras); - static QToolBar *createToolBar(QWidget *p_parent = nullptr); // The revision of the buffer of the last sync content. @@ -229,7 +219,7 @@ namespace vnotex // Subclass should maintain it. int m_editorConfigRevision = 0; - Mode m_mode = Mode::Invalid; + ViewWindowMode m_mode = ViewWindowMode::Invalid; // Managed by QObject. FindAndReplaceWidget *m_findAndReplace = nullptr; @@ -282,6 +272,8 @@ namespace vnotex void findNextOnLastFind(bool p_forward = true); + void handleBufferChanged(const QSharedPointer &p_paras); + static ViewWindow::TypeAction toolBarActionToTypeAction(ViewWindowToolBarHelper::Action p_action); Buffer *m_buffer = nullptr;