typedef struct {
UndoType type;
+ PointLayer *layer;
Point position;
Color color;
char id[ID_MAX_SIZE];
static
UndoContext point_layer_create_undo_context(PointLayer *point_layer,
- size_t index,
UndoType type)
{
UndoContext undo_context;
+ size_t index =
+ type == UNDO_ADD
+ ? dynarray_count(point_layer->positions) - 1
+ : (size_t) point_layer->selected;
+
undo_context.type = type;
+ undo_context.layer = point_layer;
dynarray_copy_to(point_layer->positions, &undo_context.position, index);
dynarray_copy_to(point_layer->colors, &undo_context.color, index);
dynarray_copy_to(point_layer->ids, &undo_context.id, index);
}
static
-void point_layer_undo(void *layer, void *context, size_t context_size)
+void point_layer_undo(void *context, size_t context_size)
{
- trace_assert(layer);
trace_assert(context);
trace_assert(sizeof(UndoContext) == context_size);
- PointLayer *point_layer = layer;
UndoContext *undo_context = context;
+ PointLayer *point_layer = undo_context->layer;
switch (undo_context->type) {
case UNDO_ADD: {
}
}
+#define UNDO_PUSH(LAYER, HISTORY, UNDO_TYPE) \
+ do { \
+ UndoContext context = point_layer_create_undo_context(LAYER, UNDO_TYPE); \
+ undo_history_push( \
+ HISTORY, \
+ point_layer_undo, \
+ &context, \
+ sizeof(context)); \
+ } while(0)
+
LayerPtr point_layer_as_layer(PointLayer *point_layer)
{
LayerPtr layer = {
? point_layer->inter_position
: positions[i];
- if (i == point_layer->selected) {
+ // Selection Layer
+ if (active && i == point_layer->selected) {
if (camera_fill_triangle(
camera,
element_shape(
trace_assert(point_layer);
trace_assert(undo_history);
- size_t index = dynarray_count(point_layer->positions);
-
char id[ID_MAX_SIZE];
for (size_t i = 0; i < ID_MAX_SIZE - 1; ++i) {
id[i] = (char) ('a' + rand() % ('z' - 'a' + 1));
dynarray_push(point_layer->colors, &color);
dynarray_push(point_layer->ids, id);
- UndoContext context =
- point_layer_create_undo_context(point_layer, index, UNDO_ADD);
-
- undo_history_push(
- undo_history,
- point_layer,
- point_layer_undo,
- &context, sizeof(context));
+ UNDO_PUSH(point_layer, undo_history, UNDO_ADD);
return 0;
}
{
trace_assert(point_layer);
- UndoContext context = point_layer_create_undo_context(point_layer, i, UNDO_DELETE);
- undo_history_push(
- undo_history,
- point_layer,
- point_layer_undo,
- &context, sizeof(context));
+ UNDO_PUSH(point_layer, undo_history, UNDO_DELETE);
dynarray_delete_at(point_layer->positions, i);
dynarray_delete_at(point_layer->colors, i);
return -1;
}
- if (selected && point_layer->selected >= 0) {
- point_layer->inter_color = color_picker_rgba(&point_layer->color_picker);
- point_layer->state = POINT_LAYER_RECOLOR;
+ if (selected) {
+ if (point_layer->selected >= 0) {
+ point_layer->inter_color = color_picker_rgba(&point_layer->color_picker);
+ point_layer->state = POINT_LAYER_RECOLOR;
+ }
return 0;
}
case SDL_KEYDOWN: {
switch(event->key.keysym.sym) {
case SDLK_RETURN: {
- UndoContext context =
- point_layer_create_undo_context(point_layer, (size_t) point_layer->selected, UNDO_UPDATE);
-
- undo_history_push(
- undo_history,
- point_layer,
- point_layer_undo,
- &context,
- sizeof(context));
+ UNDO_PUSH(point_layer, undo_history, UNDO_UPDATE);
char *id = dynarray_pointer_at(point_layer->ids, (size_t) point_layer->selected);
const char *text = edit_field_as_text(point_layer->edit_field);
case SDL_BUTTON_LEFT: {
point_layer->state = POINT_LAYER_IDLE;
- UndoContext context =
- point_layer_create_undo_context(point_layer, (size_t) point_layer->selected, UNDO_UPDATE);
-
// TODO(#1014): just click (without moving) on the point creates an undo history entry
- undo_history_push(
- undo_history,
- point_layer,
- point_layer_undo,
- &context,
- sizeof(context));
+ UNDO_PUSH(point_layer, undo_history, UNDO_UPDATE);
dynarray_replace_at(
point_layer->positions,
point_layer->inter_color = color_picker_rgba(&point_layer->color_picker);
if (!color_picker_drag(&point_layer->color_picker)) {
- UndoContext context =
- point_layer_create_undo_context(point_layer, (size_t)point_layer->selected, UNDO_UPDATE);
-
- undo_history_push(
- undo_history,
- point_layer,
- point_layer_undo,
- &context, sizeof(context));
+ UNDO_PUSH(point_layer, undo_history, UNDO_UPDATE);
dynarray_replace_at(
point_layer->colors,