summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 307c46c)
raw | patch | inline | side by side (parent: 307c46c)
author | buliabyak <buliabyak@users.sourceforge.net> | |
Tue, 6 May 2008 05:35:50 +0000 (05:35 +0000) | ||
committer | buliabyak <buliabyak@users.sourceforge.net> | |
Tue, 6 May 2008 05:35:50 +0000 (05:35 +0000) |
src/ui/dialog/transformation.cpp | patch | blob | history |
index e6de922405cad9e19e9b0ae863c9139615f438fa..5a7117db208eb08b4388964799deff8701ee250d 100644 (file)
#include "document.h"
#include "desktop-handles.h"
#include "transformation.h"
+#include "align-and-distribute.h"
#include "libnr/nr-matrix-ops.h"
#include "inkscape.h"
#include "selection.h"
#include "sp-item-transform.h"
#include "macros.h"
#include "sp-item.h"
+#include "util/glib-list-iterators.h"
namespace Inkscape {
namespace UI {
updateSelection((PageType)pagenum, sp_desktop_selection(getDesktop()));
}
+
void
Transformation::updatePageMove(Inkscape::Selection *selection)
{
double x = _scalar_move_horizontal.getValue("px");
double y = _scalar_move_vertical.getValue("px");
+ if (prefs_get_int_attribute_limited ("dialogs.transformation", "applyseparately", 0, 0, 1) == 0) {
+ // move selection as a whole
if (_check_move_relative.get_active()) {
sp_selection_move_relative(selection, x, y);
} else {
x - bbox->min()[NR::X], y - bbox->min()[NR::Y]);
}
}
+ } else {
+ // shift each object relatively to the previous one
+
+ using Inkscape::Util::GSListConstIterator;
+ std::list<SPItem *> selected;
+ selected.insert<GSListConstIterator<SPItem *> >(selected.end(), selection->itemList(), NULL);
+ if (selected.empty()) return;
+
+ if (fabs(x) > 1e-6) {
+ std::vector< BBoxSort > sorted;
+ for (std::list<SPItem *>::iterator it(selected.begin());
+ it != selected.end();
+ ++it)
+ {
+ NR::Maybe<NR::Rect> bbox = sp_item_bbox_desktop(*it);
+ if (bbox) {
+ sorted.push_back(BBoxSort(*it, *bbox, NR::X, x > 0? 1. : 0., x > 0? 0. : 1.));
+ }
+ }
+ //sort bbox by anchors
+ std::sort(sorted.begin(), sorted.end());
+
+ double move = x;
+ for ( std::vector<BBoxSort> ::iterator it (sorted.begin());
+ it < sorted.end();
+ it ++ )
+ {
+ sp_item_move_rel(it->item, NR::translate(move, 0));
+ // move each next object by x relative to previous
+ move += x;
+ }
+ }
+ if (fabs(y) > 1e-6) {
+ std::vector< BBoxSort > sorted;
+ for (std::list<SPItem *>::iterator it(selected.begin());
+ it != selected.end();
+ ++it)
+ {
+ NR::Maybe<NR::Rect> bbox = sp_item_bbox_desktop(*it);
+ if (bbox) {
+ sorted.push_back(BBoxSort(*it, *bbox, NR::Y, y > 0? 1. : 0., y > 0? 0. : 1.));
+ }
+ }
+ //sort bbox by anchors
+ std::sort(sorted.begin(), sorted.end());
+
+ double move = y;
+ for ( std::vector<BBoxSort> ::iterator it (sorted.begin());
+ it < sorted.end();
+ it ++ )
+ {
+ sp_item_move_rel(it->item, NR::translate(0, move));
+ // move each next object by x relative to previous
+ move += y;
+ }
+ }
+
+ }
sp_document_done ( sp_desktop_document (selection->desktop()) , SP_VERB_DIALOG_TRANSFORM,
_("Move"));