| Summary: | Problem when moving end point of line outside of parent | ||
|---|---|---|---|
| Product: | [Applications] kst | Reporter: | Andrew Walker <arwalker> |
| Component: | general | Assignee: | kst |
| Status: | RESOLVED FIXED | ||
| Severity: | normal | ||
| Priority: | NOR | ||
| Version First Reported In: | 1.x | ||
| Target Milestone: | --- | ||
| Platform: | Compiled Sources | ||
| OS: | Linux | ||
| Latest Commit: | Version Fixed/Implemented In: | ||
| Sentry Crash Report: | |||
|
Description
Andrew Walker
2006-08-02 19:34:28 UTC
The fix for this is the 2 line change which I mentioned in CCBUG:131679 On Wed, 2006-08-02 at 17:34 +0000, Andrew Walker wrote: [bugs.kde.org quoted mail] SVN commit 569391 by arwalker:
BUG:131738 Better restrict a line being resized to its parent - also more consistent with behaviour during line creation
M +12 -8 kstgfxmousehandlerutils.cpp
M +8 -11 ksttoplevelview.cpp
--- trunk/extragear/graphics/kst/src/libkstapp/kstgfxmousehandlerutils.cpp #569390:569391
@@ -29,10 +29,14 @@
QPoint KstGfxMouseHandlerUtils::findNearestPtOnLine(const QPoint& fromPoint, const QPoint& toPoint, const QPoint& pos, const QRect &bounds) {
QPoint npos = pos;
- if (fromPoint.y() == toPoint.y() ) {
+ if (fromPoint.y() == toPoint.y()) {
npos.setY(fromPoint.y());
+ npos.setX(kMax(npos.x(), bounds.left()));
+ npos.setX(kMin(npos.x(), bounds.right()));
} else if (fromPoint.x() == toPoint.x()) {
npos.setX(fromPoint.x());
+ npos.setY(kMax(npos.y(), bounds.top()));
+ npos.setY(kMin(npos.y(), bounds.bottom()));
} else {
double newxpos, newypos;
double slope = double(toPoint.y() - fromPoint.y()) / double(toPoint.x() - fromPoint.x());
@@ -61,14 +65,14 @@
if (maintainAspect) {
QPoint fakeMovePoint = anchorPoint + QPoint(quadrantSign(pos,anchorPoint)*abs((movePoint - anchorPoint).x()),abs((movePoint - anchorPoint).y())); // allow the rectangle to flip.
-
npos = findNearestPtOnLine(anchorPoint, fakeMovePoint, pos, bounds);
}
-
+
newSize.setTopLeft(anchorPoint);
newSize.setBottomRight(npos);
newSize = newSize.normalize();
-
+ newSize = bounds.intersect(newSize);
+
return newSize;
}
@@ -183,9 +187,9 @@
QPoint mouseDisplacement(pos - mouseOrigin); // for picking type of line..
if (mouseDisplacement.x() == 0) { // vertical line.
- npos = findNearestPtOnLine(mouseOrigin,mouseOrigin + QPoint(0,1), pos, bounds);
+ npos = findNearestPtOnLine(mouseOrigin, mouseOrigin + QPoint(0,1), pos, bounds);
} else if (mouseDisplacement.y() == 0) { // horizontal line.
- npos = findNearestPtOnLine(mouseOrigin,mouseOrigin + QPoint(1,0), pos, bounds);
+ npos = findNearestPtOnLine(mouseOrigin, mouseOrigin + QPoint(1,0), pos, bounds);
} else { // 45deg or vertical or horizontal.
int dx = int(round(2.0*mouseDisplacement.x()/abs(mouseDisplacement.y())));
int dy = int(round(2.0*mouseDisplacement.y()/abs(mouseDisplacement.x())));
@@ -197,9 +201,9 @@
dy /= abs(dy);
}
- npos = findNearestPtOnLine(mouseOrigin,mouseOrigin + QPoint(dx,dy), pos, bounds);
+ npos = findNearestPtOnLine(mouseOrigin, mouseOrigin + QPoint(dx,dy), pos, bounds);
}
- return QRect(mouseOrigin,npos);
+ return QRect(mouseOrigin, npos);
}
}
--- trunk/extragear/graphics/kst/src/libkstapp/ksttoplevelview.cpp #569390:569391
@@ -782,14 +782,7 @@
// for now we only know how to deal with lines
const QRect bounds(_pressTarget->_parent->geometry());
- QPoint npos(pos);
- //pos must be inside the parent
- npos.setX(kMax(npos.x(), bounds.left()));
- npos.setX(kMin(npos.x(), bounds.right()));
- npos.setY(kMin(npos.y(), bounds.bottom()));
- npos.setY(kMax(npos.y(), bounds.top()));
-
if (KstViewLinePtr line = kst_cast<KstViewLine>(_pressTarget)) {
QPoint movePoint, anchorPoint;
QPoint *fromPoint, *toPoint;
@@ -806,13 +799,17 @@
fromPoint = &anchorPoint;
toPoint = &movePoint;
} else {
- abort();
+ return;
}
-
+
if (maintainAspect) {
- movePoint = KstGfxMouseHandlerUtils::findNearestPtOnLine(anchorPoint, movePoint, npos, bounds);
+ movePoint = KstGfxMouseHandlerUtils::findNearestPtOnLine(anchorPoint, movePoint, pos, bounds);
} else {
- movePoint = npos; // already enforced pos inside parent.
+ if (bounds.contains(pos)) {
+ movePoint = pos;
+ } else {
+ movePoint = KstGfxMouseHandlerUtils::findNearestPtOnLine(anchorPoint, pos, pos, bounds);
+ }
}
const QRect old(_prevBand);
|