From 11d6ebef3cb66dd02d59203b35828c505573dc35 Mon Sep 17 00:00:00 2001 From: KikooDX Date: Sat, 30 Jan 2021 16:43:55 +0100 Subject: [PATCH] Mighty zoom is back (scale system) --- src/actions.zig | 16 ++++++++++++++++ src/main.zig | 28 +++++++++++----------------- src/scaling.zig | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 17 deletions(-) create mode 100644 src/scaling.zig diff --git a/src/actions.zig b/src/actions.zig index a61b127..4458d1f 100644 --- a/src/actions.zig +++ b/src/actions.zig @@ -7,6 +7,7 @@ const std = @import("std"); const expect = std.testing.expect; const movement = @import("movement.zig"); +const scaling = @import("scaling.zig"); const Vec2 = @import("vec2.zig"); const Level = @import("level.zig"); @@ -23,6 +24,7 @@ pub const Action = struct { // Only one of these should be set, and only one should be used. function_move: fn (*Vec2, u32, bool) movement.SelectionUpdate = movement.move_left, function_verb: fn (*Level) void = Level.action_delete, + function_scale: fn (scaling.scale_type) scaling.scale_type = scaling.scale_reset, }; pub const ActionsDef = .{ @@ -110,4 +112,18 @@ pub const ActionsDef = .{ .category = ActionCat.movement, .function_move = movement.move_down_right, }, + + // Scale. + .scale_reset = Action{ + .category = ActionCat.scale, + .function_scale = scaling.scale_reset, + }, + .scale_up = Action{ + .category = ActionCat.scale, + .function_scale = scaling.scale_up, + }, + .scale_down = Action{ + .category = ActionCat.scale, + .function_scale = scaling.scale_down, + }, }; diff --git a/src/main.zig b/src/main.zig index 9c96e2f..eeb064a 100644 --- a/src/main.zig +++ b/src/main.zig @@ -15,6 +15,7 @@ const maxInt = std.math.maxInt; const Level = @import("level.zig"); const Vec2 = @import("vec2.zig"); const movement = @import("movement.zig"); +const scaling = @import("scaling.zig"); const actions = @import("actions.zig"); const ActionsDef = actions.ActionsDef; const ActionCat = actions.ActionCat; @@ -42,17 +43,16 @@ pub fn main() !void { // Create camera. var camera: Vec2 = Vec2.init(0, 0); - // Scale, used by drawing code. - const scale_type = u16; - const scale_default = 16; - var scale: scale_type = scale_default; + // Init scale, used by drawing code. + var scale: scaling.scale_type = scaling.scale_default; // Create cursor. var cursor: Vec2 = Vec2.init(0, 0); // Create binding "table". var bindings = [_]*const actions.Action{&actions.ActionsDef.none} ** char_range; - // Set default bindings + // Set default bindings. + // Movement. bindings['h'] = &ActionsDef.move_left; bindings['H'] = &ActionsDef.move_LEFT; bindings['j'] = &ActionsDef.move_down; @@ -69,8 +69,12 @@ pub fn main() !void { bindings['B'] = &ActionsDef.move_DOWN_LEFT; bindings['n'] = &ActionsDef.move_down_right; bindings['N'] = &ActionsDef.move_DOWN_RIGHT; + // Scale. + bindings['='] = &ActionsDef.scale_reset; + bindings['+'] = &ActionsDef.scale_up; + bindings['-'] = &ActionsDef.scale_down; - // Create input buffer (ASCII). + // Create input buffer. const input_buffer_len = 255; var input_buffer: [input_buffer_len]u32 = undefined; comptime { @@ -122,17 +126,7 @@ pub fn main() !void { action.function_verb(&level); }, .scale => { - // TODO: move this to functions, doesn't make any sense here - // Zoom (pog feature). - if (scale > 3) { - scale -= 1; - } - if (scale < comptime maxInt(scale_type)) { - scale += 1; - } - // Reset zoom. - scale = scale_default; - log("No action for {} key.", .{action}); + scale = action.function_scale(scale); }, } } diff --git a/src/scaling.zig b/src/scaling.zig new file mode 100644 index 0000000..3b9d506 --- /dev/null +++ b/src/scaling.zig @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2021 KikooDX +// This file is part of [KBLE](https://sr.ht/~kikoodx/kble), which is +// MIT licensed. The MIT license requires this copyright notice to be +// included in all copies and substantial portions of the software. +//! Operates on a scale value used by drawing code. +const std = @import("std"); +const expect = std.testing.expect; +const maxInt = std.math.maxInt; + +pub const scale_type = u16; +pub const scale_default: comptime_int = 16; +const scale_min: comptime_int = 3; +const scale_max: comptime_int = maxInt(scale_type); + +pub fn scale_reset(current_scale: scale_type) scale_type { + return scale_default; +} + +pub fn scale_up(current_scale: scale_type) scale_type { + if (current_scale < scale_max) { + return current_scale + 1; + } else return current_scale; +} + +pub fn scale_down(current_scale: scale_type) scale_type { + if (current_scale > scale_min) { + return current_scale - 1; + } else return current_scale; +} + +test "scale reset" { + expect(scale_reset(42) == scale_default); +} + +test "scale up" { + expect(scale_up(42) == 43); + expect(scale_up(scale_max) == scale_max); +} + +test "scale down" { + expect(scale_down(42) == 41); + expect(scale_down(scale_min) == scale_min); +} +