const std = @import("std"); const raylib = @import("raylib.zig"); const c = @cImport({ @cInclude("sqlite3.h"); }); pub fn main() !void { const alloc = std.heap.page_allocator; const screen_width = 800; const screen_height = 450; raylib.InitWindow(screen_width, screen_height, "FabApp"); raylib.SetTargetFPS(60); var file_dialog_state = raylib.InitGuiWindowFileDialog(raylib.GetWorkingDirectory()); // const ext = ".sqlite3"; // @memcpy(file_dialog_state.filterExt[0..ext.len], ext); var db: ?*c.sqlite3 = undefined; while (!raylib.WindowShouldClose()) { // // Update // { if (file_dialog_state.SelectFilePressed) { // C-strings -> slices const dir = std.mem.sliceTo(&file_dialog_state.dirPathText, 0); const file = std.mem.sliceTo(&file_dialog_state.fileNameText, 0); // slices -> C-string (null-terminated) const db_path = try std.fs.path.joinZ(alloc, &[_][]const u8{ dir, file }); defer alloc.free(db_path); const result = c.sqlite3_open(db_path.ptr, &db); if (result != c.SQLITE_OK or db == null) { std.debug.print("[SQLite] err {}: {s}\n", .{ result, c.sqlite3_errmsg(db) }); _ = c.sqlite3_close(db); } else { std.debug.print("[SQLite] Success\n", .{}); } } file_dialog_state.SelectFilePressed = false; } // // Render // { raylib.BeginDrawing(); defer raylib.EndDrawing(); raylib.ClearBackground(raylib.RAYWHITE); { if (file_dialog_state.windowActive) raylib.GuiLock(); defer raylib.GuiUnlock(); const button_size = 200; if (raylib.GuiButton(.{ .x = (screen_width - button_size) / 2, .y = (screen_height - button_size) / 2, .width = 200, .height = 200 }, "Load db file") == 1) { file_dialog_state.windowActive = true; } } raylib.GuiWindowFileDialog(&file_dialog_state); } } raylib.CloseWindow(); } test "simple test" { var list = std.ArrayList(i32).init(std.testing.allocator); defer list.deinit(); // try commenting this out and see if zig detects the memory leak! try list.append(42); try std.testing.expectEqual(@as(i32, 42), list.pop()); }