// (C) 2011 Underground Software
// See the README and GPLv3 files for licensing and warranty information
//
-// JLH = James L. Hammons <jlhamm@acm.org>
+// JLH = James Hammons <jlhamm@acm.org>
//
// Who When What
// --- ---------- -------------------------------------------------------------
// JLH 03/22/2011 Created this file
+// JLH 09/29/2011 Added simple zoom in/out functionality
+// JLH 10/03/2011 Fixed zoom tool to zoom in/out from center of screen
//
// FIXED:
#include "about.h"
#include "drawingview.h"
+#include "generaltab.h"
+#include "painter.h"
+#include "settingsdialog.h"
ApplicationWindow::ApplicationWindow(): settings("Underground Software", "Architektonas")
CreateToolbars();
// Create status bar
+ zoomIndicator = new QLabel("Zoom: 12.5%");
+ statusBar()->addPermanentWidget(zoomIndicator);
statusBar()->showMessage(tr("Ready"));
ReadSettings();
Object::SetFixedLength(fixLengthAct->isChecked());
}
+// We want certain tools to be exclusive, and this approach isn't working correctly...
void ApplicationWindow::DeleteTool(void)
{
- Object::SetDeleteActive(deleteAct->isChecked());
+
+ ClearUIToolStatesExcept(deleteAct);
+ SetInternalToolStates();
}
void ApplicationWindow::DimensionTool(void)
{
- Object::SetDimensionActive(addDimensionAct->isChecked());
+ ClearUIToolStatesExcept(addDimensionAct);
+ SetInternalToolStates();
}
void ApplicationWindow::RotateTool(void)
{
+ ClearUIToolStatesExcept(rotateAct);
+ 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::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;
+ zoomIndicator->setText(QString("Zoom: %1%").arg(Painter::zoom * 100.0 * SCREEN_ZOOM));
+ drawing->update();
+}
+
+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;
+ zoomIndicator->setText(QString("Zoom: %1%").arg(Painter::zoom * 100.0 * SCREEN_ZOOM));
+ drawing->update();
+}
+
+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 != deleteAct)
+ deleteAct->setChecked(false);
+
+ if (exception != rotateAct)
+ rotateAct->setChecked(false);
+}
+
+void ApplicationWindow::SetInternalToolStates(void)
+{
+ Object::SetDeleteActive(deleteAct->isChecked());
+ Object::SetDimensionActive(addDimensionAct->isChecked());
drawing->SetRotateToolActive(rotateAct->isChecked());
+ drawing->SetAddLineToolActive(addLineAct->isChecked());
+ drawing->SetAddCircleToolActive(addCircleAct->isChecked());
}
void ApplicationWindow::HelpAbout(void)
aboutWin->show();
}
+void ApplicationWindow::Settings(void)
+{
+ SettingsDialog dlg(this);
+ dlg.generalTab->antialiasChk->setChecked(drawing->useAntialiasing);
+
+ if (dlg.exec() == false)
+ return;
+
+ // Deal with stuff here (since user hit "OK" button...)
+ drawing->useAntialiasing = dlg.generalTab->antialiasChk->isChecked();
+ WriteSettings();
+}
+
void ApplicationWindow::CreateActions(void)
{
exitAct = CreateAction(tr("&Quit"), tr("Quit"), tr("Exits the application."),
QIcon(":/res/fix-length.png"), QKeySequence(tr("F,L")), true);
connect(fixLengthAct, SIGNAL(triggered()), this, SLOT(FixLength()));
- deleteAct = CreateAction(tr("&Delete"), tr("Delete Object"), tr("Deletes selected objects."), QIcon(":/res/generic-tool.png"), QKeySequence(), true);
+ deleteAct = CreateAction(tr("&Delete"), tr("Delete Object"), tr("Deletes selected objects."), QIcon(":/res/delete-tool.png"), QKeySequence(), true);
connect(deleteAct, SIGNAL(triggered()), this, SLOT(DeleteTool()));
addDimensionAct = CreateAction(tr("Add &Dimension"), tr("Add Dimension"), tr("Adds a dimension to the drawing."), QIcon(":/res/dimension-tool.png"), QKeySequence("D,I"), true);
connect(addDimensionAct, SIGNAL(triggered()), this, SLOT(DimensionTool()));
- addLineAct = CreateAction(tr("Add &Line"), tr("Add Line"), tr("Adds a line to the drawing."), QIcon(":/res/generic-tool.png"), QKeySequence(), true);
+ addLineAct = CreateAction(tr("Add &Line"), tr("Add Line"), tr("Adds lines to the drawing."), QIcon(":/res/add-line-tool.png"), QKeySequence("A,L"), true);
+ connect(addLineAct, SIGNAL(triggered()), this, SLOT(AddLineTool()));
+
+ addCircleAct = CreateAction(tr("Add &Circle"), tr("Add Circle"), tr("Adds circles to the drawing."), QIcon(":/res/add-circle-tool.png"), QKeySequence("A,C"), true);
+ connect(addCircleAct, SIGNAL(triggered()), this, SLOT(AddCircleTool()));
- addCircleAct = CreateAction(tr("Add &Circle"), tr("Add Circle"), tr("Adds a circle to the drawing."), QIcon(":/res/generic-tool.png"), QKeySequence(), true);
+ addArcAct = CreateAction(tr("Add &Arc"), tr("Add Arc"), tr("Adds arcs to the drawing."), QIcon(":/res/add-arc-tool.png"), QKeySequence("A,A"), true);
+ connect(addArcAct, SIGNAL(triggered()), this, SLOT(AddArcTool()));
- addArcAct = CreateAction(tr("Add &Arc"), tr("Add Arc"), tr("Adds an arc to the drawing."), QIcon(":/res/generic-tool.png"), QKeySequence(), true);
+ addPolygonAct = CreateAction(tr("Add &Polygon"), tr("Add Polygon"), tr("Add polygons to the drawing."), QIcon(":/res/add-polygon-tool.png"), QKeySequence("A,P"), true);
+ connect(addPolygonAct, SIGNAL(triggered()), this, SLOT(AddPolygonTool()));
aboutAct = CreateAction(tr("About &Architektonas"), tr("About Architektonas"), tr("Gives information about this program."), QIcon(":/res/generic-tool.png"), QKeySequence());
connect(aboutAct, SIGNAL(triggered()), this, SLOT(HelpAbout()));
- rotateAct = CreateAction(tr("&Rotate Objects"), tr("Rotate"), tr("Rotate object(s) around an arbitrary center."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("R,O")), true);
+ rotateAct = CreateAction(tr("&Rotate Objects"), tr("Rotate"), tr("Rotate object(s) around an arbitrary center."), QIcon(":/res/rotate-tool.png"), QKeySequence(tr("R,O")), true);
connect(rotateAct, SIGNAL(triggered()), this, SLOT(RotateTool()));
+ zoomInAct = CreateAction(tr("Zoom &In"), tr("Zoom In"), tr("Zoom in on the document."), QIcon(":/res/zoom-in.png"), QKeySequence(tr("+")), QKeySequence(tr("=")));
+ connect(zoomInAct, SIGNAL(triggered()), this, SLOT(ZoomInTool()));
+
+ zoomOutAct = CreateAction(tr("Zoom &Out"), tr("Zoom Out"), tr("Zoom out of the document."), QIcon(":/res/zoom-out.png"), QKeySequence(tr("-")));
+ connect(zoomOutAct, SIGNAL(triggered()), this, SLOT(ZoomOutTool()));
+
fileNewAct = CreateAction(tr("&New Drawing"), tr("New Drawing"), tr("Creates a new drawing."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("Ctrl+n")));
fileOpenAct = CreateAction(tr("&Open Drawing"), tr("Open Drawing"), tr("Opens an existing drawing from a file."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("Ctrl+o")));
fileCloseAct = CreateAction(tr("&Close Drawing"), tr("Close Drawing"), tr("Closes the current drawing."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("Ctrl+w")));
settingsAct = CreateAction(tr("&Settings"), tr("Settings"), tr("Change certain defaults for Architektonas."), QIcon(":/res/generic-tool.png"), QKeySequence());
+ connect(settingsAct, SIGNAL(triggered()), this, SLOT(Settings()));
//Hm. I think we'll have to have separate logic to do the "Radio Group Toolbar" thing...
+// Yup, in order to turn them off, we'd have to have an "OFF" toolbar button. Ick.
/* QActionGroup * group = new QActionGroup(this);
group->addAction(deleteAct);
group->addAction(addDimensionAct);
// This is essentially the same as the previous function, but this allows more
// than one key sequence to be added as key shortcuts.
//
-QAction * ApplicationWindow::CreateAction2(QString name, QString tooltip, QString statustip,
+QAction * ApplicationWindow::CreateAction(QString name, QString tooltip, QString statustip,
QIcon icon, QKeySequence key1, QKeySequence key2, bool checkable/*= false*/)
{
QAction * action = new QAction(icon, name, this);
menu->addSeparator();
menu->addAction(exitAct);
+ menu = menuBar()->addMenu(tr("&View"));
+ menu->addAction(zoomInAct);
+ menu->addAction(zoomOutAct);
+
menu = menuBar()->addMenu(tr("&Edit"));
menu->addAction(fixAngleAct);
menu->addAction(fixLengthAct);
menu->addAction(addLineAct);
menu->addAction(addCircleAct);
menu->addAction(addArcAct);
+ menu->addAction(addPolygonAct);
menu->addAction(addDimensionAct);
menu->addSeparator();
menu->addAction(settingsAct);
-// editMenu = menuBar()->addMenu(tr("&Edit"));
-// editMenu->addAction(cutAct);
-// editMenu->addAction(copyAct);
-// editMenu->addAction(pasteAct);
-
-// menuBar()->addSeparator();
-
menu = menuBar()->addMenu(tr("&Help"));
menu->addAction(aboutAct);
-// helpMenu->addAction(aboutQtAct);
}
void ApplicationWindow::CreateToolbars(void)
QToolBar * toolbar = addToolBar(tr("File"));
toolbar->addAction(exitAct);
+ toolbar = addToolBar(tr("View"));
+ toolbar->addAction(zoomInAct);
+ toolbar->addAction(zoomOutAct);
+
toolbar = addToolBar(tr("Edit"));
toolbar->addAction(fixAngleAct);
toolbar->addAction(fixLengthAct);
toolbar->addAction(addLineAct);
toolbar->addAction(addCircleAct);
toolbar->addAction(addArcAct);
+ toolbar->addAction(addPolygonAct);
toolbar->addAction(addDimensionAct);
}