Fixed (again) search algorithm for iconview widget. This resolves (again) bug 420.

(cherry picked from commit d27f4e2fc3)
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
r14.0.x r14.0.3
Michele Calgaro 9 years ago
parent 8eefba828f
commit dc2dea07f7

@ -5313,23 +5313,21 @@ void QIconView::keyPressEvent( QKeyEvent *e )
/* /*
Finds the closest item in the direction \a dir starting from the specified \a fromItem. 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 LeftToRight (icon view mode): use (center, top) as item reference
If the arrangement is TopToBottom (multicolumn view mode): use left top corner 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* QIconView::findItem(Direction dir, const QIconViewItem *fromItem) const
{ {
QIconViewItem *closestItem=NULL; QIconViewItem *closestItem=NULL;
int distPri=0, distSec=0; int distPri=0, distSec=0;
int itemDistancePri=0, itemDistanceSec=0; int itemDistancePri=0, itemDistanceSec=0;
QPoint pos; QPoint pos=fromItem->rect().topLeft();
if (d->arrangement == LeftToRight) { if (d->arrangement == LeftToRight) {
pos=fromItem->rect().center(); pos.setX(fromItem->rect().center().x());
}
else {
pos=fromItem->rect().topLeft();
} }
QRect searchRect; QRect searchRect;
switch (dir) { switch (dir) {
case DirDown: case DirDown:
@ -5359,16 +5357,16 @@ QIconViewItem* QIconView::findItem(Direction dir, const QIconViewItem *fromItem)
// DirDown/DirUp : primary distance X, secondary distance Y // DirDown/DirUp : primary distance X, secondary distance Y
// DirLeft/DirRight: primary distance Y, secondary distance X // DirLeft/DirRight: primary distance Y, secondary distance X
if (d->arrangement == LeftToRight) { 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) { switch (dir) {
case DirDown: case DirDown:
if (ir.center().x() > pos.x()) { if (ir.center().x() > pos.x()) {
distPri = 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; distPri = 0;
distSec = ir.center().y()-pos.y(); distSec = ir.top()-pos.y();
} }
else { else {
itemOK = false; itemOK = false;
@ -5378,11 +5376,11 @@ QIconViewItem* QIconView::findItem(Direction dir, const QIconViewItem *fromItem)
case DirUp: case DirUp:
if (ir.center().x() < pos.x()) { if (ir.center().x() < pos.x()) {
distPri = pos.x()-ir.center().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; distPri = 0;
distSec = pos.y()-ir.center().y(); distSec = pos.y()-ir.top();
} }
else { else {
itemOK = false; itemOK = false;
@ -5390,11 +5388,11 @@ QIconViewItem* QIconView::findItem(Direction dir, const QIconViewItem *fromItem)
break; break;
case DirRight: case DirRight:
if (ir.center().y() > pos.y()) { if (ir.top() > pos.y()) {
distPri = ir.center().y()-pos.y(); distPri = ir.top()-pos.y();
distSec = ir.center().x(); 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; distPri = 0;
distSec = ir.center().x()-pos.x(); distSec = ir.center().x()-pos.x();
} }
@ -5404,11 +5402,11 @@ QIconViewItem* QIconView::findItem(Direction dir, const QIconViewItem *fromItem)
break; break;
case DirLeft: case DirLeft:
if (ir.center().y() < pos.y()) { if (ir.top() < pos.y()) {
distPri = pos.y()-ir.center().y(); distPri = pos.y()-ir.top();
distSec = contentsWidth()-ir.center().x(); 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; distPri = 0;
distSec = pos.x()-ir.center().x(); distSec = pos.x()-ir.center().x();
} }
@ -5422,8 +5420,8 @@ QIconViewItem* QIconView::findItem(Direction dir, const QIconViewItem *fromItem)
break; break;
} }
} }
else { else {
// Top to bottom arrangement (multicolumn view mode): use left top corner as item reference // Top to bottom arrangement (multicolumn view mode): use (left, top) as item reference
switch (dir) { switch (dir) {
case DirDown: case DirDown:
if (ir.left() > pos.x()) { if (ir.left() > pos.x()) {

Loading…
Cancel
Save