]> Shamusworld >> Repos - architektonas/blobdiff - src/applicationwindow.cpp
Initial work on bringing sanity to insane codebase.
[architektonas] / src / applicationwindow.cpp
index 5261dd11a2488037d601f1b0e44e836edb51f16f..06ec68ce89a6ad4857843b53f53fc13e53320a8b 100644 (file)
 
 #include "about.h"
 #include "blockwidget.h"
-#include "dimension.h"
+//#include "dimension.h"
 #include "drawingview.h"
-#include "drawarcaction.h"
-#include "drawcircleaction.h"
-#include "drawdimensionaction.h"
-#include "drawlineaction.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 "geometry.h"
+#include "global.h"
 #include "layerwidget.h"
-#include "line.h"
-#include "mirroraction.h"
+//#include "line.h"
+//#include "mirroraction.h"
 #include "painter.h"
-#include "rotateaction.h"
+//#include "rotateaction.h"
 #include "settingsdialog.h"
+//#include "triangulateaction.h"
+//#include "trimaction.h"
 
 
 // Class variables
@@ -92,7 +96,7 @@ ApplicationWindow::ApplicationWindow():
 
        ReadSettings();
        setUnifiedTitleAndToolBarOnMac(true);
-       Object::SetFont(new QFont("Verdana", 15, QFont::Bold));
+       Global::font =  new QFont("Verdana", 15, QFont::Bold);
 
        connect(lw, SIGNAL(LayerSelected(int)), drawing, SLOT(SetCurrentLayer(int)));
 }
@@ -109,7 +113,8 @@ void ApplicationWindow::closeEvent(QCloseEvent * event)
 void ApplicationWindow::FileNew(void)
 {
        // Should warn the user if drawing hasn't been saved...
-       drawing->document.Clear();
+//     drawing->document.Clear();
+       drawing->document.objects.empty();
        drawing->update();
        documentName.clear();
        setWindowTitle("Architektonas - Untitled");
@@ -126,7 +131,7 @@ void ApplicationWindow::FileOpen(void)
        if (filename.isEmpty())
                return;
 
-       FILE * file = fopen(filename.toAscii().data(), "r");
+       FILE * file = fopen(filename.toUtf8().data(), "r");
 
        if (file == 0)
        {
@@ -137,7 +142,7 @@ void ApplicationWindow::FileOpen(void)
                return;
        }
 
-       Container container(Vector(0, 0));
+       Container container;//(Vector(0, 0));
        bool successful = FileIO::LoadAtnsFile(file, &container);
        fclose(file);
 
@@ -165,7 +170,7 @@ void ApplicationWindow::FileSave(void)
                documentName = QFileDialog::getSaveFileName(this, tr("Save Drawing"),
                        "", tr("Architektonas drawings (*.drawing)"));
 
-       FILE * file = fopen(documentName.toAscii().data(), "w");
+       FILE * file = fopen(documentName.toUtf8().data(), "w");
 
        if (file == 0)
        {
@@ -186,7 +191,7 @@ 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.toUtf8().data());
                QFile::remove(documentName);
                return;
        }
@@ -211,19 +216,19 @@ void ApplicationWindow::FileSaveAs(void)
 
 void ApplicationWindow::SnapToGridTool(void)
 {
-       Object::SetSnapMode(snapToGridAct->isChecked());
+       Global::snapToGrid = snapToGridAct->isChecked();
 }
 
 
 void ApplicationWindow::FixAngle(void)
 {
-       Object::SetFixedAngle(fixAngleAct->isChecked());
+       Global::fixedAngle = fixAngleAct->isChecked();
 }
 
 
 void ApplicationWindow::FixLength(void)
 {
-       Object::SetFixedLength(fixLengthAct->isChecked());
+       Global::fixedLength = fixLengthAct->isChecked();
 }
 
 
