#define UNDO_HISTORY_CAPACITY 256
+#define EDIT_FIELD_CAPACITY 256
+
#endif // CONFIG_H_
}
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->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(
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;
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),
} break;
}
- return edit_field_event(level_editor->edit_field_filename, event);
+ return edit_field_event(&level_editor->edit_field_filename, event);
}
static
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 {
LevelEditorState state;
Vec2f camera_position;
float camera_scale;
- Edit_field *edit_field_filename;
+ Edit_field edit_field_filename;
LayerPicker layer_picker;
FadingWigglyText notice;
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;
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;
// 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;
// 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,
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();
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();
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();
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;
} break;
}
- return edit_field_event(label_layer->edit_field, event);
+ return edit_field_event(&label_layer->edit_field, event);
}
static
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;
} break;
}
- return edit_field_event(label_layer->edit_field, event);
+ return edit_field_event(&label_layer->edit_field, event);
}
static
Vec2f inter_position;
Color inter_color;
- Edit_field *edit_field;
+ Edit_field edit_field;
int id_name_counter;
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;
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;
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();
}
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);
} break;
}
- return edit_field_event(point_layer->edit_field, event);
+ return edit_field_event(&point_layer->edit_field, event);
}
static
int selection;
Vec2f move_anchor; // The mouse offset from the left-top
// corner of the rect during moving it
- Edit_field *id_edit_field;
+ Edit_field id_edit_field;
Color inter_color;
Rect inter_rect;
int id_name_counter;
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();
}
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;
} 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)
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->id_edit_field.font_size = RECT_LAYER_ID_LABEL_SIZE;
+ layer->id_edit_field.font_color = COLOR_BLACK;
layer->grid =
PUSH_LT(
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;
struct Console
{
Lt *lt;
- Edit_field *edit_field;
+ Edit_field edit_field;
Console_Log *console_log;
History *history;
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,
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;
}
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;
}
case SDLK_UP:
edit_field_replace(
- console->edit_field,
+ &console->edit_field,
history_current(console->history));
history_prev(console->history);
return 0;
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;
}
case SDLK_DOWN:
edit_field_replace(
- console->edit_field,
+ &console->edit_field,
history_current(console->history));
history_next(console->history);
return 0;
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;
}
} break;
}
- return edit_field_event(console->edit_field, event);
+ return edit_field_event(&console->edit_field, event);
}
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;
#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);
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;
}
}
}
-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)
#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,