]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level/level_editor/label_layer.c
(#1050) Replace system clipboard with internal one
[nothing.git] / src / game / level / level_editor / label_layer.c
index 3ff58a2af0db5523a1998f845e57a364e310e1f1..0ce1377e6ffc01ded80937ed326e510ee766f774 100644 (file)
 #include "game/camera.h"
 #include "color_picker.h"
 #include "ui/edit_field.h"
+#include "math/extrema.h"
 
 #define LABEL_LAYER_SELECTION_THICCNESS 5.0f
 
-// TODO(#999): LabelLayer does not support UndoHistory
 // TODO(#1050): LabelLayer does not support copy-pasting
 
 typedef enum {
@@ -29,6 +29,10 @@ typedef enum {
     LABEL_LAYER_RECOLOR
 } LabelLayerState;
 
+static int clipboard;
+static char clipboard_text[LABEL_LAYER_TEXT_MAX_SIZE];
+static Color clipboard_color;
+
 struct LabelLayer {
     Lt *lt;
     LabelLayerState state;
@@ -406,12 +410,15 @@ void label_layer_delete_selected_label(LabelLayer *label_layer,
     dynarray_delete_at(label_layer->positions, (size_t)label_layer->selected);
     dynarray_delete_at(label_layer->colors, (size_t)label_layer->selected);
     dynarray_delete_at(label_layer->texts, (size_t)label_layer->selected);
+
+    label_layer->selected = -1;
 }
 
 static
 int label_layer_add_label(LabelLayer *label_layer,
                           Point position,
                           Color color,
+                          const char *text,
                           UndoHistory *undo_history)
 {
     trace_assert(label_layer);
@@ -429,6 +436,10 @@ int label_layer_add_label(LabelLayer *label_layer,
     dynarray_push(label_layer->positions, &position);
     dynarray_push(label_layer->colors, &color);
     dynarray_push_empty(label_layer->texts);
+    memcpy(
+        dynarray_pointer_at(label_layer->texts, n),
+        text,
+        min_size_t(LABEL_LAYER_ID_MAX_SIZE - 1, strlen(text)));
 
     UNDO_PUSH(label_layer, undo_history, UNDO_ADD);
 
@@ -496,6 +507,7 @@ int label_layer_idle_event(LabelLayer *label_layer,
                     position,
                     color_picker_rgba(
                         &label_layer->color_picker),
+                    "",
                     undo_history);
                 label_layer->state = LABEL_LAYER_EDIT_TEXT;
                 edit_field_replace(
@@ -549,6 +561,29 @@ int label_layer_idle_event(LabelLayer *label_layer,
                 label_layer->selected = -1;
             }
         } break;
+
+        case SDLK_c: {
+            if ((event->key.keysym.mod & KMOD_LCTRL) && label_layer->selected >= 0) {
+                clipboard = 1;
+                dynarray_copy_to(label_layer->texts, clipboard_text, (size_t)label_layer->selected);
+                dynarray_copy_to(label_layer->colors, &clipboard_color, (size_t)label_layer->selected);
+            }
+        } break;
+
+        case SDLK_v: {
+            if ((event->key.keysym.mod & KMOD_LCTRL) && clipboard) {
+                int x, y;
+                SDL_GetMouseState(&x, &y);
+                Point position = camera_map_screen(camera, x, y);
+
+                label_layer_add_label(
+                    label_layer,
+                    position,
+                    clipboard_color,
+                    clipboard_text,
+                    undo_history);
+            }
+        } break;
         }
     } break;
     }