From: Shamus Hammons Date: Wed, 6 May 2015 01:42:45 +0000 (-0500) Subject: Rotation tool now works properly for Lines. Need to fix Arcs. X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=architektonas;a=commitdiff_plain;h=06456047e6476969e45be5b1f31b8336ea74c45f Rotation tool now works properly for Lines. Need to fix Arcs. --- diff --git a/README b/README index b979c36..fba26cd 100644 --- 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: diff --git a/src/applicationwindow.cpp b/src/applicationwindow.cpp index 866750d..825eb6d 100644 --- a/src/applicationwindow.cpp +++ b/src/applicationwindow.cpp @@ -30,26 +30,15 @@ #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(); } diff --git a/src/drawingview.cpp b/src/drawingview.cpp index f3cac0d..aeb764c 100644 --- a/src/drawingview.cpp +++ b/src/drawingview.cpp @@ -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 & 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 & 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 & v) } -void DrawingView::DeleteSelectedItems(void) -{ - std::vector::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::iterator i; - - for(i=document.objects.begin(); i!=document.objects.end(); i++) - ((Object *)(*i))->selected = false; -} - - void DrawingView::AddHoveredToSelection(void) { std::vector::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::iterator j = select.begin(); - std::vector::iterator i = toolObjects.begin(); + std::vector::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 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(); + } } // diff --git a/src/drawingview.h b/src/drawingview.h index 1e050e8..ba35aff 100644 --- a/src/drawingview.h +++ b/src/drawingview.h @@ -5,6 +5,8 @@ #include #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 DeleteSelectedItems(void); - void ClearSelection(void); void AddHoveredToSelection(void); void GetSelection(std::vector &); void GetHovered(std::vector &); - 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 select; std::vector hover; std::vector toolObjects; + std::vector toolScratch; Point toolPoint[32]; // public: diff --git a/src/utils.cpp b/src/utils.cpp index 6f3c73a..c6b457e 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -90,6 +90,13 @@ Object * CopyObject(Object * obj) } +void AddObjectsTo(std::vector & dest, std::vector & from) +{ + for(std::vector::iterator i=from.begin(); i!=from.end(); i++) + dest.push_back(*i); +} + + void ClearSelected(std::vector & v) { std::vector::iterator i; @@ -99,3 +106,49 @@ void ClearSelected(std::vector & v) } +void DeleteSelectedObjects(std::vector & v) +{ + std::vector::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 & v, std::vector & save) +{ + save.clear(); + Object o; + + for(std::vector::iterator i=v.begin(); i!=v.end(); i++) + { + memcpy(&o, (*i), sizeof(Object)); + save.push_back(o); + } +} + + +void RestorePointsTo(std::vector & v, std::vector & s) +{ + std::vector::iterator i = s.begin(); + std::vector::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]; + } +} + + diff --git a/src/utils.h b/src/utils.h index 599cf88..23b6ad3 100644 --- a/src/utils.h +++ b/src/utils.h @@ -6,7 +6,11 @@ void CopyObjects(std::vector & from, std::vector & to); Object * CopyObject(Object * obj); +void AddObjectsTo(std::vector & dest, std::vector & from); void ClearSelected(std::vector & v); +void DeleteSelectedObjects(std::vector & v); +void SavePointsFrom(std::vector & v, std::vector & s); +void RestorePointsTo(std::vector & v, std::vector & s); #endif // __UTILS_H__