Merge pull request #1237 from tsoding/remove-lt

Remove Lt from various places
master
Alexey Kutepov 2020-01-06 04:28:55 +07:00 committed by GitHub
commit 749edf20ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 157 additions and 497 deletions

View File

@ -121,8 +121,6 @@ add_executable(nothing
src/ui/wiggly_text.c src/ui/wiggly_text.c
src/ui/slider.h src/ui/slider.h
src/ui/slider.c src/ui/slider.c
src/ui/grid.h
src/ui/grid.c
src/game/level/level_editor.h src/game/level/level_editor.h
src/game/level/level_editor.c src/game/level/level_editor.c
src/game/level/level_editor/color_picker.h src/game/level/level_editor/color_picker.h
@ -143,8 +141,6 @@ add_executable(nothing
src/game/level/level_editor/background_layer.c src/game/level/level_editor/background_layer.c
src/game/level/level_editor/undo_history.h src/game/level/level_editor/undo_history.h
src/game/level/level_editor/undo_history.c src/game/level/level_editor/undo_history.c
src/game/level/level_editor/action_picker.h
src/game/level/level_editor/action_picker.c
src/system/log.h src/system/log.h
src/system/log.c src/system/log.c
src/system/lt.h src/system/lt.h

View File

@ -31,7 +31,6 @@
#include "src/ui/history.c" #include "src/ui/history.c"
#include "src/ui/wiggly_text.c" #include "src/ui/wiggly_text.c"
#include "src/ui/slider.c" #include "src/ui/slider.c"
#include "src/ui/grid.c"
#include "src/game/level/level_editor.c" #include "src/game/level/level_editor.c"
#include "src/game/level/level_editor/color_picker.c" #include "src/game/level/level_editor/color_picker.c"
#include "src/game/level/level_editor/rect_layer.c" #include "src/game/level/level_editor/rect_layer.c"
@ -42,7 +41,6 @@
#include "src/game/level/level_editor/label_layer.c" #include "src/game/level/level_editor/label_layer.c"
#include "src/game/level/level_editor/background_layer.c" #include "src/game/level/level_editor/background_layer.c"
#include "src/game/level/level_editor/undo_history.c" #include "src/game/level/level_editor/undo_history.c"
#include "src/game/level/level_editor/action_picker.c"
#include "src/system/log.c" #include "src/system/log.c"
#include "src/system/lt_adapters.c" #include "src/system/lt_adapters.c"
#include "src/system/nth_alloc.c" #include "src/system/nth_alloc.c"

View File

@ -33,4 +33,6 @@
#define UNDO_HISTORY_CAPACITY 256 #define UNDO_HISTORY_CAPACITY 256
#define EDIT_FIELD_CAPACITY 256
#endif // CONFIG_H_ #endif // CONFIG_H_

View File

@ -86,7 +86,7 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor)
level->platforms = PUSH_LT( level->platforms = PUSH_LT(
lt, lt,
create_platforms_from_rect_layer(level_editor->platforms_layer), create_platforms_from_rect_layer(&level_editor->platforms_layer),
destroy_platforms); destroy_platforms);
if (level->platforms == NULL) { if (level->platforms == NULL) {
RETURN_LT(lt, NULL); RETURN_LT(lt, NULL);
@ -102,7 +102,7 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor)
level->lava = PUSH_LT( level->lava = PUSH_LT(
lt, lt,
create_lava_from_rect_layer(level_editor->lava_layer), create_lava_from_rect_layer(&level_editor->lava_layer),
destroy_lava); destroy_lava);
if (level->lava == NULL) { if (level->lava == NULL) {
RETURN_LT(lt, NULL); RETURN_LT(lt, NULL);
@ -110,7 +110,7 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor)
level->back_platforms = PUSH_LT( level->back_platforms = PUSH_LT(
lt, lt,
create_platforms_from_rect_layer(level_editor->back_platforms_layer), create_platforms_from_rect_layer(&level_editor->back_platforms_layer),
destroy_platforms); destroy_platforms);
if (level->back_platforms == NULL) { if (level->back_platforms == NULL) {
RETURN_LT(lt, NULL); RETURN_LT(lt, NULL);
@ -118,7 +118,7 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor)
level->boxes = PUSH_LT( level->boxes = PUSH_LT(
lt, lt,
create_boxes_from_rect_layer(level_editor->boxes_layer, level->rigid_bodies), create_boxes_from_rect_layer(&level_editor->boxes_layer, level->rigid_bodies),
destroy_boxes); destroy_boxes);
if (level->boxes == NULL) { if (level->boxes == NULL) {
RETURN_LT(lt, NULL); RETURN_LT(lt, NULL);
@ -135,7 +135,7 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor)
level->regions = PUSH_LT( level->regions = PUSH_LT(
lt, lt,
create_regions_from_rect_layer( create_regions_from_rect_layer(
level_editor->regions_layer, &level_editor->regions_layer,
level->labels, level->labels,
level->goals), level->goals),
destroy_regions); destroy_regions);

View File

@ -3,7 +3,6 @@
#include "game/camera.h" #include "game/camera.h"
#include "game/sound_samples.h" #include "game/sound_samples.h"
#include "game/level/boxes.h" #include "game/level/boxes.h"
#include "game/level/level_editor/action_picker.h"
#include "game/level/level_editor/color_picker.h" #include "game/level/level_editor/color_picker.h"
#include "game/level/level_editor/rect_layer.h" #include "game/level/level_editor/rect_layer.h"
#include "game/level/level_editor/point_layer.h" #include "game/level/level_editor/point_layer.h"
@ -48,28 +47,15 @@ LevelEditor *create_level_editor(Cursor *cursor)
} }
level_editor->lt = lt; level_editor->lt = lt;
level_editor->edit_field_filename = PUSH_LT( level_editor->edit_field_filename.font_size = LEVEL_EDITOR_EDIT_FIELD_SIZE;
lt, level_editor->edit_field_filename.font_color = LEVEL_EDITOR_EDIT_FIELD_COLOR;
create_edit_field(
LEVEL_EDITOR_EDIT_FIELD_SIZE,
LEVEL_EDITOR_EDIT_FIELD_COLOR),
destroy_edit_field);
if (level_editor->edit_field_filename == NULL) {
RETURN_LT(lt, NULL);
}
level_editor->background_layer = create_background_layer(hexstr("fffda5")); level_editor->background_layer = create_background_layer(hexstr("fffda5"));
level_editor->player_layer = level_editor->player_layer =
create_player_layer(vec(0.0f, 0.0f), hexstr("ff8080")); create_player_layer(vec(0.0f, 0.0f), hexstr("ff8080"));
level_editor->platforms_layer = PUSH_LT( level_editor->platforms_layer = create_rect_layer("platform", cursor);
lt,
create_rect_layer("platform", cursor),
destroy_rect_layer);
if (level_editor->platforms_layer == NULL) {
RETURN_LT(lt, NULL);
}
level_editor->goals_layer = PUSH_LT( level_editor->goals_layer = PUSH_LT(
lt, lt,
@ -79,29 +65,9 @@ LevelEditor *create_level_editor(Cursor *cursor)
RETURN_LT(lt, NULL); RETURN_LT(lt, NULL);
} }
level_editor->lava_layer = PUSH_LT( level_editor->lava_layer = create_rect_layer("lava", cursor);
lt, level_editor->back_platforms_layer = create_rect_layer("back_platform", cursor);
create_rect_layer("lava", cursor), level_editor->boxes_layer = create_rect_layer("box", cursor);
destroy_rect_layer);
if (level_editor->lava_layer == NULL) {
RETURN_LT(lt, NULL);
}
level_editor->back_platforms_layer = PUSH_LT(
lt,
create_rect_layer("back_platform", cursor),
destroy_rect_layer);
if (level_editor->back_platforms_layer == NULL) {
RETURN_LT(lt, NULL);
}
level_editor->boxes_layer = PUSH_LT(
lt,
create_rect_layer("box", cursor),
destroy_rect_layer);
if (level_editor->boxes_layer == NULL) {
RETURN_LT(lt, NULL);
}
level_editor->label_layer = PUSH_LT( level_editor->label_layer = PUSH_LT(
lt, lt,
@ -111,21 +77,15 @@ LevelEditor *create_level_editor(Cursor *cursor)
RETURN_LT(lt, NULL); RETURN_LT(lt, NULL);
} }
level_editor->regions_layer = PUSH_LT( level_editor->regions_layer = create_rect_layer("region", cursor),
lt,
create_rect_layer("region", cursor),
destroy_rect_layer);
if (level_editor->regions_layer == NULL) {
RETURN_LT(lt, NULL);
}
level_editor->layers[LAYER_PICKER_BOXES] = rect_layer_as_layer(level_editor->boxes_layer); level_editor->layers[LAYER_PICKER_BOXES] = rect_layer_as_layer(&level_editor->boxes_layer);
level_editor->layers[LAYER_PICKER_PLATFORMS] = rect_layer_as_layer(level_editor->platforms_layer); level_editor->layers[LAYER_PICKER_PLATFORMS] = rect_layer_as_layer(&level_editor->platforms_layer);
level_editor->layers[LAYER_PICKER_BACK_PLATFORMS] = rect_layer_as_layer(level_editor->back_platforms_layer); level_editor->layers[LAYER_PICKER_BACK_PLATFORMS] = rect_layer_as_layer(&level_editor->back_platforms_layer);
level_editor->layers[LAYER_PICKER_GOALS] = point_layer_as_layer(level_editor->goals_layer); level_editor->layers[LAYER_PICKER_GOALS] = point_layer_as_layer(level_editor->goals_layer);
level_editor->layers[LAYER_PICKER_PLAYER] = player_layer_as_layer(&level_editor->player_layer); level_editor->layers[LAYER_PICKER_PLAYER] = player_layer_as_layer(&level_editor->player_layer);
level_editor->layers[LAYER_PICKER_LAVA] = rect_layer_as_layer(level_editor->lava_layer); level_editor->layers[LAYER_PICKER_LAVA] = rect_layer_as_layer(&level_editor->lava_layer);
level_editor->layers[LAYER_PICKER_REGIONS] = rect_layer_as_layer(level_editor->regions_layer); level_editor->layers[LAYER_PICKER_REGIONS] = rect_layer_as_layer(&level_editor->regions_layer);
level_editor->layers[LAYER_PICKER_BACKGROUND] = background_layer_as_layer(&level_editor->background_layer); level_editor->layers[LAYER_PICKER_BACKGROUND] = background_layer_as_layer(&level_editor->background_layer);
level_editor->layers[LAYER_PICKER_LABELS] = label_layer_as_layer(level_editor->label_layer); level_editor->layers[LAYER_PICKER_LABELS] = label_layer_as_layer(level_editor->label_layer);
@ -159,15 +119,8 @@ LevelEditor *create_level_editor_from_file(const char *file_name, Cursor *cursor
} }
level_editor->lt = lt; level_editor->lt = lt;
level_editor->edit_field_filename = PUSH_LT( level_editor->edit_field_filename.font_size = LEVEL_EDITOR_EDIT_FIELD_SIZE;
lt, level_editor->edit_field_filename.font_color = LEVEL_EDITOR_EDIT_FIELD_COLOR;
create_edit_field(
LEVEL_EDITOR_EDIT_FIELD_SIZE,
LEVEL_EDITOR_EDIT_FIELD_COLOR),
destroy_edit_field);
if (level_editor->edit_field_filename == NULL) {
RETURN_LT(lt, NULL);
}
level_editor->file_name = level_editor->file_name =
PUSH_LT( PUSH_LT(
@ -207,13 +160,13 @@ LevelEditor *create_level_editor_from_file(const char *file_name, Cursor *cursor
level_editor->label_layer = chop_label_layer(&tmpmem, &input, "label"); level_editor->label_layer = chop_label_layer(&tmpmem, &input, "label");
level_editor->regions_layer = chop_rect_layer(&tmpmem, &input, "region", cursor), level_editor->regions_layer = chop_rect_layer(&tmpmem, &input, "region", cursor),
level_editor->layers[LAYER_PICKER_BOXES] = rect_layer_as_layer(level_editor->boxes_layer); level_editor->layers[LAYER_PICKER_BOXES] = rect_layer_as_layer(&level_editor->boxes_layer);
level_editor->layers[LAYER_PICKER_PLATFORMS] = rect_layer_as_layer(level_editor->platforms_layer); level_editor->layers[LAYER_PICKER_PLATFORMS] = rect_layer_as_layer(&level_editor->platforms_layer);
level_editor->layers[LAYER_PICKER_BACK_PLATFORMS] = rect_layer_as_layer(level_editor->back_platforms_layer); level_editor->layers[LAYER_PICKER_BACK_PLATFORMS] = rect_layer_as_layer(&level_editor->back_platforms_layer);
level_editor->layers[LAYER_PICKER_GOALS] = point_layer_as_layer(level_editor->goals_layer); level_editor->layers[LAYER_PICKER_GOALS] = point_layer_as_layer(level_editor->goals_layer);
level_editor->layers[LAYER_PICKER_PLAYER] = player_layer_as_layer(&level_editor->player_layer); level_editor->layers[LAYER_PICKER_PLAYER] = player_layer_as_layer(&level_editor->player_layer);
level_editor->layers[LAYER_PICKER_LAVA] = rect_layer_as_layer(level_editor->lava_layer); level_editor->layers[LAYER_PICKER_LAVA] = rect_layer_as_layer(&level_editor->lava_layer);
level_editor->layers[LAYER_PICKER_REGIONS] = rect_layer_as_layer(level_editor->regions_layer); level_editor->layers[LAYER_PICKER_REGIONS] = rect_layer_as_layer(&level_editor->regions_layer);
level_editor->layers[LAYER_PICKER_BACKGROUND] = background_layer_as_layer(&level_editor->background_layer); level_editor->layers[LAYER_PICKER_BACKGROUND] = background_layer_as_layer(&level_editor->background_layer);
level_editor->layers[LAYER_PICKER_LABELS] = label_layer_as_layer(level_editor->label_layer); level_editor->layers[LAYER_PICKER_LABELS] = label_layer_as_layer(level_editor->label_layer);
@ -297,7 +250,7 @@ int level_editor_render(const LevelEditor *level_editor,
position); position);
if (edit_field_render_screen( if (edit_field_render_screen(
level_editor->edit_field_filename, &level_editor->edit_field_filename,
camera, camera,
vec(position.x + save_as_width, position.y)) < 0) { vec(position.x + save_as_width, position.y)) < 0) {
return -1; return -1;
@ -333,7 +286,7 @@ int level_editor_saveas_event(LevelEditor *level_editor,
path, path,
LEVEL_FOLDER_MAX_LENGTH, LEVEL_FOLDER_MAX_LENGTH,
"./assets/levels/%s.txt", "./assets/levels/%s.txt",
edit_field_as_text(level_editor->edit_field_filename)); edit_field_as_text(&level_editor->edit_field_filename));
level_editor->file_name = PUSH_LT( level_editor->file_name = PUSH_LT(
level_editor->lt, level_editor->lt,
string_duplicate(path, NULL), string_duplicate(path, NULL),
@ -346,7 +299,7 @@ int level_editor_saveas_event(LevelEditor *level_editor,
} break; } break;
} }
return edit_field_event(level_editor->edit_field_filename, event); return edit_field_event(&level_editor->edit_field_filename, event);
} }
static static

View File

@ -4,15 +4,13 @@
#include "game/level/level_editor/layer.h" #include "game/level/level_editor/layer.h"
#include "game/level/level_editor/layer_picker.h" #include "game/level/level_editor/layer_picker.h"
#include "game/level/level_editor/undo_history.h" #include "game/level/level_editor/undo_history.h"
#include "game/level/level_editor/action_picker.h" #include "game/level/level_editor/rect_layer.h"
#include "ui/wiggly_text.h" #include "ui/wiggly_text.h"
#include "ui/cursor.h" #include "ui/cursor.h"
typedef struct LevelEditor LevelEditor; typedef struct LevelEditor LevelEditor;
typedef struct RectLayer RectLayer;
typedef struct PointLayer PointLayer; typedef struct PointLayer PointLayer;
typedef struct LabelLayer LabelLayer; typedef struct LabelLayer LabelLayer;
typedef struct Edit_field Edit_field;
typedef struct Sound_samples Sound_samples; typedef struct Sound_samples Sound_samples;
typedef enum { typedef enum {
@ -26,17 +24,17 @@ struct LevelEditor
LevelEditorState state; LevelEditorState state;
Vec2f camera_position; Vec2f camera_position;
float camera_scale; float camera_scale;
Edit_field *edit_field_filename; Edit_field edit_field_filename;
LayerPicker layer_picker; LayerPicker layer_picker;
FadingWigglyText notice; FadingWigglyText notice;
RectLayer *boxes_layer; RectLayer boxes_layer;
RectLayer *platforms_layer; RectLayer platforms_layer;
RectLayer *back_platforms_layer; RectLayer back_platforms_layer;
PointLayer *goals_layer; PointLayer *goals_layer;
PlayerLayer player_layer; PlayerLayer player_layer;
RectLayer *lava_layer; RectLayer lava_layer;
RectLayer *regions_layer; RectLayer regions_layer;
BackgroundLayer background_layer; BackgroundLayer background_layer;
LabelLayer *label_layer; LabelLayer *label_layer;

View File

@ -1,109 +0,0 @@
#include <string.h>
#include "system/stacktrace.h"
#include "action_picker.h"
#include "math/extrema.h"
#include "math/vec.h"
static const char *action_labels[ACTION_N] = {
[ACTION_NONE] = "None",
[ACTION_HIDE_LABEL] = "Hide Label",
[ACTION_TOGGLE_GOAL] = "Toggle Goal"
};
#define TEXT_SCALE vec(5.0f, 5.0f)
#define TEXT_COLOR COLOR_WHITE
#define SELECTION_COLOR COLOR_WHITE
#define BACKGROUND_COLOR COLOR_BLACK
void action_picker_render(const ActionPicker *picker,
const Camera *camera)
{
trace_assert(picker);
trace_assert(camera);
(void) action_labels;
camera_fill_rect_screen(
camera,
picker->widget.boundary,
BACKGROUND_COLOR);
const float element_height = picker->widget.boundary.h / (float)ACTION_N;
for (size_t i = 0; i < ACTION_N; ++i) {
const Vec2f element_position =
vec_sum(
vec(picker->widget.boundary.x, picker->widget.boundary.y),
vec(0.0f, (float)i * element_height));
const Rect element_box =
rect_from_vecs(element_position,
vec(picker->widget.boundary.w, element_height));
camera_render_text_screen(
camera,
action_labels[i],
TEXT_SCALE,
TEXT_COLOR,
element_position);
if (i == picker->action.type) {
camera_draw_thicc_rect_screen(
camera,
element_box,
SELECTION_COLOR,
5.0f);
}
}
}
void action_picker_event(ActionPicker *picker,
const SDL_Event *event)
{
trace_assert(picker);
trace_assert(event);
switch (event->type) {
case SDL_MOUSEBUTTONDOWN: {
switch (event->button.button) {
case SDL_BUTTON_LEFT: {
const Vec2f mouse_position =
vec((float)event->button.x,
(float)event->button.y);
const float element_height = picker->widget.boundary.h / (float)ACTION_N;
for (ActionType i = 0; i < ACTION_N; ++i) {
const Vec2f element_position =
vec_sum(
vec(picker->widget.boundary.x, picker->widget.boundary.y),
vec(0.0f, (float)i * element_height));
const Rect element_box =
rect_from_vecs(element_position,
vec(picker->widget.boundary.w, element_height));
if (rect_contains_point(element_box, mouse_position)) {
picker->action.type = i;
break;
}
}
} break;
}
} break;
case SDL_KEYDOWN: {
switch (event->key.keysym.sym) {
case SDLK_UP: {
if (picker->action.type > 0) {
picker->action.type--;
}
} break;
case SDLK_DOWN: {
if (picker->action.type < ACTION_N) {
picker->action.type++;
}
} break;
}
} break;
}
}

View File

@ -1,18 +0,0 @@
#ifndef ACTION_PICKER_H_
#define ACTION_PICKER_H_
#include "game/level/action.h"
#include "game/camera.h"
#include "ui/grid.h"
typedef struct {
Widget widget;
Action action;
} ActionPicker;
void action_picker_render(const ActionPicker *action_picker,
const Camera *camera);
void action_picker_event(ActionPicker *action_picker,
const SDL_Event *event);
#endif // ACTION_PICKER_H_

View File

@ -43,7 +43,7 @@ struct LabelLayer {
int selection; int selection;
ColorPicker color_picker; ColorPicker color_picker;
Vec2f move_anchor; Vec2f move_anchor;
Edit_field *edit_field; Edit_field edit_field;
Vec2f inter_position; Vec2f inter_position;
Color inter_color; Color inter_color;
int id_name_counter; int id_name_counter;
@ -186,13 +186,8 @@ LabelLayer *create_label_layer(const char *id_name_prefix)
label_layer->color_picker = create_color_picker_from_rgba(COLOR_RED); label_layer->color_picker = create_color_picker_from_rgba(COLOR_RED);
label_layer->selection = -1; label_layer->selection = -1;
label_layer->edit_field = PUSH_LT( label_layer->edit_field.font_size = LABELS_SIZE;
lt, label_layer->edit_field.font_color = COLOR_RED;
create_edit_field(LABELS_SIZE, COLOR_RED),
destroy_edit_field);
if (label_layer->edit_field == NULL) {
RETURN_LT(lt, NULL);
}
label_layer->id_name_prefix = id_name_prefix; label_layer->id_name_prefix = id_name_prefix;
@ -313,7 +308,7 @@ int label_layer_render(const LabelLayer *label_layer,
// Label Text // Label Text
if (label_layer->state == LABEL_LAYER_EDIT_TEXT && label_layer->selection == (int) i) { if (label_layer->state == LABEL_LAYER_EDIT_TEXT && label_layer->selection == (int) i) {
if (edit_field_render_world( if (edit_field_render_world(
label_layer->edit_field, &label_layer->edit_field,
camera, camera,
position) < 0) { position) < 0) {
return -1; return -1;
@ -334,7 +329,7 @@ int label_layer_render(const LabelLayer *label_layer,
// Label ID // Label ID
if (label_layer->state == LABEL_LAYER_EDIT_ID && label_layer->selection == (int)i) { if (label_layer->state == LABEL_LAYER_EDIT_ID && label_layer->selection == (int)i) {
if (edit_field_render_world( if (edit_field_render_world(
label_layer->edit_field, &label_layer->edit_field,
camera, camera,
vec_sum( vec_sum(
position, position,
@ -541,10 +536,10 @@ int label_layer_idle_event(LabelLayer *label_layer,
undo_history); undo_history);
label_layer->state = LABEL_LAYER_EDIT_TEXT; label_layer->state = LABEL_LAYER_EDIT_TEXT;
edit_field_replace( edit_field_replace(
label_layer->edit_field, &label_layer->edit_field,
texts + label_layer->selection * LABEL_LAYER_TEXT_MAX_SIZE); texts + label_layer->selection * LABEL_LAYER_TEXT_MAX_SIZE);
edit_field_restyle( edit_field_restyle(
label_layer->edit_field, &label_layer->edit_field,
LABELS_SIZE, LABELS_SIZE,
colors[label_layer->selection]); colors[label_layer->selection]);
SDL_StartTextInput(); SDL_StartTextInput();
@ -585,10 +580,10 @@ int label_layer_idle_event(LabelLayer *label_layer,
if (label_layer->selection >= 0) { if (label_layer->selection >= 0) {
label_layer->state = LABEL_LAYER_EDIT_TEXT; label_layer->state = LABEL_LAYER_EDIT_TEXT;
edit_field_replace( edit_field_replace(
label_layer->edit_field, &label_layer->edit_field,
texts + label_layer->selection * LABEL_LAYER_TEXT_MAX_SIZE); texts + label_layer->selection * LABEL_LAYER_TEXT_MAX_SIZE);
edit_field_restyle( edit_field_restyle(
label_layer->edit_field, &label_layer->edit_field,
LABELS_SIZE, LABELS_SIZE,
colors[label_layer->selection]); colors[label_layer->selection]);
SDL_StartTextInput(); SDL_StartTextInput();
@ -599,10 +594,10 @@ int label_layer_idle_event(LabelLayer *label_layer,
if (label_layer->selection >= 0) { if (label_layer->selection >= 0) {
label_layer->state = LABEL_LAYER_EDIT_ID; label_layer->state = LABEL_LAYER_EDIT_ID;
edit_field_replace( edit_field_replace(
label_layer->edit_field, &label_layer->edit_field,
ids + label_layer->selection * LABEL_LAYER_ID_MAX_SIZE); ids + label_layer->selection * LABEL_LAYER_ID_MAX_SIZE);
edit_field_restyle( edit_field_restyle(
label_layer->edit_field, &label_layer->edit_field,
vec(1.0f, 1.0f), vec(1.0f, 1.0f),
color_invert(colors[label_layer->selection])); color_invert(colors[label_layer->selection]));
SDL_StartTextInput(); SDL_StartTextInput();
@ -765,7 +760,7 @@ int label_layer_edit_text_event(LabelLayer *label_layer,
char *text = char *text =
(char*)label_layer->texts.data + label_layer->selection * LABEL_LAYER_TEXT_MAX_SIZE; (char*)label_layer->texts.data + label_layer->selection * LABEL_LAYER_TEXT_MAX_SIZE;
memset(text, 0, LABEL_LAYER_TEXT_MAX_SIZE); memset(text, 0, LABEL_LAYER_TEXT_MAX_SIZE);
memcpy(text, edit_field_as_text(label_layer->edit_field), LABEL_LAYER_TEXT_MAX_SIZE - 1); memcpy(text, edit_field_as_text(&label_layer->edit_field), LABEL_LAYER_TEXT_MAX_SIZE - 1);
label_layer->state = LABEL_LAYER_IDLE; label_layer->state = LABEL_LAYER_IDLE;
SDL_StopTextInput(); SDL_StopTextInput();
return 0; return 0;
@ -780,7 +775,7 @@ int label_layer_edit_text_event(LabelLayer *label_layer,
} break; } break;
} }
return edit_field_event(label_layer->edit_field, event); return edit_field_event(&label_layer->edit_field, event);
} }
static static
@ -804,7 +799,7 @@ int label_layer_edit_id_event(LabelLayer *label_layer,
char *id = char *id =
(char*)label_layer->ids.data + label_layer->selection * LABEL_LAYER_ID_MAX_SIZE; (char*)label_layer->ids.data + label_layer->selection * LABEL_LAYER_ID_MAX_SIZE;
memset(id, 0, LABEL_LAYER_ID_MAX_SIZE); memset(id, 0, LABEL_LAYER_ID_MAX_SIZE);
memcpy(id, edit_field_as_text(label_layer->edit_field), LABEL_LAYER_ID_MAX_SIZE - 1); memcpy(id, edit_field_as_text(&label_layer->edit_field), LABEL_LAYER_ID_MAX_SIZE - 1);
label_layer->state = LABEL_LAYER_IDLE; label_layer->state = LABEL_LAYER_IDLE;
SDL_StopTextInput(); SDL_StopTextInput();
return 0; return 0;
@ -819,7 +814,7 @@ int label_layer_edit_id_event(LabelLayer *label_layer,
} break; } break;
} }
return edit_field_event(label_layer->edit_field, event); return edit_field_event(&label_layer->edit_field, event);
} }
static static

View File

@ -44,7 +44,7 @@ struct PointLayer
Vec2f inter_position; Vec2f inter_position;
Color inter_color; Color inter_color;
Edit_field *edit_field; Edit_field edit_field;
int id_name_counter; int id_name_counter;
const char *id_name_prefix; const char *id_name_prefix;
@ -181,15 +181,8 @@ PointLayer *create_point_layer(const char *id_name_prefix)
point_layer->colors = create_dynarray(sizeof(Color)); point_layer->colors = create_dynarray(sizeof(Color));
point_layer->ids = create_dynarray(sizeof(char) * ID_MAX_SIZE); point_layer->ids = create_dynarray(sizeof(char) * ID_MAX_SIZE);
point_layer->edit_field = PUSH_LT( point_layer->edit_field.font_size = POINT_LAYER_ID_TEXT_SIZE;
lt, point_layer->edit_field.font_color = POINT_LAYER_ID_TEXT_COLOR;
create_edit_field(
POINT_LAYER_ID_TEXT_SIZE,
POINT_LAYER_ID_TEXT_COLOR),
destroy_edit_field);
if (point_layer->edit_field == NULL) {
RETURN_LT(lt, NULL);
}
point_layer->id_name_prefix = id_name_prefix; point_layer->id_name_prefix = id_name_prefix;
@ -312,7 +305,7 @@ int point_layer_render(const PointLayer *point_layer,
if (point_layer->state == POINT_LAYER_EDIT_ID) { if (point_layer->state == POINT_LAYER_EDIT_ID) {
if (edit_field_render_world( if (edit_field_render_world(
point_layer->edit_field, &point_layer->edit_field,
camera, camera,
positions[point_layer->selection]) < 0) { positions[point_layer->selection]) < 0) {
return -1; return -1;
@ -505,7 +498,7 @@ int point_layer_idle_event(PointLayer *point_layer,
char *ids = (char*)point_layer->ids.data; char *ids = (char*)point_layer->ids.data;
point_layer->state = POINT_LAYER_EDIT_ID; point_layer->state = POINT_LAYER_EDIT_ID;
edit_field_replace( edit_field_replace(
point_layer->edit_field, &point_layer->edit_field,
ids + ID_MAX_SIZE * point_layer->selection); ids + ID_MAX_SIZE * point_layer->selection);
SDL_StartTextInput(); SDL_StartTextInput();
} }
@ -559,7 +552,7 @@ int point_layer_edit_id_event(PointLayer *point_layer,
POINT_UNDO_UPDATE)); POINT_UNDO_UPDATE));
char *id = dynarray_pointer_at(&point_layer->ids, (size_t) point_layer->selection); char *id = dynarray_pointer_at(&point_layer->ids, (size_t) point_layer->selection);
const char *text = edit_field_as_text(point_layer->edit_field); const char *text = edit_field_as_text(&point_layer->edit_field);
size_t n = min_size_t(strlen(text), ID_MAX_SIZE - 1); size_t n = min_size_t(strlen(text), ID_MAX_SIZE - 1);
memcpy(id, text, n); memcpy(id, text, n);
memset(id + n, 0, ID_MAX_SIZE - n); memset(id + n, 0, ID_MAX_SIZE - n);
@ -578,7 +571,7 @@ int point_layer_edit_id_event(PointLayer *point_layer,
} break; } break;
} }
return edit_field_event(point_layer->edit_field, event); return edit_field_event(&point_layer->edit_field, event);
} }
static static

View File

@ -10,20 +10,15 @@
#include "color.h" #include "color.h"
#include "rect_layer.h" #include "rect_layer.h"
#include "dynarray.h" #include "dynarray.h"
#include "color_picker.h"
#include "system/str.h" #include "system/str.h"
#include "ui/edit_field.h"
#include "undo_history.h" #include "undo_history.h"
#include "game/level/action.h" #include "game/level/action.h"
#include "action_picker.h"
#include "game.h" #include "game.h"
#include "math/extrema.h" #include "math/extrema.h"
#define RECT_LAYER_SELECTION_THICCNESS 15.0f #define RECT_LAYER_SELECTION_THICCNESS 15.0f
#define RECT_LAYER_ID_LABEL_SIZE vec(3.0f, 3.0f) #define RECT_LAYER_ID_LABEL_SIZE vec(3.0f, 3.0f)
#define CREATE_AREA_THRESHOLD 10.0 #define CREATE_AREA_THRESHOLD 10.0
#define RECT_LAYER_GRID_ROWS 3
#define RECT_LAYER_GRID_COLUMNS 4
static int rect_clipboard = 0; static int rect_clipboard = 0;
static Rect rect_clipboard_rect; static Rect rect_clipboard_rect;
@ -45,41 +40,6 @@ static Cursor_Style resize_styles[1 << RECT_SIDE_N] = {
CURSOR_STYLE_RESIZE_DIAG1 // [12] CURSOR_STYLE_RESIZE_DIAG1 // [12]
}; };
typedef enum {
RECT_LAYER_IDLE = 0,
RECT_LAYER_CREATE,
RECT_LAYER_RESIZE,
RECT_LAYER_MOVE,
RECT_LAYER_ID_RENAME,
RECT_LAYER_RECOLOR
} RectLayerState;
struct RectLayer {
Lt *lt;
RectLayerState state;
int resize_mask;
Dynarray ids;
Dynarray rects;
Dynarray colors;
Dynarray actions;
ColorPicker color_picker;
ActionPicker action_picker;
Vec2f create_begin;
Vec2f create_end;
int selection;
Vec2f move_anchor; // The mouse offset from the left-top
// corner of the rect during moving it
Edit_field *id_edit_field;
Color inter_color;
Rect inter_rect;
int id_name_counter;
const char *id_name_prefix;
Grid *grid;
Cursor *cursor;
int snapping_enabled;
};
typedef enum { typedef enum {
RECT_UNDO_ADD, RECT_UNDO_ADD,
RECT_UNDO_DELETE, RECT_UNDO_DELETE,
@ -449,13 +409,13 @@ static int rect_layer_event_idle(RectLayer *layer,
Color *colors = (Color*)layer->colors.data; Color *colors = (Color*)layer->colors.data;
edit_field_restyle( edit_field_restyle(
layer->id_edit_field, &layer->id_edit_field,
RECT_LAYER_ID_LABEL_SIZE, RECT_LAYER_ID_LABEL_SIZE,
color_invert(colors[layer->selection])); color_invert(colors[layer->selection]));
layer->state = RECT_LAYER_ID_RENAME; layer->state = RECT_LAYER_ID_RENAME;
edit_field_replace( edit_field_replace(
layer->id_edit_field, &layer->id_edit_field,
ids + layer->selection * ENTITY_MAX_ID_SIZE); ids + layer->selection * ENTITY_MAX_ID_SIZE);
SDL_StartTextInput(); SDL_StartTextInput();
} }
@ -812,7 +772,7 @@ static int rect_layer_event_id_rename(RectLayer *layer,
char *id = dynarray_pointer_at(&layer->ids, (size_t)layer->selection); char *id = dynarray_pointer_at(&layer->ids, (size_t)layer->selection);
memset(id, 0, ENTITY_MAX_ID_SIZE); memset(id, 0, ENTITY_MAX_ID_SIZE);
memcpy(id, edit_field_as_text(layer->id_edit_field), ENTITY_MAX_ID_SIZE - 1); memcpy(id, edit_field_as_text(&layer->id_edit_field), ENTITY_MAX_ID_SIZE - 1);
layer->state = RECT_LAYER_IDLE; layer->state = RECT_LAYER_IDLE;
SDL_StopTextInput(); SDL_StopTextInput();
} break; } break;
@ -825,7 +785,7 @@ static int rect_layer_event_id_rename(RectLayer *layer,
} break; } break;
} }
return edit_field_event(layer->id_edit_field, event); return edit_field_event(&layer->id_edit_field, event);
} }
LayerPtr rect_layer_as_layer(RectLayer *rect_layer) LayerPtr rect_layer_as_layer(RectLayer *rect_layer)
@ -837,65 +797,35 @@ LayerPtr rect_layer_as_layer(RectLayer *rect_layer)
return layer; return layer;
} }
RectLayer *create_rect_layer(const char *id_name_prefix, Cursor *cursor) RectLayer create_rect_layer(const char *id_name_prefix, Cursor *cursor)
{ {
trace_assert(cursor); trace_assert(cursor);
Lt *lt = create_lt(); RectLayer result = {0};
RectLayer *layer = PUSH_LT(lt, nth_calloc(1, sizeof(RectLayer)), free); result.ids = create_dynarray(sizeof(char) * ENTITY_MAX_ID_SIZE);
if (layer == NULL) { result.rects = create_dynarray(sizeof(Rect));
RETURN_LT(lt, NULL); result.colors = create_dynarray(sizeof(Color));
} result.actions = create_dynarray(sizeof(Action));
layer->lt = lt; result.id_edit_field.font_size = RECT_LAYER_ID_LABEL_SIZE;
result.id_edit_field.font_color = COLOR_BLACK;
result.color_picker = create_color_picker_from_rgba(rgba(1.0f, 0.0f, 0.0f, 1.0f));
result.selection = -1;
result.id_name_prefix = id_name_prefix;
result.cursor = cursor;
layer->ids = create_dynarray(sizeof(char) * ENTITY_MAX_ID_SIZE); return result;
layer->rects = create_dynarray(sizeof(Rect));
layer->colors = create_dynarray(sizeof(Color));
layer->actions = create_dynarray(sizeof(Action));
layer->id_edit_field = PUSH_LT(
lt,
create_edit_field(
RECT_LAYER_ID_LABEL_SIZE,
COLOR_BLACK),
destroy_edit_field);
if (layer->id_edit_field == NULL) {
RETURN_LT(lt, NULL);
}
layer->grid =
PUSH_LT(
lt,
nth_calloc(
1,
sizeof(Grid) + sizeof(Widget*) * RECT_LAYER_GRID_ROWS * RECT_LAYER_GRID_COLUMNS),
free);
if (layer->grid == NULL) {
RETURN_LT(lt, NULL);
}
layer->grid->rows = RECT_LAYER_GRID_ROWS;
layer->grid->columns = RECT_LAYER_GRID_COLUMNS;
grid_put_widget(layer->grid, &layer->action_picker.widget, 0, RECT_LAYER_GRID_COLUMNS - 1);
layer->color_picker = create_color_picker_from_rgba(rgba(1.0f, 0.0f, 0.0f, 1.0f));
layer->selection = -1;
layer->id_name_prefix = id_name_prefix;
layer->cursor = cursor;
return layer;
} }
RectLayer *chop_rect_layer(Memory *memory, RectLayer chop_rect_layer(Memory *memory,
String *input, String *input,
const char *id_name_prefix, const char *id_name_prefix,
Cursor *cursor) Cursor *cursor)
{ {
trace_assert(memory); trace_assert(memory);
trace_assert(input); trace_assert(input);
RectLayer *layer = create_rect_layer(id_name_prefix, cursor); RectLayer layer = create_rect_layer(id_name_prefix, cursor);
trace_assert(layer);
int n = atoi(string_to_cstr(memory, trim(chop_by_delim(input, '\n')))); int n = atoi(string_to_cstr(memory, trim(chop_by_delim(input, '\n'))));
char id[ENTITY_MAX_ID_SIZE]; char id[ENTITY_MAX_ID_SIZE];
@ -915,9 +845,9 @@ RectLayer *chop_rect_layer(Memory *memory,
string_id.data, string_id.data,
min_size_t(ENTITY_MAX_ID_SIZE - 1, string_id.count)); min_size_t(ENTITY_MAX_ID_SIZE - 1, string_id.count));
dynarray_push(&layer->rects, &rect); dynarray_push(&layer.rects, &rect);
dynarray_push(&layer->colors, &color); dynarray_push(&layer.colors, &color);
dynarray_push(&layer->ids, id); dynarray_push(&layer.ids, id);
Action action = { Action action = {
.type = ACTION_NONE, .type = ACTION_NONE,
@ -945,24 +875,12 @@ RectLayer *chop_rect_layer(Memory *memory,
} }
} }
dynarray_push(&layer->actions, &action); dynarray_push(&layer.actions, &action);
} }
return layer; return layer;
} }
void destroy_rect_layer(RectLayer *layer)
{
trace_assert(layer);
free(layer->ids.data);
free(layer->rects.data);
free(layer->colors.data);
free(layer->actions.data);
RETURN_LT0(layer->lt);
}
int rect_layer_render(const RectLayer *layer, const Camera *camera, int active) int rect_layer_render(const RectLayer *layer, const Camera *camera, int active)
{ {
trace_assert(layer); trace_assert(layer);
@ -1037,7 +955,7 @@ int rect_layer_render(const RectLayer *layer, const Camera *camera, int active)
if (layer->state == RECT_LAYER_ID_RENAME) { if (layer->state == RECT_LAYER_ID_RENAME) {
// ID renaming Edit Field // ID renaming Edit Field
if (edit_field_render_world( if (edit_field_render_world(
layer->id_edit_field, &layer->id_edit_field,
camera, camera,
rect_id_pos) < 0) { rect_id_pos) < 0) {
return -1; return -1;
@ -1109,18 +1027,6 @@ int rect_layer_event(RectLayer *layer,
trace_assert(event); trace_assert(event);
trace_assert(undo_history); trace_assert(undo_history);
switch (event->type) {
case SDL_WINDOWEVENT: {
switch (event->window.event) {
case SDL_WINDOWEVENT_SIZE_CHANGED: {
grid_relayout(layer->grid, rect(0.0f, 0.0f,
(float) event->window.data1,
(float) event->window.data2));
} break;
}
} break;
}
switch (layer->state) { switch (layer->state) {
case RECT_LAYER_IDLE: case RECT_LAYER_IDLE:
return rect_layer_event_idle(layer, event, camera, undo_history); return rect_layer_event_idle(layer, event, camera, undo_history);

View File

@ -4,19 +4,63 @@
#include "layer.h" #include "layer.h"
#include "game/level/action.h" #include "game/level/action.h"
#include "ui/cursor.h" #include "ui/cursor.h"
#include "dynarray.h"
#include "color_picker.h"
#include "ui/edit_field.h"
typedef struct RectLayer RectLayer; typedef struct RectLayer RectLayer;
typedef enum {
RECT_LAYER_IDLE = 0,
RECT_LAYER_CREATE,
RECT_LAYER_RESIZE,
RECT_LAYER_MOVE,
RECT_LAYER_ID_RENAME,
RECT_LAYER_RECOLOR
} RectLayerState;
struct RectLayer {
RectLayerState state;
int resize_mask;
Dynarray ids;
Dynarray rects;
Dynarray colors;
Dynarray actions;
ColorPicker color_picker;
Vec2f create_begin;
Vec2f create_end;
int selection;
Vec2f move_anchor; // The mouse offset from the left-top
// corner of the rect during moving it
Edit_field id_edit_field;
Color inter_color;
Rect inter_rect;
int id_name_counter;
const char *id_name_prefix;
Cursor *cursor;
int snapping_enabled;
};
LayerPtr rect_layer_as_layer(RectLayer *layer); LayerPtr rect_layer_as_layer(RectLayer *layer);
// NOTE: create_rect_layer and create_rect_layer_from_line_stream does // NOTE: create_rect_layer and create_rect_layer_from_line_stream does
// not own id_name_prefix // not own id_name_prefix
RectLayer *create_rect_layer(const char *id_name_prefix, RectLayer create_rect_layer(const char *id_name_prefix,
Cursor *cursor); Cursor *cursor);
RectLayer *chop_rect_layer(Memory *memory, RectLayer chop_rect_layer(Memory *memory,
String *input, String *input,
const char *id_name_prefix, const char *id_name_prefix,
Cursor *cursor); Cursor *cursor);
void destroy_rect_layer(RectLayer *layer);
static inline
void destroy_rect_layer(RectLayer layer)
{
free(layer.ids.data);
free(layer.rects.data);
free(layer.colors.data);
free(layer.actions.data);
}
int rect_layer_render(const RectLayer *layer, const Camera *camera, int active); int rect_layer_render(const RectLayer *layer, const Camera *camera, int active);
int rect_layer_event(RectLayer *layer, int rect_layer_event(RectLayer *layer,

View File

@ -35,7 +35,7 @@
struct Console struct Console
{ {
Lt *lt; Lt *lt;
Edit_field *edit_field; Edit_field edit_field;
Console_Log *console_log; Console_Log *console_log;
History *history; History *history;
Game *game; Game *game;
@ -54,15 +54,8 @@ Console *create_console(Game *game)
} }
console->lt = lt; console->lt = lt;
console->edit_field = PUSH_LT( console->edit_field.font_size = vec(FONT_WIDTH_SCALE, FONT_HEIGHT_SCALE);
lt, console->edit_field.font_color = CONSOLE_FOREGROUND;
create_edit_field(
vec(FONT_WIDTH_SCALE, FONT_HEIGHT_SCALE),
CONSOLE_FOREGROUND),
destroy_edit_field);
if (console->edit_field == NULL) {
RETURN_LT(lt, NULL);
}
console->console_log = PUSH_LT( console->console_log = PUSH_LT(
lt, lt,
@ -94,13 +87,13 @@ void destroy_console(Console *console)
static int console_eval_input(Console *console) static int console_eval_input(Console *console)
{ {
const char *input_text = edit_field_as_text(console->edit_field); const char *input_text = edit_field_as_text(&console->edit_field);
String input = string_nt(input_text); String input = string_nt(input_text);
String command = chop_word(&input); String command = chop_word(&input);
if (string_equal(command, STRING_LIT(""))) { if (string_equal(command, STRING_LIT(""))) {
edit_field_clean(console->edit_field); edit_field_clean(&console->edit_field);
return 0; return 0;
} }
@ -130,7 +123,7 @@ static int console_eval_input(Console *console)
console_log_push_line(console->console_log, "Unknown command", NULL, CONSOLE_ERROR); console_log_push_line(console->console_log, "Unknown command", NULL, CONSOLE_ERROR);
} }
edit_field_clean(console->edit_field); edit_field_clean(&console->edit_field);
return 0; return 0;
} }
@ -146,7 +139,7 @@ int console_handle_event(Console *console,
case SDLK_UP: case SDLK_UP:
edit_field_replace( edit_field_replace(
console->edit_field, &console->edit_field,
history_current(console->history)); history_current(console->history));
history_prev(console->history); history_prev(console->history);
return 0; return 0;
@ -154,7 +147,8 @@ int console_handle_event(Console *console,
case SDLK_p: { case SDLK_p: {
if (event->key.keysym.mod & KMOD_CTRL) { if (event->key.keysym.mod & KMOD_CTRL) {
edit_field_replace( edit_field_replace(
console->edit_field, history_current(console->history)); &console->edit_field,
history_current(console->history));
history_prev(console->history); history_prev(console->history);
return 0; return 0;
} }
@ -169,7 +163,7 @@ int console_handle_event(Console *console,
case SDLK_DOWN: case SDLK_DOWN:
edit_field_replace( edit_field_replace(
console->edit_field, &console->edit_field,
history_current(console->history)); history_current(console->history));
history_next(console->history); history_next(console->history);
return 0; return 0;
@ -177,7 +171,7 @@ int console_handle_event(Console *console,
case SDLK_n: { case SDLK_n: {
if (event->key.keysym.mod & KMOD_CTRL) { if (event->key.keysym.mod & KMOD_CTRL) {
edit_field_replace( edit_field_replace(
console->edit_field, history_current(console->history)); &console->edit_field, history_current(console->history));
history_next(console->history); history_next(console->history);
return 0; return 0;
} }
@ -186,7 +180,7 @@ int console_handle_event(Console *console,
} break; } break;
} }
return edit_field_event(console->edit_field, event); return edit_field_event(&console->edit_field, event);
} }
int console_render(const Console *console, int console_render(const Console *console,
@ -212,7 +206,7 @@ int console_render(const Console *console,
camera, camera,
vec(0.0f, y)); vec(0.0f, y));
if (edit_field_render_screen(console->edit_field, if (edit_field_render_screen(&console->edit_field,
camera, camera,
vec(0.0f, y + CONSOLE_LOG_HEIGHT)) < 0) { vec(0.0f, y + CONSOLE_LOG_HEIGHT)) < 0) {
return -1; return -1;

View File

@ -9,17 +9,6 @@
#include "system/nth_alloc.h" #include "system/nth_alloc.h"
#include "system/stacktrace.h" #include "system/stacktrace.h"
#define BUFFER_CAPACITY 256
struct Edit_field
{
Lt *lt;
char *buffer;
size_t buffer_size;
size_t cursor;
Vec2f font_size;
Color font_color;
};
static void edit_field_insert_char(Edit_field *edit_field, char c); static void edit_field_insert_char(Edit_field *edit_field, char c);
@ -48,7 +37,7 @@ static void handle_keydown_ctrl(Edit_field *edit_field, const SDL_Event *event);
static void edit_field_insert_char(Edit_field *edit_field, char c) static void edit_field_insert_char(Edit_field *edit_field, char c)
{ {
if (edit_field->buffer_size >= BUFFER_CAPACITY) { if (edit_field->buffer_size >= EDIT_FIELD_CAPACITY) {
return; return;
} }
@ -347,38 +336,6 @@ static void handle_keydown_ctrl(Edit_field *edit_field, const SDL_Event *event)
} }
} }
Edit_field *create_edit_field(Vec2f font_size,
Color font_color)
{
Lt *lt = create_lt();
Edit_field *const edit_field = PUSH_LT(lt, nth_calloc(1, sizeof(Edit_field)), free);
if (edit_field == NULL) {
RETURN_LT(lt, NULL);
}
edit_field->lt = lt;
edit_field->buffer = PUSH_LT(lt, nth_calloc(1, sizeof(char) * (BUFFER_CAPACITY + 10)), free);
if (edit_field->buffer == NULL) {
RETURN_LT(lt, NULL);
}
edit_field->buffer_size = 0;
edit_field->cursor = 0;
edit_field->font_size = font_size;
edit_field->font_color = font_color;
edit_field->buffer[edit_field->buffer_size] = 0;
return edit_field;
}
void destroy_edit_field(Edit_field *edit_field)
{
trace_assert(edit_field);
RETURN_LT0(edit_field->lt);
}
int edit_field_render_screen(const Edit_field *edit_field, int edit_field_render_screen(const Edit_field *edit_field,
const Camera *camera, const Camera *camera,
Vec2f screen_position) Vec2f screen_position)

View File

@ -7,11 +7,13 @@
#include "math/vec.h" #include "math/vec.h"
#include "game/camera.h" #include "game/camera.h"
typedef struct Edit_field Edit_field; typedef struct {
char buffer[EDIT_FIELD_CAPACITY];
Edit_field *create_edit_field(Vec2f font_size, size_t buffer_size;
Color font_color); size_t cursor;
void destroy_edit_field(Edit_field *edit_field); Vec2f font_size;
Color font_color;
} Edit_field;
int edit_field_render_screen(const Edit_field *edit_field, int edit_field_render_screen(const Edit_field *edit_field,
const Camera *camera, const Camera *camera,

View File

@ -1,19 +0,0 @@
#include "grid.h"
void grid_relayout(Grid *grid, Rect boundary)
{
const float cell_width = boundary.w / (float) grid->columns;
const float cell_height = boundary.h / (float) grid->rows;
for (size_t row = 0; row < grid->rows; ++row) {
for (size_t column = 0; column < grid->columns; ++column) {
Widget *cell = grid->cells[row * grid->columns + column];
if (cell) {
cell->boundary = rect(
boundary.x + (float) column * cell_width,
boundary.y + (float) row * cell_height,
cell_width, cell_height);
}
}
}
}

View File

@ -1,32 +0,0 @@
#ifndef GRID_H_
#define GRID_H_
#include <assert.h>
#include "system/nth_alloc.h"
#include "math/rect.h"
typedef struct {
Rect boundary;
} Widget;
typedef struct {
size_t rows;
size_t columns;
Widget *cells[];
} Grid;
static inline
void grid_put_widget(Grid *grid, Widget *widget,
size_t row, size_t column)
{
assert(grid);
assert(widget);
assert(row < grid->rows);
assert(column < grid->columns);
grid->cells[row * grid->columns + column] = widget;
}
void grid_relayout(Grid *grid, Rect boundary);
#endif // GRID_H_