Navigation: fix navigation visible items of list/tree widgets

isHidden() will be false even the item is not visible in current viewport.
This commit is contained in:
Le Tan 2018-09-24 11:41:33 +08:00
parent b025327c85
commit 803a0b66df
4 changed files with 51 additions and 39 deletions

View File

@ -8,6 +8,7 @@
#include "vnote.h" #include "vnote.h"
#include "utils/vutils.h" #include "utils/vutils.h"
#include "vtreewidget.h"
extern VNote *g_vnote; extern VNote *g_vnote;
@ -68,7 +69,19 @@ void VNavigationMode::showNavigation(QListWidget *p_widget)
QList<QListWidgetItem *> VNavigationMode::getVisibleItems(const QListWidget *p_widget) const QList<QListWidgetItem *> VNavigationMode::getVisibleItems(const QListWidget *p_widget) const
{ {
QList<QListWidgetItem *> items; QList<QListWidgetItem *> 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); QListWidgetItem *item = p_widget->item(i);
if (!item->isHidden() && item->flags() != Qt::NoItemFlags) { if (!item->isHidden() && item->flags() != Qt::NoItemFlags) {
items.append(item); items.append(item);
@ -78,35 +91,27 @@ QList<QListWidgetItem *> VNavigationMode::getVisibleItems(const QListWidget *p_w
return items; return items;
} }
static QList<QTreeWidgetItem *> getVisibleChildItems(const QTreeWidgetItem *p_item)
{
QList<QTreeWidgetItem *> 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<QTreeWidgetItem *> VNavigationMode::getVisibleItems(const QTreeWidget *p_widget) const QList<QTreeWidgetItem *> VNavigationMode::getVisibleItems(const QTreeWidget *p_widget) const
{ {
QList<QTreeWidgetItem *> items; QList<QTreeWidgetItem *> items;
for (int i = 0; i < p_widget->topLevelItemCount(); ++i) {
QTreeWidgetItem *item = p_widget->topLevelItem(i); // The first visible item.
if (!item->isHidden()) { 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); items.append(item);
if (item->isExpanded()) { if (item == lastItem) {
items.append(getVisibleChildItems(item)); break;
}
} }
item = VTreeWidget::nextItem(p_widget, item, true);
} }
return items; return items;

View File

@ -229,7 +229,6 @@ void VTagPanel::showNavigation()
QString str = QString(m_majorKey) + key; QString str = QString(m_majorKey) + key;
QLabel *label = new QLabel(str, this); QLabel *label = new QLabel(str, this);
qDebug() << g_vnote->getNavigationLabelStyle(str, true);
label->setStyleSheet(g_vnote->getNavigationLabelStyle(str, true)); label->setStyleSheet(g_vnote->getNavigationLabelStyle(str, true));
label->move(m_btn->geometry().topLeft()); label->move(m_btn->geometry().topLeft());
label->show(); label->show();

View File

@ -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) { if (!p_item) {
return NULL; return NULL;
@ -276,10 +278,10 @@ QTreeWidgetItem *VTreeWidget::nextSibling(QTreeWidgetItem *p_item, bool p_forwar
return pa->child(idx); return pa->child(idx);
} else { } else {
// Top level item. // Top level item.
int idx = indexOfTopLevelItem(p_item); int idx = p_tree->indexOfTopLevelItem(p_item);
if (p_forward) { if (p_forward) {
++idx; ++idx;
if (idx >= topLevelItemCount()) { if (idx >= p_tree->topLevelItemCount()) {
return NULL; return NULL;
} }
} else { } 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; return;
} }
QTreeWidgetItem *nItem = nextItem(item, p_forward); QTreeWidgetItem *nItem = nextItem(this, item, p_forward);
if (nItem) { if (nItem) {
setCurrentItem(nItem, 0, QItemSelectionModel::ClearAndSelect); 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; QTreeWidgetItem *nItem = NULL;
if (p_forward) { if (p_forward) {
@ -319,12 +323,12 @@ QTreeWidgetItem *VTreeWidget::nextItem(QTreeWidgetItem *p_item, bool p_forward)
nItem = p_item->child(0); nItem = p_item->child(0);
} else { } else {
while (!nItem && p_item) { while (!nItem && p_item) {
nItem = nextSibling(p_item, true); nItem = nextSibling(p_tree, p_item, true);
p_item = p_item->parent(); p_item = p_item->parent();
} }
} }
} else { } else {
nItem = nextSibling(p_item, false); nItem = nextSibling(p_tree, p_item, false);
if (!nItem) { if (!nItem) {
nItem = p_item->parent(); nItem = p_item->parent();
} else { } else {

View File

@ -45,6 +45,11 @@ public:
QTreeWidgetItem *getItemFromIndex(const QModelIndex &p_index) const; QTreeWidgetItem *getItemFromIndex(const QModelIndex &p_index) const;
// Next visible item.
static QTreeWidgetItem *nextItem(const QTreeWidget* p_tree,
QTreeWidgetItem *p_item,
bool p_forward);
protected: protected:
void keyPressEvent(QKeyEvent *p_event) Q_DECL_OVERRIDE; void keyPressEvent(QKeyEvent *p_event) Q_DECL_OVERRIDE;
@ -67,10 +72,9 @@ private:
QGraphicsOpacityEffect *getSearchInputEffect() const; QGraphicsOpacityEffect *getSearchInputEffect() const;
QTreeWidgetItem *nextSibling(QTreeWidgetItem *p_item, bool p_forward); static QTreeWidgetItem *nextSibling(const QTreeWidget *p_widget,
QTreeWidgetItem *p_item,
// Next visible item. bool p_forward);
QTreeWidgetItem *nextItem(QTreeWidgetItem *p_item, bool p_forward);
VSimpleSearchInput *m_searchInput; VSimpleSearchInput *m_searchInput;