]> git.lizzy.rs Git - nothing.git/commitdiff
Split LevelEditor event handling
authorrexim <reximkut@gmail.com>
Sun, 28 Jul 2019 17:26:04 +0000 (00:26 +0700)
committerrexim <reximkut@gmail.com>
Sun, 28 Jul 2019 17:26:14 +0000 (00:26 +0700)
src/game/level/level_editor.c

index d5bf9d5f1e31dff95682626952d4558682707384..c7f7bae6a6b13c3221407a35c913ecb90c103489 100644 (file)
@@ -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;