From b7e7f561a5b85207ef43795f535f99c243ce0f92 Mon Sep 17 00:00:00 2001 From: rexim Date: Mon, 3 Feb 2020 03:14:40 +0700 Subject: [PATCH] Introduce tool bar for subtract and snapping tools --- src/game/level/level_editor/rect_layer.c | 64 ++++++++++++++++++++---- src/game/level/level_editor/rect_layer.h | 1 + 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/game/level/level_editor/rect_layer.c b/src/game/level/level_editor/rect_layer.c index 92b5b58c..6d35d089 100644 --- a/src/game/level/level_editor/rect_layer.c +++ b/src/game/level/level_editor/rect_layer.c @@ -275,6 +275,32 @@ static int calc_resize_mask(Vec2f point, Rect rect) return mask; } +#define TOOL_BUTTON_WIDTH 50.0f +#define TOOL_BUTTON_HEIGHT 50.0f +#define TOOL_BAR_PADDING 20.0f + +static +Rect subtract_tool_button_rect(const Camera *camera) +{ + const Rect view_port = camera_view_port_screen(camera); + return rect( + TOOL_BAR_PADDING, + view_port.h - TOOL_BUTTON_HEIGHT - TOOL_BAR_PADDING, + TOOL_BUTTON_WIDTH, + TOOL_BUTTON_HEIGHT); +} + +static +Rect snapping_tool_button_rect(const Camera *camera) +{ + const Rect view_port = camera_view_port_screen(camera); + return rect( + TOOL_BAR_PADDING + TOOL_BUTTON_WIDTH + TOOL_BAR_PADDING, + view_port.h - TOOL_BUTTON_HEIGHT - TOOL_BAR_PADDING, + TOOL_BUTTON_WIDTH, + TOOL_BUTTON_HEIGHT); +} + static int rect_layer_event_idle(RectLayer *layer, const SDL_Event *event, const Camera *camera, @@ -303,6 +329,19 @@ static int rect_layer_event_idle(RectLayer *layer, case SDL_MOUSEBUTTONDOWN: { switch (event->button.button) { case SDL_BUTTON_LEFT: { + Vec2f screen_position = + vec((float) event->button.x, + (float) event->button.y); + if (rect_contains_point(subtract_tool_button_rect(camera), screen_position)) { + layer->subtract_enabled = !layer->subtract_enabled; + return 0; + } + + if (rect_contains_point(snapping_tool_button_rect(camera), screen_position)) { + layer->snapping_enabled = !layer->snapping_enabled; + return 0; + } + Vec2f position = camera_map_screen( camera, event->button.x, @@ -335,7 +374,9 @@ static int rect_layer_event_idle(RectLayer *layer, layer->selection = rect_at_position; if (layer->selection < 0) { - layer->state = RECT_LAYER_CREATE; + layer->state = layer->subtract_enabled + ? RECT_LAYER_SUBTRACT + : RECT_LAYER_CREATE; layer->create_begin = position; layer->create_end = position; } @@ -430,14 +471,6 @@ static int rect_layer_event_idle(RectLayer *layer, } } break; - case SDLK_x: { - int x, y; - SDL_GetMouseState(&x, &y); - layer->create_begin = camera_map_screen(camera, x, y); - layer->create_end = layer->create_begin; - layer->state = RECT_LAYER_SUBTRACT; - } break; - case SDLK_v: { if ((event->key.keysym.mod & KMOD_LCTRL) && rect_clipboard) { int x, y; @@ -1149,6 +1182,19 @@ int rect_layer_render(const RectLayer *layer, const Camera *camera, int active) return -1; } + // Tool bar + if (active) { + // TODO: subtract and snapping tools don't have any icons + camera_fill_rect_screen( + camera, + subtract_tool_button_rect(camera), + layer->subtract_enabled ? COLOR_RED : rgba(0.2f, 0.2f, 0.2f, 1.0f)); + camera_fill_rect_screen( + camera, + snapping_tool_button_rect(camera), + layer->snapping_enabled ? COLOR_RED : rgba(0.2f, 0.2f, 0.2f, 1.0f)); + } + return 0; } diff --git a/src/game/level/level_editor/rect_layer.h b/src/game/level/level_editor/rect_layer.h index 8bb37b44..6d60c4ce 100644 --- a/src/game/level/level_editor/rect_layer.h +++ b/src/game/level/level_editor/rect_layer.h @@ -41,6 +41,7 @@ struct RectLayer { Cursor *cursor; int snapping_enabled; + int subtract_enabled; }; LayerPtr rect_layer_as_layer(RectLayer *layer); -- 2.44.0