feat(console): redraw when children loaded

This commit is contained in:
2025-05-30 19:57:56 +02:00
parent ba172cc8ed
commit 9c4543eb4a

View File

@@ -1,5 +1,6 @@
const Model = struct {
crash: bool = false,
redraw: bool = false,
allocator: std.mem.Allocator,
current_items_view: *vxfw.ListView,
parent_items_view: *vxfw.ListView,
@@ -20,7 +21,10 @@ const Model = struct {
fn typeErasedEventHandler(ptr: *anyopaque, ctx: *vxfw.EventContext, event: vxfw.Event) anyerror!void {
const vm: *Model = @ptrCast(@alignCast(ptr));
switch (event) {
.init => return ctx.requestFocus(vm.current_items_view.widget()),
.init => {
try ctx.tick(8, vm.widget());
return ctx.requestFocus(vm.current_items_view.widget());
},
.key_press => |key| {
if (key.matches('c', .{ .ctrl = true })) {
ctx.quit = true;
@@ -33,6 +37,13 @@ const Model = struct {
}
},
.focus_in => return ctx.requestFocus(vm.current_items_view.widget()),
.tick => {
if (vm.redraw) {
ctx.redraw = true;
}
try ctx.tick(8, vm.widget());
return;
},
else => {},
}
}
@@ -56,6 +67,8 @@ const Model = struct {
fn typeErasedDrawFn(ptr: *anyopaque, ctx: vxfw.DrawContext) std.mem.Allocator.Error!vxfw.Surface {
const vm: *Model = @ptrCast(@alignCast(ptr));
vm.redraw = false;
const rootWidgets = try ctx.arena.create(std.ArrayList(vxfw.SubSurface));
rootWidgets.* = std.ArrayList(vxfw.SubSurface).init(ctx.arena);
@@ -387,18 +400,32 @@ pub fn main() !void {
.children = .{ .slice = items },
};
const model = try allocator.create(Model);
defer allocator.destroy(model);
const childrenLoadedObserver = try allocator.create(Observer(*Tab));
childrenLoadedObserver.* = Observer(*Tab){
.ctx = @ptrCast(@alignCast(model)),
.update = (struct {
fn update(ctx: *anyopaque, _: *Tab) void {
const ctx_model: *Model = @ptrCast(@alignCast(ctx));
ctx_model.redraw = true;
}
}).update,
};
var app_common_model: AppCommonModel = undefined;
{
var appState: AppState = AppState.init(allocator);
try appState.addTab(tab1);
try appState.setCurrentTab(tab1);
const model = try allocator.create(Model);
defer allocator.destroy(model);
try appState.tabChildrenLoaded.attach(childrenLoadedObserver);
var app_common_model: AppCommonModel = undefined;
try AppCommonModel.init(&app_common_model, allocator, appState);
}
defer app_common_model.deinit();
model.* = .{
.allocator = allocator,
.app_common_model = &app_common_model,
@@ -413,17 +440,6 @@ pub fn main() !void {
var app = try vxfw.App.init(allocator);
defer app.deinit();
const childrenLoadedObserver = try allocator.create(Observer(*Tab));
childrenLoadedObserver.* = Observer(*Tab){
.ctx = @ptrCast(@alignCast(&app)),
.update = (struct{fn update(ctx: *anyopaque, _: *Tab)void {
const app1: *vxfw.App = @ptrCast(@alignCast(ctx));
_ = app1;
}}).update,
};
try app_common_model.appState.tabChildrenLoaded.attach(childrenLoadedObserver);
try app.run(model.widget(), .{});
model.app_common_model.usage_number.data -= 1;