diff --git a/changes.md b/changes.md index 5214b625..c1583a56 100644 --- a/changes.md +++ b/changes.md @@ -13,7 +13,7 @@ - Support sorting in Cart; - Support sorting notes and folders via name or modification date; - Support both `flow` and `flowchart` as the language of *flowchart.js* diagram; -- Add ParsteAsBlockQuote menu action to parste text as block quote from clipboard; +- Add PasteAsBlockQuote menu action to paste text as block quote from clipboard; - Add options for Markdown-it to support subscript and superscript; - Better support for 4K display; diff --git a/src/veditarea.cpp b/src/veditarea.cpp index 605a529f..8a81344d 100644 --- a/src/veditarea.cpp +++ b/src/veditarea.cpp @@ -743,23 +743,28 @@ void VEditArea::showNavigation() for (auto label : m_naviLabels) { delete label; } + m_naviLabels.clear(); if (!isVisible()) { return; } - // Generate labels for VEditWindow. - for (int i = 0; i < 26 && i < splitter->count(); ++i) { - QChar key('a' + i); - m_keyMap[key] = getWindow(i); - - QString str = QString(m_majorKey) + key; - QLabel *label = new QLabel(str, this); - label->setStyleSheet(g_vnote->getNavigationLabelStyle(str)); - label->move(getWindow(i)->geometry().topLeft()); - label->show(); - m_naviLabels.append(label); + // Generate labels for VEDitTab. + int charIdx = 0; + for (int i = 0; charIdx < 26 && i < splitter->count(); ++i) { + VEditWindow *win = getWindow(i); + QVector tabInfos = win->getTabsNavigationInfo(); + for (int j = 0; charIdx < 26 && j < tabInfos.size(); ++j, ++charIdx) { + QChar key('a' + charIdx); + m_keyMap[key] = tabInfos[j].m_tab; + QString str = QString(m_majorKey) + key; + QLabel *label = new QLabel(str, win); + label->setStyleSheet(g_vnote->getNavigationLabelStyle(str)); + label->show(); + label->move(tabInfos[j].m_topLeft); + m_naviLabels.append(label); + } } } @@ -769,6 +774,7 @@ void VEditArea::hideNavigation() for (auto label : m_naviLabels) { delete label; } + m_naviLabels.clear(); } @@ -781,11 +787,10 @@ bool VEditArea::handleKeyNavigation(int p_key, bool &p_succeed) if (secondKey && !keyChar.isNull()) { secondKey = false; p_succeed = true; - ret = true; auto it = m_keyMap.find(keyChar); if (it != m_keyMap.end()) { - setCurrentWindow(splitter->indexOf(static_cast(it.value())), - true); + ret = true; + static_cast(it.value())->focusTab(); } } else if (keyChar == m_majorKey) { // Major key pressed. @@ -797,6 +802,7 @@ bool VEditArea::handleKeyNavigation(int p_key, bool &p_succeed) } ret = true; } + return ret; } diff --git a/src/veditwindow.cpp b/src/veditwindow.cpp index 5467cb9f..df6e0ee7 100644 --- a/src/veditwindow.cpp +++ b/src/veditwindow.cpp @@ -1010,7 +1010,10 @@ bool VEditWindow::addEditTab(QWidget *p_widget) void VEditWindow::connectEditTab(const VEditTab *p_tab) { connect(p_tab, &VEditTab::getFocused, - this, &VEditWindow::getFocused); + this, [this]() { + setCurrentWidget(static_cast(sender())); + emit getFocused(); + }); connect(p_tab, &VEditTab::outlineChanged, this, &VEditWindow::handleTabOutlineChanged); connect(p_tab, &VEditTab::currentHeaderChanged, @@ -1196,3 +1199,22 @@ int VEditWindow::tabBarHeight() const { return tabBar()->height(); } + +QVector VEditWindow::getTabsNavigationInfo() const +{ + QVector infos; + QTabBar *bar = tabBar(); + for (int i = 0; i < bar->count(); ++i) { + QPoint tl = bar->tabRect(i).topLeft(); + if (tl.x() < 0 || tl.x() >= bar->width()) { + continue; + } + + TabNavigationInfo info; + info.m_topLeft = bar->mapToParent(tl); + info.m_tab = getTab(i); + infos.append(info); + } + + return infos; +} diff --git a/src/veditwindow.h b/src/veditwindow.h index e9e406e4..0a6b8d9f 100644 --- a/src/veditwindow.h +++ b/src/veditwindow.h @@ -15,6 +15,16 @@ class QPushButton; class QActionGroup; class VEditArea; +// Tab info for navigation mode. +struct TabNavigationInfo +{ + // Top left of the tab relative to edit window. + QPoint m_topLeft; + + VEditTab *m_tab; +}; + + class VEditWindow : public QTabWidget { Q_OBJECT @@ -85,6 +95,8 @@ public: int tabBarHeight() const; + QVector getTabsNavigationInfo() const; + protected: void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; diff --git a/src/vlistwidget.cpp b/src/vlistwidget.cpp index 4def3a4b..c1b66cdb 100644 --- a/src/vlistwidget.cpp +++ b/src/vlistwidget.cpp @@ -79,11 +79,14 @@ void VListWidget::resizeEvent(QResizeEvent *p_event) m_searchInput->height())); } -void VListWidget::handleSearchModeTriggered(bool p_inSearchMode) +void VListWidget::handleSearchModeTriggered(bool p_inSearchMode, bool p_focus) { setSearchInputVisible(p_inSearchMode); if (!p_inSearchMode) { clearItemsHighlight(); + } + + if (p_focus) { setFocus(); } } diff --git a/src/vlistwidget.h b/src/vlistwidget.h index 910e2636..fbfbab95 100644 --- a/src/vlistwidget.h +++ b/src/vlistwidget.h @@ -36,7 +36,7 @@ public: static void sortListWidget(QListWidget *p_list, const QVector &p_sortedIdx); private slots: - void handleSearchModeTriggered(bool p_inSearchMode); + void handleSearchModeTriggered(bool p_inSearchMode, bool p_focus); protected: void keyPressEvent(QKeyEvent *p_event) Q_DECL_OVERRIDE; diff --git a/src/vnavigationmode.cpp b/src/vnavigationmode.cpp index 25902445..d66c3bac 100644 --- a/src/vnavigationmode.cpp +++ b/src/vnavigationmode.cpp @@ -123,9 +123,9 @@ bool VNavigationMode::handleKeyNavigation(QListWidget *p_widget, if (p_secondKey && !keyChar.isNull()) { p_secondKey = false; p_succeed = true; - ret = true; auto it = m_keyMap.find(keyChar); if (it != m_keyMap.end()) { + ret = true; p_widget->setCurrentItem(static_cast(it.value()), QItemSelectionModel::ClearAndSelect); p_widget->setFocus(); @@ -189,9 +189,9 @@ bool VNavigationMode::handleKeyNavigation(QTreeWidget *p_widget, if (p_secondKey && !keyChar.isNull()) { p_secondKey = false; p_succeed = true; - ret = true; auto it = m_keyMap.find(keyChar); if (it != m_keyMap.end()) { + ret = true; p_widget->setCurrentItem(static_cast(it.value())); p_widget->setFocus(); } diff --git a/src/vsearcher.cpp b/src/vsearcher.cpp index b0c3fb1c..8e671d08 100644 --- a/src/vsearcher.cpp +++ b/src/vsearcher.cpp @@ -254,7 +254,7 @@ void VSearcher::initUIFields() m_searchTargetCB->addItem(tr("Note"), VSearchConfig::Note); m_searchTargetCB->addItem(tr("Folder"), VSearchConfig::Folder); m_searchTargetCB->addItem(tr("Notebook"), VSearchConfig::Notebook); - m_searchTargetCB->addItem(tr("All"), + m_searchTargetCB->addItem(tr("Note/Folder/Notebook"), VSearchConfig::Note | VSearchConfig:: Folder | VSearchConfig::Notebook); diff --git a/src/vsimplesearchinput.cpp b/src/vsimplesearchinput.cpp index 2dd0a593..2a09e0f1 100644 --- a/src/vsimplesearchinput.cpp +++ b/src/vsimplesearchinput.cpp @@ -103,7 +103,7 @@ bool VSimpleSearchInput::tryHandleKeyPressEvent(QKeyEvent *p_event) } if (m_inSearchMode) { - emit triggered(m_inSearchMode); + emit triggered(m_inSearchMode, false); clearSearch(); m_searchEdit->setFocus(); @@ -120,7 +120,7 @@ bool VSimpleSearchInput::tryHandleKeyPressEvent(QKeyEvent *p_event) || (key == Qt::Key_BracketLeft && VUtils::isControlModifierForVim(modifiers))) { m_inSearchMode = false; - emit triggered(m_inSearchMode); + emit triggered(m_inSearchMode, true); return true; } } @@ -132,7 +132,7 @@ bool VSimpleSearchInput::tryHandleKeyPressEvent(QKeyEvent *p_event) if (!m_inSearchMode) { m_inSearchMode = true; - emit triggered(m_inSearchMode); + emit triggered(m_inSearchMode, false); m_searchEdit->setFocus(); m_obj->highlightHitItems(m_hitItems); @@ -189,7 +189,7 @@ bool VSimpleSearchInput::eventFilter(QObject *p_watched, QEvent *p_event) QFocusEvent *eve = static_cast(p_event); if (eve->reason() != Qt::ActiveWindowFocusReason) { m_inSearchMode = false; - emit triggered(m_inSearchMode); + emit triggered(m_inSearchMode, false); } } diff --git a/src/vsimplesearchinput.h b/src/vsimplesearchinput.h index 8aa92d0e..3d19b695 100644 --- a/src/vsimplesearchinput.h +++ b/src/vsimplesearchinput.h @@ -53,7 +53,8 @@ public: signals: // Search mode is triggered. - void triggered(bool p_inSearchMode); + // @p_focus: whether the widget containing this input should get focus. + void triggered(bool p_inSearchMode, bool p_focus); void inputTextChanged(const QString &p_text); diff --git a/src/vtoolbox.cpp b/src/vtoolbox.cpp index b4102a1b..7a113489 100644 --- a/src/vtoolbox.cpp +++ b/src/vtoolbox.cpp @@ -164,9 +164,9 @@ bool VToolBox::handleKeyNavigation(int p_key, bool &p_succeed) if (secondKey && !keyChar.isNull()) { secondKey = false; p_succeed = true; - ret = true; auto it = m_keyMap.find(keyChar); if (it != m_keyMap.end()) { + ret = true; QWidget *widget = static_cast(it.value()); setCurrentWidget(widget); } diff --git a/src/vtreewidget.cpp b/src/vtreewidget.cpp index 3f9fe561..e615e5a9 100644 --- a/src/vtreewidget.cpp +++ b/src/vtreewidget.cpp @@ -101,12 +101,14 @@ void VTreeWidget::resizeEvent(QResizeEvent *p_event) m_searchInput->height())); } -void VTreeWidget::handleSearchModeTriggered(bool p_inSearchMode) +void VTreeWidget::handleSearchModeTriggered(bool p_inSearchMode, bool p_focus) { setSearchInputVisible(p_inSearchMode); if (!p_inSearchMode) { clearItemsHighlight(); + } + if (p_focus) { setFocus(); } } diff --git a/src/vtreewidget.h b/src/vtreewidget.h index fb44d7aa..2c53cd3d 100644 --- a/src/vtreewidget.h +++ b/src/vtreewidget.h @@ -51,7 +51,7 @@ signals: void rowsMoved(int p_first, int p_last, int p_row); private slots: - void handleSearchModeTriggered(bool p_inSearchMode); + void handleSearchModeTriggered(bool p_inSearchMode, bool p_focus); void handleSearchInputTextChanged(const QString &p_text);