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 "utils/vutils.h"
#include "vtreewidget.h"
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 *> 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<QListWidgetItem *> VNavigationMode::getVisibleItems(const QListWidget *p_w
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 *> items;
for (int i = 0; i < p_widget->topLevelItemCount(); ++i) {
QTreeWidgetItem *item = p_widget->topLevelItem(i);
if (!item->isHidden()) {
// 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->isExpanded()) {
items.append(getVisibleChildItems(item));
}
if (item == lastItem) {
break;
}
item = VTreeWidget::nextItem(p_widget, item, true);
}
return items;

View File

@ -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();

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) {
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 {

View File

@ -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;