[Kst] [Bug 127524] Maintain aspect modifier doesn't work as expected for lines/arrows.
George Staikos
staikos at kde.org
Sat May 27 12:19:23 CEST 2006
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
http://bugs.kde.org/show_bug.cgi?id=127524
------- Additional Comments From staikos kde org 2006-05-27 12:18 -------
Sorry but the work on this feature had to be moved to a branch. It's too
unstable right now and needs some review I think. You can find the branch in
branches/work/kst/viewaspect.
On Monday 22 May 2006 17:20, Duncan Hanson wrote:
> SVN commit 543826 by dhanson:
>
> CCBUG:127524 mostly fixed.
>
> M +44 -67 ksttoplevelview.cpp
>
>
> --- trunk/extragear/graphics/kst/src/libkstapp/ksttoplevelview.cpp
> #543825:543826 @ -799,50 +799,54 @
> pos.setY(QMAX(pos.y(), geometry().top()));
>
> if (KstViewLinePtr line = kst_cast<KstViewLine>(_pressTarget)) {
> - const QRect old(_prevBand);
> - double aspect;
> - if (line->to().x() != line->from().x()) {
> - aspect = double(line->to().y() - line->from().y()) /
> double(line->to().x() - line->from().x()); - } else {
> - if (line->to().y() < line->from().y()) {
> - aspect = -1.0E300;
> - } else {
> - aspect = 1.0E300;
> - }
> - }
> - QPoint fromPoint, toPoint;
> + QPoint movePoint, anchorPoint;
> + QPoint *fromPoint, *toPoint;
> +
> if (_pressDirection & UP) {
> // UP means we are on the start endpoint
> - toPoint = line->to();
> - if (maintainAspect) {
> - double absAspect = fabs(aspect);
> - if (absAspect < 500 && (double(abs((pos.y() -
> toPoint.y())/(pos.x() - toPoint.x()))) < aspect || absAspect < 0.1)) { -
> fromPoint = QPoint(pos.x(), toPoint.y() + int(aspect*(pos.x() -
> toPoint.x()))); - } else {
> - fromPoint = QPoint(toPoint.x() + int((pos.y() -
> toPoint.y())/aspect), pos.y()); - }
> - } else {
> - fromPoint = pos;
> - }
> - } else if (_pressDirection & DOWN) {
> + movePoint = line->from();
> + anchorPoint = line->to();
> + fromPoint = &movePoint;
> + toPoint = &anchorPoint;
> + } else { // (_pressDirection & DOWN)
> // DOWN means we are on the end endpoint
> - fromPoint = line->from();
> - if (maintainAspect) {
> - double absAspect = fabs(aspect);
> - if (absAspect < 500 && (double(abs((pos.y() -
> toPoint.y())/(pos.x() - toPoint.x()))) < aspect || absAspect < 0.1)) { -
> toPoint = QPoint(pos.x(), fromPoint.y() + int(aspect*(pos.x() -
> fromPoint.x()))); - } else {
> - toPoint = QPoint(fromPoint.x() + int((pos.y() -
> fromPoint.y())/aspect), pos.y()); - }
> + movePoint = line->to();
> + anchorPoint = line->from();
> + fromPoint = &anchorPoint;
> + toPoint = &movePoint;
> + }
> +
> + if (maintainAspect) {
> + if (fromPoint->x() == toPoint->x()) {
> + // FIXME: implement. should not be necessary right now (because of
> the way lines are constructed). + } else if (fromPoint->y() ==
> toPoint->y()) {
> + // FIXME: implement. should not be necessary right now (because of
> the way lines are constructed). } else {
> - toPoint = pos;
> + double slope = double(toPoint->y() - fromPoint->y()) /
> double(toPoint->x() - fromPoint->x()); +
> + double newxpos, newypos;
> +
> + newxpos = (((double)pos.y()) + slope*((double)anchorPoint.x()) +
> ((double)pos.x())/slope -((double)anchorPoint.y())) / (slope + 1.0/slope);
> //we want the tip of our new line to be as close as possible to the
> original line (while still maintaining aspect). +
> + newxpos = QMIN(newxpos, geometry().right()); //ensure that our x
> is inside the tlv. + newxpos = QMAX(newxpos, geometry().left()); //
> ""
> + newypos = slope*(newxpos - ((double)anchorPoint.x())) +
> ((double)anchorPoint.y()); //consistency w/ x. +
> + newypos = QMIN(newypos, geometry().bottom()); //ensure that our y
> is inside the tlv. + newypos = QMAX(newypos, geometry().top()); //
> ""
> + newxpos = ((double)anchorPoint.x()) + (newypos -
> ((double)anchorPoint.y()))/slope; // x will still be inside the tlv because
> we have just moved newypos closer to anchorPoint.y(), which will send
> newxpos closer to anchorPoint.x(), ie. in the direction further 'into' the
> tlv. +
> + movePoint.setX((int)newxpos);
> + movePoint.setY((int)newypos);
> }
> } else {
> - abort();
> + movePoint = pos; // already enforced pos inside tlv.
> }
>
> - _prevBand.setTopLeft(fromPoint);
> - _prevBand.setBottomRight(toPoint);
> + const QRect old(_prevBand);
> +
> + _prevBand.setTopLeft(*fromPoint);
> + _prevBand.setBottomRight(*toPoint);
>
> if (old != _prevBand) {
> KstPainter p;
> @ -999,40 +1003,13 @
>
> void KstTopLevelView::releasePressLayoutModeEndPoint(const QPoint& pos,
> bool shift) { Q_UNUSED(shift)
> + Q_UNUSED(pos)
>
> if (KstViewLinePtr line = kst_cast<KstViewLine>(_pressTarget)) {
> if (_prevBand.left() != -1 && _prevBand.top() != -1) {
> - if (_pressDirection & UP) {
> - // UP means we are on the start endpoint
> - const QPoint toPoint(line->to());
> - QRect band(pos, toPoint);
> - band = band.normalize().intersect(geometry());
> - if (toPoint == band.topLeft()) {
> - line->setFrom(band.bottomRight());
> - } else if (toPoint == band.bottomLeft()) {
> - line->setFrom(band.topRight());
> - } else if (toPoint == band.topRight()) {
> - line->setFrom(band.bottomLeft());
> - } else {
> - line->setFrom(band.topLeft());
> - }
> - } else if (_pressDirection & DOWN) {
> - // DOWN means we are on the end endpoint
> - const QPoint fromPoint(line->from());
> - QRect band(fromPoint, pos);
> - band = band.normalize().intersect(geometry());
> - if (fromPoint == band.topLeft()) {
> - line->setTo(band.bottomRight());
> - } else if (fromPoint == band.bottomLeft()) {
> - line->setTo(band.topRight());
> - } else if (fromPoint == band.topRight()) {
> - line->setTo(band.bottomLeft());
> - } else {
> - line->setTo(band.topLeft());
> - }
> - } else {
> - abort();
> - }
> + line->setFrom(_prevBand.topLeft());
> + line->setTo(_prevBand.bottomRight());
> +
> _onGrid = false;
>
> // reparent
> _______________________________________________
> Kst mailing list
> Kst kde org
> https://mail.kde.org/mailman/listinfo/kst
More information about the Kst
mailing list