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

Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
pull/2/head
Michele Calgaro 9 years ago
parent dad70b4c52
commit d27f4e2fc3

@ -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