]> Shamusworld >> Repos - architektonas/blobdiff - src/applicationwindow.cpp
Added object pane, grouping, load/save functionality.
[architektonas] / src / applicationwindow.cpp
index ad832720743d286da3284823bfbaf6d12a668694..a4c39b74fe96eace7ee7376055641138c6c49d1e 100644 (file)
@@ -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();