#define LABEL_LAYER_SELECTION_THICCNESS 5.0f
+// TODO(#999): LabelLayer does not support UndoHistory
+
typedef enum {
LABEL_LAYER_IDLE = 0,
LABEL_LAYER_MOVE,
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;
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;
{
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));
}
} 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;
}
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,
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);
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;
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) {