]> Shamusworld >> Repos - architektonas/blobdiff - src/applicationwindow.cpp
Added key modifiers to Actions.
[architektonas] / src / applicationwindow.cpp
index ef42ca24a6acc9fc2c00089965f7855ff5e13852..8600d2d16fee6fc1ca3a88523fc1c9069c4856b5 100644 (file)
 #include "about.h"
 #include "blockwidget.h"
 #include "drawingview.h"
+#include "drawarcaction.h"
+#include "drawcircleaction.h"
+#include "drawdimensionaction.h"
+#include "drawlineaction.h"
 #include "fileio.h"
 #include "generaltab.h"
 #include "layerwidget.h"
 #include "settingsdialog.h"
 
 
-ApplicationWindow::ApplicationWindow(): settings("Underground Software", "Architektonas")
+ApplicationWindow::ApplicationWindow():
+       baseUnitInput(new QLineEdit),
+       dimensionSizeInput(new QLineEdit),
+       settings("Underground Software", "Architektonas")
 {
        drawing = new DrawingView(this);
        drawing->setMouseTracking(true);                // We want *all* mouse events...!
+       drawing->setFocusPolicy(Qt::StrongFocus);
        setCentralWidget(drawing);
 
        aboutWin = new AboutWindow(this);
@@ -61,9 +69,12 @@ ApplicationWindow::ApplicationWindow(): settings("Underground Software", "Archit
        dock1->setWidget(lw);
        addDockWidget(Qt::RightDockWidgetArea, dock1);
        QDockWidget * dock2 = new QDockWidget(tr("Blocks"), this);
-//     BlockWidget * bw = new BlockWidget;
-//     dock2->setWidget(bw);
+       BlockWidget * bw = new BlockWidget;
+       dock2->setWidget(bw);
        addDockWidget(Qt::RightDockWidgetArea, dock2);
+       // Needed for saveState()
+       dock1->setObjectName("Layers");
+       dock2->setObjectName("Blocks");
 
        //      Create status bar
        zoomIndicator = new QLabel("Grid: 12.0\" Zoom: 12.5%");
@@ -287,11 +298,18 @@ when zooming in, new origin will be (xCenter - origin.x) / 2, (yCenter - origin.
 
 //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.
        Painter::zoom *= zoomFactor;
-       drawing->gridSpacing = 12.0 / Painter::zoom;
-       zoomIndicator->setText(QString("Grid: %2\" Zoom: %1%").arg(Painter::zoom * 100.0 * SCREEN_ZOOM).arg(drawing->gridSpacing));
+//     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));
+       baseUnitInput->setText(QString("%1").arg(Object::gridSpacing));
 }
 
 
@@ -324,10 +342,16 @@ x 2 = (-426, -301)
 //printf("Zoom out...\n");
        // This just zooms leaving origin intact... should zoom out at the current center! [DONE]
        Painter::zoom /= zoomFactor;
-       drawing->gridSpacing = 12.0 / Painter::zoom;
-       zoomIndicator->setText(QString("Grid: %2\" Zoom: %1%").arg(Painter::zoom * 100.0 * SCREEN_ZOOM).arg(drawing->gridSpacing));
+//     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));
+       baseUnitInput->setText(QString("%1").arg(Object::gridSpacing));
 }
 
 
@@ -371,9 +395,19 @@ void ApplicationWindow::SetInternalToolStates(void)
                drawing->toolAction = NULL;
        }
 
+#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);
+#endif
+
+       update();
 }
 
 
@@ -456,6 +490,50 @@ else
 }
 
 
