From baea23ba1f144613c00fe64573a0f6c155a7dbcd Mon Sep 17 00:00:00 2001 From: Enrico Ros Date: Tue, 16 Sep 2014 03:37:39 +0200 Subject: [PATCH] Fix unwanted toggling TQIconViewItem focus on click This fixes the 'flashing' icon when clicking repeatedly on a TQIconView or derivates (ie TDEIconView, KonqIconViewWidget, the KDesktop and so on..). The current behavior considers that if not over an icon, the user is clicking down to perform icons selection (with the rubberband). This is not always true, since a click might be used to give focus to a window or unselect some icons. How this is fixed: when clicking down the mouse a flag is set. If the pointer is moved on the iconview with the button held down, then (and only at that moment) the rubber is created. Now a selection operation (the one done with the rubber) begins when moving the mouse and not only when clicking on the empty space. --- src/iconview/qiconview.cpp | 43 +++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/iconview/qiconview.cpp b/src/iconview/qiconview.cpp index 30988215..a15a098f 100644 --- a/src/iconview/qiconview.cpp +++ b/src/iconview/qiconview.cpp @@ -240,6 +240,7 @@ public: TQPoint dragStartPos; TQFontMetrics *fm; int minLeftBearing, minRightBearing; + int rubberStartX, rubberStartY; uint mousePressed :1; uint cleared :1; @@ -259,6 +260,7 @@ public: uint firstSizeHint : 1; uint showTips :1; uint pressedSelected :1; + uint canStartRubber :1; uint dragging :1; uint drawActiveSelection :1; uint inMenuMode :1; @@ -2801,6 +2803,7 @@ TQIconView::TQIconView( TQWidget *parent, const char *name, WFlags f ) d->currentItem = 0; d->highlightedItem = 0; d->rubber = 0; + d->canStartRubber = FALSE; d->backBuffer = 0; d->scrollTimer = 0; d->startDragItem = 0; @@ -4642,29 +4645,19 @@ void TQIconView::contentsMousePressEventEx( TQMouseEvent *e ) setCurrentItem( item ); + d->canStartRubber = FALSE; if ( e->button() == LeftButton ) { - if ( !item && ( d->selectionMode == Multi || - d->selectionMode == Extended ) ) { - d->tmpCurrentItem = d->currentItem; - d->currentItem = 0; - repaintItem( d->tmpCurrentItem ); - if ( d->rubber ) - delete d->rubber; - d->rubber = 0; - d->rubber = new TQRect( e->x(), e->y(), 0, 0 ); - d->selectedItems.clear(); - if ( ( e->state() & ControlButton ) == ControlButton ) { - for ( TQIconViewItem *i = firstItem(); i; i = i->nextItem() ) - if ( i->isSelected() ) - d->selectedItems.insert( i, i ); - } + if ( !item && ( d->selectionMode == Multi || d->selectionMode == Extended ) ) { + d->canStartRubber = TRUE; + d->rubberStartX = e->x(); + d->rubberStartY = e->y(); } d->mousePressed = TRUE; } emit_signals: - if ( !d->rubber ) { + if ( !d->canStartRubber ) { emit mouseButtonPressed( e->button(), item, e->globalPos() ); emit pressed( item ); emit pressed( item, e->globalPos() ); @@ -4708,6 +4701,7 @@ void TQIconView::contentsMouseReleaseEvent( TQMouseEvent *e ) d->mousePressed = FALSE; d->startDragItem = 0; + d->canStartRubber = FALSE; if ( d->rubber ) { TQRect r(d->rubber->normalize()); @@ -4793,7 +4787,22 @@ void TQIconView::contentsMouseMoveEvent( TQMouseEvent *e ) if ( d->tmpCurrentItem ) repaintItem( d->tmpCurrentItem ); } - } else if ( d->mousePressed && !d->currentItem && d->rubber ) { + } else if ( d->mousePressed && ((!d->currentItem && d->rubber) || d->canStartRubber) ) { + if ( d->canStartRubber ) { + d->canStartRubber = FALSE; + d->tmpCurrentItem = d->currentItem; + d->currentItem = 0; + repaintItem( d->tmpCurrentItem ); + delete d->rubber; + d->rubber = new TQRect( d->rubberStartX, d->rubberStartY, 0, 0 ); + d->selectedItems.clear(); + if ( ( e->state() & ControlButton ) == ControlButton || + ( e->state() & ShiftButton ) == ShiftButton ) { + for ( TQIconViewItem *i = firstItem(); i; i = i->nextItem() ) + if ( i->isSelected() ) + d->selectedItems.insert( i, i ); + } + } doAutoScroll(); } }