X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fapplicationwindow.cpp;h=a4c39b74fe96eace7ee7376055641138c6c49d1e;hb=e78daf62eb771ee29a59035d16cf63c1e6ebe144;hp=ad832720743d286da3284823bfbaf6d12a668694;hpb=0fcc2d879e1e0ca17eeaceae2159f5143a06586f;p=architektonas diff --git a/src/applicationwindow.cpp b/src/applicationwindow.cpp index ad83272..a4c39b7 100644 --- a/src/applicationwindow.cpp +++ b/src/applicationwindow.cpp @@ -35,6 +35,7 @@ #include "generaltab.h" #include "global.h" #include "layerwidget.h" +#include "objectwidget.h" #include "painter.h" #include "settingsdialog.h" #include "structs.h" @@ -75,11 +76,16 @@ ApplicationWindow::ApplicationWindow(): BlockWidget * bw = new BlockWidget; dock2->setWidget(bw); addDockWidget(Qt::RightDockWidgetArea, dock2); + QDockWidget * dock3 = new QDockWidget(tr("Object"), this); + ObjectWidget * ow = new ObjectWidget; + dock3->setWidget(ow); + addDockWidget(Qt::RightDockWidgetArea, dock3); // Needed for saveState() dock1->setObjectName("Layers"); dock2->setObjectName("Blocks"); + dock3->setObjectName("Object"); - // Create status bar + // Create status bar zoomIndicator = new QLabel("Grid: 12.0\" BU: Inch"); statusBar()->addPermanentWidget(zoomIndicator); statusBar()->showMessage(tr("Ready")); @@ -91,6 +97,8 @@ ApplicationWindow::ApplicationWindow(): connect(lw, SIGNAL(LayerDeleted(int)), drawing, SLOT(DeleteCurrentLayer(int))); connect(lw, SIGNAL(LayerToggled()), drawing, SLOT(HandleLayerToggle())); connect(lw, SIGNAL(LayersSwapped(int, int)), drawing, SLOT(HandleLayerSwap(int, int))); + + connect(drawing, SIGNAL(ObjectHovered(Object *)), ow, SLOT(ShowInfo(Object *))); } @@ -104,8 +112,9 @@ void ApplicationWindow::closeEvent(QCloseEvent * event) void ApplicationWindow::FileNew(void) { - // Should warn the user if drawing hasn't been saved... - drawing->document.objects.empty(); + // Should warn the user if drawing hasn't been saved... !!! FIX !!! + DeleteContents(drawing->document.objects); + drawing->document.objects.clear(); drawing->update(); documentName.clear(); setWindowTitle("Architektonas - Untitled"); @@ -133,7 +142,7 @@ void ApplicationWindow::FileOpen(void) return; } - Container container;//(Vector(0, 0)); + Container container; bool successful = FileIO::LoadAtnsFile(file, &container); fclose(file); @@ -143,10 +152,16 @@ void ApplicationWindow::FileOpen(void) msg.setText(QString(tr("Could not load file \"%1\"!")).arg(filename)); msg.setIcon(QMessageBox::Critical); msg.exec(); + // Make sure to delete any hanging objects in the container... + DeleteContents(container.objects); return; } -printf("FileOpen: container size = %li\n", container.objects.size()); +//printf("FileOpen: container size = %li\n", container.objects.size()); + // Keep memory leaks from happening by getting rid of the old document + DeleteContents(drawing->document.objects); + // We can do this because the vector is just a bunch of pointers to our + // Objects, and the Containers (non-empty) can be moved way with no problem. drawing->document = container; drawing->update(); documentName = filename; @@ -181,7 +196,8 @@ void ApplicationWindow::FileSave(void) msg.setText(QString(tr("Could not save file \"%1\"!")).arg(documentName)); msg.setIcon(QMessageBox::Critical); msg.exec(); - // In this case, we should unlink the created file, since it's not right... + // In this case, we should unlink the created file, since it's not + // right... // unlink(documentName.toUtf8().data()); QFile::remove(documentName); return; @@ -227,9 +243,9 @@ 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->numSelected > 0) +// if (drawing->numSelected > 0) + if (drawing->select.size() > 0) { -// drawing->DeleteSelectedItems(); DeleteSelectedObjects(drawing->document.objects); drawing->update(); deleteAct->setChecked(false); @@ -507,8 +523,9 @@ else // 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. + // 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); @@ -526,6 +543,70 @@ else statusBar()->showMessage(QString(tr("Grouped %1 objects.")).arg(itemsSelected)); } #else + int numSelected = drawing->select.size(); + + // If nothing selected, do nothing + if (numSelected == 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 (numSelected == 1) + { + Object * obj = (Object *)drawing->select[0]; + + if (obj->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); + Container * c = (Container *)obj; +//printf("Ungroup: container size = %li\n", c->objects.size()); + SelectAll(c->objects); +//printf("Ungroup: document size = %li (pre-AddObjectsTo)\n", drawing->document.objects.size()); + RemoveSelectedObjects(drawing->document.objects); + AddObjectsTo(drawing->document.objects, c->objects); + drawing->select.clear(); + AddObjectsTo(drawing->select, c->objects); + delete c; + statusBar()->showMessage(tr("Objects ungrouped.")); +//printf("Ungroup: document size = %li\n", drawing->document.objects.size()); + } + // Otherwise, if it's a group of 2 or more objects (which can be groups too) + // group them and select the group + else if (numSelected > 1) + { +// Container * container = new Container(Vector(), &(drawing->document)); +// drawing->document.MoveSelectedContentsTo(container); +// drawing->document.Add(container); +// container->DeselectAll(); +// container->state = OSSelected; + + Container * c = new Container(); +// AddObjectsTo(c->objects, drawing->select); +// RemoveSelectedObjects(drawing->document.objects); + MoveSelectedObjectsTo(c->objects, drawing->document.objects); + drawing->document.objects.push_back(c); + ClearSelected(c->objects); + c->selected = true; + c->layer = Global::currentLayer; + drawing->select.clear(); + drawing->select.push_back(c); + statusBar()->showMessage(QString(tr("Grouped %1 objects.")).arg(numSelected)); +//printf("Group: document size = %li\n", drawing->document.objects.size()); + } #endif drawing->update();