]> Shamusworld >> Repos - architektonas/commitdiff
Object movement and moving objects to intersections.
authorShamus Hammons <jlhamm@acm.org>
Tue, 7 Feb 2017 02:27:33 +0000 (20:27 -0600)
committerShamus Hammons <jlhamm@acm.org>
Tue, 7 Feb 2017 02:27:33 +0000 (20:27 -0600)
Added the ability to move selected objects by 1 BU using the arrow keys;
fixed the object movement code to allow moving onto object
intersections.

src/drawingview.cpp
src/drawingview.h
src/utils.cpp
src/utils.h

index 1fd0482a83d266c0e313081f878ded884655b649..a86e857880402542b3bdf4d53c16d4bb8133f4e7 100644 (file)
@@ -48,7 +48,8 @@ DrawingView::DrawingView(QWidget * parent/*= NULL*/): QWidget(parent),
        ctrlDown(false),
        gridBackground(BACKGROUND_MAX_SIZE, BACKGROUND_MAX_SIZE),
        scale(1.0), offsetX(-10), offsetY(-10), document(true),
-       gridPixels(0), collided(false), hoveringIntersection(false)
+       gridPixels(0), collided(false), hoveringIntersection(false),
+       dragged(NULL), draggingObject(false)
 {
 //wtf? doesn't work except in c++11??? document = { 0 };
        setBackgroundRole(QPalette::Base);
@@ -1172,12 +1173,12 @@ void DrawingView::mousePressEvent(QMouseEvent * event)
                        else if (Global::snapToGrid)
                                point = SnapPointToGrid(point);
 
-                       //Also, may want to figure out if hovering over a snap point on an object,
-                       //snap to grid if not.
+                       //Also, may want to figure out if hovering over a snap point on an
+                       //object, snap to grid if not.
                        // Snap to object point if valid...
 //                     if (Global::snapPointIsValid)
 //                             point = Global::snapPoint;
-                       
+
                        ToolHandler(ToolMouseDown, point);
                        return;
                }
@@ -1194,6 +1195,8 @@ void DrawingView::mousePressEvent(QMouseEvent * event)
                        AddHoveredToSelection();
                        update();       // needed??
                        GetHovered(hover);      // prolly needed
+                       dragged = (Object *)hover[0];
+                       draggingObject = true;
 
                        // Needed for grab & moving objects
                        // We do it *after*... why? (doesn't seem to confer any advantage...)
@@ -1255,20 +1258,6 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event)
                return;
        }
 
-       // Handle object movement (left button down & over an object)
-       if ((event->buttons() & Qt::LeftButton) && numHovered && !Global::tool)
-       {
-               if (hoveringIntersection)
-                       point = intersectionPoint;
-               else if (Global::snapToGrid)
-                       point = SnapPointToGrid(point);
-
-               HandleObjectMovement(point);
-               update();
-               oldPoint = point;
-               return;
-       }
-
        // Do object hit testing...
        bool needUpdate = HitTestObjects(point);
 
@@ -1276,15 +1265,17 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event)
        if (numHovered > 1)
        {
                GetHovered(hover);
-               Geometry::Intersects((Object *)hover[0], (Object *)hover[1]);
+               Object * obj1 = (Object *)hover[0], * obj2 = (Object *)hover[1];
+
+               Geometry::Intersects(obj1, obj2);
                int numIntersecting = Global::numIntersectParams;
                double t = Global::intersectParam[0];
                double u = Global::intersectParam[1];
 
                if (numIntersecting > 0)
                {
-                       Vector v1 = Geometry::GetPointForParameter((Object *)hover[0], t);
-                       Vector v2 = Geometry::GetPointForParameter((Object *)hover[1], u);
+                       Vector v1 = Geometry::GetPointForParameter(obj1, t);
+                       Vector v2 = Geometry::GetPointForParameter(obj2, u);
                        QString text = tr("Intersection t=%1 (%3, %4), u=%2 (%5, %6)");
                        informativeText = text.arg(t).arg(u).arg(v1.x).arg(v1.y).arg(v2.x).arg(v2.y);
 
@@ -1313,11 +1304,8 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event)
                }
        }
 
-//this doesn't work down here for some reason... :-P
-//could be because the object being moved is part of the intersection, and this is screwing things up. In which case, we need to exclude the moving object somehow from the hit test function...
-#if 0
        // Handle object movement (left button down & over an object)
-       if ((event->buttons() & Qt::LeftButton) && numHovered && !Global::tool)
+       if ((event->buttons() & Qt::LeftButton) && draggingObject && !Global::tool)
        {
                if (hoveringIntersection)
                        point = intersectionPoint;
@@ -1329,7 +1317,6 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event)
                oldPoint = point;
                return;
        }
