summaryrefslogtreecommitdiffstats
path: root/src/group.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-12-21 19:30:29 +0000
committerDavid Robillard <d@drobilla.net>2012-12-21 19:30:29 +0000
commit9306840a17b29faa3dccb614dfe27a15fa0250c8 (patch)
tree7eb3cdfcd74d4371a9e234e8bea60e1b23656583 /src/group.c
parent2c3cbd04b0d62382bad891e7933f709ef48c4be1 (diff)
downloadganv-9306840a17b29faa3dccb614dfe27a15fa0250c8.tar.gz
ganv-9306840a17b29faa3dccb614dfe27a15fa0250c8.tar.bz2
ganv-9306840a17b29faa3dccb614dfe27a15fa0250c8.zip
Implement item stacking.
git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@4876 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/group.c')
-rw-r--r--src/group.c20
1 files changed, 18 insertions, 2 deletions
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