]> Shamusworld >> Repos - architektonas/commitdiff
Rotation tool now works properly for Lines. Need to fix Arcs.
authorShamus Hammons <jlhamm@acm.org>
Wed, 6 May 2015 01:42:45 +0000 (20:42 -0500)
committerShamus Hammons <jlhamm@acm.org>
Wed, 6 May 2015 01:42:45 +0000 (20:42 -0500)
README
src/applicationwindow.cpp
src/drawingview.cpp
src/drawingview.h
src/utils.cpp
src/utils.h

diff --git a/README b/README
index b979c369270703eefaae643770fa3bd5a18f80cb..fba26cd6d3e10712487ed56f462557533a9c862d 100644 (file)
--- a/README
+++ b/README
@@ -71,7 +71,7 @@ love to hear from you so that we can improve!
 @-~ Installation ~-@
 
 Architektonas is built on the Qt 5 framework; it requires version 5.3.2 or
-later. We build it using gcc v4.4.6; we can't guarantee that it will compile on
+later. We build it using gcc v4.8.4; we can't guarantee that it will compile on
 lesser versions but you never know. Building Architektonas should be as easy as
 typing:
 
index 866750d82fc8dce1326ff8b007be6bf8045a80fd..825eb6dd30d451cf4cefd37438aa8c34d4558c37 100644 (file)
 
 #include "about.h"
 #include "blockwidget.h"
-//#include "dimension.h"
 #include "drawingview.h"
-//#include "drawarcaction.h"
-//#include "drawcircleaction.h"
-//#include "drawdimensionaction.h"
-//#include "drawlineaction.h"
-//#include "drawsplineaction.h"
 #include "fileio.h"
 #include "generaltab.h"
-//#include "geometry.h"
 #include "global.h"
 #include "layerwidget.h"
-//#include "line.h"
-//#include "mirroraction.h"
 #include "painter.h"
-//#include "rotateaction.h"
 #include "settingsdialog.h"
 #include "structs.h"
-//#include "triangulateaction.h"
-//#include "trimaction.h"
+#include "utils.h"
 
 
 // Class variables
