From 9306840a17b29faa3dccb614dfe27a15fa0250c8 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 21 Dec 2012 19:30:29 +0000 Subject: Implement item stacking. git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@4876 a436a847-0d15-0410-975c-d299462d15a1 --- src/group.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/group.c') diff --git a/src/group.c b/src/group.c index cd5e912..2a12951 100644 --- a/src/group.c +++ b/src/group.c @@ -195,6 +195,12 @@ ganv_group_unmap(GanvItem* item) (*group_parent_class->unmap)(item); } +static gint +item_layer_cmp(const void* a, const void* b, void* user_data) +{ + return ((GanvItem*)a)->layer - ((GanvItem*)b)->layer; +} + static void ganv_group_draw(GanvItem* item, cairo_t* cr, int x, int y, int width, int height) @@ -210,6 +216,7 @@ ganv_group_draw(GanvItem* item, cairo_t* cr, cairo_rectangle(cr, x, y, width, height); cairo_fill(cr); + GSequence* items = g_sequence_new(NULL); for (list = group->item_list; list; list = list->next) { child = (GanvItem*)list->data; @@ -224,11 +231,20 @@ ganv_group_draw(GanvItem* item, cairo_t* cr, && (child->x2 > child->canvas->redraw_x1) && (child->y2 > child->canvas->redraw_y2))) { if (GANV_ITEM_GET_CLASS(child)->draw) { - (*GANV_ITEM_GET_CLASS(child)->draw)( - child, cr, x, y, width, height); + g_sequence_insert_sorted(items, child, item_layer_cmp, NULL); } } } + + for (GSequenceIter* i = g_sequence_get_begin_iter(items); + !g_sequence_iter_is_end(i); + i = g_sequence_iter_next(i)) { + child = (GanvItem*)g_sequence_get(i); + (*GANV_ITEM_GET_CLASS(child)->draw)( + child, cr, x, y, width, height); + } + + g_sequence_free(items); } static double -- cgit v1.2.1