patches/qt3-0013-qiconview-rubber_on_move.diff
changeset 782 a013313b88b4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/qt3-0013-qiconview-rubber_on_move.diff	Thu Jan 10 18:27:45 2008 +0000
@@ -0,0 +1,93 @@
+--- qt-x11-free-3.3.8/src/iconview/qiconview.cpp.orig	2007-02-02 19:31:07.000000000 +0530
++++ qt-x11-free-3.3.8/src/iconview/qiconview.cpp	2008-01-08 21:10:14.443365125 +0530
+@@ -236,6 +236,7 @@
+     QPoint dragStartPos;
+     QFontMetrics *fm;
+     int minLeftBearing, minRightBearing;
++    int rubberStartX, rubberStartY;
+ 
+     uint mousePressed		:1;
+     uint cleared		:1;
+@@ -255,6 +256,7 @@
+     uint firstSizeHint : 1;
+     uint showTips		:1;
+     uint pressedSelected	:1;
++    uint canStartRubber		:1;
+     uint dragging		:1;
+     uint drawActiveSelection	:1;
+     uint inMenuMode		:1;
+@@ -2754,6 +2756,7 @@
+     d->currentItem = 0;
+     d->highlightedItem = 0;
+     d->rubber = 0;
++    d->canStartRubber = FALSE;
+     d->scrollTimer = 0;
+     d->startDragItem = 0;
+     d->tmpCurrentItem = 0;
+@@ -4513,29 +4516,19 @@
+ 
+     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 QRect( e->x(), e->y(), 0, 0 );
+-	    d->selectedItems.clear();
+-	    if ( ( e->state() & ControlButton ) == ControlButton ) {
+-		for ( QIconViewItem *i = firstItem(); i; i = i->nextItem() )
+-		    if ( i->isSelected() )
+-			d->selectedItems.insert( i, i );
+-	    }
++	    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() );
+@@ -4579,6 +4572,7 @@
+     d->mousePressed = FALSE;
+     d->startDragItem = 0;
+ 
++    d->canStartRubber = FALSE;
+     if ( d->rubber ) {
+ 	QPainter p;
+ 	p.begin( viewport() );
+@@ -4668,7 +4662,22 @@
+ 	    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 QRect( d->rubberStartX, d->rubberStartY, 0, 0 );
++	    d->selectedItems.clear();
++	    if ( ( e->state() & ControlButton ) == ControlButton ||
++	         ( e->state() & ShiftButton ) == ShiftButton ) {
++		for ( QIconViewItem *i = firstItem(); i; i = i->nextItem() )
++		    if ( i->isSelected() )
++			d->selectedItems.insert( i, i );
++	    }
++	}
+ 	doAutoScroll();
+     }
+ }