summaryrefslogtreecommitdiffstats
path: root/src/sp-item-group.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/sp-item-group.cpp')
-rw-r--r--src/sp-item-group.cpp601
1 files changed, 245 insertions, 356 deletions
diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp
index a2eda6625..010cc5449 100644
--- a/src/sp-item-group.cpp
+++ b/src/sp-item-group.cpp
@@ -53,153 +53,190 @@
using Inkscape::DocumentUndo;
-static void sp_group_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_group_release(SPObject *object);
-static void sp_group_dispose(GObject *object);
-
-static void sp_group_child_added (SPObject * object, Inkscape::XML::Node * child, Inkscape::XML::Node * ref);
-static void sp_group_remove_child (SPObject * object, Inkscape::XML::Node * child);
-static void sp_group_order_changed (SPObject * object, Inkscape::XML::Node * child, Inkscape::XML::Node * old_ref, Inkscape::XML::Node * new_ref);
-static void sp_group_update (SPObject *object, SPCtx *ctx, guint flags);
-static void sp_group_modified (SPObject *object, guint flags);
-static Inkscape::XML::Node *sp_group_write (SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_group_set(SPObject *object, unsigned key, char const *value);
-
-static Geom::OptRect sp_group_bbox(SPItem const *item, Geom::Affine const &transform, SPItem::BBoxType type);
-static void sp_group_print (SPItem * item, SPPrintContext *ctx);
-static gchar * sp_group_description (SPItem * item);
-static Inkscape::DrawingItem *sp_group_show (SPItem *item, Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
-static void sp_group_hide (SPItem * item, unsigned int key);
-static void sp_group_snappoints (SPItem const *item, std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs);
-
-static void sp_group_update_patheffect(SPLPEItem *lpeitem, bool write);
static void sp_group_perform_patheffect(SPGroup *group, SPGroup *topgroup, bool write);
-G_DEFINE_TYPE(SPGroup, sp_group, SP_TYPE_LPE_ITEM);
+#include "sp-factory.h"
-static void
-sp_group_class_init (SPGroupClass *klass)
-{
- GObjectClass * object_class;
- SPObjectClass * sp_object_class;
- SPItemClass * item_class;
- SPLPEItemClass * lpe_item_class;
-
- object_class = (GObjectClass *) klass;
- sp_object_class = (SPObjectClass *) klass;
- item_class = (SPItemClass *) klass;
- lpe_item_class = (SPLPEItemClass *) klass;
-
- object_class->dispose = sp_group_dispose;
-
- sp_object_class->child_added = sp_group_child_added;
- sp_object_class->remove_child = sp_group_remove_child;
- sp_object_class->order_changed = sp_group_order_changed;
- sp_object_class->update = sp_group_update;
- sp_object_class->modified = sp_group_modified;
- sp_object_class->set = sp_group_set;
- sp_object_class->write = sp_group_write;
- sp_object_class->release = sp_group_release;
- sp_object_class->build = sp_group_build;
-
- item_class->bbox = sp_group_bbox;
- item_class->print = sp_group_print;
- item_class->description = sp_group_description;
- item_class->show = sp_group_show;
- item_class->hide = sp_group_hide;
- item_class->snappoints = sp_group_snappoints;
-
- lpe_item_class->update_patheffect = sp_group_update_patheffect;
+namespace {
+ SPObject* createGroup() {
+ return new SPGroup();
+ }
+
+ bool groupRegistered = SPFactory::instance().registerObject("svg:g", createGroup);
}
-static void
-sp_group_init (SPGroup *group)
-{
- group->_layer_mode = SPGroup::GROUP;
- group->group = new CGroup(group);
- new (&group->_display_modes) std::map<unsigned int, SPGroup::LayerMode>();
+SPGroup::SPGroup() : SPLPEItem() {
+ this->_layer_mode = SPGroup::GROUP;
+ //new (&this->_display_modes) std::map<unsigned int, SPGroup::LayerMode>();
}
-static void sp_group_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- object->readAttr( "inkscape:groupmode" );
+SPGroup::~SPGroup() {
+ //this->_display_modes.~map();
+}
- if (((SPObjectClass *)sp_group_parent_class)->build) {
- ((SPObjectClass *)sp_group_parent_class)->build(object, document, repr);
- }
+void SPGroup::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ this->readAttr( "inkscape:groupmode" );
+
+ SPLPEItem::build(document, repr);
}
-static void sp_group_release(SPObject *object) {
- if ( SP_GROUP(object)->_layer_mode == SPGroup::LAYER ) {
- object->document->removeResource("layer", object);
- }
- if (((SPObjectClass *)sp_group_parent_class)->release) {
- ((SPObjectClass *)sp_group_parent_class)->release(object);
+void SPGroup::release() {
+ if (this->_layer_mode == SPGroup::LAYER) {
+ this->document->removeResource("layer", this);
}
-}
-static void
-sp_group_dispose(GObject *object)
-{
- SP_GROUP(object)->_display_modes.~map();
- delete SP_GROUP(object)->group;
+ SPLPEItem::release();
}
-static void sp_group_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref)
-{
- SPGroup *group = SP_GROUP(object);
+void SPGroup::child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref) {
+ SPLPEItem::child_added(child, ref);
+
+ 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
+ SPObject *ochild = last_child;
+ if ( SP_IS_ITEM(ochild) ) {
+ /* TODO: this should be moved into SPItem somehow */
+ SPItemView *v;
+ Inkscape::DrawingItem *ac;
+
+ for (v = this->display; v != NULL; v = v->next) {
+ ac = SP_ITEM (ochild)->invoke_show (v->arenaitem->drawing(), v->key, v->flags);
+
+ if (ac) {
+ v->arenaitem->appendChild(ac);
+ }
+ }
+ }
+ } else { // general case
+ SPObject *ochild = this->get_child_by_repr(child);
+ if ( ochild && SP_IS_ITEM(ochild) ) {
+ /* TODO: this should be moved into SPItem somehow */
+ SPItemView *v;
+ Inkscape::DrawingItem *ac;
- if (((SPObjectClass *) (sp_group_parent_class))->child_added) {
- (* ((SPObjectClass *) (sp_group_parent_class))->child_added) (object, child, ref);
+ unsigned position = SP_ITEM(ochild)->pos_in_parent();
+
+ for (v = this->display; v != NULL; v = v->next) {
+ ac = SP_ITEM (ochild)->invoke_show (v->arenaitem->drawing(), v->key, v->flags);
+
+ if (ac) {
+ v->arenaitem->prependChild(ac);
+ ac->setZOrder(position);
+ }
+ }
+ }
}
- group->group->onChildAdded(child);
+ this->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
/* fixme: hide (Lauris) */
-static void
-sp_group_remove_child (SPObject * object, Inkscape::XML::Node * child)
-{
- if (((SPObjectClass *) (sp_group_parent_class))->remove_child)
- (* ((SPObjectClass *) (sp_group_parent_class))->remove_child) (object, child);
+void SPGroup::remove_child(Inkscape::XML::Node *child) {
+ SPLPEItem::remove_child(child);
- SP_GROUP(object)->group->onChildRemoved(child);
+ this->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
-static void
-sp_group_order_changed (SPObject *object, 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)
{
- if (((SPObjectClass *) (sp_group_parent_class))->order_changed)
- (* ((SPObjectClass *) (sp_group_parent_class))->order_changed) (object, child, old_ref, new_ref);
+ SPLPEItem::order_changed(child, old_ref, new_ref);
+
+ SPObject *ochild = this->get_child_by_repr(child);
+ if ( ochild && SP_IS_ITEM(ochild) ) {
+ /* TODO: this should be moved into SPItem somehow */
+ SPItemView *v;
+ unsigned position = SP_ITEM(ochild)->pos_in_parent();
+ for ( v = SP_ITEM (ochild)->display ; v != NULL ; v = v->next ) {
+ v->arenaitem->setZOrder(position);
+ }
+ }
- SP_GROUP(object)->group->onOrderChanged(child, old_ref, new_ref);
+ this->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
-static void
-sp_group_update (SPObject *object, SPCtx *ctx, unsigned int flags)
-{
- if (((SPObjectClass *) (sp_group_parent_class))->update)
- ((SPObjectClass *) (sp_group_parent_class))->update (object, ctx, flags);
+void SPGroup::update(SPCtx *ctx, unsigned int flags) {
+ SPLPEItem::update(ctx, flags);
+
+ SPItemCtx *ictx, cctx;
+
+ ictx = (SPItemCtx *) ctx;
+ cctx = *ictx;
+
+ if (flags & SP_OBJECT_MODIFIED_FLAG) {
+ flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
+ }
+
+ flags &= SP_OBJECT_MODIFIED_CASCADE;
+
+ if (flags & SP_OBJECT_STYLE_MODIFIED_FLAG) {
+ for (SPItemView *v = this->display; v != NULL; v = v->next) {
+ Inkscape::DrawingGroup *group = dynamic_cast<Inkscape::DrawingGroup *>(v->arenaitem);
+ group->setStyle(this->style);
+ }
+ }
+
+ GSList *l = g_slist_reverse(this->childList(true, SPObject::ActionUpdate));
+ while (l) {
+ SPObject *child = SP_OBJECT (l->data);
+ l = g_slist_remove (l, child);
- SP_GROUP(object)->group->onUpdate(ctx, flags);
+ if (flags || (child->uflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
+ if (SP_IS_ITEM (child)) {
+ SPItem const &chi = *SP_ITEM(child);
+ cctx.i2doc = chi.transform * ictx->i2doc;
+ cctx.i2vp = chi.transform * ictx->i2vp;
+ child->updateDisplay((SPCtx *)&cctx, flags);
+ } else {
+ child->updateDisplay(ctx, flags);
+ }
+ }
+
+ sp_object_unref(child);
+ }
}
-static void
-sp_group_modified (SPObject *object, guint flags)
-{
- if (((SPObjectClass *) (sp_group_parent_class))->modified)
- ((SPObjectClass *) (sp_group_parent_class))->modified (object, flags);
+void SPGroup::modified(guint flags) {
+ SPLPEItem::modified(flags);
+
+ SPObject *child;
+
+ if (flags & SP_OBJECT_MODIFIED_FLAG) {
+ flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
+ }
+
+ flags &= SP_OBJECT_MODIFIED_CASCADE;
+
+ if (flags & SP_OBJECT_STYLE_MODIFIED_FLAG) {
+ for (SPItemView *v = this->display; v != NULL; v = v->next) {
+ Inkscape::DrawingGroup *group = dynamic_cast<Inkscape::DrawingGroup *>(v->arenaitem);
+ group->setStyle(this->style);
+ }
+ }
+
+ GSList *l = g_slist_reverse(this->childList(true));
+
+ while (l) {
+ child = SP_OBJECT (l->data);
+ l = g_slist_remove (l, child);
- SP_GROUP(object)->group->onModified(flags);
+ if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
+ child->emitModified(flags);
+ }
+
+ sp_object_unref(child);
+ }
}
-static Inkscape::XML::Node * sp_group_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags)
-{
+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");
@@ -207,15 +244,19 @@ static Inkscape::XML::Node * sp_group_write(SPObject *object, Inkscape::XML::Doc
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);
@@ -240,69 +281,109 @@ static Inkscape::XML::Node * sp_group_write(SPObject *object, Inkscape::XML::Doc
} else {
value = NULL;
}
+
repr->setAttribute("inkscape:groupmode", value);
}
- if (((SPObjectClass *) (sp_group_parent_class))->write) {
- ((SPObjectClass *) (sp_group_parent_class))->write (object, xml_doc, repr, flags);
- }
+ SPLPEItem::write(xml_doc, repr, flags);
return repr;
}
-static Geom::OptRect
-sp_group_bbox(SPItem const *item, Geom::Affine const &transform, SPItem::BBoxType type)
+Geom::OptRect SPGroup::bbox(Geom::Affine const &transform, SPItem::BBoxType bboxtype)
{
- return SP_GROUP(item)->group->bounds(type, transform);
-}
+ Geom::OptRect bbox;
-static void
-sp_group_print (SPItem * item, SPPrintContext *ctx)
-{
- SP_GROUP(item)->group->onPrint(ctx);
+ 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;
}
-static gchar * sp_group_description (SPItem * item)
-{
- return SP_GROUP(item)->group->getDescription();
+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);
+ }
}
-static void sp_group_set(SPObject *object, unsigned key, char const *value) {
- SPGroup *group = SP_GROUP(object);
+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 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: {
- if (((SPObjectClass *) (sp_group_parent_class))->set) {
- (* ((SPObjectClass *) (sp_group_parent_class))->set)(object, key, value);
- }
- }
+
+ default:
+ SPLPEItem::set(key, value);
+ break;
}
}
-static Inkscape::DrawingItem *
-sp_group_show (SPItem *item, Inkscape::Drawing &drawing, unsigned int key, unsigned int flags)
-{
- return SP_GROUP(item)->group->show(drawing, key, flags);
+Inkscape::DrawingItem *SPGroup::show (Inkscape::Drawing &drawing, unsigned int key, unsigned int flags) {
+ Inkscape::DrawingGroup *ai;
+
+ ai = new Inkscape::DrawingGroup(drawing);
+ ai->setPickChildren(this->effectiveLayerMode(key) == SPGroup::LAYER);
+ ai->setStyle(this->style);
+
+ this->_showChildren(drawing, ai, key, flags);
+ return ai;
}
-static void
-sp_group_hide (SPItem *item, unsigned int key)
-{
- SP_GROUP(item)->group->hide(key);
+void SPGroup::hide (unsigned int key) {
+ SPItem * child;
+
+ 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);
+ }
+
+// SPLPEItem::onHide(key);
}
-static void sp_group_snappoints(SPItem const *item, std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs)
-{
- 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);
@@ -561,152 +642,9 @@ void SPGroup::translateChildItems(Geom::Translate const &tr)
}
}
-CGroup::CGroup(SPGroup *group) {
- _group = group;
-}
-
-CGroup::~CGroup() {
-}
-
-void CGroup::onChildAdded(Inkscape::XML::Node *child) {
- SPObject *last_child = _group->lastChild();
- if (last_child && last_child->getRepr() == child) {
- // optimization for the common special case where the child is being added at the end
- SPObject *ochild = last_child;
- if ( SP_IS_ITEM(ochild) ) {
- /* TODO: this should be moved into SPItem somehow */
- SPItemView *v;
- Inkscape::DrawingItem *ac;
-
- for (v = _group->display; v != NULL; v = v->next) {
- ac = SP_ITEM (ochild)->invoke_show (v->arenaitem->drawing(), v->key, v->flags);
-
- if (ac) {
- v->arenaitem->appendChild(ac);
- }
- }
- }
- } else { // general case
- SPObject *ochild = _group->get_child_by_repr(child);
- if ( ochild && SP_IS_ITEM(ochild) ) {
- /* TODO: this should be moved into SPItem somehow */
- SPItemView *v;
- Inkscape::DrawingItem *ac;
-
- unsigned position = SP_ITEM(ochild)->pos_in_parent();
-
- for (v = _group->display; v != NULL; v = v->next) {
- ac = SP_ITEM (ochild)->invoke_show (v->arenaitem->drawing(), v->key, v->flags);
-
- if (ac) {
- v->arenaitem->prependChild(ac);
- ac->setZOrder(position);
- }
- }
- }
- }
-
- _group->requestModified(SP_OBJECT_MODIFIED_FLAG);
-}
-
-void CGroup::onChildRemoved(Inkscape::XML::Node */*child*/) {
- _group->requestModified(SP_OBJECT_MODIFIED_FLAG);
-}
-
-void CGroup::onUpdate(SPCtx *ctx, unsigned int flags) {
- SPItemCtx *ictx, cctx;
-
- ictx = (SPItemCtx *) ctx;
- cctx = *ictx;
-
- 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 = _group;
- for (SPItemView *v = _group->display; v != NULL; v = v->next) {
- Inkscape::DrawingGroup *group = dynamic_cast<Inkscape::DrawingGroup *>(v->arenaitem);
- group->setStyle(object->style);
- }
- }
-
- GSList *l = g_slist_reverse(_group->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);
- cctx.i2doc = chi.transform * ictx->i2doc;
- cctx.i2vp = chi.transform * ictx->i2vp;
- child->updateDisplay((SPCtx *)&cctx, flags);
- } else {
- child->updateDisplay(ctx, flags);
- }
- }
- g_object_unref (G_OBJECT (child));
- }
-}
-
-void CGroup::onModified(guint flags) {
- SPObject *child;
-
- 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 = _group;
- for (SPItemView *v = _group->display; v != NULL; v = v->next) {
- Inkscape::DrawingGroup *group = dynamic_cast<Inkscape::DrawingGroup *>(v->arenaitem);
- group->setStyle(object->style);
- }
- }
-
- GSList *l = g_slist_reverse(_group->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);
- }
- g_object_unref (G_OBJECT (child));
- }
-}
-
-Geom::OptRect CGroup::bounds(SPItem::BBoxType type, Geom::Affine const &transform)
-{
- Geom::OptRect bbox;
-
- GSList *l = _group->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(type, ct);
- }
- l = g_slist_remove (l, o);
- }
- return bbox;
-}
-
-void CGroup::onPrint(SPPrintContext *ctx) {
- GSList *l = g_slist_reverse(_group->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);
- }
-}
-
-gint CGroup::getItemCount() {
+gint SPGroup::getItemCount() {
gint len = 0;
- for (SPObject *o = _group->firstChild() ; o ; o = o->getNext() ) {
+ for (SPObject *o = this->firstChild() ; o ; o = o->getNext() ) {
if (SP_IS_ITEM(o)) {
len++;
}
@@ -715,30 +653,10 @@ gint CGroup::getItemCount() {
return len;
}
-gchar *CGroup::getDescription() {
- gint len = getItemCount();
- return g_strdup_printf(
- ngettext("<b>Group</b> of <b>%d</b> object",
- "<b>Group</b> of <b>%d</b> objects",
- len), len);
-}
-
-Inkscape::DrawingItem *CGroup::show (Inkscape::Drawing &drawing, unsigned int key, unsigned int flags) {
- Inkscape::DrawingGroup *ai;
- SPObject *object = _group;
-
- ai = new Inkscape::DrawingGroup(drawing);
- ai->setPickChildren(_group->effectiveLayerMode(key) == SPGroup::LAYER);
- ai->setStyle(object->style);
-
- _showChildren(drawing, ai, key, flags);
- return ai;
-}
-
-void CGroup::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags) {
+void SPGroup::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags) {
Inkscape::DrawingItem *ac = NULL;
SPItem * child = NULL;
- GSList *l = g_slist_reverse(_group->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)) {
@@ -752,67 +670,32 @@ void CGroup::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *a
}
}
-void CGroup::hide (unsigned int key) {
- SPItem * child;
-
- GSList *l = g_slist_reverse(_group->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);
- }
-
- if (((SPItemClass *) sp_group_parent_class)->hide)
- ((SPItemClass *) sp_group_parent_class)->hide (_group, key);
-}
-
-void CGroup::onOrderChanged (Inkscape::XML::Node *child, Inkscape::XML::Node *, Inkscape::XML::Node *)
-{
- SPObject *ochild = _group->get_child_by_repr(child);
- if ( ochild && SP_IS_ITEM(ochild) ) {
- /* TODO: this should be moved into SPItem somehow */
- SPItemView *v;
- unsigned position = SP_ITEM(ochild)->pos_in_parent();
- for ( v = SP_ITEM (ochild)->display ; v != NULL ; v = v->next ) {
- v->arenaitem->setZOrder(position);
- }
- }
-
- _group->requestModified(SP_OBJECT_MODIFIED_FLAG);
-}
-
-static void
-sp_group_update_patheffect (SPLPEItem *lpeitem, bool write)
-{
+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)) {
- if (SP_LPE_ITEM_CLASS (G_OBJECT_GET_CLASS (subitem))->update_patheffect) {
- SP_LPE_ITEM_CLASS (G_OBJECT_GET_CLASS (subitem))->update_patheffect (SP_LPE_ITEM(subitem), write);
- }
+ ((SPLPEItem*)subitem)->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);
}
}
@@ -820,20 +703,26 @@ 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) {
+ c->transform(i2anc_affine(subitem, topgroup));
sp_lpe_item_perform_path_effect(SP_LPE_ITEM(topgroup), c);
+ c->transform(i2anc_affine(subitem, topgroup).inverse());
SP_SHAPE(subitem)->setCurve(c, TRUE);
if (write) {