diff --git a/README.md b/README.md index 1cbbd5b..743aa56 100644 --- a/README.md +++ b/README.md @@ -42,9 +42,11 @@ Actions: * `=`: reset scale # Mouse control -* Right click: reset selection. -* Hold left click: add to selection. -* Hold left click + shift: select rectangle. +Right click and left click are the same, except right click reset +selection before taking effect. +* Click: free selection. +* Shift + Click: rectangle selection. +* Click while selecting: end selection. # License Copyright (c) 2021 KikooDX diff --git a/src/main.zig b/src/main.zig index 4fc58f0..38edaf9 100644 --- a/src/main.zig +++ b/src/main.zig @@ -152,18 +152,35 @@ pub fn main() !void { mouse.pos.y = @intCast(u16, ray.GetMouseY()); } - const left_press: bool = ray.IsMouseButtonPressed(conf.mouse_left_btn); - const left_release: bool = ray.IsMouseButtonReleased(conf.mouse_left_btn); - const right_press: bool = ray.IsMouseButtonPressed(conf.mouse_right_btn); + const left_click: bool = ray.IsMouseButtonPressed(conf.mouse_left_btn); + const right_click: bool = ray.IsMouseButtonPressed(conf.mouse_right_btn); + const click: bool = left_click or right_click; + + // If click, get out of current mode and apply changes if necessary. + if (click and mouse.mode != Mouse.MouseMode.idle) { + defer mouse.mode = Mouse.MouseMode.wait; + + // Select area. + if (mouse.mode == Mouse.MouseMode.rect_sel) { + const selection = Rect.init_from_vec2(mouse.start_pos, mouse.pos); + level.select_rect(selection, true); + } + } // State machine. switch (mouse.mode) { + .wait => mouse.mode = Mouse.MouseMode.idle, // See if can switch mode. .idle => { const mod_rect_sel: bool = ray.IsKeyDown(ray.KEY_LEFT_SHIFT) or ray.IsKeyDown(ray.KEY_RIGHT_SHIFT); - if (left_press) { // Switch mode. + if (click) { // Switch mode. cursor = mouse.pos; + // Reset selection on right click. + if (right_click) { + level.apply_selection_update(movement.move_but_dont(&cursor, 1, true)); + } + // Set position. mouse.start_pos = mouse.pos; mouse.mode = if (mod_rect_sel) Mouse.MouseMode.rect_sel @@ -179,24 +196,6 @@ pub fn main() !void { // Rectangle selection, see `left_release` for handling. .rect_sel => {}, } - - // If left button is released, get out of current mode and apply changes if necessary. - if (left_release) { - defer mouse.mode = Mouse.MouseMode.idle; - defer cursor = mouse.pos; - - // Select area. - if (mouse.mode == Mouse.MouseMode.rect_sel) { - const selection = Rect.init_from_vec2(mouse.start_pos, mouse.pos); - level.select_rect(selection, true); - } - } - - // Reset selection on right click. - if (right_press) { - cursor = mouse.pos; - level.apply_selection_update(movement.move_but_dont(&cursor, 1, true)); - } } ray.BeginDrawing(); diff --git a/src/mouse.zig b/src/mouse.zig index f0b551a..4080172 100644 --- a/src/mouse.zig +++ b/src/mouse.zig @@ -11,6 +11,7 @@ const Vec2 = @import("vec2.zig"); const Self = @This(); pub const MouseMode = enum { + wait, // Skip one turn. idle, sel, rect_sel,