@@ -232,6 +237,7 @@ void ApplicationWindow::DeleteTool(void)
 {
        // For this tool, we check first to see if anything is selected. If so, we
        // delete those and *don't* select the delete tool.
+#if 0
        if (drawing->document.ItemsSelected() > 0)
        {
                drawing->document.DeleteSelectedItems();
@@ -239,6 +245,7 @@ void ApplicationWindow::DeleteTool(void)
                deleteAct->setChecked(false);
                return;
        }
+#endif
 
        // Otherwise, toggle the state of the tool
        ClearUIToolStatesExcept(deleteAct);
@@ -267,6 +274,20 @@ void ApplicationWindow::MirrorTool(void)
 }
 
 
+void ApplicationWindow::TrimTool(void)
+{
+       ClearUIToolStatesExcept(trimAct);
+       SetInternalToolStates();
+}
+
+
+void ApplicationWindow::TriangulateTool(void)
+{
+       ClearUIToolStatesExcept(triangulateAct);
+       SetInternalToolStates();
+}
+
+
 void ApplicationWindow::AddLineTool(void)
 {
        ClearUIToolStatesExcept(addLineAct);
@@ -295,6 +316,13 @@ void ApplicationWindow::AddPolygonTool(void)
 }
 
 
+void ApplicationWindow::AddSplineTool(void)
+{
+       ClearUIToolStatesExcept(addSplineAct);
+       SetInternalToolStates();
+}
+
+
 void ApplicationWindow::ZoomInTool(void)
 {
        double zoomFactor = 2.0;
@@ -324,12 +352,12 @@ when zooming in, new origin will be (xCenter - origin.x) / 2, (yCenter - origin.
        // This just zooms leaving origin intact... should zoom in at the current
        // center! [DONE]
        Painter::zoom *= zoomFactor;
-       Object::gridSpacing = drawing->gridPixels / Painter::zoom;
+       Global::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));
+       zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Global::gridSpacing));
+       baseUnitInput->setText(QString("%1").arg(Global::gridSpacing));
 }
 
 
@@ -363,12 +391,12 @@ x 2 = (-426, -301)
        // This just zooms leaving origin intact... should zoom out at the current
        // center! [DONE]
        Painter::zoom /= zoomFactor;
-       Object::gridSpacing = drawing->gridPixels / Painter::zoom;
+       Global::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));
+       zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Global::gridSpacing));
+       baseUnitInput->setText(QString("%1").arg(Global::gridSpacing));
 }
 
 
@@ -389,6 +417,9 @@ void ApplicationWindow::ClearUIToolStatesExcept(QAction * exception)
        if (exception != addPolygonAct)
                addPolygonAct->setChecked(false);
 
+       if (exception != addSplineAct)
+               addSplineAct->setChecked(false);
+
        if (exception != deleteAct)
                deleteAct->setChecked(false);
 
@@ -397,33 +428,44 @@ void ApplicationWindow::ClearUIToolStatesExcept(QAction * exception)
 
        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());
+       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.
+#if 0
        if (drawing->toolAction)
        {
                delete drawing->toolAction;
                drawing->toolAction = NULL;
-               Object::ignoreClicks = false;
+               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)
-               Object::ignoreClicks = true;
+               Global::ignoreClicks = true;
+#endif
 
        drawing->update();
 }
@@ -455,6 +497,7 @@ void ApplicationWindow::Settings(void)
 //
 void ApplicationWindow::HandleGrouping(void)
 {
+#if 0
        int itemsSelected = drawing->document.ItemsSelected();
 
        // If nothing selected, do nothing
@@ -503,6 +546,7 @@ else
                container->state = OSSelected;
                statusBar()->showMessage(QString(tr("Grouped %1 objects.")).arg(itemsSelected));
        }
+#endif
 
        drawing->update();
 }
@@ -510,6 +554,7 @@ else
 
 void ApplicationWindow::HandleConnection(void)
 {
+#if 0
 //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();
@@ -572,6 +617,7 @@ printf("   -> intersects = %i, t=%lf, u=%lf\n", intersects, t, u);
                        }
                }
        }
