From 165d605eec1c3f4d35ef519fe51ab2cd602bca4c Mon Sep 17 00:00:00 2001 From: KikooDX Date: Sat, 13 Mar 2021 00:40:31 +0100 Subject: [PATCH] Parameter buffer (#6) --- README.md | 4 ++++ level.kble | Bin 0 -> 518 bytes src/actions.zig | 15 ++++++++++++++- src/level.zig | 10 ++++++++++ src/main.zig | 11 ++++++++++- src/parameter_buffer.zig | 17 +++++++++++++++++ 6 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 level.kble create mode 100644 src/parameter_buffer.zig diff --git a/README.md b/README.md index 1f8d6e4..61e4c02 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,10 @@ File (read/write): * `w`: write (save) level *See `kbleformat.md` for technical informations.* +Parameter buffer (change default value of verb calls): +* `p`: set parameter buffer to current parameter (defaults to 1) +* `P`: set the tile ID the keyboard cursor is on as parameter buffer + Modes: * ``: normal mode, default * `i`: free selection mode diff --git a/level.kble b/level.kble new file mode 100644 index 0000000000000000000000000000000000000000..5d59f828cfefcce0edffe6761d45f0fc57669d56 GIT binary patch literal 518 TcmZQzVh~^uFvuE(BRK>Be^#0! literal 0 HcmV?d00001 diff --git a/src/actions.zig b/src/actions.zig index d28b646..84ef69b 100644 --- a/src/actions.zig +++ b/src/actions.zig @@ -7,6 +7,7 @@ const std = @import("std"); const expect = std.testing.expect; const Parameter = @import("parameter.zig"); +const parameter_buffer = @import("parameter_buffer.zig"); const movement = @import("movement.zig"); const scaling = @import("scaling.zig"); const verbs = @import("verbs.zig"); @@ -21,6 +22,7 @@ pub const ActionCat = enum { verb, // do stuff with selection scale, // change draw scaling file, // load/save, file related stuff + pbuf, // modify the parameter buffer mode, // change mode }; @@ -32,6 +34,7 @@ pub const Action = struct { function_verb: fn (*Level, Parameter.buffer_type) void = verbs.delete, function_scale: fn (scaling.scale_type, Parameter.buffer_type) scaling.scale_type = scaling.scale_reset, function_file: fn (*Level, *std.mem.Allocator, [*:0]const u8) void = Level.action_write, + function_pbuf: fn (Level, Vec2, Parameter.buffer_type) Parameter.buffer_type = parameter_buffer.set, next_mode: Mode = Mode.normal, }; @@ -120,7 +123,7 @@ pub const ActionsDef = .{ .function_scale = scaling.scale_down, }, - // File + // File. .file_read = Action{ .category = ActionCat.file, .function_file = Level.action_read, @@ -130,6 +133,16 @@ pub const ActionsDef = .{ .function_file = Level.action_write, }, + // Parameter buffer. + .pbuf_set = Action{ + .category = ActionCat.pbuf, + .function_pbuf = parameter_buffer.set, + }, + .pbuf_pick = Action{ + .category = ActionCat.pbuf, + .function_pbuf = parameter_buffer.pick, + }, + // Mode change. .mode_normal = Action{ .category = ActionCat.mode, diff --git a/src/level.zig b/src/level.zig index 733bcd6..76d98df 100644 --- a/src/level.zig +++ b/src/level.zig @@ -256,6 +256,16 @@ pub fn select_rect(self: *Self, rect: Rect, state: bool) void { } } +pub fn get_tile_at(self: Self, pos: Vec2) cell_type { + const target: u32 = @intCast(u32, pos.y) * self.width + @intCast(u32, pos.x); + if (pos.x < self.width and pos.y < self.height and + target < self.width * self.height and target >= 0) + { + return self.content[target]; + } else + return 0; +} + /// Apply selection update to selection *kof*. pub fn apply_selection_update(self: *Self, selection_update: SelectionUpdate) void { // Apply changes. diff --git a/src/main.zig b/src/main.zig index 27f6569..a87c604 100644 --- a/src/main.zig +++ b/src/main.zig @@ -76,6 +76,9 @@ pub fn main() void { // Parameter buffer. var parameter: Parameter = Parameter{}; + // Yank/paste for parameters. + var parameter_buffer: Parameter.buffer_type = 1; + // Create binding "table". var bindings = [_]*const actions.Action{&actions.ActionsDef.none} ** char_range; comptime { @@ -107,6 +110,9 @@ pub fn main() void { // File. default_bindings['e'] = &ActionsDef.file_read; default_bindings['w'] = &ActionsDef.file_write; + // Parameter buffer. + default_bindings['p'] = &ActionsDef.pbuf_set; + default_bindings['P'] = &ActionsDef.pbuf_pick; // Mode. default_bindings['\n'] = &ActionsDef.mode_normal; default_bindings['i'] = &ActionsDef.mode_select; @@ -175,7 +181,7 @@ pub fn main() void { } }, .verb => { - action.function_verb(&level, parameter.pop(1)); + action.function_verb(&level, parameter.pop(parameter_buffer)); }, .scale => { scale = action.function_scale(scale, parameter.pop(1)); @@ -183,6 +189,9 @@ pub fn main() void { .file => { action.function_file(&level, allocator, level_path); }, + .pbuf => { + parameter_buffer = action.function_pbuf(level, cursor, parameter.pop(1)); + }, .mode => { // Rectangle selection! if (mode == .rectangle or mode == .unrectangle) { diff --git a/src/parameter_buffer.zig b/src/parameter_buffer.zig new file mode 100644 index 0000000..ae774b7 --- /dev/null +++ b/src/parameter_buffer.zig @@ -0,0 +1,17 @@ +// 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. +//! Parameter buffer related operations. +const buffer_type = @import("parameter.zig").buffer_type; +const Level = @import("level.zig"); +const Vec2 = @import("vec2.zig"); + +pub fn set(level: Level, cursor: Vec2, arg: buffer_type) buffer_type { + return arg; +} + +pub fn pick(level: Level, cursor: Vec2, arg: buffer_type) buffer_type { + return level.get_tile_at(cursor); +}