From 9c4543eb4a8152e7d49b74acbaa411ebe133cbfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81d=C3=A1m=20Kov=C3=A1cs?= Date: Fri, 30 May 2025 19:57:56 +0200 Subject: [PATCH] feat(console): redraw when children loaded --- src/console/main.zig | 54 ++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/src/console/main.zig b/src/console/main.zig index c9c67ff..70900ee 100644 --- a/src/console/main.zig +++ b/src/console/main.zig @@ -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,17 +400,31 @@ pub fn main() !void { .children = .{ .slice = items }, }; - var appState: AppState = AppState.init(allocator); - try appState.addTab(tab1); - try appState.setCurrentTab(tab1); - const model = try allocator.create(Model); defer allocator.destroy(model); - var app_common_model: AppCommonModel = undefined; - try AppCommonModel.init(&app_common_model, allocator, appState); - defer app_common_model.deinit(); + 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); + + try appState.tabChildrenLoaded.attach(childrenLoadedObserver); + + try AppCommonModel.init(&app_common_model, allocator, appState); + } + defer app_common_model.deinit(); model.* = .{ .allocator = allocator, @@ -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;