Parameter buffer (#6)

This commit is contained in:
KikooDX 2021-03-13 00:40:31 +01:00
parent b36001e209
commit 165d605eec
6 changed files with 55 additions and 2 deletions

View File

@ -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:
* `<return>`: normal mode, default
* `i`: free selection mode

BIN
level.kble Normal file

Binary file not shown.

View File

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

View File

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

View File

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

17
src/parameter_buffer.zig Normal file
View File

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