-#endif
 
        // Do tool handling, if any are active...
        if (Global::tool)
@@ -1385,11 +1372,9 @@ void DrawingView::mouseReleaseEvent(QMouseEvent * event)
                {
                        if (((Object *)(*i))->selected)
                                select.push_back(*i);
-
-//hmm, this is no good, too late to do any good :-P
-//                     if ((*i)->hovered)
-//                             hover.push_back(*i);
                }
+
+               draggingObject = false;
        }
        else if (event->button() == Qt::MiddleButton)
        {
@@ -1445,6 +1430,30 @@ void DrawingView::keyPressEvent(QKeyEvent * event)
 
                update();
        }
+
+       if (select.size() > 0)
+       {
+               if (event->key() == Qt::Key_Up)
+               {
+                       TranslateObjects(select, Point(0, +1.0));
+                       update();
+               }
+               else if (event->key() == Qt::Key_Down)
+               {
+                       TranslateObjects(select, Point(0, -1.0));
+                       update();
+               }
+               else if (event->key() == Qt::Key_Right)
+               {
+                       TranslateObjects(select, Point(+1.0, 0));
+                       update();
+               }
+               else if (event->key() == Qt::Key_Left)
+               {
+                       TranslateObjects(select, Point(-1.0, 0));
+                       update();
+               }
+       }
 }
 
 
