summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2018-04-02 13:57:32 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2018-04-23 21:37:56 +0000
commit3f4e7d12207b78f5a67d9f4603b188973f49cb22 (patch)
tree6b10c1ad8af350b37bae2a9957a26f6f340eb03a
parentFinish projection phase (diff)
downloadinkscape-3f4e7d12207b78f5a67d9f4603b188973f49cb22.tar.gz
inkscape-3f4e7d12207b78f5a67d9f4603b188973f49cb22.zip
Handle transforms and gix groups linked by clipboard
-rw-r--r--src/live_effects/lpe-measure-segments.cpp30
-rw-r--r--src/live_effects/parameter/originalitemarray.cpp2
-rw-r--r--src/ui/clipboard.cpp8
-rw-r--r--src/ui/clipboard.h2
4 files changed, 27 insertions, 15 deletions
diff --git a/src/live_effects/lpe-measure-segments.cpp b/src/live_effects/lpe-measure-segments.cpp
index f488fc565..e15e1749e 100644
--- a/src/live_effects/lpe-measure-segments.cpp
+++ b/src/live_effects/lpe-measure-segments.cpp
@@ -754,7 +754,19 @@ double getAngle(Geom::Point p1, Geom::Point p2, Geom::Point p3, bool flip_side,
return angle;
}
-std::vector< Point > getNodes(SPItem * item)
+std::vector< Point >
+transformNodes(std::vector< Point > nodes, Geom::Affine transform)
+{
+ std::vector< Point > result;
+ for ( std::vector<Point>::iterator iter = nodes.begin(); iter != nodes.end(); ++iter ) {
+ Geom::Point point = (*iter);
+ result.push_back(point * transform);
+ }
+ return result;
+}
+
+std::vector< Point >
+getNodes(SPItem * item)
{
std::vector< Point > current_nodes;
SPShape * shape = dynamic_cast<SPShape *> (item);
@@ -766,12 +778,12 @@ std::vector< Point > getNodes(SPItem * item)
std::vector<SPItem*> const item_list = sp_item_group_item_list(group);
for ( std::vector<SPItem*>::const_iterator iter=item_list.begin();iter!=item_list.end();++iter) {
SPItem *sub_item = *iter;
- std::vector< Point > nodes = getNodes(sub_item);
+ std::vector< Point > nodes = transformNodes(getNodes(sub_item), item->transform);
current_nodes.insert(current_nodes.end(), nodes.begin(), nodes.end());
}
} else if (shape) {
SPCurve * c = shape->getCurve();
- current_nodes = c->get_pathvector().nodes();
+ current_nodes = transformNodes(c->get_pathvector().nodes(), item->transform);
c->unref();
} else if (text || flowtext) {
Inkscape::Text::Layout::iterator iter = te_get_layout(item)->begin();
@@ -791,7 +803,7 @@ std::vector< Point > getNodes(SPItem * item)
curve->unref();
continue;
}
- std::vector< Point > letter_nodes = curve->get_pathvector().nodes();
+ std::vector< Point > letter_nodes = transformNodes(curve->get_pathvector().nodes(), item->transform);
current_nodes.insert(current_nodes.end(),letter_nodes.begin(),letter_nodes.end());
if (iter == te_get_layout(item)->end()) {
break;
@@ -800,10 +812,10 @@ std::vector< Point > getNodes(SPItem * item)
} else {
Geom::OptRect bbox = item->geometricBounds();
if (bbox) {
- current_nodes.push_back((*bbox).corner(0));
- current_nodes.push_back((*bbox).corner(1));
- current_nodes.push_back((*bbox).corner(2));
- current_nodes.push_back((*bbox).corner(3));
+ current_nodes.push_back((*bbox).corner(0) * item->transform);
+ current_nodes.push_back((*bbox).corner(1) * item->transform);
+ current_nodes.push_back((*bbox).corner(2) * item->transform);
+ current_nodes.push_back((*bbox).corner(3) * item->transform);
}
}
return current_nodes;
@@ -844,7 +856,7 @@ LPEMeasureSegments::doBeforeEffect (SPLPEItem const* lpeitem)
std::vector< Point > nodes;
for (std::vector<ItemAndActive*>::iterator iter = linked_items._vector.begin(); iter != linked_items._vector.end(); ++iter) {
SPObject *obj;
- if ((*iter)->ref.isAttached() && (obj = (*iter)->ref.getObject()) && SP_IS_ITEM(obj)) {
+ if ((*iter)->ref.isAttached() && (*iter)->actived && (obj = (*iter)->ref.getObject()) && SP_IS_ITEM(obj)) {
SPItem * item = dynamic_cast<SPItem *>(obj);
if (item) {
hasprojection = true;
diff --git a/src/live_effects/parameter/originalitemarray.cpp b/src/live_effects/parameter/originalitemarray.cpp
index b89485e2d..a4c2e5087 100644
--- a/src/live_effects/parameter/originalitemarray.cpp
+++ b/src/live_effects/parameter/originalitemarray.cpp
@@ -283,7 +283,7 @@ OriginalItemArrayParam::on_link_button_click()
{
Inkscape::UI::ClipboardManager *cm = Inkscape::UI::ClipboardManager::get();
//without second parameter populate all elements filled inside the called function
- std::vector<Glib::ustring> itemsid = cm->getElementsOfType(SP_ACTIVE_DESKTOP);
+ std::vector<Glib::ustring> itemsid = cm->getElementsOfType(SP_ACTIVE_DESKTOP, "*", 1);
if (itemsid.empty()) {
return;
diff --git a/src/ui/clipboard.cpp b/src/ui/clipboard.cpp
index 58a276090..83e878d66 100644
--- a/src/ui/clipboard.cpp
+++ b/src/ui/clipboard.cpp
@@ -107,7 +107,7 @@ public:
virtual bool pastePathEffect(ObjectSet *set);
virtual Glib::ustring getPathParameter(SPDesktop* desktop);
virtual Glib::ustring getShapeOrTextObjectId(SPDesktop *desktop);
- virtual std::vector<Glib::ustring> getElementsOfType(SPDesktop *desktop, gchar const *type);
+ virtual std::vector<Glib::ustring> getElementsOfType(SPDesktop *desktop, gchar const* type = "*", gint maxdepth = -1);
virtual const gchar *getFirstObjectID();
ClipboardManagerImpl();
@@ -661,7 +661,7 @@ Glib::ustring ClipboardManagerImpl::getShapeOrTextObjectId(SPDesktop *desktop)
* @return A vector containing all IDs or empty if no shape or text item was found.
* type. Set to "*" to retrieve all elements of the types vector inside, feel free to populate more
*/
-std::vector<Glib::ustring> ClipboardManagerImpl::getElementsOfType(SPDesktop *desktop, gchar const* type)
+std::vector<Glib::ustring> ClipboardManagerImpl::getElementsOfType(SPDesktop *desktop, gchar const* type, gint maxdepth)
{
std::vector<Glib::ustring> result;
SPDocument *tempdoc = _retrieveClipboard(); // any target will do here
@@ -686,11 +686,11 @@ std::vector<Glib::ustring> ClipboardManagerImpl::getElementsOfType(SPDesktop *de
types.push_back((Glib::ustring)"svg:image");
for (auto i=types.begin();i!=types.end();++i) {
Glib::ustring type_elem = *i;
- std::vector<Inkscape::XML::Node const *> reprs_found = sp_repr_lookup_name_many(root, type_elem.c_str(), -1); // unlimited search depth
+ std::vector<Inkscape::XML::Node const *> reprs_found = sp_repr_lookup_name_many(root, type_elem.c_str(), maxdepth); // unlimited search depth
reprs.insert(reprs.end(), reprs_found.begin(), reprs_found.end());
}
} else {
- reprs = sp_repr_lookup_name_many(root, type, -1); // unlimited search depth
+ reprs = sp_repr_lookup_name_many(root, type, maxdepth);
}
for (auto i=reprs.begin();i!=reprs.end();++i) {
Inkscape::XML::Node const * node = *i;
diff --git a/src/ui/clipboard.h b/src/ui/clipboard.h
index 390830bba..e32b5aed2 100644
--- a/src/ui/clipboard.h
+++ b/src/ui/clipboard.h
@@ -51,7 +51,7 @@ public:
virtual bool pastePathEffect(ObjectSet *set) = 0;
virtual Glib::ustring getPathParameter(SPDesktop* desktop) = 0;
virtual Glib::ustring getShapeOrTextObjectId(SPDesktop *desktop) = 0;
- virtual std::vector<Glib::ustring> getElementsOfType(SPDesktop *desktop, gchar const* type = "*") = 0;
+ virtual std::vector<Glib::ustring> getElementsOfType(SPDesktop *desktop, gchar const* type = "*", gint maxdepth = -1) = 0;
virtual const gchar *getFirstObjectID() = 0;
static ClipboardManager *get();