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) {
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;
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;
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_
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;
+}
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_