From e8167c2e560402510220fdf419afbc7c2fc51e5d Mon Sep 17 00:00:00 2001 From: leonardo-kr <65019724+leonardo-kr@users.noreply.github.com> Date: Wed, 23 Jul 2025 16:24:56 +0200 Subject: [PATCH] add dropped files example (#260) * add dropped files example * reformat build.zig --- build.zig | 7 ++- examples/core/drop_files.zig | 102 +++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 examples/core/drop_files.zig diff --git a/build.zig b/build.zig index df4dc65..dbc8267 100644 --- a/build.zig +++ b/build.zig @@ -31,7 +31,7 @@ fn getRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.buil .linux_display_backend = options.linux_display_backend, .opengl_version = options.opengl_version, .android_api_version = options.android_api_version, - .android_ndk = options.android_ndk + .android_ndk = options.android_ndk, }); const raylib = raylib_dep.artifact("raylib"); @@ -164,6 +164,11 @@ pub fn build(b: *std.Build) !void { .path = "examples/core/3d_picking.zig", .desc = "Shows picking in 3d mode", }, + .{ + .name = "drop_files", + .path = "examples/core/drop_files.zig", + .desc = "Demonstrates how to implement a drop files functionality", + }, .{ .name = "window_flags", .path = "examples/core/window_flags.zig", diff --git a/examples/core/drop_files.zig b/examples/core/drop_files.zig new file mode 100644 index 0000000..dbcc781 --- /dev/null +++ b/examples/core/drop_files.zig @@ -0,0 +1,102 @@ +// raylib-zig (c) Leonardo Kreienbuehl 2025 + +const rl = @import("raylib"); +const std = @import("std"); + +const MAX_FILEPATH_RECORDED = 4096; +const MAX_FILEPATH_SIZE = 2048; + +pub fn main() anyerror!void { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 450; + + rl.initWindow(screenWidth, screenHeight, "raylib-zig [core] example - drop files"); + defer rl.closeWindow(); // Close window and OpenGL context + + var filePathCounter: usize = 0; + var filePaths: [MAX_FILEPATH_RECORDED][MAX_FILEPATH_SIZE]u8 = std.mem.zeroes([MAX_FILEPATH_RECORDED][MAX_FILEPATH_SIZE]u8); + + rl.setTargetFPS(60); + + // Main game loop + while (!rl.windowShouldClose()) { + // Update + //---------------------------------------------------------------------------------- + if (rl.isFileDropped()) { + const droppedFiles: rl.FilePathList = rl.loadDroppedFiles(); + + for (0..droppedFiles.count) |i| { + const offset: usize = @as(usize, @intCast(filePathCounter)); + const droppedFilePathLength: usize = std.mem.len(droppedFiles.paths[i]); + + if (filePathCounter < (MAX_FILEPATH_RECORDED - 1)) { + _ = rl.textCopy( + @ptrCast(@constCast(&filePaths[offset])), + droppedFiles.paths[i][0..droppedFilePathLength :0], + ); + filePathCounter += 1; + } + } + + rl.unloadDroppedFiles(droppedFiles); + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.beginDrawing(); + defer rl.endDrawing(); + + rl.clearBackground(rl.Color.ray_white); + + if (filePathCounter == 0) { + rl.drawText( + "Drop your files to this window!", + 100, + 40, + 20, + rl.Color.dark_gray, + ); + } else { + rl.drawText( + "Dropped files:", + 100, + 40, + 20, + rl.Color.dark_gray, + ); + + for (0..filePathCounter) |i| { + const castedI: i32 = @intCast(i); + if (@mod(i, 2) == 0) { + rl.drawRectangle( + 0, + 85 + 40 * castedI, + screenWidth, + 40, + rl.fade(rl.Color.light_gray, 0.5), + ); + } else { + rl.drawRectangle( + 0, + 85 + 40 * castedI, + screenWidth, + 40, + rl.fade(rl.Color.light_gray, 0.3), + ); + } + + rl.drawText( + filePaths[i][0 .. MAX_FILEPATH_SIZE - 1 :0], + 120, + 100 + 40 * castedI, + 10, + rl.Color.gray, + ); + } + } + //---------------------------------------------------------------------------------- + } +}