+void ApplicationWindow::HandleGridSizeInPixels(int size)
+{
+       drawing->SetGridSize(size);
+       drawing->update();
+}
+
+
+void ApplicationWindow::HandleGridSizeInBaseUnits(QString text)
+{
+       // Parse the text...
+       bool ok;
+       double value = text.toDouble(&ok);
+
+       // Nothing parsable to a double, so quit...
+       if (!ok || value == 0)
+               return;
+
+//     drawing->gridSpacing = value;
+//     Painter::zoom = drawing->gridPixels / drawing->gridSpacing;
+       Object::gridSpacing = value;
+       Painter::zoom = drawing->gridPixels / Object::gridSpacing;
+       drawing->UpdateGridBackground();
+       drawing->update();
+}
+
+
+void ApplicationWindow::HandleDimensionSize(QString text)
+{
+       // Parse the text...
+       bool ok;
+       double value = text.toDouble(&ok);
+
+       // Nothing parsable to a double, so quit...
+       if (!ok || value == 0)
+               return;
+
+       drawing->document.ResizeAllDimensions(value);
+//     drawing->gridSpacing = value;
+//     Painter::zoom = drawing->gridPixels / drawing->gridSpacing;
+//     drawing->UpdateGridBackground();
+       drawing->update();
+}
+
+
 void ApplicationWindow::CreateActions(void)
 {
        exitAct = CreateAction(tr("&Quit"), tr("Quit"), tr("Exits the application."),
@@ -523,6 +601,10 @@ void ApplicationWindow::CreateActions(void)
        groupAct = CreateAction(tr("&Group"), tr("Group"), tr("Group/ungroup selected objects."), QIcon(":/res/group-tool.png"), QKeySequence("g"));
        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"));
+
+       disconnectAct = CreateAction(tr("&Disconnect"), tr("Disconnect"), tr("Disconnect objects joined at point."), QIcon(":/res/disconnect-tool.png"), QKeySequence("d,d"));
+
 //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);
@@ -591,6 +673,8 @@ void ApplicationWindow::CreateMenus(void)
        menu->addAction(fixAngleAct);
        menu->addAction(fixLengthAct);
        menu->addAction(rotateAct);
+       menu->addAction(connectAct);
+       menu->addAction(disconnectAct);
        menu->addSeparator();
        menu->addAction(deleteAct);
        menu->addSeparator();
@@ -610,25 +694,43 @@ void ApplicationWindow::CreateMenus(void)
 void ApplicationWindow::CreateToolbars(void)
 {
        QToolBar * toolbar = addToolBar(tr("File"));
+       toolbar->setObjectName("File"); // Needed for saveState()
        toolbar->addAction(exitAct);
 
        toolbar = addToolBar(tr("View"));
+       toolbar->setObjectName("View");
        toolbar->addAction(zoomInAct);
        toolbar->addAction(zoomOutAct);
 
+       QSpinBox * spinbox = new QSpinBox;
+       toolbar->addWidget(spinbox);
+//     QLineEdit * lineedit = new QLineEdit;
+       toolbar->addWidget(baseUnitInput);
+       toolbar->addWidget(dimensionSizeInput);
+
        toolbar = addToolBar(tr("Edit"));
+       toolbar->setObjectName("Edit");
        toolbar->addAction(snapToGridAct);
        toolbar->addAction(groupAct);
        toolbar->addAction(fixAngleAct);
        toolbar->addAction(fixLengthAct);
        toolbar->addAction(rotateAct);
        toolbar->addAction(deleteAct);
+       toolbar->addAction(connectAct);
+       toolbar->addAction(disconnectAct);
        toolbar->addSeparator();
        toolbar->addAction(addLineAct);
        toolbar->addAction(addCircleAct);
        toolbar->addAction(addArcAct);
        toolbar->addAction(addPolygonAct);
        toolbar->addAction(addDimensionAct);
+
+       spinbox->setRange(4, 256);
+       spinbox->setValue(12);
+       baseUnitInput->setText("12");
+       connect(spinbox, SIGNAL(valueChanged(int)), this, SLOT(HandleGridSizeInPixels(int)));
+       connect(baseUnitInput, SIGNAL(textChanged(QString)), this, SLOT(HandleGridSizeInBaseUnits(QString)));
+       connect(dimensionSizeInput, SIGNAL(textChanged(QString)), this, SLOT(HandleDimensionSize(QString)));
 }
 
 
@@ -640,10 +742,7 @@ void ApplicationWindow::ReadSettings(void)
        snapToGridAct->setChecked(settings.value("snapToGrid", true).toBool());
        resize(size);
        move(pos);
-//     pos = settings.value("charWndPos", QPoint(0, 0)).toPoint();
-//     size = settings.value("charWndSize", QSize(200, 200)).toSize();
-//     ((TTEdit *)qApp)->charWnd->resize(size);
-//     ((TTEdit *)qApp)->charWnd->move(pos);
+       restoreState(settings.value("windowState").toByteArray());
 }
 
 
@@ -651,9 +750,8 @@ void ApplicationWindow::WriteSettings(void)
 {
        settings.setValue("pos", pos());
        settings.setValue("size", size());
+       settings.setValue("windowState", saveState());
        settings.setValue("useAntialiasing", drawing->useAntialiasing);
        settings.setValue("snapToGrid", snapToGridAct->isChecked());
-//     settings.setValue("charWndPos", ((TTEdit *)qApp)->charWnd->pos());
-//     settings.setValue("charWndSize", ((TTEdit *)qApp)->charWnd->size());
 }