summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichele Calgaro <[email protected]>2015-09-07 23:58:02 +0900
committerMichele Calgaro <[email protected]>2015-09-08 00:00:33 +0900
commitdc2dea07f70096f5a771b17a63f4c4f5fe8a809c (patch)
treea9466c6f17891bdfcd3575f7c0c7e5dece006102 /src
parent8eefba828fef6908ef67d610e9fbbb4abb28d3ba (diff)
downloadqt3-dc2dea07f70096f5a771b17a63f4c4f5fe8a809c.tar.gz
qt3-dc2dea07f70096f5a771b17a63f4c4f5fe8a809c.zip
Fixed (again) search algorithm for iconview widget. This resolves (again) bug 420.r14.0.3r14.0.2
(cherry picked from commit d27f4e2fc304208a404c64279a4e32b1a94b05a9) Signed-off-by: Michele Calgaro <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/iconview/qiconview.cpp46
1 files changed, 22 insertions, 24 deletions
diff --git a/src/iconview/qiconview.cpp b/src/iconview/qiconview.cpp
index df9a1be..2eb7b71 100644
--- a/src/iconview/qiconview.cpp
+++ b/src/iconview/qiconview.cpp
@@ -5313,23 +5313,21 @@ void QIconView::keyPressEvent( QKeyEvent *e )
/*
Finds the closest item in the direction \a dir starting from the specified \a fromItem.
- If the arrangement is LeftToRight (icon view mode): use center as item reference
- If the arrangement is TopToBottom (multicolumn view mode): use left top corner as item reference
+ If the arrangement is LeftToRight (icon view mode): use (center, top) as item reference
+ If the arrangement is TopToBottom (multicolumn view mode): use (left, top) as item reference
+ This is to allow for smooth scrolling when using the keyboard arrow keys.
*/
QIconViewItem* QIconView::findItem(Direction dir, const QIconViewItem *fromItem) const
{
QIconViewItem *closestItem=NULL;
int distPri=0, distSec=0;
int itemDistancePri=0, itemDistanceSec=0;
-
- QPoint pos;
+
+ QPoint pos=fromItem->rect().topLeft();
if (d->arrangement == LeftToRight) {
- pos=fromItem->rect().center();
- }
- else {
- pos=fromItem->rect().topLeft();
+ pos.setX(fromItem->rect().center().x());
}
-
+
QRect searchRect;
switch (dir) {
case DirDown:
@@ -5359,16 +5357,16 @@ QIconViewItem* QIconView::findItem(Direction dir, const QIconViewItem *fromItem)
// DirDown/DirUp : primary distance X, secondary distance Y
// DirLeft/DirRight: primary distance Y, secondary distance X
if (d->arrangement == LeftToRight) {
- // Left to right arrangement (icon view mode): use center as item reference
+ // Left to right arrangement (icon view mode): use (center, top) as item reference
switch (dir) {
case DirDown:
if (ir.center().x() > pos.x()) {
distPri = ir.center().x()-pos.x();
- distSec = ir.center().y();
+ distSec = ir.top();
}
- else if (ir.center().x() == pos.x() && ir.center().y() > pos.y()) {
+ else if (ir.center().x() == pos.x() && ir.top() > pos.y()) {
distPri = 0;
- distSec = ir.center().y()-pos.y();
+ distSec = ir.top()-pos.y();
}
else {
itemOK = false;
@@ -5378,11 +5376,11 @@ QIconViewItem* QIconView::findItem(Direction dir, const QIconViewItem *fromItem)
case DirUp:
if (ir.center().x() < pos.x()) {
distPri = pos.x()-ir.center().x();
- distSec = contentsHeight()-ir.center().y();
+ distSec = contentsHeight()-ir.top();
}
- else if (ir.center().x() == pos.x() && ir.center().y() < pos.y()) {
+ else if (ir.center().x() == pos.x() && ir.top() < pos.y()) {
distPri = 0;
- distSec = pos.y()-ir.center().y();
+ distSec = pos.y()-ir.top();
}
else {
itemOK = false;
@@ -5390,11 +5388,11 @@ QIconViewItem* QIconView::findItem(Direction dir, const QIconViewItem *fromItem)
break;
case DirRight:
- if (ir.center().y() > pos.y()) {
- distPri = ir.center().y()-pos.y();
+ if (ir.top() > pos.y()) {
+ distPri = ir.top()-pos.y();
distSec = ir.center().x();
}
- else if (ir.center().y() == pos.y() && ir.center().x() > pos.x()) {
+ else if (ir.top() == pos.y() && ir.center().x() > pos.x()) {
distPri = 0;
distSec = ir.center().x()-pos.x();
}
@@ -5404,11 +5402,11 @@ QIconViewItem* QIconView::findItem(Direction dir, const QIconViewItem *fromItem)
break;
case DirLeft:
- if (ir.center().y() < pos.y()) {
- distPri = pos.y()-ir.center().y();
+ if (ir.top() < pos.y()) {
+ distPri = pos.y()-ir.top();
distSec = contentsWidth()-ir.center().x();
}
- else if (ir.center().y() == pos.y() && ir.center().x() < pos.x()) {
+ else if (ir.top() == pos.y() && ir.center().x() < pos.x()) {
distPri = 0;
distSec = pos.x()-ir.center().x();
}
@@ -5422,8 +5420,8 @@ QIconViewItem* QIconView::findItem(Direction dir, const QIconViewItem *fromItem)
break;
}
}
- else {
- // Top to bottom arrangement (multicolumn view mode): use left top corner as item reference
+ else {
+ // Top to bottom arrangement (multicolumn view mode): use (left, top) as item reference
switch (dir) {
case DirDown:
if (ir.left() > pos.x()) {