From 15508fac70f1df7dd04a5d9b0f2dee1194b67001 Mon Sep 17 00:00:00 2001 From: Benoit Walter Date: Tue, 16 Sep 2014 03:17:57 +0200 Subject: Remove unnecessary scrollbar in TQIconView Test case (using konqueror icon view): - The first icons are being shown (no scrollbar yet) - When there is no space left, a vertical scrollbar is needed - The vertical scrollbar may cover the right edge of the icons (in the last column) => an horizontal scrollbar is needed :-( Solution: When using ScrollBarMode::Auto, prevent TQt from drawing icons on the scrollbar area (before the scrollbar is shown). Related to KDE bug #69589 (cherry picked from commit 36ee984c64818f3b8180567d527f7d320606cfb1) --- src/iconview/qiconview.cpp | 40 ++++++++++++++++++++++++++++++---------- src/iconview/qiconview.h | 2 ++ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/iconview/qiconview.cpp b/src/iconview/qiconview.cpp index 335ca22..e5ae298 100644 --- a/src/iconview/qiconview.cpp +++ b/src/iconview/qiconview.cpp @@ -1102,7 +1102,7 @@ void QIconViewItem::setText( const QString &text ) if ( view ) { if ( QRect( view->contentsX(), view->contentsY(), - view->visibleWidth(), view->visibleHeight() ). + view->visibleWidthSB(), view->visibleHeightSB() ). intersects( oR ) ) view->repaintContents( oR.x() - 1, oR.y() - 1, oR.width() + 2, oR.height() + 2, FALSE ); @@ -1154,7 +1154,7 @@ void QIconViewItem::setPixmap( const QPixmap &icon ) if ( view ) { if ( QRect( view->contentsX(), view->contentsY(), - view->visibleWidth(), view->visibleHeight() ). + view->visibleWidthSB(), view->visibleHeightSB() ). intersects( oR ) ) view->repaintContents( oR.x() - 1, oR.y() - 1, oR.width() + 2, oR.height() + 2, FALSE ); @@ -1190,7 +1190,7 @@ void QIconViewItem::setPicture( const QPicture &icon ) if ( view ) { if ( QRect( view->contentsX(), view->contentsY(), - view->visibleWidth(), view->visibleHeight() ). + view->visibleWidthSB(), view->visibleHeightSB() ). intersects( oR ) ) view->repaintContents( oR.x() - 1, oR.y() - 1, oR.width() + 2, oR.height() + 2, FALSE ); @@ -1258,7 +1258,7 @@ void QIconViewItem::setPixmap( const QPixmap &icon, bool recalc, bool redraw ) if ( view ) { if ( QRect( view->contentsX(), view->contentsY(), - view->visibleWidth(), view->visibleHeight() ). + view->visibleWidthSB(), view->visibleHeightSB() ). intersects( oR ) ) view->repaintContents( oR.x() - 1, oR.y() - 1, oR.width() + 2, oR.height() + 2, FALSE ); @@ -5633,8 +5633,8 @@ void QIconView::insertInGrid( QIconViewItem *item ) } item->dirty = FALSE; } else { - QRegion r( QRect( 0, 0, QMAX( contentsWidth(), visibleWidth() ), - QMAX( contentsHeight(), visibleHeight() ) ) ); + QRegion r( QRect( 0, 0, QMAX( contentsWidth(), visibleWidthSB() ), + QMAX( contentsHeight(), visibleHeightSB() ) ) ); QIconViewItem *i = d->firstItem; int y = -1; @@ -5897,7 +5897,7 @@ QIconViewItem *QIconView::makeRowLayout( QIconViewItem *begin, int &y, bool &cha QIconViewItem *item = begin; for (;;) { x += d->spacing + item->width(); - if ( x > visibleWidth() && item != begin ) { + if ( x > visibleWidthSB() && item != begin ) { item = item->prev; while (item && (item->isVisible() == FALSE)) { item = item->prev; @@ -5928,7 +5928,7 @@ QIconViewItem *QIconView::makeRowLayout( QIconViewItem *begin, int &y, bool &cha int x; if ( item == begin ) { if ( reverse ) - x = visibleWidth() - d->spacing - item->width(); + x = visibleWidthSB() - d->spacing - item->width(); else x = d->spacing; } else { @@ -5964,7 +5964,7 @@ QIconViewItem *QIconView::makeRowLayout( QIconViewItem *begin, int &y, bool &cha i += r; x = i * d->rastX + sp * d->spacing; } - if ( x > visibleWidth() && item != begin ) { + if ( x > visibleWidthSB() && item != begin ) { item = item->prev; while (item && (item->isVisible() == FALSE)) { item = item->prev; @@ -6036,7 +6036,7 @@ QIconViewItem *QIconView::makeRowLayout( QIconViewItem *begin, int &y, bool &cha QIconViewItem *item = begin; for (;;) { y += d->spacing + item->height(); - if ( y > visibleHeight() && item != begin ) { + if ( y > visibleHeightSB() && item != begin ) { item = item->prev; while (item && (item->isVisible() == FALSE)) { item = item->prev; @@ -6600,4 +6600,24 @@ bool QIconView::isRenaming() const #endif } +int QIconView::visibleWidthSB() const +{ + if ( vScrollBarMode() != Auto ) + return visibleWidth(); + + int offset = verticalScrollBar()->isVisible() ? 0 + : style().pixelMetric( QStyle::PM_ScrollBarExtent, verticalScrollBar() ); + return QMAX( 0, visibleWidth() - offset ); +} + +int QIconView::visibleHeightSB() const +{ + if ( hScrollBarMode() != Auto ) + return visibleHeight(); + + int offset = horizontalScrollBar()->isVisible() ? 0 + : style().pixelMetric( QStyle::PM_ScrollBarExtent, horizontalScrollBar() ); + return QMAX( 0, visibleHeight() - offset ); +} + #endif // QT_NO_ICONVIEW diff --git a/src/iconview/qiconview.h b/src/iconview/qiconview.h index 109779f..4504690 100644 --- a/src/iconview/qiconview.h +++ b/src/iconview/qiconview.h @@ -504,6 +504,8 @@ private: const QPoint &relativeTo, const QIconViewItem *item ) const; QBitmap mask( QPixmap *pix ) const; + int visibleWidthSB() const; + int visibleHeightSB() const; QIconViewPrivate *d; -- cgit v1.2.3