#include "applicationwindow.h"
#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 "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...!
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));
}
// 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();
}
//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));
}
//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));
}
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();
}
}
+//
+// 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;
// 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);
((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."),
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);
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);
menu->addAction(fixAngleAct);
menu->addAction(fixLengthAct);
menu->addAction(rotateAct);
+ menu->addAction(connectAct);
+ menu->addAction(disconnectAct);
menu->addSeparator();
menu->addAction(deleteAct);
menu->addSeparator();
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)));
}
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());
}
{
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());
}