#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 {
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;
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);
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);
position,
color_picker_rgba(
&label_layer->color_picker),
+ "",
undo_history);
label_layer->state = LABEL_LAYER_EDIT_TEXT;
edit_field_replace(
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;
}