@@ -238,7 +227,8 @@ void ApplicationWindow::DeleteTool(void)
        // delete those and *don't* select the delete tool.
        if (drawing->numSelected > 0)
        {
-               drawing->DeleteSelectedItems();
+//             drawing->DeleteSelectedItems();
+               DeleteSelectedObjects(drawing->document.objects);
                drawing->update();
                deleteAct->setChecked(false);
                return;
@@ -260,6 +250,11 @@ void ApplicationWindow::DimensionTool(void)
 void ApplicationWindow::RotateTool(void)
 {
        ClearUIToolStatesExcept(rotateAct);
+
+       // Do tear-down if Rotate tool has been turned off
+       if (!rotateAct->isChecked())
+               drawing->RotateHandler(ToolCleanup, Point(0, 0));
+
        SetInternalToolStates();
 }
 
@@ -414,34 +409,11 @@ void ApplicationWindow::ClearUIToolStatesExcept(QAction * exception)
 
 void ApplicationWindow::SetInternalToolStates(void)
 {
-//     Global::deleteActive = deleteAct->isChecked();
-//     Global::dimensionActive = addDimensionAct->isChecked();
-
        // We can be sure that if we've come here, then either an active tool is
        // being deactivated, or a new tool is being created. In either case, the
        // old tool needs to be deleted.
        Global::toolState = TSNone;
-#if 0
-       if (drawing->toolAction)
-       {
-               delete drawing->toolAction;
-               drawing->toolAction = NULL;
-               Global::ignoreClicks = false;
-       }
 
-       drawing->SetToolActive(addLineAct->isChecked() ? new DrawLineAction() : NULL);
-       drawing->SetToolActive(addCircleAct->isChecked() ? new DrawCircleAction() : NULL);
-       drawing->SetToolActive(addArcAct->isChecked() ? new DrawArcAction() : NULL);
-       drawing->SetToolActive(addDimensionAct->isChecked() ? new DrawDimensionAction() : NULL);
-       drawing->SetToolActive(addSplineAct->isChecked() ? new DrawSplineAction() : NULL);
-       drawing->SetToolActive(mirrorAct->isChecked() ? new MirrorAction() : NULL);
-       drawing->SetToolActive(rotateAct->isChecked() ? new RotateAction() : NULL);
-       drawing->SetToolActive(trimAct->isChecked() ? new TrimAction() : NULL);
-       drawing->SetToolActive(triangulateAct->isChecked() ? new TriangulateAction() : NULL);
-
-       if (drawing->toolAction)
-               Global::ignoreClicks = true;
-#else
        if (addLineAct->isChecked())
                Global::tool = TTLine;
        else if (addCircleAct->isChecked())
@@ -466,7 +438,6 @@ void ApplicationWindow::SetInternalToolStates(void)
                Global::tool = TTTriangulate;
        else
                Global::tool = TTNone;
-#endif
 
        drawing->update();
 }
index f3cac0db04a00f44aa71934bfac4e6b21f122165..aeb764cc5781ff38364f7a99eb154c4898c360bd 100644 (file)
@@ -40,8 +40,6 @@
 
 #define BACKGROUND_MAX_SIZE    512
 
-enum { ToolMouseDown, ToolMouseMove, ToolMouseUp };
-
 // Class variable
 //Container DrawingView::document(Vector(0, 0));
 
@@ -49,7 +47,7 @@ enum { ToolMouseDown, ToolMouseMove, ToolMouseUp };
 DrawingView::DrawingView(QWidget * parent/*= NULL*/): QWidget(parent),
        // The value in the settings file will override this.
        useAntialiasing(true), numSelected(0), numHovered(0), shiftDown(false),
-       ctrlDown(false), overrideColor(false),
+       ctrlDown(false),
        gridBackground(BACKGROUND_MAX_SIZE, BACKGROUND_MAX_SIZE),
        scale(1.0), offsetX(-10), offsetY(-10),// document(Vector(0, 0)),
        gridPixels(0), collided(false)//, toolAction(NULL)
@@ -267,24 +265,6 @@ zero; so we do another modulus operation on the result to achieve this.
 }
 
 
