flow/src/buffer/Selection.zig

74 lines
1.9 KiB
Zig

const cbor = @import("cbor");
const Writer = @import("std").Io.Writer;
const Buffer = @import("Buffer.zig");
const Cursor = @import("Cursor.zig");
begin: Cursor = Cursor{},
end: Cursor = Cursor{},
const Self = @This();
pub const Style = enum { normal, inclusive };
pub inline fn eql(self: Self, other: Self) bool {
return self.begin.eql(other.begin) and self.end.eql(other.end);
}
pub fn from_cursor(cursor: *const Cursor) Self {
return .{ .begin = cursor.*, .end = cursor.* };
}
pub fn line_from_cursor(cursor: Cursor, root: Buffer.Root, mtrx: Buffer.Metrics) Self {
var begin = cursor;
var end = cursor;
begin.move_begin();
end.move_end(root, mtrx);
end.move_right(root, mtrx) catch {};
return .{ .begin = begin, .end = end };
}
pub fn empty(self: *const Self) bool {
return self.begin.eql(self.end);
}
pub fn reverse(self: *Self) void {
const tmp = self.begin;
self.begin = self.end;
self.end = tmp;
}
pub inline fn is_reversed(self: *const Self) bool {
return self.begin.right_of(self.end);
}
pub fn normalize(self: *Self) void {
if (self.is_reversed()) self.reverse();
}
pub fn write(self: *const Self, writer: *Writer) !void {
try cbor.writeArrayHeader(writer, 2);
try self.begin.write(writer);
try self.end.write(writer);
}
pub fn extract(self: *Self, iter: *[]const u8) !bool {
var iter2 = iter.*;
const len = cbor.decodeArrayHeader(&iter2) catch return false;
if (len != 2) return false;
if (!try self.begin.extract(&iter2)) return false;
if (!try self.end.extract(&iter2)) return false;
iter.* = iter2;
return true;
}
pub fn nudge_insert(self: *Self, nudge: Self) void {
self.begin.nudge_insert(nudge);
self.end.nudge_insert(nudge);
}
pub fn nudge_delete(self: *Self, nudge: Self) bool {
if (!self.begin.nudge_delete(nudge))
return false;
return self.end.nudge_delete(nudge);
}