From 02221cda86e7fa78bb1dd42a6d2572b68cdee0f1 Mon Sep 17 00:00:00 2001 From: rexim Date: Mon, 29 Jul 2019 00:26:04 +0700 Subject: [PATCH] Split LevelEditor event handling --- src/game/level/level_editor.c | 185 ++++++++++++++++++++-------------- 1 file changed, 107 insertions(+), 78 deletions(-) diff --git a/src/game/level/level_editor.c b/src/game/level/level_editor.c index d5bf9d5f..c7f7bae6 100644 --- a/src/game/level/level_editor.c +++ b/src/game/level/level_editor.c @@ -335,104 +335,133 @@ int level_editor_render(const LevelEditor *level_editor, return 0; } -int level_editor_event(LevelEditor *level_editor, - const SDL_Event *event, - const Camera *camera) +static +int level_editor_saveas_event(LevelEditor *level_editor, + const SDL_Event *event, + const Camera *camera) { trace_assert(level_editor); trace_assert(event); trace_assert(camera); - if (level_editor->state == LEVEL_EDITOR_SAVEAS) { - switch (event->type) { - case SDL_KEYDOWN: { - if (event->key.keysym.sym == SDLK_RETURN) { - trace_assert(level_editor->file_name == NULL); - level_editor->file_name = PUSH_LT( - level_editor->lt, - string_duplicate( - edit_field_as_text( - level_editor->edit_field_filename), - NULL), - free); - level_editor_dump(level_editor); - SDL_StopTextInput(); - level_editor->state = LEVEL_EDITOR_IDLE; - return 0; - } - } break; + switch (event->type) { + case SDL_KEYDOWN: { + if (event->key.keysym.sym == SDLK_RETURN) { + trace_assert(level_editor->file_name == NULL); + level_editor->file_name = PUSH_LT( + level_editor->lt, + string_duplicate( + edit_field_as_text( + level_editor->edit_field_filename), + NULL), + free); + level_editor_dump(level_editor); + SDL_StopTextInput(); + level_editor->state = LEVEL_EDITOR_IDLE; + return 0; } + } break; + } - return edit_field_event(level_editor->edit_field_filename, event); - } else { - switch (event->type) { - case SDL_KEYDOWN: { - switch(event-> key.keysym.sym) { - case SDLK_s: { - /* TODO(#903): There is no indication that the level is saved when you press S in Level Editor */ - if (level_editor->file_name) { - level_editor_dump(level_editor); - log_info("Saving level to `%s`\n", level_editor->file_name); - } else { - SDL_StartTextInput(); - level_editor->state = LEVEL_EDITOR_SAVEAS; - } - } break; - } - } break; - - case SDL_MOUSEWHEEL: { - // TODO(#679): zooming in edit mode is not smooth enough - if (event->wheel.y > 0) { - level_editor->camera_scale += 0.1f; - } else if (event->wheel.y < 0) { - level_editor->camera_scale = fmaxf(0.1f, level_editor->camera_scale - 0.1f); - } - } break; + return edit_field_event(level_editor->edit_field_filename, event); +} - case SDL_MOUSEBUTTONUP: - case SDL_MOUSEBUTTONDOWN: { - if (event->type == SDL_MOUSEBUTTONDOWN && event->button.button == SDL_BUTTON_MIDDLE) { - level_editor->drag = true; - } +static +int level_editor_idle_event(LevelEditor *level_editor, + const SDL_Event *event, + const Camera *camera) +{ + trace_assert(level_editor); + trace_assert(event); + trace_assert(camera); - if (event->type == SDL_MOUSEBUTTONUP && event->button.button == SDL_BUTTON_MIDDLE) { - level_editor->drag = false; + switch (event->type) { + case SDL_KEYDOWN: { + switch(event-> key.keysym.sym) { + case SDLK_s: { + /* TODO(#903): There is no indication that the level is saved when you press S in Level Editor */ + if (level_editor->file_name) { + level_editor_dump(level_editor); + log_info("Saving level to `%s`\n", level_editor->file_name); + } else { + SDL_StartTextInput(); + level_editor->state = LEVEL_EDITOR_SAVEAS; } } break; + } + } break; + + case SDL_MOUSEWHEEL: { + // TODO(#679): zooming in edit mode is not smooth enough + if (event->wheel.y > 0) { + level_editor->camera_scale += 0.1f; + } else if (event->wheel.y < 0) { + level_editor->camera_scale = fmaxf(0.1f, level_editor->camera_scale - 0.1f); + } + } break; - case SDL_MOUSEMOTION: { - if (level_editor->drag) { - const Vec next_position = camera_map_screen(camera, event->motion.x, event->motion.y); - const Vec prev_position = camera_map_screen( - camera, - event->motion.x + event->motion.xrel, - event->motion.y + event->motion.yrel); + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEBUTTONDOWN: { + if (event->type == SDL_MOUSEBUTTONDOWN && event->button.button == SDL_BUTTON_MIDDLE) { + level_editor->drag = true; + } - vec_add(&level_editor->camera_position, - vec_sub(next_position, prev_position)); - } + if (event->type == SDL_MOUSEBUTTONUP && event->button.button == SDL_BUTTON_MIDDLE) { + level_editor->drag = false; + } + } break; - } break; + case SDL_MOUSEMOTION: { + if (level_editor->drag) { + const Vec next_position = camera_map_screen(camera, event->motion.x, event->motion.y); + const Vec prev_position = camera_map_screen( + camera, + event->motion.x + event->motion.xrel, + event->motion.y + event->motion.yrel); + + vec_add(&level_editor->camera_position, + vec_sub(next_position, prev_position)); } - bool selected = false; - if (layer_picker_event( - &level_editor->layer_picker, + } break; + } + + bool selected = false; + if (layer_picker_event( + &level_editor->layer_picker, + event, + camera, + &selected) < 0) { + return -1; + } + + if (!selected) { + if (layer_event( + level_editor->layers[level_editor->layer_picker], event, - camera, - &selected) < 0) { + camera) < 0) { return -1; } + } - if (!selected) { - if (layer_event( - level_editor->layers[level_editor->layer_picker], - event, - camera) < 0) { - return -1; - } - } + + return 0; +} + +int level_editor_event(LevelEditor *level_editor, + const SDL_Event *event, + const Camera *camera) +{ + trace_assert(level_editor); + trace_assert(event); + trace_assert(camera); + + switch (level_editor->state) { + case LEVEL_EDITOR_IDLE: + return level_editor_idle_event(level_editor, event, camera); + + case LEVEL_EDITOR_SAVEAS: + return level_editor_saveas_event(level_editor, event, camera); } return 0; -- 2.44.0