From 7413b3b4e5f03d400698d330b75809c54df28eaa Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Tue, 31 Jan 2012 16:55:00 -0600 Subject: [PATCH] Add full hidden item support to QIconView This will enable TDE to efficiently filter icon views via Konqueror (cherry picked from commit 660a32cfcf9bd9aee882ee3fb84045e8a49e4f97) --- src/iconview/qiconview.cpp | 74 ++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 6 deletions(-) diff --git a/src/iconview/qiconview.cpp b/src/iconview/qiconview.cpp index 4387a19..936dd96 100644 --- a/src/iconview/qiconview.cpp +++ b/src/iconview/qiconview.cpp @@ -1138,6 +1138,9 @@ void QIconViewItem::setKey( const QString &k ) void QIconViewItem::setPixmap( const QPixmap &icon ) { + if (isVisible() == FALSE) + return; + if ( itemIcon && itemIcon == unknown_icon ) itemIcon = 0; @@ -1236,6 +1239,9 @@ void QIconViewItem::setText( const QString &text, bool recalc, bool redraw ) void QIconViewItem::setPixmap( const QPixmap &icon, bool recalc, bool redraw ) { + if (isVisible() == FALSE) + return; + if ( itemIcon && itemIcon == unknown_icon ) itemIcon = 0; @@ -3012,7 +3018,7 @@ void QIconView::insertItem( QIconViewItem *item, QIconViewItem *after ) //insertInGrid( item ); d->cachedW = QMAX( d->cachedW, item->x() + item->width() ); - d->cachedH= QMAX( d->cachedH, item->y() + item->height() ); + d->cachedH = QMAX( d->cachedH, item->y() + item->height() ); d->updateTimer->start( 0, TRUE ); } else { @@ -3591,6 +3597,9 @@ void QIconView::arrangeItemsInGrid( bool update ) int w = 0, h = 0, y = d->spacing; QIconViewItem *item = d->firstItem; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } bool changedLayout = FALSE; while ( item ) { bool changed; @@ -3608,21 +3617,37 @@ void QIconView::arrangeItemsInGrid( bool update ) break; item = item->next; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } } if ( d->lastItem && d->arrangement == TopToBottom ) { item = d->lastItem; - int x = item->x(); + while (item && (item->isVisible() == FALSE)) { + item = item->prev; + } + int x = 0; + if (item) + x = item->x(); while ( item && item->x() >= x ) { w = QMAX( w, item->x() + item->width() ); h = QMAX( h, item->y() + item->height() ); item = item->prev; + while (item && (item->isVisible() == FALSE)) { + item = item->prev; + } } } d->containerUpdateLocked = FALSE; - w = QMAX( QMAX( d->cachedW, w ), d->lastItem->x() + d->lastItem->width() ); - h = QMAX( QMAX( d->cachedH, h ), d->lastItem->y() + d->lastItem->height() ); + QIconViewItem *lastVisibleItem = d->lastItem; + while (lastVisibleItem->prev && (lastVisibleItem->isVisible() == FALSE)) { + lastVisibleItem = lastVisibleItem->prev; + } + + w = QMAX( QMAX( d->cachedW, w ), lastVisibleItem->x() + lastVisibleItem->width() ); + h = QMAX( QMAX( d->cachedH, h ), lastVisibleItem->y() + lastVisibleItem->height() ); if ( d->arrangement == TopToBottom ) w += d->spacing; @@ -3981,8 +4006,8 @@ void QIconView::ensureItemVisible( QIconViewItem *item ) if ( !item ) return; - if ( d->updateTimer && d->updateTimer->isActive() || - d->fullRedrawTimer && d->fullRedrawTimer->isActive() ) + if ( (d->updateTimer && d->updateTimer->isActive()) || + (d->fullRedrawTimer && d->fullRedrawTimer->isActive()) ) slotUpdate(); int w = item->width(); @@ -5838,6 +5863,15 @@ QIconViewItem *QIconView::makeRowLayout( QIconViewItem *begin, int &y, bool &cha { QIconViewItem *end = 0; + // Find the first visible item + while (begin->next && (begin->isVisible() == FALSE)) { + begin = begin->next; + } + if (!begin->next) { + changed = TRUE; + return begin; + } + bool reverse = QApplication::reverseLayout(); changed = FALSE; @@ -5853,12 +5887,18 @@ QIconViewItem *QIconView::makeRowLayout( QIconViewItem *begin, int &y, bool &cha x += d->spacing + item->width(); if ( x > visibleWidth() && item != begin ) { item = item->prev; + while (item && (item->isVisible() == FALSE)) { + item = item->prev; + } break; } h = QMAX( h, item->height() ); ih = QMAX( ih, item->pixmapRect().height() ); QIconViewItem *old = item; item = item->next; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } if ( !item ) { item = old; break; @@ -5914,12 +5954,18 @@ QIconViewItem *QIconView::makeRowLayout( QIconViewItem *begin, int &y, bool &cha } if ( x > visibleWidth() && item != begin ) { item = item->prev; + while (item && (item->isVisible() == FALSE)) { + item = item->prev; + } break; } h = QMAX( h, item->height() ); ih = QMAX( ih, item->pixmapRect().height() ); QIconViewItem *old = item; item = item->next; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } if ( !item ) { item = old; break; @@ -5960,6 +6006,9 @@ QIconViewItem *QIconView::makeRowLayout( QIconViewItem *begin, int &y, bool &cha if ( item == end ) break; item = item->next; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } } y += h + d->spacing; } @@ -5977,11 +6026,17 @@ QIconViewItem *QIconView::makeRowLayout( QIconViewItem *begin, int &y, bool &cha y += d->spacing + item->height(); if ( y > visibleHeight() && item != begin ) { item = item->prev; + while (item && (item->isVisible() == FALSE)) { + item = item->prev; + } break; } w = QMAX( w, item->width() ); QIconViewItem *old = item; item = item->next; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } if ( !item ) { item = old; break; @@ -6011,6 +6066,9 @@ QIconViewItem *QIconView::makeRowLayout( QIconViewItem *begin, int &y, bool &cha if ( item == end ) break; item = item->next; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } } x += w + d->spacing; } @@ -6324,6 +6382,10 @@ void QIconView::rebuildContainers() } } } + else { + // Skip this hidden item + item = item->next; + } } }