+#endif
 }
 
 
@@ -599,8 +645,8 @@ void ApplicationWindow::HandleGridSizeInBaseUnits(QString text)
 
 //     drawing->gridSpacing = value;
 //     Painter::zoom = drawing->gridPixels / drawing->gridSpacing;
-       Object::gridSpacing = value;
-       Painter::zoom = drawing->gridPixels / Object::gridSpacing;
+       Global::gridSpacing = value;
+       Painter::zoom = drawing->gridPixels / Global::gridSpacing;
        drawing->UpdateGridBackground();
        drawing->update();
 }
@@ -616,10 +662,7 @@ void ApplicationWindow::HandleDimensionSize(QString text)
        if (!ok || value == 0)
                return;
 
-       drawing->document.ResizeAllDimensions(value);
-//     drawing->gridSpacing = value;
-//     Painter::zoom = drawing->gridPixels / drawing->gridSpacing;
-//     drawing->UpdateGridBackground();
+//     drawing->document.ResizeAllDimensions(value);
        drawing->update();
 }
 
@@ -659,6 +702,9 @@ void ApplicationWindow::CreateActions(void)
        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()));
 
+       addSplineAct = CreateAction(tr("Add &Spline"), tr("Add Spline"), tr("Add a NURB spline to the drawing."), QIcon(":/res/add-spline-tool.png"), QKeySequence("A,S"), true);
+       connect(addSplineAct, SIGNAL(triggered()), this, SLOT(AddSplineTool()));
+
        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()));
 
@@ -700,6 +746,12 @@ void ApplicationWindow::CreateActions(void)
        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()));
 
+       trimAct = CreateAction(tr("&Trim"), tr("Trim"), tr("Trim extraneous lines from selected objects."), QIcon(":/res/trim-tool.png"), QKeySequence("t,r"), true);
+       connect(trimAct, SIGNAL(triggered()), this, SLOT(TrimTool()));
+
+       triangulateAct = CreateAction(tr("&Triangulate"), tr("Triangulate"), tr("Make triangles from selected lines, preserving their lengths."), QIcon(":/res/triangulate-tool.png"), QKeySequence("t,g"), true);
+       connect(triangulateAct, SIGNAL(triggered()), this, SLOT(TriangulateTool()));
+
 
 //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.
@@ -770,6 +822,8 @@ void ApplicationWindow::CreateMenus(void)
        menu->addAction(fixLengthAct);
        menu->addAction(rotateAct);
        menu->addAction(mirrorAct);
+       menu->addAction(trimAct);
+       menu->addAction(triangulateAct);
        menu->addAction(connectAct);
        menu->addAction(disconnectAct);
        menu->addSeparator();
@@ -779,6 +833,7 @@ void ApplicationWindow::CreateMenus(void)
        menu->addAction(addCircleAct);
        menu->addAction(addArcAct);
        menu->addAction(addPolygonAct);
+       menu->addAction(addSplineAct);
        menu->addAction(addDimensionAct);
        menu->addSeparator();
        menu->addAction(settingsAct);
@@ -818,6 +873,8 @@ void ApplicationWindow::CreateToolbars(void)
        toolbar->addAction(fixLengthAct);
        toolbar->addAction(rotateAct);
        toolbar->addAction(mirrorAct);
+       toolbar->addAction(trimAct);
+       toolbar->addAction(triangulateAct);
        toolbar->addAction(deleteAct);
        toolbar->addAction(connectAct);
        toolbar->addAction(disconnectAct);
@@ -826,6 +883,7 @@ void ApplicationWindow::CreateToolbars(void)
        toolbar->addAction(addCircleAct);
        toolbar->addAction(addArcAct);
        toolbar->addAction(addPolygonAct);
+       toolbar->addAction(addSplineAct);
        toolbar->addAction(addDimensionAct);
 
        spinbox->setRange(4, 256);