feat(buffers): add support for ephemeral buffers

Ephemeral buffers are not hidden and kept when closed. Ephemeral buffers
can be turned into regular buffers by saving them with save_as.
This commit is contained in:
CJ van den Berg 2025-01-27 18:59:13 +01:00
parent 8062923068
commit 939537ed84
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9
7 changed files with 92 additions and 18 deletions

View file

@ -40,6 +40,7 @@ file_eol_mode: EolMode = .lf,
last_save_eol_mode: EolMode = .lf,
file_utf8_sanitized: bool = false,
hidden: bool = false,
ephemeral: bool = false,
undo_history: ?*UndoNode = null,
redo_history: ?*UndoNode = null,
@ -1279,6 +1280,7 @@ pub const StoreToFileError = error{
NotDir,
NotOpenForWriting,
OperationAborted,
OutOfMemory,
PathAlreadyExists,
PipeBusy,
ProcessFdQuotaExceeded,
@ -1315,12 +1317,24 @@ pub fn store_to_file_and_clean(self: *Self, file_path: []const u8) StoreToFileEr
self.last_save_eol_mode = self.file_eol_mode;
self.file_exists = true;
self.file_utf8_sanitized = false;
if (self.ephemeral) {
self.ephemeral = false;
self.file_path = try self.allocator.dupe(u8, file_path);
}
}
pub fn mark_clean(self: *Self) void {
self.last_save = self.root;
}
pub fn is_hidden(self: *const Self) bool {
return self.hidden;
}
pub fn is_ephemeral(self: *const Self) bool {
return self.ephemeral;
}
pub fn is_dirty(self: *const Self) bool {
return if (!self.file_exists)
self.root.length() > 0

View file

@ -47,6 +47,7 @@ pub fn open_scratch(self: *Self, file_path: []const u8, content: []const u8) Buf
};
buffer.update_last_used_time();
buffer.hidden = false;
buffer.ephemeral = true;
return buffer;
}
@ -56,11 +57,23 @@ pub fn get_buffer_for_file(self: *Self, file_path: []const u8) ?*Buffer {
pub fn delete_buffer(self: *Self, file_path: []const u8) bool {
const buffer = self.buffers.get(file_path) orelse return false;
const did_remove = self.buffers.remove(file_path);
buffer.deinit();
return self.buffers.remove(file_path);
return did_remove;
}
pub fn retire(_: *Self, _: *Buffer) void {}
pub fn retire(_: *Self, buffer: *Buffer) void {
tp.trace(tp.channel.debug, .{ "buffer", "retire", buffer.file_path, "hidden", buffer.hidden, "ephemeral", buffer.ephemeral });
}
pub fn close_buffer(self: *Self, buffer: *Buffer) void {
buffer.hidden = true;
tp.trace(tp.channel.debug, .{ "buffer", "close", buffer.file_path, "hidden", buffer.hidden, "ephemeral", buffer.ephemeral });
if (buffer.is_ephemeral()) {
_ = self.buffers.remove(buffer.file_path);
buffer.deinit();
}
}
pub fn list_most_recently_used(self: *Self, allocator: std.mem.Allocator) error{OutOfMemory}![]*Buffer {
const result = try self.list_unordered(allocator);
@ -98,7 +111,10 @@ pub fn save_all(self: *const Self) Buffer.StoreToFileError!void {
var i = self.buffers.iterator();
while (i.next()) |kv| {
const buffer = kv.value_ptr.*;
try buffer.store_to_file_and_clean(buffer.file_path);
if (buffer.is_ephemeral())
buffer.mark_clean()
else
try buffer.store_to_file_and_clean(buffer.file_path);
}
}