+ ClearUIToolStatesExcept(rotateAct);
+ SetInternalToolStates();
+}
+
+
+void ApplicationWindow::MirrorTool(void)
+{
+ ClearUIToolStatesExcept(mirrorAct);
+ SetInternalToolStates();
+}
+
+
+void ApplicationWindow::TrimTool(void)
+{
+ ClearUIToolStatesExcept(trimAct);
+ SetInternalToolStates();
+}
+
+
+void ApplicationWindow::TriangulateTool(void)
+{
+ ClearUIToolStatesExcept(triangulateAct);
+ SetInternalToolStates();
+}
+
+
+void ApplicationWindow::AddLineTool(void)
+{
+ ClearUIToolStatesExcept(addLineAct);
+ SetInternalToolStates();
+}
+
+
+void ApplicationWindow::AddCircleTool(void)
+{
+ ClearUIToolStatesExcept(addCircleAct);
+ SetInternalToolStates();
+}
+
+
+void ApplicationWindow::AddArcTool(void)
+{
+ ClearUIToolStatesExcept(addArcAct);
+ SetInternalToolStates();
+}
+
+
+void ApplicationWindow::AddPolygonTool(void)
+{
+ ClearUIToolStatesExcept(addPolygonAct);
+ SetInternalToolStates();
+}
+
+
+void ApplicationWindow::AddSplineTool(void)
+{
+ ClearUIToolStatesExcept(addSplineAct);
+ SetInternalToolStates();
+}
+
+
+void ApplicationWindow::ZoomInTool(void)
+{
+ double zoomFactor = 2.0;
+/*
+We need to find the center of the screen, then figure out where the new corner
+will be in the zoomed in window.
+
+So we know in Qt coords, the center is found via:
+size.width() / 2 --> xCenter
+size.height() / 2 --> yCenter
+
+transform x/yCenter to Cartesian coordinates. So far, so good.
+
+when zooming in, new origin will be (xCenter - origin.x) / 2, (yCenter - origin.y) / 2
+(after subtracting from center, that is...)
+*/
+ QSize size = drawing->size();
+ Vector center(size.width() / 2.0, size.height() / 2.0);
+//printf("Zoom in... Center=%.2f,%.2f; ", center.x, center.y);
+ center = Painter::QtToCartesianCoords(center);
+//printf("(%.2f,%.2f); origin=%.2f,%.2f; ", center.x, center.y, Painter::origin.x, Painter::origin.y);
+ Vector newOrigin = center - ((center - Painter::origin) / zoomFactor);
+//printf("newOrigin=%.2f,%.2f;\n", newOrigin.x, newOrigin.y);
+ Painter::origin = newOrigin;
+
+//printf("Zoom in... level going from %02f to ", Painter::zoom);
+ // This just zooms leaving origin intact... should zoom in at the current
+ // center! [DONE]
+ Painter::zoom *= zoomFactor;
+ Object::gridSpacing = drawing->gridPixels / Painter::zoom;
+ drawing->UpdateGridBackground();
+ drawing->update();
+
+ zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Object::gridSpacing));
+ baseUnitInput->setText(QString("%1").arg(Object::gridSpacing));
+}
+
+
+void ApplicationWindow::ZoomOutTool(void)
+{
+/*
+Ok, real example.
+center = (436, 311)
+origin = (223, 160.5)
+newOrigin should be (-10, -10)
+Why isn't it?
+
+center - origin = (213, 150.5)
+origin - center = (-213, -150.5)
+x 2 = (-426, -301)
++ center = (-10, -10)
+
+*/
+ double zoomFactor = 2.0;
+ QSize size = drawing->size();
+ Vector center(size.width() / 2.0, size.height() / 2.0);
+//printf("Zoom out... Center=%.2f,%.2f; ", center.x, center.y);
+ center = Painter::QtToCartesianCoords(center);
+//printf("(%.2f,%.2f); origin=%.2f,%.2f; ", center.x, center.y, Painter::origin.x, Painter::origin.y);
+// Vector newOrigin = (center - Painter::origin) * zoomFactor;
+// Vector newOrigin = center - (Painter::origin * zoomFactor);
+ Vector newOrigin = center + ((Painter::origin - center) * zoomFactor);
+//printf("newOrigin=%.2f,%.2f;\n", newOrigin.x, newOrigin.y);
+ Painter::origin = newOrigin;
+//printf("Zoom out...\n");
+ // This just zooms leaving origin intact... should zoom out at the current
+ // center! [DONE]
+ Painter::zoom /= zoomFactor;
+ Object::gridSpacing = drawing->gridPixels / Painter::zoom;
+ drawing->UpdateGridBackground();
+ drawing->update();
+
+ zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Object::gridSpacing));
+ baseUnitInput->setText(QString("%1").arg(Object::gridSpacing));
+}
+
+
+void ApplicationWindow::ClearUIToolStatesExcept(QAction * exception)
+{
+ if (exception != addArcAct)
+ addArcAct->setChecked(false);
+
+ if (exception != addCircleAct)
+ addCircleAct->setChecked(false);
+
+ if (exception != addDimensionAct)
+ addDimensionAct->setChecked(false);
+
+ if (exception != addLineAct)
+ addLineAct->setChecked(false);
+
+ if (exception != addPolygonAct)
+ addPolygonAct->setChecked(false);
+
+ if (exception != addSplineAct)
+ addSplineAct->setChecked(false);
+
+ if (exception != deleteAct)
+ deleteAct->setChecked(false);
+
+ if (exception != rotateAct)
+ rotateAct->setChecked(false);
+
+ if (exception != mirrorAct)
+ mirrorAct->setChecked(false);
+
+ if (exception != trimAct)
+ trimAct->setChecked(false);
+
+ if (exception != triangulateAct)
+ triangulateAct->setChecked(false);
+}
+
+
+void ApplicationWindow::SetInternalToolStates(void)
+{
+ Object::SetDeleteActive(deleteAct->isChecked());
+ Object::SetDimensionActive(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.
+ if (drawing->toolAction)
+ {
+ delete drawing->toolAction;
+ drawing->toolAction = NULL;
+ Object::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)
+ Object::ignoreClicks = true;
+
+ drawing->update();