From a7f2b2ba3f13ceb60376802f4a31e104153839e8 Mon Sep 17 00:00:00 2001 From: Marc Jeanmougin Date: Tue, 17 Feb 2015 03:00:37 +0100 Subject: At first, I was thinking "I just have to go to the selection file, and change that GSList* with a std::list, then resolve the few problems" So, i tried that. And I will continue tomorrow, and the days after, on and on. (bzr r13922.1.1) --- src/sp-item-group.cpp | 91 +++++++++++++++++++++------------------------------ 1 file changed, 38 insertions(+), 53 deletions(-) (limited to 'src/sp-item-group.cpp') diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp index b1ba37de2..e6531c6be 100644 --- a/src/sp-item-group.cpp +++ b/src/sp-item-group.cpp @@ -171,11 +171,10 @@ void SPGroup::update(SPCtx *ctx, unsigned int flags) { childflags |= SP_OBJECT_PARENT_MODIFIED_FLAG; } childflags &= SP_OBJECT_MODIFIED_CASCADE; - - GSList *l = g_slist_reverse(this->childList(true, SPObject::ActionUpdate)); - while (l) { - SPObject *child = SP_OBJECT (l->data); - l = g_slist_remove (l, child); + SelContainer l=this->childList(true, SPObject::ActionUpdate); + l.reverse(); + for(SelContainer::const_iterator i=l.begin();i!=l.end();i++){ + SPObject *child = SP_OBJECT (*i); if (childflags || (child->uflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { SPItem *item = dynamic_cast(child); @@ -211,20 +210,16 @@ void SPGroup::update(SPCtx *ctx, unsigned int flags) { void SPGroup::modified(guint flags) { // std::cout << "SPGroup::modified(): " << (getId()?getId():"null") << std::endl; SPLPEItem::modified(flags); - - SPObject *child; - if (flags & SP_OBJECT_MODIFIED_FLAG) { flags |= SP_OBJECT_PARENT_MODIFIED_FLAG; } flags &= SP_OBJECT_MODIFIED_CASCADE; - GSList *l = g_slist_reverse(this->childList(true)); - - while (l) { - child = SP_OBJECT (l->data); - l = g_slist_remove (l, child); + SelContainer l=this->childList(true); + l.reverse(); + for(SelContainer::const_iterator i=l.begin();i!=l.end();i++){ + SPObject *child = SP_OBJECT (*i); if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { child->emitModified(flags); @@ -296,35 +291,28 @@ Geom::OptRect SPGroup::bbox(Geom::Affine const &transform, SPItem::BBoxType bbox Geom::OptRect bbox; // TODO CPPIFY: replace this const_cast later - GSList *l = const_cast(this)->childList(false, SPObject::ActionBBox); - - while (l) { - SPObject *o = SP_OBJECT (l->data); - + SelContainer l=const_cast(this)->childList(false, SPObject::ActionBBox); + for(SelContainer::const_iterator i=l.begin();i!=l.end();i++){ + SPObject *o = SP_OBJECT (*i); SPItem *item = dynamic_cast(o); if (item && !item->isHidden()) { Geom::Affine const ct(item->transform * transform); bbox |= item->bounds(bboxtype, ct); } - - l = g_slist_remove (l, o); } return bbox; } void SPGroup::print(SPPrintContext *ctx) { - GSList *l = g_slist_reverse(this->childList(false)); - - while (l) { - SPObject *o = SP_OBJECT (l->data); - + SelContainer l=this->childList(false); + l.reverse(); + for(SelContainer::const_iterator i=l.begin();i!=l.end();i++){ + SPObject *o = SP_OBJECT (*i); SPItem *item = dynamic_cast(o); if (item) { item->invoke_print(ctx); } - - l = g_slist_remove (l, o); } } @@ -372,17 +360,15 @@ Inkscape::DrawingItem *SPGroup::show (Inkscape::Drawing &drawing, unsigned int k } void SPGroup::hide (unsigned int key) { - GSList *l = g_slist_reverse(this->childList(false, SPObject::ActionShow)); - - while (l) { - SPObject *o = SP_OBJECT (l->data); + SelContainer l=this->childList(false, SPObject::ActionShow); + l.reverse(); + for(SelContainer::const_iterator i=l.begin();i!=l.end();i++){ + SPObject *o = SP_OBJECT (*i); SPItem *item = dynamic_cast(o); if (item) { item->invoke_hide(key); } - - l = g_slist_remove (l, o); } // SPLPEItem::onHide(key); @@ -401,7 +387,7 @@ void SPGroup::snappoints(std::vector &p, Inkscape: void -sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done) +sp_item_group_ungroup (SPGroup *group, SelContainer &children, bool do_done) { g_return_if_fail (group != NULL); @@ -560,8 +546,8 @@ sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done) } Inkscape::GC::release(repr); - if (children && item) { - *children = g_slist_prepend(*children, item); + if (!children.empty() && item) { + children.push_front(dynamic_cast(item)); } items = g_slist_remove (items, items->data); @@ -576,19 +562,18 @@ sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done) * some API for list aspect of SPGroup */ -GSList *sp_item_group_item_list(SPGroup * group) +SelContainer sp_item_group_item_list(SPGroup * group) { - g_return_val_if_fail(group != NULL, NULL); - - GSList *s = NULL; + SelContainer s; + g_return_val_if_fail(group != NULL, s); for (SPObject *o = group->firstChild() ; o ; o = o->getNext() ) { if ( dynamic_cast(o) ) { - s = g_slist_prepend(s, o); + s.push_front(o); } } - - return g_slist_reverse (s); + s.reverse(); + return s; } SPObject *sp_item_group_get_child_by_name(SPGroup *group, SPObject *ref, const gchar *name) @@ -809,9 +794,10 @@ gint SPGroup::getItemCount() const { void SPGroup::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags) { Inkscape::DrawingItem *ac = NULL; - GSList *l = g_slist_reverse(this->childList(false, SPObject::ActionShow)); - while (l) { - SPObject *o = SP_OBJECT (l->data); + SelContainer l=this->childList(false, SPObject::ActionShow); + l.reverse(); + for(SelContainer::const_iterator i=l.begin();i!=l.end();i++){ + SPObject *o = SP_OBJECT (*i); SPItem * child = dynamic_cast(o); if (child) { ac = child->invoke_show (drawing, key, flags); @@ -819,7 +805,6 @@ void SPGroup::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem * ai->appendChild(ac); } } - l = g_slist_remove (l, o); } } @@ -828,10 +813,10 @@ void SPGroup::update_patheffect(bool write) { g_message("sp_group_update_patheffect: %p\n", lpeitem); #endif - GSList const *item_list = sp_item_group_item_list(this); + SelContainer const item_list = sp_item_group_item_list(this); - for ( GSList const *iter = item_list; iter; iter = iter->next ) { - SPObject *subitem = static_cast(iter->data); + for ( SelContainer::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) { + SPObject *subitem = static_cast(*iter); SPLPEItem *lpeItem = dynamic_cast(subitem); if (lpeItem) { @@ -856,10 +841,10 @@ void SPGroup::update_patheffect(bool write) { static void sp_group_perform_patheffect(SPGroup *group, SPGroup *topgroup, bool write) { - GSList const *item_list = sp_item_group_item_list(group); + SelContainer const item_list = sp_item_group_item_list(group); - for ( GSList const *iter = item_list; iter; iter = iter->next ) { - SPObject *subitem = static_cast(iter->data); + for ( SelContainer::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) { + SPObject *subitem = static_cast(*iter); SPGroup *subGroup = dynamic_cast(subitem); if (subGroup) { -- cgit v1.2.3 From 5fd00cab14d48beaf2279a2b8f3ad5b02b76c87b Mon Sep 17 00:00:00 2001 From: Marc Jeanmougin Date: Thu, 19 Feb 2015 04:25:21 +0100 Subject: Put a few std::vector (bzr r13922.1.5) --- src/sp-item-group.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'src/sp-item-group.cpp') diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp index e6531c6be..f09a4ee47 100644 --- a/src/sp-item-group.cpp +++ b/src/sp-item-group.cpp @@ -387,7 +387,7 @@ void SPGroup::snappoints(std::vector &p, Inkscape: void -sp_item_group_ungroup (SPGroup *group, SelContainer &children, bool do_done) +sp_item_group_ungroup (SPGroup *group, std::vector &children, bool do_done) { g_return_if_fail (group != NULL); @@ -547,7 +547,7 @@ sp_item_group_ungroup (SPGroup *group, SelContainer &children, bool do_done) Inkscape::GC::release(repr); if (!children.empty() && item) { - children.push_front(dynamic_cast(item)); + children.insert(children.begin(),item); } items = g_slist_remove (items, items->data); @@ -562,17 +562,16 @@ sp_item_group_ungroup (SPGroup *group, SelContainer &children, bool do_done) * some API for list aspect of SPGroup */ -SelContainer sp_item_group_item_list(SPGroup * group) +std::vector sp_item_group_item_list(SPGroup * group) { - SelContainer s; + std::vector s; g_return_val_if_fail(group != NULL, s); for (SPObject *o = group->firstChild() ; o ; o = o->getNext() ) { if ( dynamic_cast(o) ) { - s.push_front(o); + s.push_back((SPItem*)o); } } - s.reverse(); return s; } @@ -813,9 +812,9 @@ void SPGroup::update_patheffect(bool write) { g_message("sp_group_update_patheffect: %p\n", lpeitem); #endif - SelContainer const item_list = sp_item_group_item_list(this); + std::vector const item_list = sp_item_group_item_list(this); - for ( SelContainer::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) { + for ( std::vector::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) { SPObject *subitem = static_cast(*iter); SPLPEItem *lpeItem = dynamic_cast(subitem); @@ -841,9 +840,9 @@ void SPGroup::update_patheffect(bool write) { static void sp_group_perform_patheffect(SPGroup *group, SPGroup *topgroup, bool write) { - SelContainer const item_list = sp_item_group_item_list(group); + std::vector const item_list = sp_item_group_item_list(group); - for ( SelContainer::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) { + for ( std::vector::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) { SPObject *subitem = static_cast(*iter); SPGroup *subGroup = dynamic_cast(subitem); -- cgit v1.2.3 From 7e4b6f793d31d3245bd8afbf6f10aa255ac3e7ae Mon Sep 17 00:00:00 2001 From: Marc Jeanmougin Date: Thu, 19 Feb 2015 20:20:09 +0100 Subject: added a set to the Selection (bzr r13922.1.6) --- src/sp-item-group.cpp | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) (limited to 'src/sp-item-group.cpp') diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp index f09a4ee47..8a40df5ed 100644 --- a/src/sp-item-group.cpp +++ b/src/sp-item-group.cpp @@ -171,9 +171,8 @@ void SPGroup::update(SPCtx *ctx, unsigned int flags) { childflags |= SP_OBJECT_PARENT_MODIFIED_FLAG; } childflags &= SP_OBJECT_MODIFIED_CASCADE; - SelContainer l=this->childList(true, SPObject::ActionUpdate); - l.reverse(); - for(SelContainer::const_iterator i=l.begin();i!=l.end();i++){ + std::vector l=this->childList(true, SPObject::ActionUpdate); + for(std::vector ::const_iterator i=l.begin();i!=l.end();i++){ SPObject *child = SP_OBJECT (*i); if (childflags || (child->uflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { @@ -216,9 +215,8 @@ void SPGroup::modified(guint flags) { flags &= SP_OBJECT_MODIFIED_CASCADE; - SelContainer l=this->childList(true); - l.reverse(); - for(SelContainer::const_iterator i=l.begin();i!=l.end();i++){ + std::vector l=this->childList(true); + for(std::vector::const_iterator i=l.begin();i!=l.end();i++){ SPObject *child = SP_OBJECT (*i); if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { @@ -291,8 +289,8 @@ Geom::OptRect SPGroup::bbox(Geom::Affine const &transform, SPItem::BBoxType bbox Geom::OptRect bbox; // TODO CPPIFY: replace this const_cast later - SelContainer l=const_cast(this)->childList(false, SPObject::ActionBBox); - for(SelContainer::const_iterator i=l.begin();i!=l.end();i++){ + std::vector l=const_cast(this)->childList(false, SPObject::ActionBBox); + for(std::vector::const_iterator i=l.begin();i!=l.end();i++){ SPObject *o = SP_OBJECT (*i); SPItem *item = dynamic_cast(o); if (item && !item->isHidden()) { @@ -305,9 +303,8 @@ Geom::OptRect SPGroup::bbox(Geom::Affine const &transform, SPItem::BBoxType bbox } void SPGroup::print(SPPrintContext *ctx) { - SelContainer l=this->childList(false); - l.reverse(); - for(SelContainer::const_iterator i=l.begin();i!=l.end();i++){ + std::vector l=this->childList(false); + for(std::vector::const_iterator i=l.begin();i!=l.end();i++){ SPObject *o = SP_OBJECT (*i); SPItem *item = dynamic_cast(o); if (item) { @@ -360,9 +357,8 @@ Inkscape::DrawingItem *SPGroup::show (Inkscape::Drawing &drawing, unsigned int k } void SPGroup::hide (unsigned int key) { - SelContainer l=this->childList(false, SPObject::ActionShow); - l.reverse(); - for(SelContainer::const_iterator i=l.begin();i!=l.end();i++){ + std::vector l=this->childList(false, SPObject::ActionShow); + for(std::vector::const_iterator i=l.begin();i!=l.end();i++){ SPObject *o = SP_OBJECT (*i); SPItem *item = dynamic_cast(o); @@ -793,9 +789,8 @@ gint SPGroup::getItemCount() const { void SPGroup::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags) { Inkscape::DrawingItem *ac = NULL; - SelContainer l=this->childList(false, SPObject::ActionShow); - l.reverse(); - for(SelContainer::const_iterator i=l.begin();i!=l.end();i++){ + std::vector l=this->childList(false, SPObject::ActionShow); + for(std::vector::const_iterator i=l.begin();i!=l.end();i++){ SPObject *o = SP_OBJECT (*i); SPItem * child = dynamic_cast(o); if (child) { -- cgit v1.2.3 From 9a7fa4d1899d30ec745107823f307b2a0bf3172f Mon Sep 17 00:00:00 2001 From: Marc Jeanmougin Date: Fri, 27 Feb 2015 03:10:36 +0100 Subject: corrected the casts (hopefully) (bzr r13922.1.10) --- src/sp-item-group.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src/sp-item-group.cpp') diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp index d58676235..620c0b70f 100644 --- a/src/sp-item-group.cpp +++ b/src/sp-item-group.cpp @@ -173,7 +173,7 @@ void SPGroup::update(SPCtx *ctx, unsigned int flags) { childflags &= SP_OBJECT_MODIFIED_CASCADE; std::vector l=this->childList(true, SPObject::ActionUpdate); for(std::vector ::const_iterator i=l.begin();i!=l.end();i++){ - SPObject *child = SP_OBJECT (*i); + SPObject *child = *i; if (childflags || (child->uflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { SPItem *item = dynamic_cast(child); @@ -217,7 +217,7 @@ void SPGroup::modified(guint flags) { std::vector l=this->childList(true); for(std::vector::const_iterator i=l.begin();i!=l.end();i++){ - SPObject *child = SP_OBJECT (*i); + SPObject *child = *i; if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { child->emitModified(flags); @@ -289,9 +289,9 @@ Geom::OptRect SPGroup::bbox(Geom::Affine const &transform, SPItem::BBoxType bbox Geom::OptRect bbox; // TODO CPPIFY: replace this const_cast later - std::vector l=const_cast(this)->childList(false, SPObject::ActionBBox); + std::vector l = const_cast(this)->childList(false, SPObject::ActionBBox); for(std::vector::const_iterator i=l.begin();i!=l.end();i++){ - SPObject *o = SP_OBJECT (*i); + SPObject *o = *i; SPItem *item = dynamic_cast(o); if (item && !item->isHidden()) { Geom::Affine const ct(item->transform * transform); @@ -305,7 +305,7 @@ Geom::OptRect SPGroup::bbox(Geom::Affine const &transform, SPItem::BBoxType bbox void SPGroup::print(SPPrintContext *ctx) { std::vector l=this->childList(false); for(std::vector::const_iterator i=l.begin();i!=l.end();i++){ - SPObject *o = SP_OBJECT (*i); + SPObject *o = *i; SPItem *item = dynamic_cast(o); if (item) { item->invoke_print(ctx); @@ -359,7 +359,7 @@ Inkscape::DrawingItem *SPGroup::show (Inkscape::Drawing &drawing, unsigned int k void SPGroup::hide (unsigned int key) { std::vector l=this->childList(false, SPObject::ActionShow); for(std::vector::const_iterator i=l.begin();i!=l.end();i++){ - SPObject *o = SP_OBJECT (*i); + SPObject *o = *i; SPItem *item = dynamic_cast(o); if (item) { @@ -799,7 +799,7 @@ void SPGroup::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem * Inkscape::DrawingItem *ac = NULL; std::vector l=this->childList(false, SPObject::ActionShow); for(std::vector::const_iterator i=l.begin();i!=l.end();i++){ - SPObject *o = SP_OBJECT (*i); + SPObject *o = *i; SPItem * child = dynamic_cast(o); if (child) { ac = child->invoke_show (drawing, key, flags); -- cgit v1.2.3 From 9bdc157f705ca61516e599cb416580283d21ec35 Mon Sep 17 00:00:00 2001 From: Marc Jeanmougin Date: Fri, 27 Feb 2015 04:21:48 +0100 Subject: more cast cleanup (bzr r13922.1.11) --- src/sp-item-group.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/sp-item-group.cpp') diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp index 620c0b70f..64ad9ff43 100644 --- a/src/sp-item-group.cpp +++ b/src/sp-item-group.cpp @@ -818,7 +818,7 @@ void SPGroup::update_patheffect(bool write) { std::vector const item_list = sp_item_group_item_list(this); for ( std::vector::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) { - SPObject *subitem = static_cast(*iter); + SPObject *subitem = *iter; SPLPEItem *lpeItem = dynamic_cast(subitem); if (lpeItem) { @@ -846,7 +846,7 @@ sp_group_perform_patheffect(SPGroup *group, SPGroup *topgroup, bool write) std::vector const item_list = sp_item_group_item_list(group); for ( std::vector::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) { - SPObject *subitem = static_cast(*iter); + SPObject *subitem = *iter; SPGroup *subGroup = dynamic_cast(subitem); if (subGroup) { -- cgit v1.2.3 From fee6f2b2bd4ade26b957f91de04d45c38541b05a Mon Sep 17 00:00:00 2001 From: Marc Jeanmougin Date: Sat, 2 May 2015 03:14:58 +0200 Subject: fixed selection after ungroup fixed some regression with displacement of clones of clones when ungrouping (test case: icons.svg) (bzr r14084) --- src/sp-item-group.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'src/sp-item-group.cpp') diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp index 9bd42665d..72cd5d7fa 100644 --- a/src/sp-item-group.cpp +++ b/src/sp-item-group.cpp @@ -375,7 +375,7 @@ void sp_item_group_ungroup_handle_clones(SPItem *parent, Geom::Affine const g) { for(std::list::const_iterator refd=parent->hrefList.begin();refd!=parent->hrefList.end();refd++){ SPItem *citem = dynamic_cast(*refd); - if (citem) { + if (citem && !citem->cloned) { SPUse *useitem = dynamic_cast(citem); if (useitem && useitem->get_original() == parent) { Geom::Affine ctrans; @@ -541,15 +541,12 @@ sp_item_group_ungroup (SPGroup *group, std::vector &children, bool do_d if (item) { item->doWriteTransform(repr, item->transform, NULL, false); + children.insert(children.begin(),item); } else { g_assert_not_reached(); } Inkscape::GC::release(repr); - if (!children.empty() && item) { - children.insert(children.begin(),item); - } - items = g_slist_remove (items, items->data); } -- cgit v1.2.3