Разделил главный фрейм UI на отдельные модули: tab_bar, left_panel, right_panel и canvas_view. Это улучшает читаемость и поддерживает принцип единственной ответственности. Также изменил функцию `updateVisibleImageRect`, чтобы она возвращала `bool`, указывающий на необходимость перерисовки.
50 lines
1.6 KiB
Zig
50 lines
1.6 KiB
Zig
const std = @import("std");
|
|
const dvui = @import("dvui");
|
|
const SDLBackend = @import("sdl-backend");
|
|
const WindowContext = @import("WindowContext.zig");
|
|
const ui = @import("ui/frame.zig");
|
|
|
|
pub fn main() !void {
|
|
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
|
const allocator = gpa.allocator();
|
|
|
|
var backend = try SDLBackend.initWindow(.{
|
|
.allocator = allocator,
|
|
.size = .{ .w = 800.0, .h = 600.0 },
|
|
.title = "My DVUI App",
|
|
.vsync = true,
|
|
});
|
|
defer backend.deinit();
|
|
|
|
var win = try dvui.Window.init(@src(), allocator, backend.backend(), .{
|
|
.theme = switch (backend.preferredColorScheme() orelse .light) {
|
|
.light => dvui.Theme.builtin.adwaita_light,
|
|
.dark => dvui.Theme.builtin.adwaita_dark,
|
|
},
|
|
});
|
|
defer win.deinit();
|
|
|
|
var ctx = try WindowContext.init(allocator);
|
|
defer ctx.deinit();
|
|
|
|
var interrupted = false;
|
|
main_loop: while (true) {
|
|
const nstime = win.beginWait(interrupted);
|
|
try win.begin(nstime);
|
|
try backend.addAllEvents(&win);
|
|
|
|
_ = SDLBackend.c.SDL_SetRenderDrawColor(backend.renderer, 0, 0, 0, 255);
|
|
_ = SDLBackend.c.SDL_RenderClear(backend.renderer);
|
|
|
|
if (!ui.guiFrame(&ctx)) break :main_loop;
|
|
|
|
const end_micros = try win.end(.{});
|
|
try backend.setCursor(win.cursorRequested());
|
|
try backend.textInputRect(win.textInputRequested());
|
|
try backend.renderPresent();
|
|
|
|
const wait_event_micros = win.waitTime(end_micros);
|
|
interrupted = try backend.waitEventTimeout(wait_event_micros);
|
|
}
|
|
}
|