]> Shamusworld >> Repos - architektonas/blobdiff - src/applicationwindow.cpp
Added 1st stab at grouping capability.
[architektonas] / src / applicationwindow.cpp
index 0911b8e3742881eba036979b353391346339136c..a9108eb5f6d3d2b5d96b5280b99e13652013f6ed 100644 (file)
@@ -346,8 +346,19 @@ void ApplicationWindow::SetInternalToolStates(void)
        Object::SetDeleteActive(deleteAct->isChecked());
        Object::SetDimensionActive(addDimensionAct->isChecked());
        drawing->SetRotateToolActive(rotateAct->isChecked());
+
+       // We can be sure that if we've come here, then either an active tool is
+       // being deactivated, or a new tool is being created. In either case, the
+       // old tool needs to be deleted.
+       if (drawing->toolAction)
+       {
+               delete drawing->toolAction;
+               drawing->toolAction = NULL;
+       }
+
        drawing->SetAddLineToolActive(addLineAct->isChecked());
        drawing->SetAddCircleToolActive(addCircleAct->isChecked());
+       drawing->SetAddDimensionToolActive(addDimensionAct->isChecked());
 }
 
 
@@ -374,6 +385,52 @@ void ApplicationWindow::Settings(void)
 void ApplicationWindow::HandleGrouping(void)
 {
        // Group a bunch of selected objects together or ungroup a selected group.
+
+       if (drawing->document.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)
+       {
+               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);
+       }
+       // 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)
+       {
+               Container * container = new Container(Vector(), &(drawing->document));
+               drawing->document.MoveSelectedContentsTo(container);
+               drawing->document.Add(container);
+               container->DeselectAll();
+               container->state = OSSelected;
+       }
+
+       drawing->update();
 }