- trace_assert(context);
- trace_assert(sizeof(RectUndoContext) == context_size);
-
- RectUndoContext *undo_context = context;
-
- switch (undo_context->type) {
- case RECT_UNDO_ADD: {
- RectLayer *layer = undo_context->add.layer;
- dynarray_delete_at(&layer->rects, undo_context->add.index);
- dynarray_delete_at(&layer->colors, undo_context->add.index);
- dynarray_delete_at(&layer->ids, undo_context->add.index);
- dynarray_delete_at(&layer->actions, undo_context->add.index);
- layer->selection = -1;
- } break;
-
- case RECT_UNDO_DELETE: {
- RectLayer *layer = undo_context->element.layer;
- dynarray_insert_before(&layer->rects, undo_context->element.index, &undo_context->element.rect);
- dynarray_insert_before(&layer->colors, undo_context->element.index, &undo_context->element.color);
- dynarray_insert_before(&layer->ids, undo_context->element.index, &undo_context->element.id);
- dynarray_insert_before(&layer->actions, undo_context->element.index, &undo_context->element.action);
- layer->selection = -1;
- } break;
-
- case RECT_UNDO_UPDATE: {
- RectLayer *layer = undo_context->element.layer;
- dynarray_replace_at(&layer->rects, undo_context->element.index, &undo_context->element.rect);
- dynarray_replace_at(&layer->colors, undo_context->element.index, &undo_context->element.color);
- dynarray_replace_at(&layer->ids, undo_context->element.index, &undo_context->element.id);
- dynarray_replace_at(&layer->actions, undo_context->element.index, &undo_context->element.action);
- } break;
-
- case RECT_UNDO_SWAP: {
- RectLayer *layer = undo_context->element.layer;
- dynarray_swap(&layer->rects, undo_context->swap.index1, undo_context->swap.index2);
- dynarray_swap(&layer->colors, undo_context->swap.index1, undo_context->swap.index2);
- dynarray_swap(&layer->ids, undo_context->swap.index1, undo_context->swap.index2);
- dynarray_swap(&layer->actions, undo_context->swap.index1, undo_context->swap.index2);
- } break;
- }