]> git.lizzy.rs Git - nothing.git/commitdiff
(#790) Don't trigger proto_rect when color_picker selected something
authorrexim <reximkut@gmail.com>
Sat, 13 Apr 2019 17:43:07 +0000 (00:43 +0700)
committerrexim <reximkut@gmail.com>
Sat, 13 Apr 2019 17:43:07 +0000 (00:43 +0700)
src/game/level/level_editor.c
src/game/level/level_editor/color_picker.c
src/game/level/level_editor/color_picker.h
src/game/level/level_editor/proto_rect.c
src/game/level/level_editor/proto_rect.h

index 75c3a39a549be85609772bdc177874712e9ba4ae..815e12b4b46f2f42d5fbf611884a7ce5a33b1925 100644 (file)
@@ -77,13 +77,9 @@ int level_editor_event(LevelEditor *level_editor,
     trace_assert(level_editor);
     trace_assert(event);
 
-    switch (event->type) {
-    case SDL_MOUSEMOTION: {
-        const float sens = 1.0f / level_editor->camera_scale * 0.25f;
-        vec_add(&level_editor->camera_position,
-                vec((float) event->motion.xrel * sens, (float) event->motion.yrel * sens));
-    } break;
+    (void) camera;
 
+    switch (event->type) {
     case SDL_MOUSEWHEEL: {
         // TODO(#679): zooming in edit mode is not smooth enough
         if (event->wheel.y > 0) {
@@ -92,18 +88,35 @@ int level_editor_event(LevelEditor *level_editor,
             level_editor->camera_scale = fmaxf(0.1f, level_editor->camera_scale - 0.1f);
         }
     } break;
-    }
 
-    if (proto_rect_event(
-            &level_editor->proto_rect,
-            event,
-            camera,
-            level_editor->boxes) < 0) {
-        return -1;
-    }
+    case SDL_MOUSEBUTTONUP:
+    case SDL_MOUSEBUTTONDOWN: {
+        bool selected = false;
+        if (color_picker_mouse_button(
+                &level_editor->color_picker,
+                &event->button,
+                &selected) < 0) {
+            return -1;
+        }
 
-    if (color_picker_event(&level_editor->color_picker, event) < 0) {
-        return -1;
+        if (!selected && proto_rect_mouse_button(
+                &level_editor->proto_rect,
+                &event->button,
+                level_editor->boxes,
+                camera) < 0) {
+            return -1;
+        }
+    } break;
+
+    case SDL_MOUSEMOTION: {
+        const float sens = 1.0f / level_editor->camera_scale * 0.25f;
+        vec_add(&level_editor->camera_position,
+                vec((float) event->motion.xrel * sens, (float) event->motion.yrel * sens));
+
+        if (proto_rect_mouse_motion(&level_editor->proto_rect, &event->motion, camera) < 0) {
+            return -1;
+        }
+    } break;
     }
 
     return 0;
index 2701121959bc0a00e4e07330669c30a261bdea12..892c1d7be9ff884f41f60c8b86c280cd7f53d68d 100644 (file)
@@ -46,30 +46,31 @@ int color_picker_update(ColorPicker *color_picker,
     return 0;
 }
 
-int color_picker_event(ColorPicker *color_picker,
-                       const SDL_Event *event)
+int color_picker_mouse_button(ColorPicker *color_picker,
+                              const SDL_MouseButtonEvent *event,
+                              bool *selected)
 {
     trace_assert(color_picker);
     trace_assert(event);
 
-    switch (event->type) {
-    case SDL_MOUSEBUTTONDOWN: {
-        switch (event->button.button) {
+    *selected = false;
+
+    if (event->type == SDL_MOUSEBUTTONDOWN) {
+        switch (event->button) {
         case SDL_BUTTON_LEFT: {
             for (size_t i = 0; i < colors_count; ++i) {
-                const Vec mouse_position = vec((float) event->button.x, (float) event->button.y);
+                const Vec mouse_position = vec((float) event->x, (float) event->y);
                 const Rect color_cell =
                     rect(COLOR_CELL_WIDTH * (float) i, 0,
                          COLOR_CELL_WIDTH,
                          COLOR_CELL_HEIGHT);
                 if (rect_contains_point(color_cell, mouse_position)) {
                     color_picker->proto_rect->color = colors[i];
-                    break;
+                    *selected = true;
                 }
             }
         } break;
         }
-    } break;
     }
 
     return 0;
index b0ec76d3eaa40440e5c235c7d4f0fc33bef30928..b1c95e66202c292e5d3d9ea3b33f28a41b1c1951 100644 (file)
@@ -10,7 +10,8 @@ int color_picker_render(const ColorPicker *color_picker,
                         Camera *camera);
 int color_picker_update(ColorPicker *color_picker,
                         float delta_time);
-int color_picker_event(ColorPicker *color_picker,
-                       const SDL_Event *event);
+int color_picker_mouse_button(ColorPicker *color_picker,
+                              const SDL_MouseButtonEvent *event,
+                              bool *selected);
 
 #endif  // COLOR_PICKER_H_
index ffabfab19e8822d8d677577027eb964c33180396..ee168b24c78717b3a34a8a69d2e40cf93779ddd4 100644 (file)
@@ -98,3 +98,74 @@ int proto_rect_event(ProtoRect *proto_rect,
 
     return 0;
 }
+
+int proto_rect_mouse_button(ProtoRect *proto_rect,
+                            const SDL_MouseButtonEvent *event,
+                            Boxes *boxes,
+                            const Camera *camera)
+{
+    trace_assert(proto_rect);
+    trace_assert(event);
+    trace_assert(boxes);
+    trace_assert(camera);
+
+    if (proto_rect->active) {
+        // Active
+        switch (event->type) {
+        case SDL_MOUSEBUTTONUP: {
+            switch (event->button) {
+            case SDL_BUTTON_LEFT: {
+                const Rect real_rect =
+                    rect_from_points(
+                        proto_rect->begin,
+                        proto_rect->end);
+                const float area = real_rect.w * real_rect.h;
+
+                if (area >= PROTO_AREA_THRESHOLD) {
+                    boxes_add_box(boxes, real_rect, proto_rect->color);
+                } else {
+                    log_info("The area is too small %f. Such small box won't be created.\n", area);
+                }
+                proto_rect->active = false;
+            } break;
+            }
+        } break;
+        }
+    } else {
+        // Inactive
+        switch (event->type) {
+        case SDL_MOUSEBUTTONDOWN: {
+            switch (event->button) {
+            case SDL_BUTTON_LEFT: {
+                proto_rect->active = true;
+                proto_rect->begin = camera_map_screen(
+                    camera,
+                    event->x,
+                    event->y);
+                proto_rect->end = proto_rect->begin;
+            } break;
+            }
+        } break;
+        }
+    }
+
+    return 0;
+}
+
+
+int proto_rect_mouse_motion(ProtoRect *proto_rect,
+                            const SDL_MouseMotionEvent *event,
+                            const Camera *camera)
+{
+    trace_assert(proto_rect);
+    trace_assert(event);
+
+    if (proto_rect->active) {
+        proto_rect->end = camera_map_screen(
+            camera,
+            event->x,
+            event->y);
+    }
+
+    return 0;
+}
index 75d65e5f0483b305fb7321ac5389642970adf79d..5a02451db6d08ac0d6966eb3eb7fb43a838667da 100644 (file)
@@ -17,5 +17,12 @@ int proto_rect_event(ProtoRect *proto_rect,
                      const SDL_Event *event,
                      const Camera *camera,
                      Boxes *boxes);
+int proto_rect_mouse_button(ProtoRect *proto_rect,
+                            const SDL_MouseButtonEvent *event,
+                            Boxes *boxes,
+                            const Camera *camera);
+int proto_rect_mouse_motion(ProtoRect *proto_rect,
+                            const SDL_MouseMotionEvent *event,
+                            const Camera *camera);
 
 #endif  // PROTO_RECT_H_