feat(console): redraw when children loaded
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
const Model = struct {
|
const Model = struct {
|
||||||
crash: bool = false,
|
crash: bool = false,
|
||||||
|
redraw: bool = false,
|
||||||
allocator: std.mem.Allocator,
|
allocator: std.mem.Allocator,
|
||||||
current_items_view: *vxfw.ListView,
|
current_items_view: *vxfw.ListView,
|
||||||
parent_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 {
|
fn typeErasedEventHandler(ptr: *anyopaque, ctx: *vxfw.EventContext, event: vxfw.Event) anyerror!void {
|
||||||
const vm: *Model = @ptrCast(@alignCast(ptr));
|
const vm: *Model = @ptrCast(@alignCast(ptr));
|
||||||
switch (event) {
|
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| {
|
.key_press => |key| {
|
||||||
if (key.matches('c', .{ .ctrl = true })) {
|
if (key.matches('c', .{ .ctrl = true })) {
|
||||||
ctx.quit = true;
|
ctx.quit = true;
|
||||||
@@ -33,6 +37,13 @@ const Model = struct {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
.focus_in => return ctx.requestFocus(vm.current_items_view.widget()),
|
.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 => {},
|
else => {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -56,6 +67,8 @@ const Model = struct {
|
|||||||
|
|
||||||
fn typeErasedDrawFn(ptr: *anyopaque, ctx: vxfw.DrawContext) std.mem.Allocator.Error!vxfw.Surface {
|
fn typeErasedDrawFn(ptr: *anyopaque, ctx: vxfw.DrawContext) std.mem.Allocator.Error!vxfw.Surface {
|
||||||
const vm: *Model = @ptrCast(@alignCast(ptr));
|
const vm: *Model = @ptrCast(@alignCast(ptr));
|
||||||
|
vm.redraw = false;
|
||||||
|
|
||||||
const rootWidgets = try ctx.arena.create(std.ArrayList(vxfw.SubSurface));
|
const rootWidgets = try ctx.arena.create(std.ArrayList(vxfw.SubSurface));
|
||||||
rootWidgets.* = std.ArrayList(vxfw.SubSurface).init(ctx.arena);
|
rootWidgets.* = std.ArrayList(vxfw.SubSurface).init(ctx.arena);
|
||||||
|
|
||||||
@@ -387,18 +400,32 @@ pub fn main() !void {
|
|||||||
.children = .{ .slice = items },
|
.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);
|
var appState: AppState = AppState.init(allocator);
|
||||||
try appState.addTab(tab1);
|
try appState.addTab(tab1);
|
||||||
try appState.setCurrentTab(tab1);
|
try appState.setCurrentTab(tab1);
|
||||||
|
|
||||||
const model = try allocator.create(Model);
|
try appState.tabChildrenLoaded.attach(childrenLoadedObserver);
|
||||||
defer allocator.destroy(model);
|
|
||||||
|
|
||||||
var app_common_model: AppCommonModel = undefined;
|
|
||||||
try AppCommonModel.init(&app_common_model, allocator, appState);
|
try AppCommonModel.init(&app_common_model, allocator, appState);
|
||||||
|
}
|
||||||
defer app_common_model.deinit();
|
defer app_common_model.deinit();
|
||||||
|
|
||||||
|
|
||||||
model.* = .{
|
model.* = .{
|
||||||
.allocator = allocator,
|
.allocator = allocator,
|
||||||
.app_common_model = &app_common_model,
|
.app_common_model = &app_common_model,
|
||||||
@@ -413,17 +440,6 @@ pub fn main() !void {
|
|||||||
var app = try vxfw.App.init(allocator);
|
var app = try vxfw.App.init(allocator);
|
||||||
defer app.deinit();
|
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(), .{});
|
try app.run(model.widget(), .{});
|
||||||
|
|
||||||
model.app_common_model.usage_number.data -= 1;
|
model.app_common_model.usage_number.data -= 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user