diff options
| author | Markus Engel <markus.engel@tum.de> | 2013-04-05 15:51:29 +0000 |
|---|---|---|
| committer | Markus Engel <markus.engel@tum.de> | 2013-04-05 15:51:29 +0000 |
| commit | dbda80349e95767e390a178cda7c05787fbce1fe (patch) | |
| tree | 851cb7ea9e876da0ff50665f16e2410604c79da1 /src/sp-item-group.cpp | |
| parent | Merged Shape and subclasses. Cleaned up a bit. (diff) | |
| download | inkscape-dbda80349e95767e390a178cda7c05787fbce1fe.tar.gz inkscape-dbda80349e95767e390a178cda7c05787fbce1fe.zip | |
Merged Group and subclasses.
(bzr r11608.1.77)
Diffstat (limited to 'src/sp-item-group.cpp')
| -rw-r--r-- | src/sp-item-group.cpp | 202 |
1 files changed, 95 insertions, 107 deletions
diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp index 10e84f2da..5956b16a9 100644 --- a/src/sp-item-group.cpp +++ b/src/sp-item-group.cpp @@ -67,71 +67,38 @@ namespace { bool groupRegistered = SPFactory::instance().registerObject("svg:g", createGroup); } -G_DEFINE_TYPE(SPGroup, sp_group, G_TYPE_OBJECT); +SPGroup::SPGroup() : SPLPEItem(), CLPEItem(this) { + delete this->clpeitem; + this->clpeitem = this; + this->citem = this; + this->cobject = this; -static void -sp_group_class_init (SPGroupClass *klass) -{ - GObjectClass * object_class; - object_class = (GObjectClass *) klass; - object_class->dispose = sp_group_dispose; -} - -CGroup::CGroup(SPGroup *group) : CLPEItem(group) { - this->spgroup = group; + this->_layer_mode = SPGroup::GROUP; + new (&this->_display_modes) std::map<unsigned int, SPGroup::LayerMode>(); } -CGroup::~CGroup() { +SPGroup::~SPGroup() { + this->_display_modes.~map(); } -SPGroup::SPGroup() : SPLPEItem() { - SPGroup* group = this; - - group->cgroup = new CGroup(group); - group->typeHierarchy.insert(typeid(SPGroup)); - - delete group->clpeitem; - group->clpeitem = group->cgroup; - group->citem = group->cgroup; - group->cobject = group->cgroup; - - group->_layer_mode = SPGroup::GROUP; - new (&group->_display_modes) std::map<unsigned int, SPGroup::LayerMode>(); -} - -static void -sp_group_init (SPGroup *group) -{ - new (group) SPGroup(); -} - -void CGroup::build(SPDocument *document, Inkscape::XML::Node *repr) { - SPGroup* object = this->spgroup; - - object->readAttr( "inkscape:groupmode" ); +void SPGroup::build(SPDocument *document, Inkscape::XML::Node *repr) { + this->readAttr( "inkscape:groupmode" ); CLPEItem::build(document, repr); } -void CGroup::release() { - SPGroup* object = this->spgroup; - - if ( SP_GROUP(object)->_layer_mode == SPGroup::LAYER ) { - object->document->removeResource("layer", object); +void SPGroup::release() { + if (this->_layer_mode == SPGroup::LAYER) { + this->document->removeResource("layer", this); } - CLPEItem::release(); -} -static void -sp_group_dispose(GObject *object) -{ - SP_GROUP(object)->_display_modes.~map(); + CLPEItem::release(); } -void CGroup::child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref) { +void SPGroup::child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref) { CLPEItem::child_added(child, ref); - SPObject *last_child = spgroup->lastChild(); + SPObject *last_child = this->lastChild(); if (last_child && last_child->getRepr() == child) { // optimization for the common special case where the child is being added at the end @@ -141,7 +108,7 @@ void CGroup::child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref) { SPItemView *v; Inkscape::DrawingItem *ac; - for (v = spgroup->display; v != NULL; v = v->next) { + for (v = this->display; v != NULL; v = v->next) { ac = SP_ITEM (ochild)->invoke_show (v->arenaitem->drawing(), v->key, v->flags); if (ac) { @@ -150,7 +117,7 @@ void CGroup::child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref) { } } } else { // general case - SPObject *ochild = spgroup->get_child_by_repr(child); + SPObject *ochild = this->get_child_by_repr(child); if ( ochild && SP_IS_ITEM(ochild) ) { /* TODO: this should be moved into SPItem somehow */ SPItemView *v; @@ -158,7 +125,7 @@ void CGroup::child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref) { unsigned position = SP_ITEM(ochild)->pos_in_parent(); - for (v = spgroup->display; v != NULL; v = v->next) { + for (v = this->display; v != NULL; v = v->next) { ac = SP_ITEM (ochild)->invoke_show (v->arenaitem->drawing(), v->key, v->flags); if (ac) { @@ -169,22 +136,22 @@ void CGroup::child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref) { } } - spgroup->requestModified(SP_OBJECT_MODIFIED_FLAG); + this->requestModified(SP_OBJECT_MODIFIED_FLAG); } /* fixme: hide (Lauris) */ -void CGroup::remove_child(Inkscape::XML::Node *child) { +void SPGroup::remove_child(Inkscape::XML::Node *child) { CLPEItem::remove_child(child); - spgroup->requestModified(SP_OBJECT_MODIFIED_FLAG); + this->requestModified(SP_OBJECT_MODIFIED_FLAG); } -void CGroup::order_changed (Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref) +void SPGroup::order_changed (Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref) { CLPEItem::order_changed(child, old_ref, new_ref); - SPObject *ochild = spgroup->get_child_by_repr(child); + SPObject *ochild = this->get_child_by_repr(child); if ( ochild && SP_IS_ITEM(ochild) ) { /* TODO: this should be moved into SPItem somehow */ SPItemView *v; @@ -194,10 +161,10 @@ void CGroup::order_changed (Inkscape::XML::Node *child, Inkscape::XML::Node *old } } - spgroup->requestModified(SP_OBJECT_MODIFIED_FLAG); + this->requestModified(SP_OBJECT_MODIFIED_FLAG); } -void CGroup::update(SPCtx *ctx, unsigned int flags) { +void SPGroup::update(SPCtx *ctx, unsigned int flags) { CLPEItem::update(ctx, flags); SPItemCtx *ictx, cctx; @@ -212,17 +179,17 @@ void CGroup::update(SPCtx *ctx, unsigned int flags) { flags &= SP_OBJECT_MODIFIED_CASCADE; if (flags & SP_OBJECT_STYLE_MODIFIED_FLAG) { - SPObject *object = spgroup; - for (SPItemView *v = spgroup->display; v != NULL; v = v->next) { + for (SPItemView *v = this->display; v != NULL; v = v->next) { Inkscape::DrawingGroup *group = dynamic_cast<Inkscape::DrawingGroup *>(v->arenaitem); - group->setStyle(object->style); + group->setStyle(this->style); } } - GSList *l = g_slist_reverse(spgroup->childList(true, SPObject::ActionUpdate)); + GSList *l = g_slist_reverse(this->childList(true, SPObject::ActionUpdate)); while (l) { SPObject *child = SP_OBJECT (l->data); l = g_slist_remove (l, child); + if (flags || (child->uflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { if (SP_IS_ITEM (child)) { SPItem const &chi = *SP_ITEM(child); @@ -233,43 +200,50 @@ void CGroup::update(SPCtx *ctx, unsigned int flags) { child->updateDisplay(ctx, flags); } } + sp_object_unref(child); } } -void CGroup::modified(guint flags) { +void SPGroup::modified(guint flags) { CLPEItem::modified(flags); SPObject *child; - if (flags & SP_OBJECT_MODIFIED_FLAG) flags |= SP_OBJECT_PARENT_MODIFIED_FLAG; + if (flags & SP_OBJECT_MODIFIED_FLAG) { + flags |= SP_OBJECT_PARENT_MODIFIED_FLAG; + } + flags &= SP_OBJECT_MODIFIED_CASCADE; if (flags & SP_OBJECT_STYLE_MODIFIED_FLAG) { - SPObject *object = spgroup; - for (SPItemView *v = spgroup->display; v != NULL; v = v->next) { + for (SPItemView *v = this->display; v != NULL; v = v->next) { Inkscape::DrawingGroup *group = dynamic_cast<Inkscape::DrawingGroup *>(v->arenaitem); - group->setStyle(object->style); + group->setStyle(this->style); } } - GSList *l = g_slist_reverse(spgroup->childList(true)); + GSList *l = g_slist_reverse(this->childList(true)); + while (l) { child = SP_OBJECT (l->data); l = g_slist_remove (l, child); + if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { child->emitModified(flags); } + sp_object_unref(child); } } -Inkscape::XML::Node* CGroup::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { - SPGroup* object = this->spgroup; +Inkscape::XML::Node* SPGroup::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { + SPGroup* object = this; SPGroup *group = SP_GROUP(object); if (flags & SP_OBJECT_WRITE_BUILD) { GSList *l; + if (!repr) { if (SP_IS_SWITCH(object)) { repr = xml_doc->createElement("svg:switch"); @@ -277,15 +251,19 @@ Inkscape::XML::Node* CGroup::write(Inkscape::XML::Document *xml_doc, Inkscape::X repr = xml_doc->createElement("svg:g"); } } + l = NULL; + for (SPObject *child = object->firstChild(); child; child = child->getNext() ) { if ( !SP_IS_TITLE(child) && !SP_IS_DESC(child) ) { Inkscape::XML::Node *crepr = child->updateRepr(xml_doc, NULL, flags); + if (crepr) { l = g_slist_prepend (l, crepr); } } } + while (l) { repr->addChild((Inkscape::XML::Node *) l->data, NULL); Inkscape::GC::release((Inkscape::XML::Node *) l->data); @@ -310,6 +288,7 @@ Inkscape::XML::Node* CGroup::write(Inkscape::XML::Document *xml_doc, Inkscape::X } else { value = NULL; } + repr->setAttribute("inkscape:groupmode", value); } @@ -318,83 +297,91 @@ Inkscape::XML::Node* CGroup::write(Inkscape::XML::Document *xml_doc, Inkscape::X return repr; } -Geom::OptRect CGroup::bbox(Geom::Affine const &transform, SPItem::BBoxType bboxtype) +Geom::OptRect SPGroup::bbox(Geom::Affine const &transform, SPItem::BBoxType bboxtype) { Geom::OptRect bbox; - GSList *l = this->spgroup->childList(false, SPObject::ActionBBox); + GSList *l = this->childList(false, SPObject::ActionBBox); + while (l) { SPObject *o = SP_OBJECT (l->data); + if (SP_IS_ITEM(o) && !SP_ITEM(o)->isHidden()) { SPItem *child = SP_ITEM(o); Geom::Affine const ct(child->transform * transform); bbox |= child->bounds(bboxtype, ct); } + l = g_slist_remove (l, o); } + return bbox; } -void CGroup::print(SPPrintContext *ctx) { - GSList *l = g_slist_reverse(spgroup->childList(false)); +void SPGroup::print(SPPrintContext *ctx) { + GSList *l = g_slist_reverse(this->childList(false)); + while (l) { SPObject *o = SP_OBJECT (l->data); + if (SP_IS_ITEM(o)) { SP_ITEM(o)->invoke_print (ctx); } + l = g_slist_remove (l, o); } } -gchar *CGroup::description() { - gint len = this->spgroup->getItemCount(); +gchar *SPGroup::description() { + gint len = this->getItemCount(); return g_strdup_printf( ngettext("<b>Group</b> of <b>%d</b> object", "<b>Group</b> of <b>%d</b> objects", len), len); } -void CGroup::set(unsigned int key, gchar const* value) { - SPGroup *group = this->spgroup; - +void SPGroup::set(unsigned int key, gchar const* value) { switch (key) { case SP_ATTR_INKSCAPE_GROUPMODE: if ( value && !strcmp(value, "layer") ) { - group->setLayerMode(SPGroup::LAYER); + this->setLayerMode(SPGroup::LAYER); } else if ( value && !strcmp(value, "maskhelper") ) { - group->setLayerMode(SPGroup::MASK_HELPER); + this->setLayerMode(SPGroup::MASK_HELPER); } else { - group->setLayerMode(SPGroup::GROUP); + this->setLayerMode(SPGroup::GROUP); } break; - default: { + + default: CLPEItem::set(key, value); - } + break; } } -Inkscape::DrawingItem *CGroup::show (Inkscape::Drawing &drawing, unsigned int key, unsigned int flags) { +Inkscape::DrawingItem *SPGroup::show (Inkscape::Drawing &drawing, unsigned int key, unsigned int flags) { Inkscape::DrawingGroup *ai; - SPObject *object = spgroup; ai = new Inkscape::DrawingGroup(drawing); - ai->setPickChildren(spgroup->effectiveLayerMode(key) == SPGroup::LAYER); - ai->setStyle(object->style); + ai->setPickChildren(this->effectiveLayerMode(key) == SPGroup::LAYER); + ai->setStyle(this->style); - this->spgroup->_showChildren(drawing, ai, key, flags); + this->_showChildren(drawing, ai, key, flags); return ai; } -void CGroup::hide (unsigned int key) { +void SPGroup::hide (unsigned int key) { SPItem * child; - GSList *l = g_slist_reverse(spgroup->childList(false, SPObject::ActionShow)); + GSList *l = g_slist_reverse(this->childList(false, SPObject::ActionShow)); + while (l) { SPObject *o = SP_OBJECT (l->data); + if (SP_IS_ITEM (o)) { child = SP_ITEM (o); child->invoke_hide (key); } + l = g_slist_remove (l, o); } @@ -402,10 +389,8 @@ void CGroup::hide (unsigned int key) { } -void CGroup::snappoints(std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs) { - SPGroup* item = this->spgroup; - - for ( SPObject const *o = item->firstChild(); o; o = o->getNext() ) +void SPGroup::snappoints(std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs) { + for ( SPObject const *o = this->firstChild(); o; o = o->getNext() ) { if (SP_IS_ITEM(o)) { SP_ITEM(o)->getSnappoints(p, snapprefs); @@ -688,33 +673,32 @@ void SPGroup::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem * } } -void CGroup::update_patheffect(bool write) { - SPGroup* lpeitem = this->spgroup; - +void SPGroup::update_patheffect(bool write) { #ifdef GROUP_VERBOSE g_message("sp_group_update_patheffect: %p\n", lpeitem); #endif - g_return_if_fail (lpeitem != NULL); - g_return_if_fail (SP_IS_GROUP (lpeitem)); - GSList const *item_list = sp_item_group_item_list(SP_GROUP(lpeitem)); + GSList const *item_list = sp_item_group_item_list(this); + for ( GSList const *iter = item_list; iter; iter = iter->next ) { SPObject *subitem = static_cast<SPObject *>(iter->data); + if (SP_IS_LPE_ITEM(subitem)) { ((SPLPEItem*)subitem)->clpeitem->update_patheffect(write); } } - if (sp_lpe_item_has_path_effect(lpeitem) && sp_lpe_item_path_effects_enabled(lpeitem)) { - for (PathEffectList::iterator it = lpeitem->path_effect_list->begin(); it != lpeitem->path_effect_list->end(); it++) + if (sp_lpe_item_has_path_effect(this) && sp_lpe_item_path_effects_enabled(this)) { + for (PathEffectList::iterator it = this->path_effect_list->begin(); it != this->path_effect_list->end(); it++) { LivePathEffectObject *lpeobj = (*it)->lpeobject; + if (lpeobj && lpeobj->get_lpe()) { - lpeobj->get_lpe()->doBeforeEffect(lpeitem); + lpeobj->get_lpe()->doBeforeEffect(this); } } - sp_group_perform_patheffect(SP_GROUP(lpeitem), SP_GROUP(lpeitem), write); + sp_group_perform_patheffect(this, this, write); } } @@ -722,17 +706,21 @@ static void sp_group_perform_patheffect(SPGroup *group, SPGroup *topgroup, bool write) { GSList const *item_list = sp_item_group_item_list(SP_GROUP(group)); + for ( GSList const *iter = item_list; iter; iter = iter->next ) { SPObject *subitem = static_cast<SPObject *>(iter->data); + if (SP_IS_GROUP(subitem)) { sp_group_perform_patheffect(SP_GROUP(subitem), topgroup, write); } else if (SP_IS_SHAPE(subitem)) { SPCurve * c = NULL; + if (SP_IS_PATH(subitem)) { c = SP_PATH(subitem)->get_original_curve(); } else { c = SP_SHAPE(subitem)->getCurve(); } + // only run LPEs when the shape has a curve defined if (c) { sp_lpe_item_perform_path_effect(SP_LPE_ITEM(topgroup), c); |
