]> Shamusworld >> Repos - architektonas/blobdiff - src/applicationwindow.cpp
Misc. fixes & additions
[architektonas] / src / applicationwindow.cpp
index 71e8a087d5618225543d37438e1e5b8c23986d53..23629bca9976e3ef78a5780e5b45d4da6169bada 100644 (file)
@@ -37,6 +37,7 @@
 #include "drawlineaction.h"
 #include "fileio.h"
 #include "generaltab.h"
+#include "geometry.h"
 #include "layerwidget.h"
 #include "mirroraction.h"
 #include "painter.h"
@@ -178,7 +179,8 @@ void ApplicationWindow::FileSave(void)
                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;
        }
 
@@ -312,18 +314,14 @@ when zooming in, new origin will be (xCenter - origin.x) / 2, (yCenter - origin.
        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));
 }
 
@@ -355,17 +353,14 @@ x 2 = (-426, -301)
 //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));
 }
 
@@ -506,6 +501,59 @@ else
 }
 
 
+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);
@@ -618,8 +666,10 @@ void ApplicationWindow::CreateActions(void)
        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()));