mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 22:09:52 +08:00
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:
parent
b025327c85
commit
803a0b66df
@ -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);
|
||||||
items.append(item);
|
if (!firstItem) {
|
||||||
if (item->isExpanded()) {
|
return items;
|
||||||
items.append(getVisibleChildItems(item));
|
}
|
||||||
}
|
|
||||||
|
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;
|
return items;
|
||||||
|
@ -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();
|
||||||
|
@ -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 {
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user