#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
// 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;
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();
}
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())
Global::tool = TTTriangulate;
else
Global::tool = TTNone;
-#endif
drawing->update();
}
#define BACKGROUND_MAX_SIZE 512
-enum { ToolMouseDown, ToolMouseMove, ToolMouseUp };
-
// Class variable
//Container DrawingView::document(Vector(0, 0));
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)
}
-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;
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);
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
}
-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;
}
-void DrawingView::ToolMouse(int mode, Point p)
+void DrawingView::ToolHandler(int mode, Point p)
{
if (Global::tool == TTLine)
LineHandler(mode, 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)
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;
}
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);
}
}
// 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
if (Global::snapToGrid)
point = SnapPointToGrid(point);
- ToolMouse(ToolMouseMove, point);
+ ToolHandler(ToolMouseMove, point);
}
// This is used to draw the tool crosshair...
if (Global::tool)
{
Vector point = Painter::QtToCartesianCoords(Vector(event->x(), event->y()));
- ToolMouse(ToolMouseUp, point);
+ ToolHandler(ToolMouseUp, point);
return;
}
void DrawingView::keyPressEvent(QKeyEvent * event)
{
-#if 0
- if (toolAction)
- toolAction->KeyDown(event->key());
-#endif
bool oldShift = shiftDown;
bool oldCtrl = ctrlDown;
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;
ctrlDown = false;
if ((oldShift != shiftDown) || (oldCtrl != ctrlDown))
+ {
+ if (Global::tool)
+ ToolHandler(ToolKeyUp, Point(0, 0));
+
update();
+ }
}
//