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/slider.h
src/ui/slider.c
src/ui/grid.h
src/ui/grid.c
src/game/level/level_editor.h
src/game/level/level_editor.c
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/undo_history.h
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.c
src/system/lt.h

View File

@ -31,7 +31,6 @@
#include "src/ui/history.c"
#include "src/ui/wiggly_text.c"
#include "src/ui/slider.c"
#include "src/ui/grid.c"
#include "src/game/level/level_editor.c"
#include "src/game/level/level_editor/color_picker.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/background_layer.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/lt_adapters.c"
#include "src/system/nth_alloc.c"

View File

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

View File

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

View File

@ -3,7 +3,6 @@
#include "game/camera.h"
#include "game/sound_samples.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/rect_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->edit_field_filename = PUSH_LT(
lt,
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->edit_field_filename.font_size = LEVEL_EDITOR_EDIT_FIELD_SIZE;
level_editor->edit_field_filename.font_color = LEVEL_EDITOR_EDIT_FIELD_COLOR;
level_editor->background_layer = create_background_layer(hexstr("fffda5"));
level_editor->player_layer =
create_player_layer(vec(0.0f, 0.0f), hexstr("ff8080"));
level_editor->platforms_layer = PUSH_LT(
lt,
create_rect_layer("platform", cursor),
destroy_rect_layer);
if (level_editor->platforms_layer == NULL) {
RETURN_LT(lt, NULL);
}
level_editor->platforms_layer = create_rect_layer("platform", cursor);
level_editor->goals_layer = PUSH_LT(
lt,
@ -79,29 +65,9 @@ LevelEditor *create_level_editor(Cursor *cursor)
RETURN_LT(lt, NULL);
}
level_editor->lava_layer = PUSH_LT(
lt,
create_rect_layer("lava", 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->lava_layer = create_rect_layer("lava", cursor);
level_editor->back_platforms_layer = create_rect_layer("back_platform", cursor);
level_editor->boxes_layer = create_rect_layer("box", cursor);
level_editor->label_layer = PUSH_LT(
lt,
@ -111,21 +77,15 @@ LevelEditor *create_level_editor(Cursor *cursor)
RETURN_LT(lt, NULL);
}
level_editor->regions_layer = PUSH_LT(
lt,
create_rect_layer("region", cursor),
destroy_rect_layer);
if (level_editor->regions_layer == NULL) {
RETURN_LT(lt, NULL);
}
level_editor->regions_layer = create_rect_layer("region", cursor),
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_BACK_PLATFORMS] = rect_layer_as_layer(level_editor->back_platforms_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_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_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_REGIONS] = rect_layer_as_layer(level_editor->regions_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_BACKGROUND] = background_layer_as_layer(&level_editor->background_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->edit_field_filename = PUSH_LT(
lt,
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->edit_field_filename.font_size = LEVEL_EDITOR_EDIT_FIELD_SIZE;
level_editor->edit_field_filename.font_color = LEVEL_EDITOR_EDIT_FIELD_COLOR;
level_editor->file_name =
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->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_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_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_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_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_REGIONS] = rect_layer_as_layer(level_editor->regions_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_BACKGROUND] = background_layer_as_layer(&level_editor->background_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);
if (edit_field_render_screen(
level_editor->edit_field_filename,
&level_editor->edit_field_filename,
camera,
vec(position.x + save_as_width, position.y)) < 0) {
return -1;
@ -333,7 +286,7 @@ int level_editor_saveas_event(LevelEditor *level_editor,
path,
LEVEL_FOLDER_MAX_LENGTH,
"./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->lt,
string_duplicate(path, NULL),
@ -346,7 +299,7 @@ int level_editor_saveas_event(LevelEditor *level_editor,
} break;
}
return edit_field_event(level_editor->edit_field_filename, event);
return edit_field_event(&level_editor->edit_field_filename, event);
}
static

View File

@ -4,15 +4,13 @@
#include "game/level/level_editor/layer.h"
#include "game/level/level_editor/layer_picker.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/cursor.h"
typedef struct LevelEditor LevelEditor;
typedef struct RectLayer RectLayer;
typedef struct PointLayer PointLayer;
typedef struct LabelLayer LabelLayer;
typedef struct Edit_field Edit_field;
typedef struct Sound_samples Sound_samples;
typedef enum {
@ -26,17 +24,17 @@ struct LevelEditor
LevelEditorState state;
Vec2f camera_position;
float camera_scale;
Edit_field *edit_field_filename;
Edit_field edit_field_filename;
LayerPicker layer_picker;
FadingWigglyText notice;
RectLayer *boxes_layer;
RectLayer *platforms_layer;
RectLayer *back_platforms_layer;
RectLayer boxes_layer;
RectLayer platforms_layer;
RectLayer back_platforms_layer;
PointLayer *goals_layer;
PlayerLayer player_layer;
RectLayer *lava_layer;
RectLayer *regions_layer;
RectLayer lava_layer;
RectLayer regions_layer;
BackgroundLayer background_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;
ColorPicker color_picker;
Vec2f move_anchor;
Edit_field *edit_field;
Edit_field edit_field;
Vec2f inter_position;
Color inter_color;
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->selection = -1;
label_layer->edit_field = PUSH_LT(
lt,
create_edit_field(LABELS_SIZE, COLOR_RED),
destroy_edit_field);
if (label_layer->edit_field == NULL) {
RETURN_LT(lt, NULL);
}
label_layer->edit_field.font_size = LABELS_SIZE;
label_layer->edit_field.font_color = COLOR_RED;
label_layer->id_name_prefix = id_name_prefix;
@ -313,7 +308,7 @@ int label_layer_render(const LabelLayer *label_layer,
// Label Text
if (label_layer->state == LABEL_LAYER_EDIT_TEXT && label_layer->selection == (int) i) {
if (edit_field_render_world(
label_layer->edit_field,
&label_layer->edit_field,
camera,
position) < 0) {
return -1;
@ -334,7 +329,7 @@ int label_layer_render(const LabelLayer *label_layer,
// Label ID
if (label_layer->state == LABEL_LAYER_EDIT_ID && label_layer->selection == (int)i) {
if (edit_field_render_world(
label_layer->edit_field,
&label_layer->edit_field,
camera,
vec_sum(
position,
@ -541,10 +536,10 @@ int label_layer_idle_event(LabelLayer *label_layer,
undo_history);
label_layer->state = LABEL_LAYER_EDIT_TEXT;
edit_field_replace(
label_layer->edit_field,
&label_layer->edit_field,
texts + label_layer->selection * LABEL_LAYER_TEXT_MAX_SIZE);
edit_field_restyle(
label_layer->edit_field,
&label_layer->edit_field,
LABELS_SIZE,
colors[label_layer->selection]);
SDL_StartTextInput();
@ -585,10 +580,10 @@ int label_layer_idle_event(LabelLayer *label_layer,
if (label_layer->selection >= 0) {
label_layer->state = LABEL_LAYER_EDIT_TEXT;
edit_field_replace(
label_layer->edit_field,
&label_layer->edit_field,
texts + label_layer->selection * LABEL_LAYER_TEXT_MAX_SIZE);
edit_field_restyle(
label_layer->edit_field,
&label_layer->edit_field,
LABELS_SIZE,
colors[label_layer->selection]);
SDL_StartTextInput();
@ -599,10 +594,10 @@ int label_layer_idle_event(LabelLayer *label_layer,
if (label_layer->selection >= 0) {
label_layer->state = LABEL_LAYER_EDIT_ID;
edit_field_replace(
label_layer->edit_field,
&label_layer->edit_field,
ids + label_layer->selection * LABEL_LAYER_ID_MAX_SIZE);
edit_field_restyle(
label_layer->edit_field,
&label_layer->edit_field,
vec(1.0f, 1.0f),
color_invert(colors[label_layer->selection]));
SDL_StartTextInput();
@ -765,7 +760,7 @@ int label_layer_edit_text_event(LabelLayer *label_layer,
char *text =
(char*)label_layer->texts.data + label_layer->selection * 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;
SDL_StopTextInput();
return 0;
@ -780,7 +775,7 @@ int label_layer_edit_text_event(LabelLayer *label_layer,
} break;
}
return edit_field_event(label_layer->edit_field, event);
return edit_field_event(&label_layer->edit_field, event);
}
static
@ -804,7 +799,7 @@ int label_layer_edit_id_event(LabelLayer *label_layer,
char *id =
(char*)label_layer->ids.data + label_layer->selection * 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;
SDL_StopTextInput();
return 0;
@ -819,7 +814,7 @@ int label_layer_edit_id_event(LabelLayer *label_layer,
} break;
}
return edit_field_event(label_layer->edit_field, event);
return edit_field_event(&label_layer->edit_field, event);
}
static

View File

@ -44,7 +44,7 @@ struct PointLayer
Vec2f inter_position;
Color inter_color;
Edit_field *edit_field;
Edit_field edit_field;
int id_name_counter;
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->ids = create_dynarray(sizeof(char) * ID_MAX_SIZE);
point_layer->edit_field = PUSH_LT(
lt,
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->edit_field.font_size = POINT_LAYER_ID_TEXT_SIZE;
point_layer->edit_field.font_color = POINT_LAYER_ID_TEXT_COLOR;
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 (edit_field_render_world(
point_layer->edit_field,
&point_layer->edit_field,
camera,
positions[point_layer->selection]) < 0) {
return -1;
@ -505,7 +498,7 @@ int point_layer_idle_event(PointLayer *point_layer,
char *ids = (char*)point_layer->ids.data;
point_layer->state = POINT_LAYER_EDIT_ID;
edit_field_replace(
point_layer->edit_field,
&point_layer->edit_field,
ids + ID_MAX_SIZE * point_layer->selection);
SDL_StartTextInput();
}
@ -559,7 +552,7 @@ int point_layer_edit_id_event(PointLayer *point_layer,
POINT_UNDO_UPDATE));
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);
memcpy(id, text, n);
memset(id + n, 0, ID_MAX_SIZE - n);
@ -578,7 +571,7 @@ int point_layer_edit_id_event(PointLayer *point_layer,
} break;
}
return edit_field_event(point_layer->edit_field, event);
return edit_field_event(&point_layer->edit_field, event);
}
static

View File

@ -10,20 +10,15 @@
#include "color.h"
#include "rect_layer.h"
#include "dynarray.h"
#include "color_picker.h"
#include "system/str.h"
#include "ui/edit_field.h"
#include "undo_history.h"
#include "game/level/action.h"
#include "action_picker.h"
#include "game.h"
#include "math/extrema.h"
#define RECT_LAYER_SELECTION_THICCNESS 15.0f
#define RECT_LAYER_ID_LABEL_SIZE vec(3.0f, 3.0f)
#define CREATE_AREA_THRESHOLD 10.0
#define RECT_LAYER_GRID_ROWS 3
#define RECT_LAYER_GRID_COLUMNS 4
static int rect_clipboard = 0;
static Rect rect_clipboard_rect;
@ -45,41 +40,6 @@ static Cursor_Style resize_styles[1 << RECT_SIDE_N] = {
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 {
RECT_UNDO_ADD,
RECT_UNDO_DELETE,
@ -449,13 +409,13 @@ static int rect_layer_event_idle(RectLayer *layer,
Color *colors = (Color*)layer->colors.data;
edit_field_restyle(
layer->id_edit_field,
&layer->id_edit_field,
RECT_LAYER_ID_LABEL_SIZE,
color_invert(colors[layer->selection]));
layer->state = RECT_LAYER_ID_RENAME;
edit_field_replace(
layer->id_edit_field,
&layer->id_edit_field,
ids + layer->selection * ENTITY_MAX_ID_SIZE);
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);
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;
SDL_StopTextInput();
} break;
@ -825,7 +785,7 @@ static int rect_layer_event_id_rename(RectLayer *layer,
} 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)
@ -837,65 +797,35 @@ LayerPtr rect_layer_as_layer(RectLayer *rect_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);
Lt *lt = create_lt();
RectLayer result = {0};
RectLayer *layer = PUSH_LT(lt, nth_calloc(1, sizeof(RectLayer)), free);
if (layer == NULL) {
RETURN_LT(lt, NULL);
}
layer->lt = lt;
result.ids = create_dynarray(sizeof(char) * ENTITY_MAX_ID_SIZE);
result.rects = create_dynarray(sizeof(Rect));
result.colors = create_dynarray(sizeof(Color));
result.actions = create_dynarray(sizeof(Action));
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);
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;
return result;
}
RectLayer *chop_rect_layer(Memory *memory,
String *input,
const char *id_name_prefix,
Cursor *cursor)
RectLayer chop_rect_layer(Memory *memory,
String *input,
const char *id_name_prefix,
Cursor *cursor)
{
trace_assert(memory);
trace_assert(input);
RectLayer *layer = create_rect_layer(id_name_prefix, cursor);
trace_assert(layer);
RectLayer layer = create_rect_layer(id_name_prefix, cursor);
int n = atoi(string_to_cstr(memory, trim(chop_by_delim(input, '\n'))));
char id[ENTITY_MAX_ID_SIZE];
@ -915,9 +845,9 @@ RectLayer *chop_rect_layer(Memory *memory,
string_id.data,
min_size_t(ENTITY_MAX_ID_SIZE - 1, string_id.count));
dynarray_push(&layer->rects, &rect);
dynarray_push(&layer->colors, &color);
dynarray_push(&layer->ids, id);
dynarray_push(&layer.rects, &rect);
dynarray_push(&layer.colors, &color);
dynarray_push(&layer.ids, id);
Action action = {
.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;
}
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)
{
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) {
// ID renaming Edit Field
if (edit_field_render_world(
layer->id_edit_field,
&layer->id_edit_field,
camera,
rect_id_pos) < 0) {
return -1;
@ -1109,18 +1027,6 @@ int rect_layer_event(RectLayer *layer,
trace_assert(event);
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) {
case RECT_LAYER_IDLE:
return rect_layer_event_idle(layer, event, camera, undo_history);

View File

@ -4,19 +4,63 @@
#include "layer.h"
#include "game/level/action.h"
#include "ui/cursor.h"
#include "dynarray.h"
#include "color_picker.h"
#include "ui/edit_field.h"
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);
// NOTE: create_rect_layer and create_rect_layer_from_line_stream does
// not own id_name_prefix
RectLayer *create_rect_layer(const char *id_name_prefix,
Cursor *cursor);
RectLayer *chop_rect_layer(Memory *memory,
String *input,
const char *id_name_prefix,
Cursor *cursor);
void destroy_rect_layer(RectLayer *layer);
RectLayer create_rect_layer(const char *id_name_prefix,
Cursor *cursor);
RectLayer chop_rect_layer(Memory *memory,
String *input,
const char *id_name_prefix,
Cursor *cursor);
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_event(RectLayer *layer,

View File

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

View File

@ -9,17 +9,6 @@
#include "system/nth_alloc.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);
@ -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)
{
if (edit_field->buffer_size >= BUFFER_CAPACITY) {
if (edit_field->buffer_size >= EDIT_FIELD_CAPACITY) {
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,
const Camera *camera,
Vec2f screen_position)

View File

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