153
155
if (((SPObjectClass *) (parent_class))->child_added)
154
156
(* ((SPObjectClass *) (parent_class))->child_added) (object, child, ref);
156
SPObject *last_child = object->lastChild();
157
if (last_child && SP_OBJECT_REPR(last_child) == child) {
158
// optimization for the common special case where the child is being added at the end
159
SPObject *ochild = last_child;
160
if ( SP_IS_ITEM(ochild) ) {
161
/* TODO: this should be moved into SPItem somehow */
165
for (v = item->display; v != NULL; v = v->next) {
166
ac = sp_item_invoke_show (SP_ITEM (ochild), NR_ARENA_ITEM_ARENA (v->arenaitem), v->key, v->flags);
169
nr_arena_item_append_child (v->arenaitem, ac);
170
nr_arena_item_unref (ac);
174
} else { // general case
175
SPObject *ochild = sp_object_get_child_by_repr(object, child);
176
if ( ochild && SP_IS_ITEM(ochild) ) {
177
/* TODO: this should be moved into SPItem somehow */
181
unsigned position = sp_item_pos_in_parent(SP_ITEM(ochild));
183
for (v = item->display; v != NULL; v = v->next) {
184
ac = sp_item_invoke_show (SP_ITEM (ochild), NR_ARENA_ITEM_ARENA (v->arenaitem), v->key, v->flags);
187
nr_arena_item_add_child (v->arenaitem, ac, NULL);
188
nr_arena_item_set_order (ac, position);
189
nr_arena_item_unref (ac);
195
object->requestModified(SP_OBJECT_MODIFIED_FLAG);
158
SP_GROUP(object)->group->onChildAdded(child);
198
161
/* fixme: hide (Lauris) */
212
175
if (((SPObjectClass *) (parent_class))->order_changed)
213
176
(* ((SPObjectClass *) (parent_class))->order_changed) (object, child, old_ref, new_ref);
215
SPObject *ochild = sp_object_get_child_by_repr(object, child);
216
if ( ochild && SP_IS_ITEM(ochild) ) {
217
/* TODO: this should be moved into SPItem somehow */
219
unsigned position = sp_item_pos_in_parent(SP_ITEM(ochild));
220
for ( v = SP_ITEM (ochild)->display ; v != NULL ; v = v->next ) {
221
nr_arena_item_set_order (v->arenaitem, position);
225
object->requestModified(SP_OBJECT_MODIFIED_FLAG);
178
SP_GROUP(object)->group->onOrderChanged(child, old_ref, new_ref);
229
182
sp_group_update (SPObject *object, SPCtx *ctx, unsigned int flags)
233
SPItemCtx *ictx, cctx;
236
group = SP_GROUP (object);
237
ictx = (SPItemCtx *) ctx;
240
if (((SPObjectClass *) (parent_class))->update)
241
((SPObjectClass *) (parent_class))->update (object, ctx, flags);
243
if (flags & SP_OBJECT_MODIFIED_FLAG) flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
244
flags &= SP_OBJECT_MODIFIED_CASCADE;
247
for (child = sp_object_first_child(object) ; child != NULL ; child = SP_OBJECT_NEXT(child) ) {
248
g_object_ref (G_OBJECT (child));
249
l = g_slist_prepend (l, child);
251
l = g_slist_reverse (l);
253
child = SP_OBJECT (l->data);
254
l = g_slist_remove (l, child);
255
if (flags || (child->uflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
256
if (SP_IS_ITEM (child)) {
257
SPItem const &chi = *SP_ITEM(child);
258
cctx.i2doc = chi.transform * ictx->i2doc;
259
cctx.i2vp = chi.transform * ictx->i2vp;
260
child->updateDisplay((SPCtx *)&cctx, flags);
262
child->updateDisplay(ctx, flags);
265
g_object_unref (G_OBJECT (child));
184
if (((SPObjectClass *) (parent_class))->update)
185
((SPObjectClass *) (parent_class))->update (object, ctx, flags);
187
SP_GROUP(object)->group->onUpdate(ctx, flags);
270
191
sp_group_modified (SPObject *object, guint flags)
276
group = SP_GROUP (object);
278
if (flags & SP_OBJECT_MODIFIED_FLAG) flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
279
flags &= SP_OBJECT_MODIFIED_CASCADE;
282
for (child = sp_object_first_child(object) ; child != NULL ; child = SP_OBJECT_NEXT(child) ) {
283
g_object_ref (G_OBJECT (child));
284
l = g_slist_prepend (l, child);
286
l = g_slist_reverse (l);
288
child = SP_OBJECT (l->data);
289
l = g_slist_remove (l, child);
290
if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
291
child->emitModified(flags);
293
g_object_unref (G_OBJECT (child));
193
SP_GROUP(object)->group->onModified(flags);
297
196
static Inkscape::XML::Node *
344
243
sp_group_bbox(SPItem const *item, NRRect *bbox, NR::Matrix const &transform, unsigned const flags)
346
for (SPObject *o = sp_object_first_child(SP_OBJECT(item)); o != NULL; o = SP_OBJECT_NEXT(o)) {
348
SPItem *child = SP_ITEM(o);
349
NR::Matrix const ct(child->transform * transform);
350
sp_item_invoke_bbox_full(child, bbox, ct, flags, FALSE);
245
SP_GROUP(item)->group->calculateBBox(bbox, transform, flags);
356
249
sp_group_print (SPItem * item, SPPrintContext *ctx)
362
group = SP_GROUP (item);
364
for (o = sp_object_first_child(SP_OBJECT(item)) ; o != NULL ; o = SP_OBJECT_NEXT(o) ) {
365
if (SP_IS_ITEM (o)) {
367
sp_item_invoke_print (SP_ITEM (o), ctx);
251
SP_GROUP(item)->group->onPrint(ctx);
372
254
static gchar * sp_group_description (SPItem * item)
378
group = SP_GROUP (item);
381
for ( o = sp_object_first_child(SP_OBJECT(item)) ; o != NULL ; o = SP_OBJECT_NEXT(o) ) {
387
return g_strdup_printf(
388
ngettext("<b>Group</b> of <b>%d</b> object",
389
"<b>Group</b> of <b>%d</b> objects",
256
return SP_GROUP(item)->group->getDescription();
393
259
static void sp_group_set(SPObject *object, unsigned key, char const *value) {
412
278
static NRArenaItem *
413
279
sp_group_show (SPItem *item, NRArena *arena, unsigned int key, unsigned int flags)
416
NRArenaItem *ai, *ac, *ar;
420
group = (SPGroup *) item;
422
ai = NRArenaGroup::create(arena);
423
nr_arena_group_set_transparent(NR_ARENA_GROUP (ai),
424
group->effectiveLayerMode(key) ==
429
for (o = sp_object_first_child(SP_OBJECT(item)) ; o != NULL; o = SP_OBJECT_NEXT(o) ) {
430
if (SP_IS_ITEM (o)) {
432
ac = sp_item_invoke_show (child, arena, key, flags);
434
nr_arena_item_add_child (ai, ac, ar);
436
nr_arena_item_unref (ac);
281
return SP_GROUP(item)->group->show(arena, key, flags);
445
285
sp_group_hide (SPItem *item, unsigned int key)
451
group = (SPGroup *) item;
453
for (o = sp_object_first_child(SP_OBJECT(item)) ; o != NULL; o = SP_OBJECT_NEXT(o) ) {
454
if (SP_IS_ITEM (o)) {
456
sp_item_invoke_hide (child, key);
460
if (((SPItemClass *) parent_class)->hide)
461
((SPItemClass *) parent_class)->hide (item, key);
287
SP_GROUP(item)->group->hide(key);
464
290
static void sp_group_snappoints (SPItem const *item, SnapPointsIter p)
527
CGroup::CGroup(SPGroup *group) {
534
void CGroup::onChildAdded(Inkscape::XML::Node *child) {
535
SPObject *last_child = _group->lastChild();
536
if (last_child && SP_OBJECT_REPR(last_child) == child) {
537
// optimization for the common special case where the child is being added at the end
538
SPObject *ochild = last_child;
539
if ( SP_IS_ITEM(ochild) ) {
540
/* TODO: this should be moved into SPItem somehow */
544
for (v = _group->display; v != NULL; v = v->next) {
545
ac = sp_item_invoke_show (SP_ITEM (ochild), NR_ARENA_ITEM_ARENA (v->arenaitem), v->key, v->flags);
548
nr_arena_item_append_child (v->arenaitem, ac);
549
nr_arena_item_unref (ac);
553
} else { // general case
554
SPObject *ochild = sp_object_get_child_by_repr(_group, child);
555
if ( ochild && SP_IS_ITEM(ochild) ) {
556
/* TODO: this should be moved into SPItem somehow */
560
unsigned position = sp_item_pos_in_parent(SP_ITEM(ochild));
562
for (v = _group->display; v != NULL; v = v->next) {
563
ac = sp_item_invoke_show (SP_ITEM (ochild), NR_ARENA_ITEM_ARENA (v->arenaitem), v->key, v->flags);
566
nr_arena_item_add_child (v->arenaitem, ac, NULL);
567
nr_arena_item_set_order (ac, position);
568
nr_arena_item_unref (ac);
574
_group->requestModified(SP_OBJECT_MODIFIED_FLAG);
577
void CGroup::onChildRemoved(Inkscape::XML::Node */*child*/) {
578
_group->requestModified(SP_OBJECT_MODIFIED_FLAG);
581
void CGroup::onUpdate(SPCtx *ctx, unsigned int flags) {
583
SPItemCtx *ictx, cctx;
585
ictx = (SPItemCtx *) ctx;
588
if (flags & SP_OBJECT_MODIFIED_FLAG) flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
589
flags &= SP_OBJECT_MODIFIED_CASCADE;
591
GSList *l = g_slist_reverse(_childList(true, ActionUpdate));
593
child = SP_OBJECT (l->data);
594
l = g_slist_remove (l, child);
595
if (flags || (child->uflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
596
if (SP_IS_ITEM (child)) {
597
SPItem const &chi = *SP_ITEM(child);
598
cctx.i2doc = chi.transform * ictx->i2doc;
599
cctx.i2vp = chi.transform * ictx->i2vp;
600
child->updateDisplay((SPCtx *)&cctx, flags);
602
child->updateDisplay(ctx, flags);
605
g_object_unref (G_OBJECT (child));
609
GSList *CGroup::_childList(bool add_ref, Action) {
611
for (SPObject *child = sp_object_first_child(_group) ; child != NULL ; child = SP_OBJECT_NEXT(child) ) {
613
g_object_ref (G_OBJECT (child));
615
l = g_slist_prepend (l, child);
620
void CGroup::onModified(guint flags) {
623
if (flags & SP_OBJECT_MODIFIED_FLAG) flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
624
flags &= SP_OBJECT_MODIFIED_CASCADE;
626
GSList *l = g_slist_reverse(_childList(true));
628
child = SP_OBJECT (l->data);
629
l = g_slist_remove (l, child);
630
if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
631
child->emitModified(flags);
633
g_object_unref (G_OBJECT (child));
637
void CGroup::calculateBBox(NRRect *bbox, NR::Matrix const &transform, unsigned const flags) {
638
GSList *l = _childList(false, ActionBBox);
640
SPObject *o = SP_OBJECT (l->data);
642
SPItem *child = SP_ITEM(o);
643
NR::Matrix const ct(child->transform * transform);
644
sp_item_invoke_bbox_full(child, bbox, ct, flags, FALSE);
646
l = g_slist_remove (l, o);
650
void CGroup::onPrint(SPPrintContext *ctx) {
651
GSList *l = _childList(false);
653
SPObject *o = SP_OBJECT (l->data);
655
sp_item_invoke_print (SP_ITEM (o), ctx);
657
l = g_slist_remove (l, o);
661
gint CGroup::getItemCount() {
663
for (SPObject *o = sp_object_first_child(SP_OBJECT(_group)) ; o != NULL ; o = SP_OBJECT_NEXT(o) ) {
672
gchar *CGroup::getDescription() {
673
gint len = getItemCount();
674
return g_strdup_printf(
675
ngettext("<b>Group</b> of <b>%d</b> object",
676
"<b>Group</b> of <b>%d</b> objects",
680
NRArenaItem *CGroup::show (NRArena *arena, unsigned int key, unsigned int flags) {
683
ai = NRArenaGroup::create(arena);
684
nr_arena_group_set_transparent(NR_ARENA_GROUP (ai),
685
_group->effectiveLayerMode(key) ==
688
_showChildren(arena, ai, key, flags);
692
void CGroup::_showChildren (NRArena *arena, NRArenaItem *ai, unsigned int key, unsigned int flags) {
693
NRArenaItem *ac = NULL;
694
NRArenaItem *ar = NULL;
695
SPItem * child = NULL;
696
GSList *l = _childList(false, ActionShow);
698
SPObject *o = SP_OBJECT (l->data);
699
if (SP_IS_ITEM (o)) {
701
ac = sp_item_invoke_show (child, arena, key, flags);
703
nr_arena_item_add_child (ai, ac, ar);
705
nr_arena_item_unref (ac);
708
l = g_slist_remove (l, o);
712
void CGroup::hide (unsigned int key) {
715
GSList *l = _childList(false, ActionShow);
717
SPObject *o = SP_OBJECT (l->data);
718
if (SP_IS_ITEM (o)) {
720
sp_item_invoke_hide (child, key);
722
l = g_slist_remove (l, o);
725
if (((SPItemClass *) parent_class)->hide)
726
((SPItemClass *) parent_class)->hide (_group, key);
729
void CGroup::onOrderChanged (Inkscape::XML::Node *child, Inkscape::XML::Node *, Inkscape::XML::Node *)
731
SPObject *ochild = sp_object_get_child_by_repr(_group, child);
732
if ( ochild && SP_IS_ITEM(ochild) ) {
733
/* TODO: this should be moved into SPItem somehow */
735
unsigned position = sp_item_pos_in_parent(SP_ITEM(ochild));
736
for ( v = SP_ITEM (ochild)->display ; v != NULL ; v = v->next ) {
737
nr_arena_item_set_order (v->arenaitem, position);
741
_group->requestModified(SP_OBJECT_MODIFIED_FLAG);