toolbox drag improvement by Lukas Dolezal

BUG:178707

svn path=/trunk/KDE/kdelibs/; revision=901337
This commit is contained in:
Aaron J. Seigo 2008-12-25 08:29:03 +00:00
parent 0f70316466
commit d2baf76321

View File

@ -58,7 +58,7 @@ public:
int size; int size;
QSize iconSize; QSize iconSize;
ToolBox::Corner corner; ToolBox::Corner corner;
QPoint dragStart; QPoint dragStartRelative;
QTransform viewTransform; QTransform viewTransform;
bool hidden : 1; bool hidden : 1;
bool showing : 1; bool showing : 1;
@ -194,7 +194,8 @@ ToolBox::Corner ToolBox::corner() const
void ToolBox::mousePressEvent(QGraphicsSceneMouseEvent *event) void ToolBox::mousePressEvent(QGraphicsSceneMouseEvent *event)
{ {
event->accept(); event->accept();
d->dragStart = mapToParent(event->pos()).toPoint(); // set grab position relative to toolbox
d->dragStartRelative = mapToParent(event->pos()).toPoint() - pos().toPoint();
} }
void ToolBox::mouseMoveEvent(QGraphicsSceneMouseEvent *event) void ToolBox::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
@ -203,9 +204,6 @@ void ToolBox::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
return; return;
} }
//TODOs:
// move relative to where on the toolbox it was grabbed
// sticky points at midpoints
d->dragging = true; d->dragging = true;
d->userMoved = true; d->userMoved = true;
const QPoint newPos = mapToParent(event->pos()).toPoint(); const QPoint newPos = mapToParent(event->pos()).toPoint();
@ -219,6 +217,36 @@ void ToolBox::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
int x = curPos.x(); int x = curPos.x();
int y = curPos.y(); int y = curPos.y();
// jump to the nearest desktop border
int distanceToLeft = newPos.x() - d->dragStartRelative.x();
int distanceToRight = areaWidth - w - distanceToLeft;
int distanceToTop = newPos.y() - d->dragStartRelative.y();
int distanceToBottom = areaHeight - h - distanceToTop;
// decide which border is the nearest
if (distanceToLeft < distanceToTop && distanceToLeft < distanceToRight &&
distanceToLeft < distanceToBottom ) {
x = 0;
y = (newPos.y() - d->dragStartRelative.y());
}
else if (distanceToRight < distanceToTop && distanceToRight < distanceToLeft &&
distanceToRight < distanceToBottom) {
x = areaWidth - w;
y = (newPos.y() - d->dragStartRelative.y());
}
else if (distanceToTop < distanceToLeft && distanceToTop < distanceToRight &&
distanceToTop < distanceToBottom ) {
y = 0;
x = (newPos.x() - d->dragStartRelative.x());
}
else if (distanceToBottom < distanceToLeft && distanceToBottom < distanceToRight &&
distanceToBottom < distanceToTop) {
y = areaHeight - h;
x = (newPos.x() - d->dragStartRelative.x());
}
//kDebug() << "distances from borders" << (newPos - d->dragStartRelative) << distanceToLeft << distanceToRight << distanceToTop << distanceToBottom << "=>" << x << y;
/*
if (y == 0 || y + h >= areaHeight) { if (y == 0 || y + h >= areaHeight) {
x = curPos.x() + (newPos.x() - d->dragStart.x()); x = curPos.x() + (newPos.x() - d->dragStart.x());
if (x < 0) { if (x < 0) {
@ -239,11 +267,10 @@ void ToolBox::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
y = areaHeight - h; y = areaHeight - h;
} }
} }
*/
x = qBound(0, x, areaWidth - w); x = qBound(0, x, areaWidth - w);
y = qBound(0, y, areaHeight - h); y = qBound(0, y, areaHeight - h);
Corner newCorner = d->corner; Corner newCorner = d->corner;
if (x == 0) { if (x == 0) {
if (y == 0) { if (y == 0) {
@ -275,7 +302,6 @@ void ToolBox::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
} }
setPos(x, y); setPos(x, y);
d->dragStart = newPos;
} }
void ToolBox::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) void ToolBox::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
@ -284,7 +310,6 @@ void ToolBox::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
emit toggled(); emit toggled();
} }
d->dragStart = QPoint();
d->dragging = false; d->dragging = false;
KConfigGroup cg(d->containment->config()); KConfigGroup cg(d->containment->config());
save(cg); save(cg);