Code

Add option to align & distribute dialog to treat the selection as a group (closes...
authorcilix42 <cilix42@users.sourceforge.net>
Sat, 13 Sep 2008 15:31:36 +0000 (15:31 +0000)
committercilix42 <cilix42@users.sourceforge.net>
Sat, 13 Sep 2008 15:31:36 +0000 (15:31 +0000)
src/ui/dialog/align-and-distribute.cpp
src/ui/dialog/align-and-distribute.h

index 0e93ecb12350267f7a4fd2c72ede8f657e2ff320..627f10c0c4c12c3ab1ba0ee0d8f7013729b886f8 100644 (file)
@@ -122,6 +122,8 @@ private :
         Inkscape::Selection *selection = sp_desktop_selection(desktop);
         if (!selection) return;
 
+        bool sel_as_group = (prefs_get_int_attribute("dialogs.align", "sel-as-groups", 0) != 0);
+
         using Inkscape::Util::GSListConstIterator;
         std::list<SPItem *> selected;
         selected.insert<GSListConstIterator<SPItem *> >(selected.end(), selection->itemList(), NULL);
@@ -151,7 +153,9 @@ private :
                 );
             //remove the master from the selection
             SPItem * thing = *master;
-            selected.erase(master);
+            if (!sel_as_group) {
+                selected.erase(master);
+            }
             //Compute the anchor point
             boost::optional<NR::Rect> b = sp_item_bbox_desktop (thing);
             if (b) {
@@ -208,16 +212,21 @@ private :
         prefs_set_int_attribute("options.clonecompensation", "value", SP_CLONE_COMPENSATION_UNMOVED);
 
         bool changed = false;
-        //Move each item in the selected list
+        boost::optional<NR::Rect> b;
+        if (sel_as_group)
+            b = selection->bounds();
+
+        //Move each item in the selected list separately
         for (std::list<SPItem *>::iterator it(selected.begin());
              it != selected.end();
              it++)
         {
             sp_document_ensure_up_to_date(sp_desktop_document (desktop));
-            boost::optional<NR::Rect> b = sp_item_bbox_desktop (*it);
+            if (!sel_as_group)
+                b = sp_item_bbox_desktop (*it);
             if (b) {
                 Geom::Point const sp(a.sx0 * b->min()[Geom::X] + a.sx1 * b->max()[Geom::X],
-                                   a.sy0 * b->min()[Geom::Y] + a.sy1 * b->max()[Geom::Y]);
+                                     a.sy0 * b->min()[Geom::Y] + a.sy1 * b->max()[Geom::Y]);
                 Geom::Point const mp_rel( mp - sp );
                 if (LInfty(mp_rel) > 1e-9) {
                     sp_item_move_rel(*it, NR::translate(mp_rel));
@@ -783,7 +792,8 @@ AlignAndDistribute::AlignAndDistribute()
       _removeOverlapTable(1, 5, false),
       _graphLayoutTable(1, 5, false),
       _nodesTable(1, 4, true),
-      _anchorLabel(_("Relative to: "))
+      _anchorLabel(_("Relative to: ")),
+      _selgrpLabel(_("Treat selection as group: "))
 {
 
     //Instanciate the align buttons
@@ -910,7 +920,13 @@ AlignAndDistribute::AlignAndDistribute()
     _anchorBox.pack_start(_anchorLabel);
     _anchorBox.pack_start(_combo);
 
+    _selgrpBox.pack_start(_selgrpLabel);
+    _selgrpBox.pack_start(_selgrp);
+    _selgrp.set_active(prefs_get_int_attribute("dialogs.align", "sel-as-groups", 0));
+    _selgrp.signal_toggled().connect(sigc::mem_fun(*this, &AlignAndDistribute::on_selgrp_toggled));
+
     _alignBox.pack_start(_anchorBox);
+    _alignBox.pack_start(_selgrpBox);
     _alignBox.pack_start(_alignTable);
 
     _alignFrame.add(_alignBox);
@@ -959,6 +975,13 @@ void AlignAndDistribute::on_ref_change(){
     //Make blink the master
 }
 
+void AlignAndDistribute::on_selgrp_toggled(){
+
+    prefs_set_int_attribute("dialogs.align", "sel-as-groups", _selgrp.get_active());
+
+    //Make blink the master
+}
+
 
 
 
index e4fdf9604e0107d3636c552a24e8fff28fb2b586..e2bb68fe5b128a5daf36afbf83d7507104f575ec 100644 (file)
@@ -70,6 +70,7 @@ public:
 protected:
 
     void on_ref_change();
+    void on_selgrp_toggled();
     void addDistributeButton(const Glib::ustring &id, const Glib::ustring tiptext, 
                                       guint row, guint col, bool onInterSpace, 
                                       Geom::Dim2 orientation, float kBegin, float kEnd);
@@ -94,8 +95,11 @@ protected:
     Gtk::Frame _alignFrame, _distributeFrame, _removeOverlapFrame, _graphLayoutFrame, _nodesFrame;
     Gtk::Table _alignTable, _distributeTable, _removeOverlapTable, _graphLayoutTable, _nodesTable;
     Gtk::HBox _anchorBox;
+    Gtk::HBox _selgrpBox;
     Gtk::VBox _alignBox;
     Gtk::Label _anchorLabel;
+    Gtk::Label _selgrpLabel;
+    Gtk::CheckButton _selgrp;
     Gtk::ComboBoxText _combo;
     Gtk::Tooltips _tooltips;