diff --git a/src/vnavigationmode.cpp b/src/vnavigationmode.cpp index 71a6347c..a6764554 100644 --- a/src/vnavigationmode.cpp +++ b/src/vnavigationmode.cpp @@ -8,6 +8,7 @@ #include "vnote.h" #include "utils/vutils.h" +#include "vtreewidget.h" extern VNote *g_vnote; @@ -68,7 +69,19 @@ void VNavigationMode::showNavigation(QListWidget *p_widget) QList VNavigationMode::getVisibleItems(const QListWidget *p_widget) const { QList items; - for (int i = 0; i < p_widget->count(); ++i) { + // The first visible item. + QListWidgetItem *firstItem = p_widget->itemAt(0, 0); + if (!firstItem) { + return items; + } + + QListWidgetItem *lastItem = NULL; + lastItem = p_widget->itemAt(p_widget->viewport()->rect().bottomLeft()); + + int first = p_widget->row(firstItem); + int last = lastItem ? p_widget->row(lastItem) : (p_widget->count() - 1); + + for (int i = first; i <= last; ++i) { QListWidgetItem *item = p_widget->item(i); if (!item->isHidden() && item->flags() != Qt::NoItemFlags) { items.append(item); @@ -78,35 +91,27 @@ QList VNavigationMode::getVisibleItems(const QListWidget *p_w return items; } -static QList getVisibleChildItems(const QTreeWidgetItem *p_item) -{ - QList items; - if (p_item && !p_item->isHidden() && p_item->isExpanded()) { - for (int i = 0; i < p_item->childCount(); ++i) { - QTreeWidgetItem *child = p_item->child(i); - if (!child->isHidden()) { - items.append(child); - if (child->isExpanded()) { - items.append(getVisibleChildItems(child)); - } - } - } - } - - return items; -} - QList VNavigationMode::getVisibleItems(const QTreeWidget *p_widget) const { QList items; - for (int i = 0; i < p_widget->topLevelItemCount(); ++i) { - QTreeWidgetItem *item = p_widget->topLevelItem(i); - if (!item->isHidden()) { - items.append(item); - if (item->isExpanded()) { - items.append(getVisibleChildItems(item)); - } + + // The first visible item. + QTreeWidgetItem *firstItem = p_widget->itemAt(0, 0); + if (!firstItem) { + return items; + } + + QTreeWidgetItem *lastItem = NULL; + lastItem = p_widget->itemAt(p_widget->viewport()->rect().bottomLeft()); + + QTreeWidgetItem *item = firstItem; + while (item) { + items.append(item); + if (item == lastItem) { + break; } + + item = VTreeWidget::nextItem(p_widget, item, true); } return items; diff --git a/src/vtagpanel.cpp b/src/vtagpanel.cpp index e5e0cbb8..eb3c72d0 100644 --- a/src/vtagpanel.cpp +++ b/src/vtagpanel.cpp @@ -229,7 +229,6 @@ void VTagPanel::showNavigation() QString str = QString(m_majorKey) + key; QLabel *label = new QLabel(str, this); - qDebug() << g_vnote->getNavigationLabelStyle(str, true); label->setStyleSheet(g_vnote->getNavigationLabelStyle(str, true)); label->move(m_btn->geometry().topLeft()); label->show(); diff --git a/src/vtreewidget.cpp b/src/vtreewidget.cpp index 6475ac85..f51475ce 100644 --- a/src/vtreewidget.cpp +++ b/src/vtreewidget.cpp @@ -252,7 +252,9 @@ static QTreeWidgetItem *lastItemOfTree(QTreeWidgetItem *p_item) } } -QTreeWidgetItem *VTreeWidget::nextSibling(QTreeWidgetItem *p_item, bool p_forward) +QTreeWidgetItem *VTreeWidget::nextSibling(const QTreeWidget *p_tree, + QTreeWidgetItem *p_item, + bool p_forward) { if (!p_item) { return NULL; @@ -276,10 +278,10 @@ QTreeWidgetItem *VTreeWidget::nextSibling(QTreeWidgetItem *p_item, bool p_forwar return pa->child(idx); } else { // Top level item. - int idx = indexOfTopLevelItem(p_item); + int idx = p_tree->indexOfTopLevelItem(p_item); if (p_forward) { ++idx; - if (idx >= topLevelItemCount()) { + if (idx >= p_tree->topLevelItemCount()) { return NULL; } } else { @@ -289,7 +291,7 @@ QTreeWidgetItem *VTreeWidget::nextSibling(QTreeWidgetItem *p_item, bool p_forwar } } - return topLevelItem(idx); + return p_tree->topLevelItem(idx); } } @@ -305,13 +307,15 @@ void VTreeWidget::selectNextItem(bool p_forward) return; } - QTreeWidgetItem *nItem = nextItem(item, p_forward); + QTreeWidgetItem *nItem = nextItem(this, item, p_forward); if (nItem) { setCurrentItem(nItem, 0, QItemSelectionModel::ClearAndSelect); } } -QTreeWidgetItem *VTreeWidget::nextItem(QTreeWidgetItem *p_item, bool p_forward) +QTreeWidgetItem *VTreeWidget::nextItem(const QTreeWidget *p_tree, + QTreeWidgetItem *p_item, + bool p_forward) { QTreeWidgetItem *nItem = NULL; if (p_forward) { @@ -319,12 +323,12 @@ QTreeWidgetItem *VTreeWidget::nextItem(QTreeWidgetItem *p_item, bool p_forward) nItem = p_item->child(0); } else { while (!nItem && p_item) { - nItem = nextSibling(p_item, true); + nItem = nextSibling(p_tree, p_item, true); p_item = p_item->parent(); } } } else { - nItem = nextSibling(p_item, false); + nItem = nextSibling(p_tree, p_item, false); if (!nItem) { nItem = p_item->parent(); } else { diff --git a/src/vtreewidget.h b/src/vtreewidget.h index d39075f8..516422e3 100644 --- a/src/vtreewidget.h +++ b/src/vtreewidget.h @@ -45,6 +45,11 @@ public: QTreeWidgetItem *getItemFromIndex(const QModelIndex &p_index) const; + // Next visible item. + static QTreeWidgetItem *nextItem(const QTreeWidget* p_tree, + QTreeWidgetItem *p_item, + bool p_forward); + protected: void keyPressEvent(QKeyEvent *p_event) Q_DECL_OVERRIDE; @@ -67,10 +72,9 @@ private: QGraphicsOpacityEffect *getSearchInputEffect() const; - QTreeWidgetItem *nextSibling(QTreeWidgetItem *p_item, bool p_forward); - - // Next visible item. - QTreeWidgetItem *nextItem(QTreeWidgetItem *p_item, bool p_forward); + static QTreeWidgetItem *nextSibling(const QTreeWidget *p_widget, + QTreeWidgetItem *p_item, + bool p_forward); VSimpleSearchInput *m_searchInput;