67 lines
2.2 KiB
Zig
67 lines
2.2 KiB
Zig
const std = @import("std");
|
|
const dvui = @import("dvui");
|
|
const WindowContext = @import("../WindowContext.zig");
|
|
const Document = @import("../models/Document.zig");
|
|
const json_io = @import("../persistence/json_io.zig");
|
|
|
|
pub fn menuBar(ctx: *WindowContext) void {
|
|
var m = dvui.menu(@src(), .horizontal, .{ .background = true, .expand = .horizontal });
|
|
defer m.deinit();
|
|
|
|
if (dvui.menuItemLabel(@src(), "File", .{ .submenu = true }, .{ .expand = .none })) |r| {
|
|
var fm = dvui.floatingMenu(@src(), .{ .from = r }, .{});
|
|
defer fm.deinit();
|
|
|
|
if (dvui.menuItemLabel(@src(), "Open", .{}, .{ .expand = .horizontal }) != null) {
|
|
m.close();
|
|
openDocumentDialog(ctx);
|
|
}
|
|
|
|
if (dvui.menuItemLabel(@src(), "Save As", .{}, .{ .expand = .horizontal }) != null) {
|
|
m.close();
|
|
saveAsDialog(ctx);
|
|
}
|
|
}
|
|
}
|
|
|
|
fn openDocumentDialog(ctx: *WindowContext) void {
|
|
const path_z = dvui.dialogNativeFileOpen(ctx.allocator, .{
|
|
.title = "Open",
|
|
.filters = &.{ "*.json" },
|
|
.filter_description = "JSON files",
|
|
}) catch |err| {
|
|
std.debug.print("Open dialog error: {}\n", .{err});
|
|
return;
|
|
} orelse return;
|
|
defer ctx.allocator.free(path_z);
|
|
|
|
const path = path_z[0..path_z.len];
|
|
const doc = json_io.loadFromFile(Document, ctx.allocator, path) catch |err| {
|
|
std.debug.print("Open file error: {}\n", .{err});
|
|
return;
|
|
};
|
|
ctx.addDocument(doc) catch |err| {
|
|
std.debug.print("Add document error: {}\n", .{err});
|
|
return;
|
|
};
|
|
}
|
|
|
|
fn saveAsDialog(ctx: *WindowContext) void {
|
|
const open_doc = ctx.activeDocument() orelse return;
|
|
const path_z = dvui.dialogNativeFileSave(ctx.allocator, .{
|
|
.title = "Save As",
|
|
.filters = &.{ "*.json" },
|
|
.filter_description = "JSON files",
|
|
}) catch |err| {
|
|
std.debug.print("Save dialog error: {}\n", .{err});
|
|
return;
|
|
} orelse return;
|
|
defer ctx.allocator.free(path_z);
|
|
|
|
const path_raw = path_z[0..path_z.len];
|
|
json_io.saveToFile(Document, &open_doc.document, path_raw) catch |err| {
|
|
std.debug.print("Save file error: {}\n", .{err});
|
|
return;
|
|
};
|
|
}
|