1
/* ============================================================
2
* Author: Renchi Raju <renchi@pooh.tam.uiuc.edu>
3
* Copyright 2002-2004 by Renchi Raju
5
* This program is free software; you can redistribute it
6
* and/or modify it under the terms of the GNU General
7
* Public License as published by the Free Software Foundation;
8
* either version 2, or (at your option)
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
* ============================================================ */
28
#include <qdragobject.h>
30
#include <qapplication.h>
31
#include <qdrawutil.h>
35
#include <kglobalsettings.h>
45
#include "thumbitem.h"
46
#include "thumbview.h"
49
#define RECT_EXTENSION 300
51
class ThumbViewPrivate {
68
QPtrList<ThumbItem> selectedItems;
69
QPtrList<ThumbItem> prevSelectedItems;
73
struct ItemContainer {
74
ItemContainer(ItemContainer *p, ItemContainer *n,
76
: prev(p), next(n), rect(r) {
78
items.setAutoDelete(false);
85
ItemContainer *prev, *next;
87
QPtrList<ThumbItem> items;
89
} *firstContainer, *lastContainer;
91
ThumbItem *startDragItem;
97
ThumbItem* toolTipItem;
103
static int cmpItems( const void *n1, const void *n2 )
108
ThumbViewPrivate::SortableItem *i1 = (ThumbViewPrivate::SortableItem *)n1;
109
ThumbViewPrivate::SortableItem *i2 = (ThumbViewPrivate::SortableItem *)n2;
111
return i1->item->compare( i2->item );
115
ThumbView::ThumbView(QWidget* parent, const char* name,
117
: QScrollView(parent, name, Qt::WStaticContents | fl)
119
setBackgroundMode(Qt::NoBackground);
120
viewport()->setBackgroundMode(Qt::NoBackground);
121
viewport()->setFocusProxy(this);
122
viewport()->setFocusPolicy(QWidget::WheelFocus);
123
viewport()->setMouseTracking(true);
127
d = new ThumbViewPrivate;
133
d->pressedMoved = false;
136
d->banner = QRect(0, 0, 0, 0);
138
d->firstContainer = 0;
139
d->lastContainer = 0;
140
d->selectedItems.setAutoDelete(false);
141
d->updateTimer = new QTimer(this);
142
d->startDragItem = 0;
144
d->toolTipTimer = new QTimer();
147
connect(d->updateTimer, SIGNAL(timeout()),
149
connect(d->toolTipTimer, SIGNAL(timeout()),
150
SLOT(slotToolTip()));
152
setEnableToolTips(true);
155
ThumbView::~ThumbView()
162
delete d->updateTimer;
163
delete d->toolTipTimer;
167
void ThumbView::clear(bool update)
174
d->toolTipTimer->stop();
178
d->selectedItems.clear();
179
emit signalSelectionChanged();
181
ThumbItem *item = d->firstItem;
183
ThumbItem *tmp = item->next;
191
d->banner = QRect(0, 0, 0, 0);
193
viewport()->setUpdatesEnabled(false);
194
resizeContents(0, 0);
195
setContentsPos(0, 0);
196
viewport()->setUpdatesEnabled(true);
204
int ThumbView::count()
209
int ThumbView::index(ThumbItem* item)
214
if ( item == d->firstItem )
216
else if ( item == d->lastItem )
219
ThumbItem *i = d->firstItem;
221
while ( i && i != item ) {
230
ThumbItem* ThumbView::firstItem()
235
ThumbItem* ThumbView::lastItem()
240
void ThumbView::insertItem(ThumbItem *item)
251
d->lastItem->next = item;
252
item->prev = d->lastItem;
259
// this way one can insert items in a loop
260
// without too many paintevents
261
d->updateTimer->start(0, true);
265
void ThumbView::takeItem(ThumbItem *item)
271
// First remove item from any containers holding it
272
ThumbViewPrivate::ItemContainer *tmp = d->firstContainer;
274
tmp->items.remove(item);
278
// Remove from selected item list
279
d->selectedItems.remove(item);
281
if (d->toolTipItem == item)
284
d->toolTipTimer->stop();
288
if (item == d->firstItem) {
289
d->firstItem = d->firstItem->next;
291
d->firstItem->prev = 0;
293
d->firstItem = d->lastItem = 0;
295
else if (item == d->lastItem) {
296
d->lastItem = d->lastItem->prev;
298
d->lastItem->next = 0;
300
d->firstItem = d->lastItem = 0;
305
i->prev->next = i->next;
307
i->next->prev = i->prev;
312
QRect r(contentsRectToViewport(item->rect()));
313
viewport()->repaint(r);
318
void ThumbView::slotUpdate()
320
d->updateTimer->stop();
325
void ThumbView::sort()
327
ThumbViewPrivate::SortableItem *items
328
= new ThumbViewPrivate::SortableItem[ count() ];
330
ThumbItem *item = d->firstItem;
332
for ( ; item; item = item->next )
333
items[ i++ ].item = item;
335
qsort( items, count(), sizeof( ThumbViewPrivate::SortableItem ), cmpItems );
339
for ( i = 0; i < (int)count(); ++i ) {
340
item = items[ i ].item;
344
item->prev->next = item;
349
if ( i == (int)count() - 1 )
358
void ThumbView::setEnableToolTips(bool val)
363
d->toolTipTimer->stop();
368
void ThumbView::slotToolTip()
370
emit signalShowToolTip(d->toolTipItem);
373
void ThumbView::viewportPaintEvent(QPaintEvent *pe)
376
QRegion paintRegion(pe->region());
378
QPainter painter(viewport());
379
painter.setClipRegion(paintRegion);
381
QRect br(contentsRectToViewport(d->banner));
384
if (br.intersects(r)) {
386
QRegion clip(br.intersect(r));
387
painter.setClipRegion(clip);
388
paintBanner(&painter);
390
paintRegion -= QRect(br);
393
ThumbViewPrivate::ItemContainer *c = d->firstContainer;
394
for ( ; c; c = c->next) {
396
QRect cr(contentsRectToViewport(c->rect));
398
if (r.intersects(cr)) {
400
ThumbItem *item = c->items.first();
401
for ( ; item; item = c->items.next()) {
403
QRect ir(contentsRectToViewport(item->rect()));
405
if (r.intersects(ir)) {
407
item->paintItem(&painter, colorGroup());
409
paintRegion -= QRegion(ir);
417
painter.setClipRegion(paintRegion);
418
painter.fillRect(r, colorGroup().base());
425
void ThumbView::resizeEvent(QResizeEvent* e)
427
QScrollView::resizeEvent(e);
431
void ThumbView::rearrangeItems(bool update)
433
if (!d->firstItem || !d->lastItem)
437
int w = 0, h = 0, y = d->banner.height() + d->spacing;
439
ThumbItem *item = d->firstItem;
440
bool changedLayout = false;
444
ThumbItem *next = makeRow(item, y, changed);
445
changedLayout = changed || changedLayout;
447
w = QMAX(w, item->x() + item->width());
448
h = QMAX(h, item->y() + item->height());
451
if ( !item || !item->next )
457
w = QMAX(w, d->lastItem->x() + d->lastItem->width());
458
h = QMAX(h, d->lastItem->y() + d->lastItem->height());
460
int vw = visibleWidth();
462
viewport()->setUpdatesEnabled(false);
463
resizeContents( w, h );
464
bool doAgain = visibleWidth() != vw;
466
rearrangeItems(false);
467
viewport()->setUpdatesEnabled(true);
472
if (changedLayout && update) {
473
viewport()->update();
480
void ThumbView::triggerUpdate()
482
d->updateTimer->start(0, true);
485
ThumbItem* ThumbView::makeRow(ThumbItem *begin, int &y, bool &changed)
492
// first calculate the row height
496
ThumbItem *item = begin;
498
x += d->spacing + item->width();
499
//int maxW = visibleWidth();
500
int maxW = frameRect().width() - 20;
501
if (x > maxW && item != begin) {
505
h = QMAX(h, item->height());
507
ThumbItem *old = item;
517
// now move the items
521
if ( item == begin ) {
525
x = item->prev->x() + item->prev->width() + d->spacing;
527
changed = item->move(x, y) || changed;
538
void ThumbView::repaintBanner()
540
if (d->banner.isEmpty() || d->banner.isNull())
542
QRect br(contentsRectToViewport(d->banner));
544
viewport()->repaint(br);
547
void ThumbView::calcBanner()
549
d->banner.setRect(0, 0, 0, 0);
553
void ThumbView::paintBanner(QPainter *)
558
void ThumbView::setBannerRect(const QRect& r)
563
QRect ThumbView::bannerRect()
569
void ThumbView::drawRubber(QPainter *p)
571
if ( !p || !d->rubber )
574
QRect r(d->rubber->normalize());
576
r = contentsRectToViewport(r);
578
QPoint pnt(r.x(), r.y());
580
style().drawPrimitive(QStyle::PE_FocusRect, p,
581
QRect( pnt.x(), pnt.y(),
582
r.width(), r.height() ),
583
colorGroup(), QStyle::Style_Default,
584
QStyleOption(colorGroup().base()));
588
void ThumbView::leaveEvent(QEvent *e)
593
d->toolTipTimer->stop();
596
// nullify the d->startDragItem if the mouse
599
d->startDragItem = 0;
601
QScrollView::leaveEvent(e);
604
void ThumbView::focusOutEvent(QFocusEvent *e)
609
d->toolTipTimer->stop();
612
QScrollView::focusOutEvent(e);
615
void ThumbView::drawFrameRaised(QPainter* p)
617
QRect r = frameRect();
618
int lwidth = lineWidth();
620
const QColorGroup & g = colorGroup();
622
qDrawShadeRect( p, r, g, false, lwidth,
626
void ThumbView::drawFrameSunken(QPainter* p)
628
QRect r = frameRect();
629
int lwidth = lineWidth();
631
const QColorGroup & g = colorGroup();
633
qDrawShadeRect( p, r, g, true, lwidth,
637
void ThumbView::contentsMousePressEvent(QMouseEvent *e)
640
// If renaming any item, cancel it --------------------------
642
renamingItem->cancelRenameItem();
647
d->toolTipTimer->stop();
651
// Delete any existing rubber -------------------------------
656
p.setRasterOp(NotROP);
657
p.setPen(QPen(color0, 1));
666
d->dragStartPos = e->pos();
668
ThumbItem *item = findItem(e->pos());
671
if (e->state() & Qt::ControlButton) {
673
item->setSelected(!item->isSelected(), false);
676
else if (e->state() & Qt::ShiftButton) {
678
// different selection mode than the Trolls
680
ThumbItem *lastSelectedItem = 0;
682
bool bwdSelection = false;
684
// first go backwards
685
for (ThumbItem *it = item->prev; it; it = it->prev) {
686
if (it->isSelected()) {
687
lastSelectedItem = it;
693
bool fwdSelection = false;
695
if (!lastSelectedItem) {
697
for (ThumbItem *it = item->next; it; it = it->next) {
698
if (it->isSelected()) {
699
lastSelectedItem = it;
709
for (ThumbItem *it = lastSelectedItem;
710
it && it != item->next; it = it->next) {
711
if (!it->isSelected()) {
712
it->setSelected(true, false);
716
else if (fwdSelection) {
717
for (ThumbItem *it = item;
718
it && it != lastSelectedItem->next; it = it->next) {
719
if (!it->isSelected()) {
720
it->setSelected(true, false);
725
item->setSelected(!item->isSelected(), false);
729
emit signalSelectionChanged();
733
if (!item->isSelected()) {
734
item->setSelected(true, true);
738
d->startDragItem = item;
742
// Press outside any item. unselect all if the ctrl button is not pressed
743
if (!(e->state() & Qt::ControlButton))
749
d->prevSelectedItems.clear();
750
for (ThumbItem* item = d->selectedItems.first();
751
item; item = d->selectedItems.next())
753
d->prevSelectedItems.append(item);
757
// If not item then initiate rubber
762
d->rubber = new QRect( e->x(), e->y(), 0, 0 );
765
p.begin( viewport() );
766
p.setRasterOp( NotROP );
767
p.setPen( QPen( color0, 1 ) );
768
p.setBrush( NoBrush );
772
d->pressedMoved = false;
775
bool ThumbView::acceptToolTip(ThumbItem *, const QPoint &)
780
void ThumbView::contentsMouseMoveEvent(QMouseEvent *e)
785
if (e->state() == NoButton )
787
ThumbItem* item = findItem(e->pos());
791
if (!isActiveWindow())
794
d->toolTipTimer->stop();
799
if (item != d->toolTipItem)
802
d->toolTipTimer->stop();
805
if(acceptToolTip(item, e->pos()))
807
d->toolTipItem = item;
808
d->toolTipTimer->start(500, true);
812
if(item == d->toolTipItem && !acceptToolTip(item, e->pos()))
815
d->toolTipTimer->stop();
820
if(KGlobalSettings::changeCursorOverIcon())
823
setCursor(KCursor::handCursor());
831
d->toolTipTimer->stop();
835
if (d->startDragItem &&
836
(e->state() == LeftButton ||
837
e->state() == (LeftButton | ControlButton) ||
838
e->state() == (LeftButton | ShiftButton) ))
840
if ( (d->dragStartPos - e->pos() ).manhattanLength()
841
> QApplication::startDragDistance() )
848
if (!d->rubber) return;
850
QRect oldRubber = QRect(*d->rubber);
852
d->rubber->setRight( e->pos().x() );
853
d->rubber->setBottom( e->pos().y() );
857
viewport()->setUpdatesEnabled(false);
859
QRect nr(d->rubber->normalize());
860
QRect rubberUnion = nr.unite(oldRubber.normalize());
863
bool changed = false;
867
ThumbViewPrivate::ItemContainer *c = d->lastContainer;
868
for (; c; c = c->prev) {
869
if ( rubberUnion.intersects(c->rect) ) {
870
ThumbItem *item = c->items.last();
871
for ( ; item; item = c->items.prev() ) {
872
if (nr.intersects(item->rect())) {
873
if (!item->isSelected())
875
item->setSelected(true, false);
877
paintRegion += QRect(item->rect());
881
if (item->isSelected() &&
882
d->prevSelectedItems.containsRef(item) == 0)
884
item->setSelected(false, false);
886
paintRegion += QRect(item->rect());
894
viewport()->setUpdatesEnabled(true);
896
QRect r = *d->rubber;
897
*d->rubber = oldRubber;
900
p.begin( viewport() );
901
p.setRasterOp( NotROP );
902
p.setPen( QPen( color0, 1 ) );
903
p.setBrush( NoBrush );
909
emit signalSelectionChanged();
910
paintRegion.translate(-contentsX(), -contentsY());
911
viewport()->repaint(paintRegion);
914
ensureVisible(e->pos().x(), e->pos().y());
919
p.setRasterOp(NotROP);
920
p.setPen(QPen(color0, 1));
925
d->pressedMoved = true;
928
void ThumbView::contentsMouseReleaseEvent(QMouseEvent *e)
932
d->startDragItem = 0;
937
p.begin( viewport() );
938
p.setRasterOp( NotROP );
939
p.setPen( QPen( color0, 1 ) );
940
p.setBrush( NoBrush );
949
d->prevSelectedItems.clear();
951
if (e->button() == Qt::RightButton) {
952
ThumbItem *item = findItem(e->pos());
954
emit signalRightButtonClicked(item, e->globalPos());
956
emit signalRightButtonClicked(e->globalPos());
958
else if ((e->button() == Qt::LeftButton) &&
959
!(e->state() & Qt::ShiftButton) &&
960
!(e->state() & Qt::ControlButton)) {
961
if (d->pressedMoved) {
962
d->pressedMoved = false;
965
ThumbItem *item = findItem(e->pos());
968
item->setSelected(true, true);
969
if(KGlobalSettings::singleClick())
970
itemClickedToOpen(item);
975
void ThumbView::contentsMouseDoubleClickEvent(QMouseEvent *e)
977
if(KGlobalSettings::singleClick())
980
ThumbItem *item = findItem(e->pos());
982
itemClickedToOpen(item);
986
void ThumbView::itemClickedToOpen(ThumbItem *item)
994
renamingItem->cancelRenameItem();
996
item->setSelected(true);
997
emit signalDoubleClicked(item);
1000
void ThumbView::contentsWheelEvent(QWheelEvent *e)
1003
d->toolTipTimer->stop();
1006
QScrollView::contentsWheelEvent(e);
1007
viewport()->update();
1010
void ThumbView::rebuildContainers()
1014
ThumbItem *item = d->firstItem;
1017
ThumbViewPrivate::ItemContainer* c = d->lastContainer;
1019
if (c->rect.contains(item->rect())) {
1020
c->items.append(item);
1023
else if (c->rect.intersects(item->rect())) {
1024
c->items.append( item );
1028
c = d->lastContainer;
1030
c->items.append(item);
1035
if (item->y() < c->rect.y() && c->prev) {
1043
c = d->lastContainer;
1049
void ThumbView::appendContainer()
1053
s = QSize( INT_MAX - 1, RECT_EXTENSION );
1055
if (!d->firstContainer) {
1057
new ThumbViewPrivate::ItemContainer(0, 0, QRect(QPoint(0, 0), s));
1058
d->lastContainer = d->firstContainer;
1061
d->lastContainer = new ThumbViewPrivate::ItemContainer(
1062
d->lastContainer, 0, QRect(d->lastContainer->rect.bottomLeft(), s));
1066
void ThumbView::deleteContainers()
1068
ThumbViewPrivate::ItemContainer *c = d->firstContainer, *tmpc;
1074
d->firstContainer = d->lastContainer = 0;
1077
void ThumbView::updateItemContainer(ThumbItem *item)
1081
// First remove item from any containers holding it
1082
ThumbViewPrivate::ItemContainer *tmp = d->firstContainer;
1084
tmp->items.remove(item);
1088
ThumbViewPrivate::ItemContainer *c = d->firstContainer;
1091
c = d->firstContainer;
1094
const QRect ir = item->rect();
1095
bool contains = false;
1097
if (c->rect.intersects(ir)) {
1098
contains = c->rect.contains(ir);
1105
c = d->lastContainer;
1113
c->items.append(item);
1119
c = d->lastContainer;
1121
c->items.append( item );
1124
if (contentsWidth() < ir.right() ||
1125
contentsHeight() < ir.bottom())
1126
resizeContents(QMAX(contentsWidth(), ir.right()),
1127
QMAX(contentsHeight(), ir.bottom()));
1131
ThumbItem* ThumbView::findItem(const QPoint& pos)
1133
if ( !d->firstItem )
1136
ThumbViewPrivate::ItemContainer *c = d->lastContainer;
1137
for (; c; c = c->prev) {
1138
if ( c->rect.contains(pos) ) {
1139
ThumbItem *item = c->items.last();
1140
for ( ; item; item = c->items.prev() )
1141
if ( item->rect().contains( pos ) )
1149
ThumbItem* ThumbView::findItem(const QString& text)
1156
ThumbItem *item = 0;
1157
for (item = d->firstItem; item; item = item->next) {
1158
if (item->text() == text) {
1171
QRect ThumbView::contentsRectToViewport(const QRect& r)
1173
QRect vr = QRect(contentsToViewport(QPoint(r.x(), r.y())),
1178
void ThumbView::clearSelection()
1181
for (ThumbItem* item = d->firstItem; item; item = item->next) {
1182
if (item->isSelected()) {
1183
item->setSelected(false, false);
1184
d->selectedItems.remove(item);
1187
blockSignals(false);
1188
emit signalSelectionChanged();
1191
void ThumbView::selectAll()
1194
for (ThumbItem* item = d->firstItem; item; item = item->next) {
1195
if (!item->isSelected()) {
1196
item->setSelected(true, false);
1197
d->selectedItems.append(item);
1200
blockSignals(false);
1201
emit signalSelectionChanged();
1204
void ThumbView::invertSelection()
1207
for (ThumbItem* item = d->firstItem; item; item = item->next) {
1208
if (!item->isSelected()) {
1209
item->setSelected(true, false);
1210
d->selectedItems.append(item);
1213
item->setSelected(false, false);
1214
d->selectedItems.remove(item);
1217
blockSignals(false);
1218
emit signalSelectionChanged();
1221
void ThumbView::selectItem(ThumbItem* item, bool select)
1227
d->selectedItems.prepend(item);
1231
d->selectedItems.remove(item);
1234
emit signalSelectionChanged();
1237
void ThumbView::emitRenamed(ThumbItem *item)
1241
emit signalItemRenamed(item);
1244
void ThumbView::startDrag()
1246
if (!d->startDragItem) return;
1249
for (ThumbItem *it = firstItem(); it; it=it->nextItem()) {
1250
if (it->isSelected()) {
1251
uris.append(it->text().utf8());
1255
QUriDrag* drag = new QUriDrag(uris, this);
1257
drag->setPixmap(*d->startDragItem->pixmap());
1258
d->startDragItem = 0;
1263
void ThumbView::contentsDropEvent(QDropEvent *e)
1268
if (e->source() == this) {
1276
void ThumbView::keyPressEvent(QKeyEvent *e)
1278
bool handled = false;
1280
if ( !d->firstItem )
1283
ThumbItem *currItem = d->selectedItems.first();
1285
switch ( e->key() ) {
1288
d->firstItem->setSelected(true, true);
1289
ensureItemVisible(d->firstItem);
1295
d->lastItem->setSelected(true, true);
1296
ensureItemVisible(d->lastItem);
1305
emit signalReturnPressed(currItem);
1312
ThumbItem *item = currItem ? currItem->next : d->firstItem;
1315
keySelectItem(item, e->state() & Qt::ShiftButton);
1316
ensureItemVisible(item);
1323
ThumbItem *item = currItem ? currItem->prev : d->firstItem;
1326
keySelectItem(item, e->state() & Qt::ShiftButton);
1327
ensureItemVisible(item);
1335
currItem = currItem ? currItem : d->firstItem;
1337
int x = currItem->x() + currItem->width()/2;
1338
int y = currItem->y() - d->spacing*2;
1340
ThumbItem *item = 0;
1342
while (!item && y > 0) {
1343
item = findItem(QPoint(x,y));
1344
y -= d->spacing * 2;
1349
keySelectItem(item, e->state() & Qt::ShiftButton);
1350
ensureItemVisible(item);
1358
currItem = currItem ? currItem : d->firstItem;
1360
int x = currItem->x() + currItem->width()/2;
1361
int y = currItem->y() + currItem->height() +
1364
ThumbItem *item = 0;
1366
while (!item && y < contentsHeight()) {
1367
item = findItem(QPoint(x,y));
1368
y += d->spacing * 2;
1373
keySelectItem(item, e->state() & Qt::ShiftButton);
1374
ensureItemVisible(item);
1383
currItem = currItem ? currItem : d->firstItem;
1385
QRect r( 0, currItem->y() + visibleHeight(),
1386
contentsWidth(), visibleHeight() );
1387
ThumbItem *ni = findFirstVisibleItem(r);
1389
r = QRect( 0, currItem->y() + currItem->height(),
1390
contentsWidth(), contentsHeight() );
1391
ni = findLastVisibleItem( r );
1394
ni->setSelected(true, true);
1395
ensureItemVisible(ni);
1403
currItem = currItem ? currItem : d->firstItem;
1405
QRect r(0, currItem->y() - visibleHeight(),
1406
contentsWidth(), visibleHeight() );
1407
ThumbItem *ni = findFirstVisibleItem(r);
1409
r = QRect( 0, 0, contentsWidth(), currItem->y() );
1410
ni = findFirstVisibleItem( r );
1413
ni->setSelected(true, true);
1414
ensureItemVisible(ni);
1427
viewport()->update();
1428
emit signalSelectionChanged();
1432
void ThumbView::keySelectItem(ThumbItem* item, bool shift)
1439
if (!item->isSelected())
1441
item->setSelected(true,false);
1445
d->selectedItems.removeRef(item);
1446
d->selectedItems.prepend(item);
1451
item->setSelected(true,true);
1455
void ThumbView::ensureItemVisible(ThumbItem *item)
1460
if ( item->y() == d->firstItem->y() )
1462
int w = item->width();
1463
ensureVisible( item->x() + w / 2, 0, w/2+1, 0 );
1467
int w = item->width();
1468
int h = item->height();
1469
ensureVisible( item->x() + w / 2, item->y() + h / 2,
1470
w / 2 + 1, h / 2 + 1 );
1474
ThumbItem* ThumbView::findFirstVisibleItem(const QRect &r ) const
1476
ThumbViewPrivate::ItemContainer *c = d->firstContainer;
1478
bool alreadyIntersected = false;
1479
for ( ; c; c = c->next ) {
1480
if ( c->rect.intersects( r ) ) {
1481
alreadyIntersected = true;
1482
ThumbItem *item = c->items.first();
1483
for ( ; item; item = c->items.next() ) {
1484
if ( r.intersects( item->rect() ) ) {
1488
QRect r2 = item->rect();
1489
QRect r3 = i->rect();
1490
if ( r2.y() < r3.y() )
1492
else if ( r2.y() == r3.y() &&
1499
if ( alreadyIntersected )
1507
ThumbItem* ThumbView::findLastVisibleItem(const QRect &r ) const
1509
ThumbViewPrivate::ItemContainer *c = d->firstContainer;
1511
bool alreadyIntersected = false;
1512
for ( ; c; c = c->next ) {
1513
if ( c->rect.intersects( r ) ) {
1514
alreadyIntersected = true;
1515
ThumbItem *item = c->items.first();
1516
for ( ; item; item = c->items.next() ) {
1517
if ( r.intersects( item->rect() ) ) {
1521
QRect r2 = item->rect();
1522
QRect r3 = i->rect();
1523
if ( r2.y() > r3.y() )
1525
else if ( r2.y() == r3.y() &&
1532
if ( alreadyIntersected )
1540
#include "thumbview.moc"