|
| 1 | +const std = @import("std"); |
| 2 | +const regz = @import("regz"); |
| 3 | +const dvui = @import("dvui"); |
| 4 | +const VirtualFilesystem = @import("VirtualFilesystem.zig"); |
| 5 | + |
| 6 | +const window_icon_png = @embedFile("zig-favicon.png"); |
| 7 | + |
| 8 | +pub const dvui_app: dvui.App = .{ |
| 9 | + .config = .{ |
| 10 | + .options = .{ |
| 11 | + .size = .{ .w = 800.0, .h = 600.0 }, |
| 12 | + .min_size = .{ .w = 250.0, .h = 350.0 }, |
| 13 | + .title = "Regz Wizard", |
| 14 | + .icon = window_icon_png, |
| 15 | + }, |
| 16 | + }, |
| 17 | + .frameFn = frame, |
| 18 | + .initFn = init, |
| 19 | + .deinitFn = deinit, |
| 20 | +}; |
| 21 | + |
| 22 | +pub const main = dvui.App.main; |
| 23 | +pub const panic = dvui.App.panic; |
| 24 | +pub const std_options: std.Options = .{ |
| 25 | + .logFn = dvui.App.logFn, |
| 26 | +}; |
| 27 | + |
| 28 | +var db: ?*regz.Database = null; |
| 29 | +var debug_allocator: std.heap.DebugAllocator(.{}) = .init; |
| 30 | +const gpa = debug_allocator.allocator(); |
| 31 | +var vfs: VirtualFilesystem = undefined; |
| 32 | +var current_gen_file: usize = 0; |
| 33 | + |
| 34 | +pub fn init(win: *dvui.Window) void { |
| 35 | + _ = win; |
| 36 | + vfs = .init(gpa); |
| 37 | +} |
| 38 | + |
| 39 | +// Run as app is shutting down before dvui.Window.deinit() |
| 40 | +pub fn deinit() void { |
| 41 | + if (db) |d| d.destroy(); |
| 42 | + vfs.deinit(); |
| 43 | + _ = debug_allocator.deinit(); |
| 44 | +} |
| 45 | + |
| 46 | +// TODO: add mechanism to open a file, this creates a brand new db instance. |
| 47 | +// - Some sort of menu bar |
| 48 | +// - File -> Drop down |
| 49 | + |
| 50 | +// Run each frame to do normal UI |
| 51 | +pub fn frame() !dvui.App.Result { |
| 52 | + var scaler = try dvui.scale(@src(), .{ .scale = &dvui.currentWindow().content_scale, .pinch_zoom = .global }, .{ .rect = .cast(dvui.windowRect()) }); |
| 53 | + scaler.deinit(); |
| 54 | + |
| 55 | + var scroll = try dvui.scrollArea(@src(), .{}, .{ .expand = .both, .color_fill = .fill_window }); |
| 56 | + defer scroll.deinit(); |
| 57 | + |
| 58 | + var vbox = try dvui.box(@src(), .vertical, .{ .expand = .both, .margin = .{ .x = 4 } }); |
| 59 | + defer vbox.deinit(); |
| 60 | + |
| 61 | + { |
| 62 | + var m = try dvui.menu(@src(), .horizontal, .{}); |
| 63 | + defer m.deinit(); |
| 64 | + |
| 65 | + if (try dvui.menuItemLabel(@src(), "File", .{ .submenu = true }, .{ .expand = .horizontal })) |r| { |
| 66 | + var fw = try dvui.floatingMenu(@src(), .{ .from = r }, .{}); |
| 67 | + defer fw.deinit(); |
| 68 | + |
| 69 | + if (try dvui.menuItemLabel(@src(), "Open", .{}, .{}) != null) blk: { |
| 70 | + defer fw.close(); |
| 71 | + const filename = try dvui.dialogNativeFileOpen(dvui.currentWindow().arena(), .{ .title = "dvui native file open", .filters = &.{ "*.svd", "*.atdf" }, .filter_description = "images" }); |
| 72 | + if (filename) |f| { |
| 73 | + const ext = std.fs.path.extension(f); |
| 74 | + const format: regz.Database.Format = if (std.mem.eql(u8, ext, ".svd")) |
| 75 | + .svd |
| 76 | + else if (std.mem.eql(u8, ext, ".atdf")) |
| 77 | + .atdf |
| 78 | + else |
| 79 | + break :blk; |
| 80 | + |
| 81 | + if (db) |d| d.destroy(); |
| 82 | + |
| 83 | + vfs.deinit(); |
| 84 | + vfs = .init(gpa); |
| 85 | + |
| 86 | + db = try regz.Database.create_from_path(gpa, format, f); |
| 87 | + try db.?.to_zig(vfs.dir(), .{ .for_microzig = true }); |
| 88 | + } |
| 89 | + } |
| 90 | + |
| 91 | + if (try dvui.menuItemLabel(@src(), "Exit", .{}, .{})) |_| { |
| 92 | + return .close; |
| 93 | + } |
| 94 | + } |
| 95 | + |
| 96 | + if (db != null) if (try dvui.menuItemLabel(@src(), "Edit", .{ .submenu = true }, .{ .expand = .horizontal })) |r| { |
| 97 | + var fw = try dvui.floatingMenu(@src(), .{ .from = r }, .{}); |
| 98 | + defer fw.deinit(); |
| 99 | + |
| 100 | + if (try dvui.menuItemLabel(@src(), "Apply Patches", .{}, .{})) |_| { |
| 101 | + defer fw.close(); |
| 102 | + |
| 103 | + const filename = try dvui.dialogNativeFileOpen(dvui.currentWindow().arena(), .{ .title = "dvui native file open", .filters = &.{"*.json"}, .filter_description = "images" }); |
| 104 | + _ = filename; |
| 105 | + } |
| 106 | + }; |
| 107 | + |
| 108 | + if (try dvui.menuItemLabel(@src(), "View", .{ .submenu = true }, .{ .expand = .horizontal })) |r| { |
| 109 | + var fw = try dvui.floatingMenu(@src(), .{ .from = r }, .{}); |
| 110 | + defer fw.deinit(); |
| 111 | + |
| 112 | + if (try dvui.menuItemLabel(@src(), "Demo Window", .{}, .{})) |_| { |
| 113 | + dvui.Examples.show_demo_window = true; |
| 114 | + fw.close(); |
| 115 | + } |
| 116 | + } |
| 117 | + } |
| 118 | + |
| 119 | + // look at demo() for examples of dvui widgets, shows in a floating window |
| 120 | + try dvui.Examples.demo(); |
| 121 | + |
| 122 | + if (db != null) { |
| 123 | + const entries = vfs.map.keys(); |
| 124 | + _ = try dvui.dropdown(@src(), entries, ¤t_gen_file, .{}); |
| 125 | + |
| 126 | + const current = entries[current_gen_file]; |
| 127 | + |
| 128 | + var font = dvui.themeGet().font_body; |
| 129 | + font.name = "VeraMono"; |
| 130 | + |
| 131 | + var tl = dvui.TextLayoutWidget.init(@src(), .{}, .{ .expand = .horizontal, .font = font }); |
| 132 | + try tl.install(.{}); |
| 133 | + defer tl.deinit(); |
| 134 | + |
| 135 | + try tl.addText(vfs.map.get(current).?, .{ |
| 136 | + .font = font, |
| 137 | + }); |
| 138 | + } |
| 139 | + |
| 140 | + return .ok; |
| 141 | +} |
0 commit comments