]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level/level_editor/label_layer.c
Add TODO(#999)
[nothing.git] / src / game / level / level_editor / label_layer.c
index 6335b8bffdc147ca89783d82f69e4bb036b87031..ec5b7f9e417e4373dc16237bdbbaf496f8c892a7 100644 (file)
@@ -18,6 +18,8 @@
 
 #define LABEL_LAYER_SELECTION_THICCNESS 5.0f
 
+// TODO(#999): LabelLayer does not support UndoHistory
+
 typedef enum {
     LABEL_LAYER_IDLE = 0,
     LABEL_LAYER_MOVE,
@@ -25,8 +27,6 @@ typedef enum {
     LABEL_LAYER_EDIT_ID
 } LabelLayerState;
 
-// TODO(#963): LabelLayer cannot add the labels
-// TODO(#964): LabelLayer cannot modify the labels' id
 struct LabelLayer {
     Lt *lt;
     LabelLayerState state;
@@ -270,16 +270,24 @@ int label_layer_element_at(LabelLayer *label_layer,
     trace_assert(label_layer);
 
     const size_t n = dynarray_count(label_layer->texts);
+    char *ids = dynarray_data(label_layer->ids);
     char *texts = dynarray_data(label_layer->texts);
     Point *positions = dynarray_data(label_layer->positions);
 
     for (size_t i = 0; i < n; ++i) {
-        // TODO: the boundary of label_layer_element_at does not include the id
-        Rect boundary = sprite_font_boundary_box(
-            font,
-            positions[i],
-            LABELS_SIZE,
-            texts + i * LABEL_LAYER_TEXT_MAX_SIZE);
+        Rect boundary = rect_boundary2(
+            sprite_font_boundary_box(
+                font,
+                positions[i],
+                LABELS_SIZE,
+                texts + i * LABEL_LAYER_TEXT_MAX_SIZE),
+            sprite_font_boundary_box(
+                font,
+                vec_sub(
+                    positions[i],
+                    vec(0.0f, FONT_CHAR_HEIGHT)),
+                vec(1.0f, 1.0f),
+                ids + i * LABEL_LAYER_ID_MAX_SIZE));
 
         if (rect_contains_point(boundary, position)) {
             return (int) i;
@@ -307,7 +315,7 @@ int label_layer_add_label(LabelLayer *label_layer,
 {
     trace_assert(label_layer);
 
-    // TODO: id generation code is duplicated
+    // TODO(#982): id generation code is duplicated in label_layer, point_layer and rect_layer
     char id[LABEL_LAYER_ID_MAX_SIZE];
     for (size_t i = 0; i < LABEL_LAYER_ID_MAX_SIZE - 1; ++i) {
         id[i] = (char) ('a' + rand() % ('z' - 'a' + 1));
@@ -409,12 +417,12 @@ int label_layer_idle_event(LabelLayer *label_layer,
             }
         } break;
 
-        // TODO: label is not deselected after deletion
         case SDLK_DELETE: {
             if (label_layer->selected >= 0) {
                 label_layer_delete_nth_label(
                     label_layer,
                     (size_t) label_layer->selected);
+                label_layer->selected = -1;
             }
         } break;
         }
@@ -493,8 +501,6 @@ int label_layer_edit_text_event(LabelLayer *label_layer,
     return edit_field_event(label_layer->edit_field, event);
 }
 
-// TODO: LabelLayer does not support cancelling the editing of ids
-
 static
 int label_layer_edit_id_event(LabelLayer *label_layer,
                               const SDL_Event *event,
@@ -505,10 +511,10 @@ int label_layer_edit_id_event(LabelLayer *label_layer,
     trace_assert(camera);
     trace_assert(label_layer->selected >= 0);
 
-
     switch (event->type) {
     case SDL_KEYDOWN: {
-        if (event->key.keysym.sym == SDLK_RETURN) {
+        switch (event->key.keysym.sym) {
+        case SDLK_RETURN: {
             char *id =
                 (char*)dynarray_data(label_layer->ids) + label_layer->selected * LABEL_LAYER_ID_MAX_SIZE;
             memset(id, 0, LABEL_LAYER_ID_MAX_SIZE);
@@ -516,21 +522,29 @@ int label_layer_edit_id_event(LabelLayer *label_layer,
             label_layer->state = LABEL_LAYER_IDLE;
             SDL_StopTextInput();
             return 0;
+        } break;
+
+        case SDLK_ESCAPE: {
+            label_layer->state = LABEL_LAYER_IDLE;
+            SDL_StopTextInput();
+            return 0;
+        } break;
         }
     } break;
     }
 
-
     return edit_field_event(label_layer->edit_field, event);
 }
 
 int label_layer_event(LabelLayer *label_layer,
                       const SDL_Event *event,
-                      const Camera *camera)
+                      const Camera *camera,
+                      UndoHistory *undo_history)
 {
     trace_assert(label_layer);
     trace_assert(event);
     trace_assert(camera);
+    trace_assert(undo_history);
 
     int changed = 0;
 
@@ -541,10 +555,13 @@ int label_layer_event(LabelLayer *label_layer,
         return -1;
     }
 
-    if (changed && label_layer->selected >= 0) {
-        Color *colors = dynarray_data(label_layer->colors);
-        colors[label_layer->selected] =
-            color_picker_rgba(&label_layer->color_picker);
+    if (changed) {
+        if (label_layer->selected >= 0) {
+            Color *colors = dynarray_data(label_layer->colors);
+            colors[label_layer->selected] =
+                color_picker_rgba(&label_layer->color_picker);
+        }
+        return 0;
     }
 
     switch (label_layer->state) {