Improved mouse controls.

This commit is contained in:
KikooDX 2021-02-01 10:37:58 +01:00
parent 170409c014
commit 8cdc788a4e
3 changed files with 27 additions and 25 deletions

View File

@ -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

View File

@ -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();

View File

@ -11,6 +11,7 @@ const Vec2 = @import("vec2.zig");
const Self = @This();
pub const MouseMode = enum {
wait, // Skip one turn.
idle,
sel,
rect_sel,