Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 766) +++ trunk/src/data.c (revision 767) @@ -251,3 +251,28 @@ camv->lysel = idx; rnd_event(&camv->hidlib, CAMV_EVENT_LAYER_SELECTED, "i", idx); } + +void camv_data_reverse_layers(camv_design_t *camv, int inhibit_ev) +{ + vtp0_t tmp = {0}; + long n, end, i; + + /* go backward from the end, look for non-sub-layers to copy each + "layer group" at the end of tmp */ + end = camv->layers.used; + for(n = camv->layers.used-1; n >= 0; n--) { + const camv_layer_t *ly = camv->layers.array[n]; + if (!ly->sub) { + for(i = n; i < end; i++) + vtp0_append(&tmp, camv->layers.array[i]); + end = n; + } + } + + vtp0_uninit(&camv->layers); + memcpy(&camv->layers, &tmp, sizeof(vtp0_t)); + + if (!inhibit_ev) + rnd_event(&camv->hidlib, CAMV_EVENT_LAYERS_CHANGED, NULL); +} + Index: trunk/src/data.h =================================================================== --- trunk/src/data.h (revision 766) +++ trunk/src/data.h (revision 767) @@ -113,6 +113,7 @@ void camv_group_load_begin(camv_design_t *camv); void camv_group_load_end(camv_design_t *camv); +void camv_data_reverse_layers(camv_design_t *camv, int inhibit_ev); #define camv_hid_redraw(camv) rnd_render->invalidate_all(rnd_render)