-void DrawingView::AddNewObjectToDocument(Object * object)
-{
-       if (object)
-       {
-//             object->Reparent(&document);
-//             document.Add(object);
-               update();
-       }
-//printf("DrawingView::AddNewObjectToDocument(). object=%08X\n", object);
-}
-
-
-void DrawingView::HandleActionUpdate(void)
-{
-       update();
-}
-
-
 void DrawingView::SetCurrentLayer(int layer)
 {
        Global::currentLayer = layer;
@@ -358,7 +338,11 @@ void DrawingView::RenderObjects(Painter * painter, std::vector<void *> & v)
                Object * obj = (Object *)(*i);
                float scaledThickness = Global::scale * obj->thickness;
 
-               if (!overrideColor)
+               if ((Global::tool == TTRotate) && ctrlDown && obj->selected)
+               {
+                       painter->SetPen(0x00FF00, 2.0, LSSolid);
+               }
+               else
                {
                        painter->SetPen(obj->color, Global::zoom * scaledThickness, obj->style);
                        painter->SetBrush(obj->color);
@@ -475,8 +459,8 @@ void DrawingView::RenderObjects(Painter * painter, std::vector<void *> & v)
                        double t = Geometry::ParameterOfLineAndPoint(linePt1, linePt2, linePt2 - (unit * 9.0 * scaledThickness));
                //printf("Dimension::Draw(): t = %lf\n", t);
 
-               // On the screen, it's acting like this is actually 58%...
-               // This is correct, we want it to happen at > 50%
+                       // On the screen, it's acting like this is actually 58%...
+                       // This is correct, we want it to happen at > 50%
                        if (t > 0.58)
                        {
                                // Draw main dimension line + arrowheads
@@ -535,34 +519,6 @@ void DrawingView::RenderObjects(Painter * painter, std::vector<void *> & v)
 }
 
 
-void DrawingView::DeleteSelectedItems(void)
-{
-       std::vector<void *>::iterator i = document.objects.begin();
-
-       while (i != document.objects.end())
-       {
-               Object * obj = (Object *)(*i);
-
-               if (obj->selected)
-               {
-                       delete obj;
-                       document.objects.erase(i);
-               }
-               else
-                       i++;
-       }
-}
-
-
-void DrawingView::ClearSelection(void)
-{
-       std::vector<void *>::iterator i;
-
-       for(i=document.objects.begin(); i!=document.objects.end(); i++)
-               ((Object *)(*i))->selected = false;
-}
-
-
 void DrawingView::AddHoveredToSelection(void)
 {
        std::vector<void *>::iterator i;
@@ -611,7 +567,7 @@ void DrawingView::resizeEvent(QResizeEvent * /*event*/)
 }
 
 
-void DrawingView::ToolMouse(int mode, Point p)
+void DrawingView::ToolHandler(int mode, Point p)
 {
        if (Global::tool == TTLine)
                LineHandler(mode, p);
@@ -732,9 +688,7 @@ void DrawingView::RotateHandler(int mode, Point p)
                if (Global::toolState == TSNone)
                {
                        toolPoint[0] = p;
-                       toolObjects.clear();
-                       CopyObjects(select, toolObjects);
-//                     ClearSelected(toolObjects);
+                       SavePointsFrom(select, toolScratch);
                        Global::toolState = TSPoint1;
                }
                else if (Global::toolState == TSPoint1)
@@ -744,36 +698,24 @@ void DrawingView::RotateHandler(int mode, Point p)
 
                break;
        case ToolMouseMove:
-/*
-There's two approaches to this that we can do:
-
- -- Keep a copy of selected objects & rotate those (drawing rotated + selected)
- -- Rotate the selected (drawing selected only)
-
-Either way, we need to have a copy of the points before we change them; we also need
-to know whether or not to discard any changes made--maybe with a ToolCleanup()
-function.
-*/
                if ((Global::toolState == TSPoint1) || (Global::toolState == TSNone))
                        toolPoint[0] = p;
                else if (Global::toolState == TSPoint2)
                {
-// need to reset the selected points to their non-rotated state in this case...
+                       toolPoint[1] = p;
+
                        if (shiftDown)
                                return;
 
-                       toolPoint[1] = p;
-
                        double angle = Vector(toolPoint[1], toolPoint[0]).Angle();
                        std::vector<void *>::iterator j = select.begin();
-                       std::vector<void *>::iterator i = toolObjects.begin();
+                       std::vector<Object>::iterator i = toolScratch.begin();
 
-//                     for(; i!=select.end(); i++, j++)
-                       for(; i!=toolObjects.end(); i++, j++)
+                       for(; i!=toolScratch.end(); i++, j++)
                        {
-                               Object * obj = (Object *)(*i);
-                               Point p1 = Geometry::RotatePointAroundPoint(obj->p[0], toolPoint[0], angle);
-                               Point p2 = Geometry::RotatePointAroundPoint(obj->p[1], toolPoint[0], angle);
+                               Object obj = *i;
+                               Point p1 = Geometry::RotatePointAroundPoint(obj.p[0], toolPoint[0], angle);
+                               Point p2 = Geometry::RotatePointAroundPoint(obj.p[1], toolPoint[0], angle);
                                Object * obj2 = (Object *)(*j);
                                obj2->p[0] = p1;
                                obj2->p[1] = p2;
@@ -796,12 +738,38 @@ function.
                }
                else
                {
-#if 0
-                       Line * l = new Line(toolPoint[0], toolPoint[1]);
-                       document.objects.push_back(l);
-                       toolPoint[0] = toolPoint[1];
-#endif
+                       // Either we're finished with our rotate, or we're stamping a copy.
+                       if (ctrlDown)
+                       {
+                               // Stamp a copy of the selection at the current rotation & bail
+                               std::vector<void *> temp;
+                               CopyObjects(select, temp);
+                               ClearSelected(temp);
+                               AddObjectsTo(document.objects, temp);
+                               RestorePointsTo(select, toolScratch);
+                               return;
+                       }
+
+                       toolPoint[0] = p;
+                       Global::toolState = TSPoint1;
+                       SavePointsFrom(select, toolScratch);
                }
+
+               break;
+       case ToolKeyDown:
+               // Reset the selection if shift held down...
+               if (shiftDown)
+                       RestorePointsTo(select, toolScratch);
+
+               break;
+       case ToolKeyUp:
+               // Reset selection when key is let up
+               if (!shiftDown)
+                       RotateHandler(ToolMouseMove, toolPoint[1]);
+
+               break;
+       case ToolCleanup:
+               RestorePointsTo(select, toolScratch);
        }
 }
 
@@ -824,13 +792,14 @@ void DrawingView::mousePressEvent(QMouseEvent * event)
 //                     if (Global::snapPointIsValid)
 //                             point = Global::snapPoint;
                        
-                       ToolMouse(ToolMouseDown, point);
+                       ToolHandler(ToolMouseDown, point);
                        return;
                }
 
                // Clear the selection only if CTRL isn't being held on click
                if (!ctrlDown)
-                       ClearSelection();
+                       ClearSelected(document.objects);
+//                     ClearSelection();
 
                // If any objects are being hovered on click, add them to the selection
                // & return
@@ -913,7 +882,7 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event)
                if (Global::snapToGrid)
                        point = SnapPointToGrid(point);
 
