mirror of https://git.sr.ht/~kikoodx/kble
Improved mouse controls.
This commit is contained in:
parent
170409c014
commit
8cdc788a4e
|
@ -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
|
||||
|
|
43
src/main.zig
43
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();
|
||||
|
|
|
@ -11,6 +11,7 @@ const Vec2 = @import("vec2.zig");
|
|||
const Self = @This();
|
||||
|
||||
pub const MouseMode = enum {
|
||||
wait, // Skip one turn.
|
||||
idle,
|
||||
sel,
|
||||
rect_sel,
|
||||
|
|
Loading…
Reference in New Issue