]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level/level_editor/point_layer.c
Merge pull request #1046 from tsoding/704
[nothing.git] / src / game / level / level_editor / point_layer.c
index 5bc14f939a124bd8014a9a34c345a23638797d53..0e848bffc2d653deb6a0bba0d90f514ad6b40997 100644 (file)
@@ -51,6 +51,7 @@ typedef enum {
 
 typedef struct {
     UndoType type;
+    PointLayer *layer;
     Point position;
     Color color;
     char id[ID_MAX_SIZE];
@@ -59,12 +60,17 @@ typedef struct {
 
 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);
@@ -74,14 +80,13 @@ UndoContext point_layer_create_undo_context(PointLayer *point_layer,
 }
 
 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: {
@@ -106,6 +111,16 @@ void point_layer_undo(void *layer, void *context, size_t context_size)
     }
 }
 
+#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 = {
@@ -236,7 +251,8 @@ int point_layer_render(const PointLayer *point_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(
@@ -311,8 +327,6 @@ int point_layer_add_element(PointLayer *point_layer,
     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));
@@ -323,14 +337,7 @@ int point_layer_add_element(PointLayer *point_layer,
     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;
 }
@@ -342,12 +349,7 @@ void point_layer_delete_nth_element(PointLayer *point_layer,
 {
     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);
@@ -373,9 +375,11 @@ int point_layer_idle_event(PointLayer *point_layer,
         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;
     }
 
@@ -450,15 +454,7 @@ int point_layer_edit_id_event(PointLayer *point_layer,
     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);
@@ -500,16 +496,8 @@ int point_layer_move_event(PointLayer *point_layer,
         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,
@@ -553,14 +541,7 @@ int point_layer_recolor_event(PointLayer *point_layer,
         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,