@@ -1674,114 +1683,12 @@ bool DrawingView::HitTestObjects(Point point)
        {
                Object * obj = (Object *)(*i);
 
+               // If we're seeing the object we're dragging, skip it
+               if (draggingObject && (obj == dragged))
+                       continue;
+
                if (HitTest(obj, point))
                        needUpdate = true;
-#if 0
-               switch (obj->type)
-               {
-               case OTLine:
-               {
-                       bool oldHP0 = obj->hitPoint[0], oldHP1 = obj->hitPoint[1], oldHO = obj->hitObject;
-                       obj->hitPoint[0] = obj->hitPoint[1] = obj->hitObject = false;
-                       Vector lineSegment = obj->p[1] - obj->p[0];
-                       Vector v1 = point - obj->p[0];
-                       Vector v2 = point - obj->p[1];
-                       double t = Geometry::ParameterOfLineAndPoint(obj->p[0], obj->p[1], point);
-                       double distance;
-
-                       if (t < 0.0)
-                               distance = v1.Magnitude();
-                       else if (t > 1.0)
-                               distance = v2.Magnitude();
-                       else
-                               // distance = ?Det?(ls, v1) / |ls|
-                               distance = fabs((lineSegment.x * v1.y - v1.x * lineSegment.y)
-                                       / lineSegment.Magnitude());
-
-                       if ((v1.Magnitude() * Global::zoom) < 8.0)
-                               obj->hitPoint[0] = true;
-                       else if ((v2.Magnitude() * Global::zoom) < 8.0)
-                               obj->hitPoint[1] = true;
-                       else if ((distance * Global::zoom) < 5.0)
-                               obj->hitObject = true;
-
-                       obj->hovered = (obj->hitPoint[0] || obj->hitPoint[1] || obj->hitObject ? true : false);
-
-                       if ((oldHP0 != obj->hitPoint[0]) || (oldHP1 != obj->hitPoint[1]) || (oldHO != obj->hitObject))
-                               needUpdate = true;
-
-                       break;
-               }
-               case OTCircle:
-               {
-                       bool oldHP = obj->hitPoint[0], oldHO = obj->hitObject;
-                       obj->hitPoint[0] = obj->hitObject = false;
-                       double length = Vector::Magnitude(obj->p[0], point);
-
-                       if ((length * Global::zoom) < 8.0)
-                               obj->hitPoint[0] = true;
-                       else if ((fabs(length - obj->radius[0]) * Global::zoom) < 2.0)
-                               obj->hitObject = true;
-
-                       obj->hovered = (obj->hitPoint[0] || obj->hitObject ? true : false);
-
-                       if ((oldHP != obj->hitPoint[0]) || (oldHO != obj->hitObject))
-                               needUpdate = true;
-
-                       break;
-               }
-               case OTArc:
-               {
-                       bool oldHP0 = obj->hitPoint[0], oldHP1 = obj->hitPoint[1], oldHP2 = obj->hitPoint[2], oldHO = obj->hitObject;
-                       obj->hitPoint[0] = obj->hitPoint[1] = obj->hitPoint[2] = obj->hitObject = false;
-                       double length = Vector::Magnitude(obj->p[0], point);
-                       double angle = Vector::Angle(obj->p[0], point);
-
-                       // Make sure we get the angle in the correct spot
-                       if (angle < obj->angle[0])
-                               angle += TAU;
-
-                       // Get the span that we're pointing at...
-                       double span = angle - obj->angle[0];
-
-                       // N.B.: Still need to hit test the arc start & arc span handles...
-                       double spanAngle = obj->angle[0] + obj->angle[1];
-                       Point handle1 = obj->p[0] + (Vector(cos(obj->angle[0]), sin(obj->angle[0])) * obj->radius[0]);
-                       Point handle2 = obj->p[0] + (Vector(cos(spanAngle), sin(spanAngle)) * obj->radius[0]);
-                       double length2 = Vector::Magnitude(point, handle1);
-                       double length3 = Vector::Magnitude(point, handle2);
-
-                       if ((length * Global::zoom) < 8.0)
-                               obj->hitPoint[0] = true;
-                       else if ((length2 * Global::zoom) < 8.0)
-                               obj->hitPoint[1] = true;
-                       else if ((length3 * Global::zoom) < 8.0)
-                               obj->hitPoint[2] = true;
-                       else if (((fabs(length - obj->radius[0]) * Global::zoom) < 2.0) && (span < obj->angle[1]))
-                               obj->hitObject = true;
-
-                       obj->hovered = (obj->hitPoint[0] || obj->hitPoint[1] || obj->hitPoint[2] || obj->hitObject ? true : false);
-
-                       if ((oldHP0 != obj->hitPoint[0]) || (oldHP1 != obj->hitPoint[1]) || (oldHP2 != obj->hitPoint[2]) || (oldHO != obj->hitObject))
-                               needUpdate = true;
-
-                       break;
-               }
-               case OTContainer:
-               {
-                       // Containers must be recursively tested...
-                       Container * c = (Container *)obj;
-                       std::vector<void *>::iterator i;
-
-                       for(i=c->objects.begin(); i!=c->objects.end(); i++)
-                       {
-                               
-                       }
-               }
-               default:
-                       break;
-               }
-#endif
 
                if (obj->hovered)
                {
@@ -1925,7 +1832,8 @@ void DrawingView::HandleObjectMovement(Point point)
 {
        Point delta = point - oldPoint;
 //printf("HOM: old = (%f,%f), new = (%f, %f), delta = (%f, %f)\n", oldPoint.x, oldPoint.y, point.x, point.y, delta.x, delta.y);
-       Object * obj = (Object *)hover[0];
+//     Object * obj = (Object *)hover[0];
+       Object * obj = dragged;
 //printf("Object type = %i (size=%i), ", obj->type, hover.size());
 //printf("Object (%X) move: hp1=%s, hp2=%s, hl=%s\n", obj, (obj->hitPoint[0] ? "true" : "false"), (obj->hitPoint[1] ? "true" : "false"), (obj->hitObject ? "true" : "false"));
 
index 780c81214bf81c360bf53901478fb1421d390d6d..1af3a7776506a98fe1de0fbeec85a699ab90e88b 100644 (file)
@@ -88,9 +88,8 @@ class DrawingView: public QWidget
                Point toolPoint[32];
                Point intersectionPoint;
                bool hoveringIntersection;
-
-//     public:
-//             static Container document;
+               Object * dragged;
+               bool draggingObject;
 };
 
 #endif // __DRAWINGVIEW_H__
index 02d6b20ef9c6fe977aa9efe5de0a4f5e6e70baa7..2263d7d224c6d4d66d76d69144e288b2fbfece68 100644 (file)
@@ -245,3 +245,32 @@ void TranslateObject(Object * obj, Point delta)
 }
 
 
+void TranslateObjects(std::vector<void *> & v, Point delta)
+{
+#if 0
+       if (obj->type == OTContainer)
+       {
+               Container * c = (Container *)obj;
+               std::vector<void *>::iterator i;
+
+               for(i=c->objects.begin(); i!=c->objects.end(); i++)
+                       TranslateObject((Object *)*i, delta);
+       }
+       else
+       {
+               obj->p[0] += delta;
+               obj->p[1] += delta;
+       }
+#endif
+       // Handle containters too???
+       std::vector<void *>::iterator i;
+
+       for(i=v.begin(); i!=v.end(); i++)
+       {
+               Object * obj = (Object *)(*i);
+               obj->p[0] += delta;
+               obj->p[1] += delta;
+       }
+}
+
+
index 24c0414634bd6bdd1f234f5caa853e54c9ea95cf..90e6d9f7f8d03a5afe423181d10b42a59055c5ab 100644 (file)
@@ -16,6 +16,7 @@ void RemoveSelectedObjects(std::vector<void *> & v);
 void SavePointsFrom(std::vector<void *> & v, std::vector<Object> & s);
 void RestorePointsTo(std::vector<void *> & v, std::vector<Object> & s);
 void TranslateObject(Object * obj, Point delta);
+void TranslateObjects(std::vector<void *> & v, Point delta);
 
 #endif // __UTILS_H__