X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fapplicationwindow.cpp;h=bf9baf45781fb076e8c9f9c733969f3f5784ba53;hb=642cf72c11b49a9e00128ab6258a2438c785a5ab;hp=20387318f1f5d24fb022dffad04cf379e891b198;hpb=e11a07565fe5ef3dfafbf9a933d7a1575e058867;p=architektonas diff --git a/src/applicationwindow.cpp b/src/applicationwindow.cpp index 2038731..bf9baf4 100644 --- a/src/applicationwindow.cpp +++ b/src/applicationwindow.cpp @@ -29,17 +29,28 @@ #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 "mirroraction.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...! + drawing->setFocusPolicy(Qt::StrongFocus); setCentralWidget(drawing); aboutWin = new AboutWindow(this); @@ -53,21 +64,29 @@ 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)); + + connect(lw, SIGNAL(LayerSelected(int)), drawing, SLOT(SetCurrentLayer(int))); } @@ -197,7 +216,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(); } @@ -217,6 +246,13 @@ void ApplicationWindow::RotateTool(void) } +void ApplicationWindow::MirrorTool(void) +{ + ClearUIToolStatesExcept(mirrorAct); + SetInternalToolStates(); +} + + void ApplicationWindow::AddLineTool(void) { ClearUIToolStatesExcept(addLineAct); @@ -272,11 +308,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)); } @@ -309,10 +352,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)); } @@ -338,6 +387,9 @@ void ApplicationWindow::ClearUIToolStatesExcept(QAction * exception) if (exception != rotateAct) rotateAct->setChecked(false); + + if (exception != mirrorAct) + mirrorAct->setChecked(false); } @@ -356,9 +408,20 @@ 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); + drawing->SetToolActive(mirrorAct->isChecked() ? new MirrorAction() : NULL); +#endif + + update(); } @@ -382,9 +445,106 @@ 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 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 (itemsSelected == 1) + { + Object * object = drawing->document.SelectedItem(0); + +#if 0 +if (object == NULL) + printf("SelectedItem = NULL!\n"); +else + printf("SelectedItem = %08X, type = %i\n", object, object->type); +#endif + + if (object == NULL || object->type != OTContainer) + { + statusBar()->showMessage(tr("A group requires two or more selected objects.")); + return; + } + + // Need the parent of the group, we're assuming here that the parent is + // the drawing's document. Does it matter? Maybe... + // Could just stipulate that grouping like this only takes place where the + // parent of the group is the drawing's document. Makes life much simpler. + ((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 (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; + 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(); } @@ -394,7 +554,7 @@ void ApplicationWindow::CreateActions(void) 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."), @@ -405,7 +565,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); @@ -435,26 +595,34 @@ void ApplicationWindow::CreateActions(void) zoomOutAct = CreateAction(tr("Zoom &Out"), tr("Zoom Out"), tr("Zoom out of the document."), QIcon(":/res/zoom-out.png"), QKeySequence(tr("-"))); connect(zoomOutAct, SIGNAL(triggered()), this, SLOT(ZoomOutTool())); - fileNewAct = CreateAction(tr("&New Drawing"), tr("New Drawing"), tr("Creates a new drawing."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("Ctrl+n"))); + fileNewAct = CreateAction(tr("&New Drawing"), tr("New Drawing"), tr("Creates a new drawing."), QIcon(":/res/file-new.png"), QKeySequence(tr("Ctrl+n"))); connect(fileNewAct, SIGNAL(triggered()), this, SLOT(FileNew())); - fileOpenAct = CreateAction(tr("&Open Drawing"), tr("Open Drawing"), tr("Opens an existing drawing from a file."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("Ctrl+o"))); + fileOpenAct = CreateAction(tr("&Open Drawing"), tr("Open Drawing"), tr("Opens an existing drawing from a file."), QIcon(":/res/file-open.png"), QKeySequence(tr("Ctrl+o"))); connect(fileOpenAct, SIGNAL(triggered()), this, SLOT(FileOpen())); - fileSaveAct = CreateAction(tr("&Save Drawing"), tr("Save Drawing"), tr("Saves the current drawing to a file."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("Ctrl+s"))); + fileSaveAct = CreateAction(tr("&Save Drawing"), tr("Save Drawing"), tr("Saves the current drawing to a file."), QIcon(":/res/file-save.png"), QKeySequence(tr("Ctrl+s"))); connect(fileSaveAct, SIGNAL(triggered()), this, SLOT(FileSave())); - fileSaveAsAct = CreateAction(tr("Save Drawing &As"), tr("Save As"), tr("Saves the current drawing to a file with a different name."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("Ctrl+Shift+s"))); + fileSaveAsAct = CreateAction(tr("Save Drawing &As"), tr("Save As"), tr("Saves the current drawing to a file with a different name."), QIcon(":/res/file-save-as.png"), QKeySequence(tr("Ctrl+Shift+s"))); connect(fileSaveAsAct, SIGNAL(triggered()), this, SLOT(FileSaveAs())); - fileCloseAct = CreateAction(tr("&Close Drawing"), tr("Close Drawing"), tr("Closes the current drawing."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("Ctrl+w"))); + fileCloseAct = CreateAction(tr("&Close Drawing"), tr("Close Drawing"), tr("Closes the current drawing."), QIcon(":/res/file-close.png"), QKeySequence(tr("Ctrl+w"))); - settingsAct = CreateAction(tr("&Settings"), tr("Settings"), tr("Change certain defaults for Architektonas."), QIcon(":/res/generic-tool.png"), QKeySequence()); + settingsAct = CreateAction(tr("&Settings"), tr("Settings"), tr("Change certain defaults for Architektonas."), QIcon(":/res/settings.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")); + + 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())); + + //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); @@ -523,6 +691,9 @@ void ApplicationWindow::CreateMenus(void) menu->addAction(fixAngleAct); menu->addAction(fixLengthAct); menu->addAction(rotateAct); + menu->addAction(mirrorAct); + menu->addAction(connectAct); + menu->addAction(disconnectAct); menu->addSeparator(); menu->addAction(deleteAct); menu->addSeparator(); @@ -542,25 +713,49 @@ void ApplicationWindow::CreateMenus(void) void ApplicationWindow::CreateToolbars(void) { QToolBar * toolbar = addToolBar(tr("File")); - toolbar->addAction(exitAct); + toolbar->setObjectName("File"); // Needed for saveState() + toolbar->addAction(fileNewAct); + toolbar->addAction(fileOpenAct); + toolbar->addAction(fileSaveAct); + toolbar->addAction(fileSaveAsAct); + toolbar->addAction(fileCloseAct); +// 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(mirrorAct); 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))); } @@ -572,10 +767,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()); } @@ -583,9 +775,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()); }