#include "drawlineaction.h"
#include "fileio.h"
#include "generaltab.h"
+#include "geometry.h"
#include "layerwidget.h"
#include "mirroraction.h"
#include "painter.h"
+#include "rotateaction.h"
#include "settingsdialog.h"
+// Class variables
+DrawingView * ApplicationWindow::drawing;
+
+
ApplicationWindow::ApplicationWindow():
baseUnitInput(new QLineEdit),
dimensionSizeInput(new QLineEdit),
msg.setIcon(QMessageBox::Critical);
msg.exec();
// In this case, we should unlink the created file, since it's not right...
- unlink(documentName.toAscii().data());
+// unlink(documentName.toAscii().data());
+ QFile::remove(documentName);
return;
}
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]
- // This should actually be calculated by drawing->gridPixels / grid size.
+ // This just zooms leaving origin intact... should zoom in at the current
+ // center! [DONE]
Painter::zoom *= zoomFactor;
-// drawing->gridSpacing = drawing->gridPixels / Painter::zoom;
Object::gridSpacing = drawing->gridPixels / Painter::zoom;
-// zoomIndicator->setText(QString("Grid: %2\" Zoom: %1%").arg(Painter::zoom * 100.0 * SCREEN_ZOOM).arg(drawing->gridSpacing));
-// zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(drawing->gridSpacing));
- zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Object::gridSpacing));
drawing->UpdateGridBackground();
drawing->update();
-// baseUnitInput->setText(QString("%1").arg(drawing->gridSpacing));
+ zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Object::gridSpacing));
baseUnitInput->setText(QString("%1").arg(Object::gridSpacing));
}
//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]
+ // This just zooms leaving origin intact... should zoom out at the current
+ // center! [DONE]
Painter::zoom /= zoomFactor;
-// drawing->gridSpacing = drawing->gridPixels / Painter::zoom;
Object::gridSpacing = drawing->gridPixels / Painter::zoom;
-// zoomIndicator->setText(QString("Grid: %2\" Zoom: %1%").arg(Painter::zoom * 100.0 * SCREEN_ZOOM).arg(drawing->gridSpacing));
-// zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(drawing->gridSpacing));
- zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Object::gridSpacing));
drawing->UpdateGridBackground();
drawing->update();
-// baseUnitInput->setText(QString("%1").arg(drawing->gridSpacing));
+ zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Object::gridSpacing));
baseUnitInput->setText(QString("%1").arg(Object::gridSpacing));
}
{
Object::SetDeleteActive(deleteAct->isChecked());
Object::SetDimensionActive(addDimensionAct->isChecked());
- drawing->SetRotateToolActive(rotateAct->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
{
delete drawing->toolAction;
drawing->toolAction = NULL;
+ Object::ignoreClicks = false;
}
-#if 0
- drawing->SetAddLineToolActive(addLineAct->isChecked());
- drawing->SetAddCircleToolActive(addCircleAct->isChecked());
- drawing->SetAddArcToolActive(addArcAct->isChecked());
- drawing->SetAddDimensionToolActive(addDimensionAct->isChecked());
-#else
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(mirrorAct->isChecked() ? new MirrorAction() : NULL);
-#endif
+ drawing->SetToolActive(rotateAct->isChecked() ? new RotateAction() : NULL);
+
+ if (drawing->toolAction)
+ Object::ignoreClicks = true;
- update();
+ drawing->update();
}
}
+void ApplicationWindow::HandleConnection(void)
+{
+//double tt = Geometry::ParameterOfLineAndPoint(Vector(0, 0), Vector(10, 0), Vector(8, 2));
+//printf("Parameter of point @ (8,2) of line (0,0), (10,0): %lf\n", tt);
+ int itemsSelected = drawing->document.ItemsSelected();
+
+ // If nothing selected, do nothing
+ if (itemsSelected == 0)
+ {
+ statusBar()->showMessage(tr("No objects selected to connect."));
+ return;
+ }
+
+ // If one thing selected, do nothing
+ if (itemsSelected == 1)
+ {
+ statusBar()->showMessage(tr("Nothing to connect object to."));
+ return;
+ }
+
+ // This is O(n^2 / 2) :-P
+ for(int i=0; i<itemsSelected; i++)
+ {
+ Object * obj1 = drawing->document.SelectedItem(i);
+
+ for(int j=i+1; j<itemsSelected; j++)
+ {
+ Object * obj2 = drawing->document.SelectedItem(j);
+ double t, u;
+
+ if ((obj1->type != OTLine) || (obj2->type != OTLine))
+ continue;
+
+//printf("Testing objects for intersection (%X, %X)...\n", obj1, obj2);
+ int intersects = Geometry::Intersects((Line *)obj1, (Line *)obj2, &t, &u);
+//printf(" (%s) --> t=%lf, u=%lf\n", (intersects ? "true" : "FALSE"), t, u);
+
+ if (intersects)
+ {
+printf("Connecting objects (%X, %X)...\n", obj1, obj2);
+ obj1->Connect(obj2, u);
+ obj2->Connect(obj1, t);
+ }
+ }
+ }
+}
+
+
+void ApplicationWindow::HandleDisconnection(void)
+{
+}
+
+
void ApplicationWindow::HandleGridSizeInPixels(int size)
{
drawing->SetGridSize(size);
connect(groupAct, SIGNAL(triggered()), this, SLOT(HandleGrouping()));
connectAct = CreateAction(tr("&Connect"), tr("Connect"), tr("Connect objects at point."), QIcon(":/res/connect-tool.png"), QKeySequence("c,c"));
+ connect(connectAct, SIGNAL(triggered()), this, SLOT(HandleConnection()));
disconnectAct = CreateAction(tr("&Disconnect"), tr("Disconnect"), tr("Disconnect objects joined at point."), QIcon(":/res/disconnect-tool.png"), QKeySequence("d,d"));
+ connect(disconnectAct, SIGNAL(triggered()), this, SLOT(HandleDisconnection()));
mirrorAct = CreateAction(tr("&Mirror"), tr("Mirror"), tr("Mirror selected objects around a line."), QIcon(":/res/mirror-tool.png"), QKeySequence("m,i"), true);
connect(mirrorAct, SIGNAL(triggered()), this, SLOT(MirrorTool()));