--- share/icons/icons.svg 2009-12-02 20:26:44 +0000
+++ share/icons/icons.svg 2010-01-01 16:50:46 +0000
@@ -18,13 +18,6 @@
version="1.0">
-
@@ -3853,42 +3846,6 @@
x1="109.28288"
id="linearGradient6625-4"
inkscape:collect="always" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ inkscape:collect="always"
+ xlink:href="#linearGradient5704"
+ id="linearGradient6608"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2094935,0,0,1.3820546,-12.246897,758.20042)"
+ x1="11.87961"
+ y1="205.44775"
+ x2="18.584427"
+ y2="211.60497" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
=== modified file 'src/extension/internal/bitmap/level.cpp'
--- src/ui/dialog/align-and-distribute.cpp 2009-11-30 20:05:43 +0000
+++ src/ui/dialog/align-and-distribute.cpp 2010-01-01 16:58:34 +0000
@@ -517,8 +517,8 @@
guint row,
guint column,
AlignAndDistribute &dialog) :
- Action(id, tiptext, row, column + 4,
- dialog.graphLayout_table(), dialog.tooltips(), dialog)
+ Action(id, tiptext, row, column,
+ dialog.rearrange_table(), dialog.tooltips(), dialog)
{}
private :
@@ -541,6 +541,89 @@
}
};
+class ActionExchangePositions : public Action {
+public:
+ ActionExchangePositions(Glib::ustring const &id,
+ Glib::ustring const &tiptext,
+ guint row,
+ guint column,
+ AlignAndDistribute &dialog) :
+ Action(id, tiptext, row, column,
+ dialog.rearrange_table(), dialog.tooltips(), dialog)
+ {};
+
+
+private :
+ static boost::optional center;
+
+ static bool sort_compare(const SPItem * a,const SPItem * b) {
+ if (a == NULL) return false;
+ if (b == NULL) return true;
+ if (center) {
+ Geom::Point point_a = a->getCenter() - (*center);
+ Geom::Point point_b = b->getCenter() - (*center);
+ // First criteria: Sort according to the angle to the center point
+ double angle_a = atan2(double(point_a[Geom::Y]), double(point_a[Geom::X]));
+ double angle_b = atan2(double(point_b[Geom::Y]), double(point_b[Geom::X]));
+ if (angle_a != angle_b) return (angle_a < angle_b);
+ // Second criteria: Sort according to the distance the center point
+ Geom::Coord length_a = point_a.length();
+ Geom::Coord length_b = point_b.length();
+ if (length_a != length_b) return (length_a > length_b);
+
+ }
+ // Last criteria: Sort according to the z-coordinate
+ return (a->isSiblingOf(b));
+ }
+
+ virtual void on_button_click()
+ {
+ SPDesktop *desktop = _dialog.getDesktop();
+ if (!desktop) return;
+
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
+ if (!selection) return;
+
+ using Inkscape::Util::GSListConstIterator;
+ std::list selected;
+ selected.insert >(selected.end(), selection->itemList(), NULL);
+ if (selected.empty()) return;
+
+ //Check 2 or more selected objects
+ if (selected.size() < 2) return;
+
+ // see comment in ActionAlign above
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ int saved_compensation = prefs->getInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED);
+ prefs->setInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED);
+
+ // sort the list
+ center = selection->center();
+ selected.sort(ActionExchangePositions::sort_compare);
+
+ std::list::iterator it(selected.begin());
+ Geom::Point p1 = (*it)->getCenter();
+ for (++it ;it != selected.end(); ++it)
+ {
+ Geom::Point p2 = (*it)->getCenter();
+ Geom::Point delta = p1 - p2;
+ sp_item_move_rel((*it),Geom::Translate(delta[Geom::X],delta[Geom::Y] ));
+ p1 = p2;
+ }
+ Geom::Point p2 = selected.front()->getCenter();
+ Geom::Point delta = p1 - p2;
+ sp_item_move_rel(selected.front(),Geom::Translate(delta[Geom::X],delta[Geom::Y] ));
+
+ // restore compensation setting
+ prefs->setInt("/options/clonecompensation/value", saved_compensation);
+
+ sp_document_done(sp_desktop_document(_dialog.getDesktop()), SP_VERB_DIALOG_ALIGN_DISTRIBUTE,
+ _("Exchange Positions"));
+ }
+};
+// instantiae the private static member
+boost::optional ActionExchangePositions::center;
+
class ActionUnclump : public Action {
public :
ActionUnclump(const Glib::ustring &id,
@@ -549,7 +632,7 @@
guint column,
AlignAndDistribute &dialog):
Action(id, tiptext, row, column,
- dialog.distribute_table(), dialog.tooltips(), dialog)
+ dialog.rearrange_table(), dialog.tooltips(), dialog)
{}
private :
@@ -580,7 +663,7 @@
guint column,
AlignAndDistribute &dialog):
Action(id, tiptext, row, column,
- dialog.distribute_table(), dialog.tooltips(), dialog)
+ dialog.rearrange_table(), dialog.tooltips(), dialog)
{}
private :
@@ -786,13 +869,13 @@
randomize_bbox(),
_alignFrame(_("Align")),
_distributeFrame(_("Distribute")),
+ _rearrangeFrame(_("Rearrange")),
_removeOverlapFrame(_("Remove overlaps")),
- _graphLayoutFrame(_("Connector network layout")),
_nodesFrame(_("Nodes")),
_alignTable(2, 6, true),
- _distributeTable(3, 6, true),
+ _distributeTable(2, 6, true),
+ _rearrangeTable(1, 5, false),
_removeOverlapTable(1, 5, false),
- _graphLayoutTable(1, 5, false),
_nodesTable(1, 4, true),
_anchorLabel(_("Relative to: ")),
_selgrpLabel(_("Treat selection as group: "))
@@ -876,22 +959,26 @@
_("Distribute baselines of texts vertically"),
1, 5, this->distribute_table(), Geom::Y, true);
+ // Rearrange
+ //Graph Layout
+ addGraphLayoutButton(INKSCAPE_ICON_DISTRIBUTE_GRAPH,
+ _("Nicely arrange selected connector network"),
+ 0, 0);
+ addExchangePositionsButton(INKSCAPE_ICON_EXCHANGE_POSITIONS,
+ _("Exchange positions of selected objects"),
+ 0, 1);
//Randomize & Unclump
addRandomizeButton(INKSCAPE_ICON_DISTRIBUTE_RANDOMIZE,
_("Randomize centers in both dimensions"),
- 2, 2);
+ 0, 2);
addUnclumpButton(INKSCAPE_ICON_DISTRIBUTE_UNCLUMP,
_("Unclump objects: try to equalize edge-to-edge distances"),
- 2, 4);
+ 0, 3);
//Remove overlaps
addRemoveOverlapsButton(INKSCAPE_ICON_DISTRIBUTE_REMOVE_OVERLAPS,
_("Move objects as little as possible so that their bounding boxes do not overlap"),
0, 0);
- //Graph Layout
- addGraphLayoutButton(INKSCAPE_ICON_DISTRIBUTE_GRAPH,
- _("Nicely arrange selected connector network"),
- 0, 0);
//Node Mode buttons
// NOTE: "align nodes vertically" means "move nodes vertically until they align on a common
@@ -937,8 +1024,8 @@
_alignFrame.add(_alignBox);
_distributeFrame.add(_distributeTable);
+ _rearrangeFrame.add(_rearrangeTable);
_removeOverlapFrame.add(_removeOverlapTable);
- _graphLayoutFrame.add(_graphLayoutTable);
_nodesFrame.add(_nodesTable);
Gtk::Box *contents = _getContents();
@@ -948,8 +1035,8 @@
contents->pack_start(_alignFrame, true, true);
contents->pack_start(_distributeFrame, true, true);
+ contents->pack_start(_rearrangeFrame, true, true);
contents->pack_start(_removeOverlapFrame, true, true);
- contents->pack_start(_graphLayoutFrame, true, true);
contents->pack_start(_nodesFrame, true, true);
//Connect to the global tool change signal
@@ -1004,8 +1091,8 @@
((_alignFrame).*(mSel))();
((_distributeFrame).*(mSel))();
+ ((_rearrangeFrame).*(mSel))();
((_removeOverlapFrame).*(mSel))();
- ((_graphLayoutFrame).*(mSel))();
((_nodesFrame).*(mNode))();
}
@@ -1057,6 +1144,15 @@
);
}
+void AlignAndDistribute::addExchangePositionsButton(const Glib::ustring &id, const Glib::ustring tiptext,
+ guint row, guint col)
+{
+ _actionList.push_back(
+ new ActionExchangePositions(
+ id, tiptext, row, col, *this)
+ );
+}
+
void AlignAndDistribute::addUnclumpButton(const Glib::ustring &id, const Glib::ustring tiptext,
guint row, guint col)
{
=== modified file 'src/ui/dialog/align-and-distribute.h'
--- src/ui/dialog/align-and-distribute.h 2008-11-21 05:24:08 +0000
+++ src/ui/dialog/align-and-distribute.h 2009-12-26 18:06:40 +0000
@@ -57,8 +57,8 @@
Gtk::Table &align_table(){return _alignTable;}
Gtk::Table &distribute_table(){return _distributeTable;}
+ Gtk::Table &rearrange_table(){return _rearrangeTable;}
Gtk::Table &removeOverlap_table(){return _removeOverlapTable;}
- Gtk::Table &graphLayout_table(){return _graphLayoutTable;}
Gtk::Table &nodes_table(){return _nodesTable;}
Gtk::Tooltips &tooltips(){return _tooltips;}
@@ -84,6 +84,9 @@
void addGraphLayoutButton(const Glib::ustring &id,
const Glib::ustring tiptext,
guint row, guint col);
+ void addExchangePositionsButton(const Glib::ustring &id,
+ const Glib::ustring tiptext,
+ guint row, guint col);
void addUnclumpButton(const Glib::ustring &id, const Glib::ustring tiptext,
guint row, guint col);
void addRandomizeButton(const Glib::ustring &id, const Glib::ustring tiptext,
@@ -92,8 +95,8 @@
guint row, guint col, Gtk::Table &table, Geom::Dim2 orientation, bool distribute);
std::list _actionList;
- Gtk::Frame _alignFrame, _distributeFrame, _removeOverlapFrame, _graphLayoutFrame, _nodesFrame;
- Gtk::Table _alignTable, _distributeTable, _removeOverlapTable, _graphLayoutTable, _nodesTable;
+ Gtk::Frame _alignFrame, _distributeFrame, _rearrangeFrame, _removeOverlapFrame, _nodesFrame;
+ Gtk::Table _alignTable, _distributeTable, _rearrangeTable, _removeOverlapTable, _nodesTable;
Gtk::HBox _anchorBox;
Gtk::HBox _selgrpBox;
Gtk::VBox _alignBox;
=== modified file 'src/ui/icon-names.h'
--- src/ui/icon-names.h 2009-12-02 20:26:44 +0000
+++ src/ui/icon-names.h 2009-12-29 09:55:24 +0000
@@ -206,6 +206,8 @@
"edit-select-original"
#define INKSCAPE_ICON_EDIT_UNDO_HISTORY \
"edit-undo-history"
+#define INKSCAPE_ICON_EXCHANGE_POSITIONS \
+ "exchange-positions"
#define INKSCAPE_ICON_FILL_RULE_EVEN_ODD \
"fill-rule-even-odd"
#define INKSCAPE_ICON_FILL_RULE_NONZERO \