diff options
| author | mc <> | 2015-02-16 11:54:33 +0000 |
|---|---|---|
| committer | JazzyNico <nicoduf@yahoo.fr> | 2015-02-16 11:54:33 +0000 |
| commit | 55361947a1fbfc1c64fbb424ce845cd081d936ec (patch) | |
| tree | e83d9ffff869768ab52008346f8a0d1fe4361aec /src | |
| parent | Adjust timeout for snap tool tips to 4 seconds (diff) | |
| download | inkscape-55361947a1fbfc1c64fbb424ce845cd081d936ec.tar.gz inkscape-55361947a1fbfc1c64fbb424ce845cd081d936ec.zip | |
Clones. Fix for bug #1245339 (When changing a clone's parent's layer, the clones shift position) and bug #653574 (Ungrouping moves clones inside nested groups).
Fixed bugs:
- https://launchpad.net/bugs/653574
- https://launchpad.net/bugs/1245339
(bzr r13924)
Diffstat (limited to 'src')
| -rw-r--r-- | src/selection-chemistry.cpp | 23 | ||||
| -rw-r--r-- | src/sp-item-group.cpp | 36 | ||||
| -rw-r--r-- | src/sp-item-group.h | 9 |
3 files changed, 59 insertions, 9 deletions
diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index c9837aabe..17b31f8b7 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -1321,6 +1321,26 @@ void sp_selection_paste_size_separately(SPDesktop *desktop, bool apply_x, bool a } } +/** + * Ensures that the clones of objects are not modified when moving objects between layers. + * Calls the same function as ungroup + */ +void sp_selection_change_layer_maintain_clones(GSList const *items,SPObject *where) +{ + for (const GSList *i = items; i != NULL; i = i->next) { + SPItem *item = dynamic_cast<SPItem *>(SP_OBJECT(i->data)); + if (item) { + SPItem *oldparent = dynamic_cast<SPItem *>(item->parent); + SPItem *newparent = dynamic_cast<SPItem *>(where); + sp_item_group_ungroup_handle_clones(item->document->getRoot(), + item, + (oldparent->i2doc_affine()) + *((newparent->i2doc_affine()).inverse())); + } + } +} + + void sp_selection_to_next_layer(SPDesktop *dt, bool suppressDone) { Inkscape::Selection *selection = dt->getSelection(); @@ -1336,6 +1356,7 @@ void sp_selection_to_next_layer(SPDesktop *dt, bool suppressDone) bool no_more = false; // Set to true, if no more layers above SPObject *next=Inkscape::next_layer(dt->currentRoot(), dt->currentLayer()); if (next) { + sp_selection_change_layer_maintain_clones(items,next); GSList *temp_clip = NULL; sp_selection_copy_impl(items, &temp_clip, dt->doc()->getReprDoc()); sp_selection_delete_impl(items, false, false); @@ -1381,6 +1402,7 @@ void sp_selection_to_prev_layer(SPDesktop *dt, bool suppressDone) bool no_more = false; // Set to true, if no more layers below SPObject *next=Inkscape::previous_layer(dt->currentRoot(), dt->currentLayer()); if (next) { + sp_selection_change_layer_maintain_clones(items,next); GSList *temp_clip = NULL; sp_selection_copy_impl(items, &temp_clip, dt->doc()->getReprDoc()); // we're in the same doc, so no need to copy defs sp_selection_delete_impl(items, false, false); @@ -1424,6 +1446,7 @@ void sp_selection_to_layer(SPDesktop *dt, SPObject *moveto, bool suppressDone) GSList const *items = g_slist_copy(const_cast<GSList *>(selection->itemList())); if (moveto) { + sp_selection_change_layer_maintain_clones(items,moveto); GSList *temp_clip = NULL; sp_selection_copy_impl(items, &temp_clip, dt->doc()->getReprDoc()); // we're in the same doc, so no need to copy defs sp_selection_delete_impl(items, false, false); diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp index b1ba37de2..35840e01a 100644 --- a/src/sp-item-group.cpp +++ b/src/sp-item-group.cpp @@ -399,6 +399,26 @@ void SPGroup::snappoints(std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape: } } +void sp_item_group_ungroup_handle_clones(SPGroup *group,SPItem *parent, Geom::Affine const g) +{ + for (SPObject *child = group->firstChild() ; child; child = child->getNext() ) { + SPItem *citem = dynamic_cast<SPItem *>(child); + if (citem) { + SPUse *useitem = dynamic_cast<SPUse *>(citem); + if (useitem && useitem->get_original() == parent) { + Geom::Affine ctrans; + ctrans = g.inverse() * citem->transform; + gchar *affinestr = sp_svg_transform_write(ctrans); + citem->setAttribute("transform", affinestr); + g_free(affinestr); + } + SPGroup *groupitem = dynamic_cast<SPGroup *>(citem); + if (groupitem) { + sp_item_group_ungroup_handle_clones(groupitem,parent,g); + } + } + } +} void sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done) @@ -435,8 +455,14 @@ sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done) /* Step 1 - generate lists of children objects */ GSList *items = NULL; GSList *objects = NULL; - for (SPObject *child = group->firstChild() ; child; child = child->getNext() ) { + Geom::Affine const g(group->transform); + + for (SPObject *child = group->firstChild() ; child; child = child->getNext() ) + if (SPItem *citem = dynamic_cast<SPItem *>(child)) + sp_item_group_ungroup_handle_clones(root,citem,g); + + for (SPObject *child = group->firstChild() ; child; child = child->getNext() ) { SPItem *citem = dynamic_cast<SPItem *>(child); if (citem) { /* Merging of style */ @@ -472,13 +498,6 @@ sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done) // Merging transform Geom::Affine ctrans; - Geom::Affine const g(group->transform); - SPUse *useitem = dynamic_cast<SPUse *>(citem); - if (useitem && useitem->get_original() && - useitem->get_original()->parent == dynamic_cast<SPObject *>(group)) { - // make sure a clone's effective transform is the same as was under group - ctrans = g.inverse() * citem->transform * g; - } else { // We should not apply the group's transformation to both a linked offset AND to its source if (dynamic_cast<SPOffset *>(citem)) { // Do we have an offset at hand (whether it's dynamic or linked)? SPItem *source = sp_offset_get_source(dynamic_cast<SPOffset *>(citem)); @@ -497,7 +516,6 @@ sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done) } else { ctrans = citem->transform * g; } - } // FIXME: constructing a transform that would fully preserve the appearance of a // textpath if it is ungrouped with its path seems to be impossible in general diff --git a/src/sp-item-group.h b/src/sp-item-group.h index 15bb58f22..4bac0b269 100644 --- a/src/sp-item-group.h +++ b/src/sp-item-group.h @@ -95,6 +95,15 @@ public: virtual void update_patheffect(bool write); }; +/** + * finds clones of a child of the group going out of the group; and inverse the group transform on its clones + * Also called when moving objects between different layers + * @param group current group + * @param parent original parent + * @param g transform + */ +void sp_item_group_ungroup_handle_clones(SPGroup *group,SPItem *parent, Geom::Affine const g); + void sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done = true); |