-               ToolMouse(ToolMouseMove, point);
+               ToolHandler(ToolMouseMove, point);
        }
 
        // This is used to draw the tool crosshair...
@@ -939,7 +908,7 @@ void DrawingView::mouseReleaseEvent(QMouseEvent * event)
                if (Global::tool)
                {
                        Vector point = Painter::QtToCartesianCoords(Vector(event->x(), event->y()));
-                       ToolMouse(ToolMouseUp, point);
+                       ToolHandler(ToolMouseUp, point);
                        return;
                }
 
@@ -1007,10 +976,6 @@ void DrawingView::wheelEvent(QWheelEvent * event)
 
 void DrawingView::keyPressEvent(QKeyEvent * event)
 {
-#if 0
-       if (toolAction)
-               toolAction->KeyDown(event->key());
-#endif
        bool oldShift = shiftDown;
        bool oldCtrl = ctrlDown;
 
@@ -1020,16 +985,17 @@ void DrawingView::keyPressEvent(QKeyEvent * event)
                ctrlDown = true;
 
        if ((oldShift != shiftDown) || (oldCtrl != ctrlDown))
+       {
+               if (Global::tool)
+                       ToolHandler(ToolKeyDown, Point(0, 0));
+
                update();
+       }
 }
 
 
 void DrawingView::keyReleaseEvent(QKeyEvent * event)
 {
-#if 0
-       if (toolAction)
-               toolAction->KeyReleased(event->key());
-#endif
        bool oldShift = shiftDown;
        bool oldCtrl = ctrlDown;
 
@@ -1039,7 +1005,12 @@ void DrawingView::keyReleaseEvent(QKeyEvent * event)
                ctrlDown = false;
 
        if ((oldShift != shiftDown) || (oldCtrl != ctrlDown))
+       {
+               if (Global::tool)
+                       ToolHandler(ToolKeyUp, Point(0, 0));
+
                update();
+       }
 }
 
 //
index 1e050e8f1d72917c14f487d8e306dffc0d5d7fbc..ba35affc022ecbde8c3a54f4c78ae8b4639cf573 100644 (file)
@@ -5,6 +5,8 @@
 #include <stdint.h>
 #include "structs.h"
 
+enum { ToolMouseDown, ToolMouseMove, ToolMouseUp, ToolKeyDown, ToolKeyUp, ToolCleanup };
+
 class Painter;
 
 class DrawingView: public QWidget
