commit
749edf20ea
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -33,4 +33,6 @@
|
|||
|
||||
#define UNDO_HISTORY_CAPACITY 256
|
||||
|
||||
#define EDIT_FIELD_CAPACITY 256
|
||||
|
||||
#endif // CONFIG_H_
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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_
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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_
|
Loading…
Reference in New Issue