]> Shamusworld >> Repos - architektonas/blobdiff - src/applicationwindow.cpp
Added ability to translate groups with Lines.
[architektonas] / src / applicationwindow.cpp
index a9108eb5f6d3d2b5d96b5280b99e13652013f6ed..daae37cf0e4fd61898f1eac1998d1184e7c91922 100644 (file)
 #include "applicationwindow.h"
 
 #include "about.h"
+#include "blockwidget.h"
 #include "drawingview.h"
 #include "fileio.h"
 #include "generaltab.h"
+#include "layerwidget.h"
 #include "painter.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...!
@@ -53,20 +58,26 @@ ApplicationWindow::ApplicationWindow(): settings("Underground Software", "Archit
        CreateMenus();
        CreateToolbars();
 
+       // Create Dock widgets
+       QDockWidget * dock1 = new QDockWidget(tr("Layers"), this);
+       LayerWidget * lw = new LayerWidget;
+       dock1->setWidget(lw);
+       addDockWidget(Qt::RightDockWidgetArea, dock1);
+       QDockWidget * dock2 = new QDockWidget(tr("Blocks"), this);
+       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%");
        statusBar()->addPermanentWidget(zoomIndicator);
        statusBar()->showMessage(tr("Ready"));
 
        ReadSettings();
-
-//     connect(textEdit->document(), SIGNAL(contentsChanged()),
-//                     this, SLOT(documentWasModified()));
-
-//     setCurrentFile("");
        setUnifiedTitleAndToolBarOnMac(true);
-
-//     ((TTEdit *)qApp)->charWnd->show();//eh?
        Object::SetFont(new QFont("Verdana", 15, QFont::Bold));
 }
 
@@ -197,7 +208,17 @@ void ApplicationWindow::FixLength(void)
 // We want certain tools to be exclusive, and this approach isn't working correctly...
 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 (drawing->document.ItemsSelected() > 0)
+       {
+               drawing->document.DeleteSelectedItems();
+               drawing->update();
+               deleteAct->setChecked(false);
+               return;
+       }
+
+       // Otherwise, toggle the state of the tool
        ClearUIToolStatesExcept(deleteAct);
        SetInternalToolStates();
 }
@@ -272,11 +293,15 @@ 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;
+//     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));
        drawing->UpdateGridBackground();
        drawing->update();
+
+       baseUnitInput->setText(QString("%1").arg(drawing->gridSpacing));
 }
 
 
@@ -309,10 +334,13 @@ 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;
+//     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));
        drawing->UpdateGridBackground();
        drawing->update();
+
+       baseUnitInput->setText(QString("%1").arg(drawing->gridSpacing));
 }
 
 
@@ -382,11 +410,16 @@ void ApplicationWindow::Settings(void)
 }
 
 
+//
+// Group a bunch of selected objects (which can include other groups) together
+// or ungroup a selected group.
+//
 void ApplicationWindow::HandleGrouping(void)
 {
-       // Group a bunch of selected objects together or ungroup a selected group.
+       int itemsSelected = drawing->document.ItemsSelected();
 
-       if (drawing->document.ItemsSelected() == 0)
+       // If nothing selected, do nothing
+       if (itemsSelected == 0)
        {
                statusBar()->showMessage(tr("No objects selected to make a group from."));
                return;
@@ -394,7 +427,7 @@ void ApplicationWindow::HandleGrouping(void)
 
        // If it's a group that's selected, ungroup it and leave the objects in a
        // selected state
-       if (drawing->document.ItemsSelected() == 1)
+       if (itemsSelected == 1)
        {
                Object * object = drawing->document.SelectedItem(0);
 
@@ -418,29 +451,73 @@ else
                ((Container *)object)->SelectAll();
                ((Container *)object)->MoveContentsTo(&(drawing->document));
                drawing->document.Delete(object);
+               statusBar()->showMessage(tr("Objects ungrouped."));
        }
        // Otherwise, if it's a group of 2 or more objects (which can be groups too)
        // group them and select the group
-       else if (drawing->document.ItemsSelected() > 1)
+       else if (itemsSelected > 1)
        {
                Container * container = new Container(Vector(), &(drawing->document));
                drawing->document.MoveSelectedContentsTo(container);
                drawing->document.Add(container);
                container->DeselectAll();
                container->state = OSSelected;
+               statusBar()->showMessage(QString(tr("Grouped %1 objects.")).arg(itemsSelected));
        }
 
        drawing->update();
 }
 
 
+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;
+       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."),
                QIcon(":/res/quit.png"), QKeySequence(tr("Ctrl+q")));
        connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
 
-       snapToGridAct = CreateAction(tr("Snap To &Grid"), tr("Snap To Grid"), tr("Snaps mouse cursor to the visible grid when moving/creating objects."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("S")), true);
+       snapToGridAct = CreateAction(tr("Snap To &Grid"), tr("Snap To Grid"), tr("Snaps mouse cursor to the visible grid when moving/creating objects."), QIcon(":/res/snap-to-grid-tool.png"), QKeySequence(tr("S")), true);
        connect(snapToGridAct, SIGNAL(triggered()), this, SLOT(SnapToGridTool()));
 
        fixAngleAct = CreateAction(tr("Fix &Angle"), tr("Fix Angle"), tr("Fixes the angle of an object."),
@@ -451,7 +528,7 @@ void ApplicationWindow::CreateActions(void)
                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/delete-tool.png"), QKeySequence(), true);
+       deleteAct = CreateAction(tr("&Delete"), tr("Delete Object"), tr("Deletes selected objects."), QIcon(":/res/delete-tool.png"), QKeySequence(tr("Delete")), 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);
@@ -498,9 +575,13 @@ void ApplicationWindow::CreateActions(void)
        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()));
 
-       groupAct = CreateAction(tr("&Group"), tr("Group"), tr("Group/ungroup selected objects."), QIcon(":/res/generic-tool.png"), QKeySequence("g"));
+       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);
@@ -569,6 +650,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();
@@ -588,25 +671,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)));
 }
 
 
@@ -618,10 +719,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());
 }
 
 
@@ -629,9 +727,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());
 }