@@ -19,12 +21,10 @@ class DrawingView: public QWidget
                void UpdateGridBackground(void);
                Point SnapPointToGrid(Point);
                void RenderObjects(Painter *, std::vector<void *> &);
-               void DeleteSelectedItems(void);
-               void ClearSelection(void);
                void AddHoveredToSelection(void);
                void GetSelection(std::vector<void *> &);
                void GetHovered(std::vector<void *> &);
-               void ToolMouse(int, Point);
+               void ToolHandler(int, Point);
                void ToolDraw(Painter *);
                void LineHandler(int, Point);
                void RotateHandler(int, Point);
@@ -33,8 +33,6 @@ class DrawingView: public QWidget
                void HandleObjectMovement(Point);
 
        public slots:
-               void AddNewObjectToDocument(Object *);
-               void HandleActionUpdate(void);
                void SetCurrentLayer(int);
 
        protected:
@@ -57,7 +55,6 @@ class DrawingView: public QWidget
                uint32_t numHovered;
                bool shiftDown;
                bool ctrlDown;
-               bool overrideColor;
 
        private:
                QPixmap gridBackground;
@@ -75,6 +72,7 @@ class DrawingView: public QWidget
                std::vector<void *> select;
                std::vector<void *> hover;
                std::vector<void *> toolObjects;
+               std::vector<Object> toolScratch;
                Point toolPoint[32];
 
 //     public:
index 6f3c73ae0941733bbfd8764a8ac0996cab79cbbf..c6b457e8bb8e59e9802c64dfeb445c33b6e4d6b4 100644 (file)
@@ -90,6 +90,13 @@ Object * CopyObject(Object * obj)
 }
 
 
+void AddObjectsTo(std::vector<void *> & dest, std::vector<void *> & from)
+{
+       for(std::vector<void *>::iterator i=from.begin(); i!=from.end(); i++)
+               dest.push_back(*i);
+}
+
+
 void ClearSelected(std::vector<void *> & v)
 {
        std::vector<void *>::iterator i;
@@ -99,3 +106,49 @@ void ClearSelected(std::vector<void *> & v)
 }
 
 
+void DeleteSelectedObjects(std::vector<void *> & v)
+{
+       std::vector<void *>::iterator i = v.begin();
+
+       while (i != v.end())
+       {
+               Object * obj = (Object *)(*i);
+
+               if (obj->selected)
+               {
+                       delete obj;
+                       v.erase(i);
+               }
+               else
+                       i++;
+       }
+}
+
+
+void SavePointsFrom(std::vector<void *> & v, std::vector<Object> & save)
+{
+       save.clear();
+       Object o;
+
+       for(std::vector<void *>::iterator i=v.begin(); i!=v.end(); i++)
+       {
+               memcpy(&o, (*i), sizeof(Object));
+               save.push_back(o);
+       }
+}
+
+
+void RestorePointsTo(std::vector<void *> & v, std::vector<Object> & s)
+{
+       std::vector<Object>::iterator i = s.begin();
+       std::vector<void *>::iterator j = v.begin();
+
+       for(; i!=s.end(); i++, j++)
+       {
+               Object * obj2 = (Object *)(*j);
+               obj2->p[0] = (*i).p[0];
+               obj2->p[1] = (*i).p[1];
+       }
+}
+
+
index 599cf88c388cc010d47adce69a5d66c58b84283d..23b6ad3d3c1a467e5794fc53d24ff483fb70aec8 100644 (file)
@@ -6,7 +6,11 @@
 
 void CopyObjects(std::vector<void *> & from, std::vector<void *> & to);
 Object * CopyObject(Object * obj);
+void AddObjectsTo(std::vector<void *> & dest, std::vector<void *> & from);
 void ClearSelected(std::vector<void *> & v);
+void DeleteSelectedObjects(std::vector<void *> & v);
+void SavePointsFrom(std::vector<void *> & v, std::vector<Object> & s);
+void RestorePointsTo(std::vector<void *> & v, std::vector<Object> & s);
 
 #endif // __UTILS_H__