From f8738ef5f78f184ba6170886256fe7f65965c775 Mon Sep 17 00:00:00 2001 From: ihaveahax Date: Mon, 2 Dec 2024 23:31:13 -0600 Subject: [PATCH] add fs.ask_select_file and fs.ask_select_dir --- arm9/source/lua/gm9internalfs.c | 55 ++++++++++++++++++++++++++++++ arm9/source/lua/gm9lua.c | 2 -- arm9/source/lua/gm9lua.h | 11 ++++-- command comparison table.ods | Bin 25387 -> 26093 bytes data/luapackages/fs.lua | 2 ++ data/luascripts/selector-test.lua | 21 ++++++++++++ flake.nix | 1 + 7 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 data/luascripts/selector-test.lua diff --git a/arm9/source/lua/gm9internalfs.c b/arm9/source/lua/gm9internalfs.c index 4474d4cd..756360d8 100644 --- a/arm9/source/lua/gm9internalfs.c +++ b/arm9/source/lua/gm9internalfs.c @@ -217,6 +217,59 @@ static int internalfs_dir_info(lua_State* L) { return 1; } +static int FileDirSelector(lua_State* L, const char* path_orig, const char* prompt, bool is_dir, bool include_dirs, bool explorer) { + bool ret; + char path[_VAR_CNT_LEN] = { 0 }; + char choice[_VAR_CNT_LEN] = { 0 }; + strncpy(path, path_orig, _VAR_CNT_LEN); + if (strncmp(path, "Z:", 2) == 0) { + return luaL_error(L, "forbidden drive"); + } else if (!is_dir) { + u32 flags_ext = include_dirs ? 0 : NO_DIRS; + char *npattern = strrchr(path, '/'); + if (!npattern) { + return luaL_error(L, "invalid path"); + } + *(npattern++) = '\0'; + ret = FileSelector(choice, prompt, path, npattern, flags_ext, explorer); + } else { + ret = FileSelector(choice, prompt, path, NULL, NO_FILES | SELECT_DIRS, explorer); + } + + if (ret) { + lua_pushstring(L, choice); + } else { + lua_pushnil(L); + } + return 1; +} + +static int internalfs_ask_select_file(lua_State* L) { + bool extra = CheckLuaArgCountPlusExtra(L, 2, "_fs.ask_select_file"); + const char* prompt = luaL_checkstring(L, 1); + const char* path = luaL_checkstring(L, 2); + + u32 flags = 0; + if (extra) { + flags = GetFlagsFromTable(L, 3, flags, INCLUDE_DIRS | EXPLORER); + }; + + return FileDirSelector(L, path, prompt, false, (flags & INCLUDE_DIRS), (flags & EXPLORER)); +} + +static int internalfs_ask_select_dir(lua_State* L) { + bool extra = CheckLuaArgCountPlusExtra(L, 2, "_fs.ask_select_dir"); + const char* prompt = luaL_checkstring(L, 1); + const char* path = luaL_checkstring(L, 2); + + u32 flags = 0; + if (extra) { + flags = GetFlagsFromTable(L, 3, flags, EXPLORER); + }; + + return FileDirSelector(L, path, prompt, true, true, (flags & EXPLORER)); +} + static int internalfs_exists(lua_State* L) { CheckLuaArgCount(L, 1, "_fs.exists"); const char* path = luaL_checkstring(L, 1); @@ -537,6 +590,8 @@ static const luaL_Reg internalfs_lib[] = { {"stat", internalfs_stat}, {"stat_fs", internalfs_stat_fs}, {"dir_info", internalfs_dir_info}, + {"ask_select_file", internalfs_ask_select_file}, + {"ask_select_dir", internalfs_ask_select_dir}, {"exists", internalfs_exists}, {"is_dir", internalfs_is_dir}, {"is_file", internalfs_is_file}, diff --git a/arm9/source/lua/gm9lua.c b/arm9/source/lua/gm9lua.c index 0e817329..c90b0ffc 100644 --- a/arm9/source/lua/gm9lua.c +++ b/arm9/source/lua/gm9lua.c @@ -16,8 +16,6 @@ #include "gm9internalsys.h" #define DEBUGSP(x) ShowPrompt(false, (x)) -// this is taken from scripting.c -#define _VAR_CNT_LEN 256 typedef struct GM9LuaLoadF { int n; // pre-read characters diff --git a/arm9/source/lua/gm9lua.h b/arm9/source/lua/gm9lua.h index d1c57076..0942666f 100644 --- a/arm9/source/lua/gm9lua.h +++ b/arm9/source/lua/gm9lua.h @@ -10,14 +10,19 @@ #define TO_EMUNAND (1UL<<12) #define LEGIT (1UL<<13) #define FIND_FIRST (1UL<<14) +#define INCLUDE_DIRS (1UL<<15) +#define EXPLORER (1UL<<16) -#define FLAGS_STR "no_cancel", "silent", "calc_sha", "sha1", "skip", "overwrite_all", "append_all", "all", "recursive", "to_emunand", "legit", "first" -#define FLAGS_CONSTS NO_CANCEL, SILENT, CALC_SHA, USE_SHA1, SKIP_ALL, OVERWRITE_ALL, APPEND_ALL, ASK_ALL, RECURSIVE, TO_EMUNAND, LEGIT, FIND_FIRST -#define FLAGS_COUNT 12 +#define FLAGS_STR "no_cancel", "silent", "calc_sha", "sha1", "skip", "overwrite_all", "append_all", "all", "recursive", "to_emunand", "legit", "first", "include_dirs", "explorer" +#define FLAGS_CONSTS NO_CANCEL, SILENT, CALC_SHA, USE_SHA1, SKIP_ALL, OVERWRITE_ALL, APPEND_ALL, ASK_ALL, RECURSIVE, TO_EMUNAND, LEGIT, FIND_FIRST, INCLUDE_DIRS, EXPLORER +#define FLAGS_COUNT 14 #define LUASCRIPT_EXT "lua" #define LUASCRIPT_MAX_SIZE STD_BUFFER_SIZE +// taken from arm9/source/utils/scripting.c +#define _VAR_CNT_LEN 256 + #ifndef NO_LUA static inline void CheckLuaArgCount(lua_State* L, int argcount, const char* cmd) { int args = lua_gettop(L); diff --git a/command comparison table.ods b/command comparison table.ods index ec7ecc5dd4d617027484fae03ae1427255630bc0..3d7fe8120222daafe06d3670379c4b5f95863ded 100644 GIT binary patch delta 23769 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 delta 23138 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 I?0jndKM~G@Gynhq diff --git a/data/luapackages/fs.lua b/data/luapackages/fs.lua index 71e78f0d..b9341b3f 100644 --- a/data/luapackages/fs.lua +++ b/data/luapackages/fs.lua @@ -8,6 +8,8 @@ fs.list_dir = _fs.list_dir fs.stat = _fs.stat fs.stat_fs = _fs.stat_fs fs.dir_info = _fs.dir_info +fs.ask_select_file = _fs.ask_select_file +fs.ask_select_dir = _fs.ask_select_dir fs.exists = _fs.exists fs.is_dir = _fs.is_dir fs.is_file = _fs.is_file diff --git a/data/luascripts/selector-test.lua b/data/luascripts/selector-test.lua new file mode 100644 index 00000000..5c62c042 --- /dev/null +++ b/data/luascripts/selector-test.lua @@ -0,0 +1,21 @@ +for i, v in pairs({"9:/test_1", "9:/test_2", "9:/extradir_3"}) do + print("Making dir", v) + fs.mkdir(v) +end + +for i, v in pairs({"9:/test_1.bin", "9:/test_2.bin", "9:/extratest_3.bin", "9:/test_2/thingy.txt"}) do + print("Touching file", v) + fs.write_file(v, 0, "a") +end + +print() +print("Selected:", fs.ask_select_file("Select a file!", "9:/test_*")) +print("Selected:", fs.ask_select_file("Select a file! (explorer)", "9:/test_*", {explorer=true})) + +print("Selected:", fs.ask_select_dir("Select a directory!", "9:/")) +print("Selected:", fs.ask_select_dir("Select a directory! (explorer)", "9:/", {explorer=true})) + +print("Selected:", fs.ask_select_file("Select a file OR directory!", "9:/test_*", {include_dirs=true})) +print("Selected:", fs.ask_select_file("Select a file OR directory! (explorer)", "9:/test_*", {include_dirs=true, explorer=true})) +print("Done") +ui.echo("Done") diff --git a/flake.nix b/flake.nix index 5636b919..29a878e2 100644 --- a/flake.nix +++ b/flake.nix @@ -12,6 +12,7 @@ pkgs.devkitNix.devkitARM python3Packages.python ( python3Packages.callPackage ./firmtool.nix { } ) + lua54Packages.lua ]; inherit (pkgs.devkitNix.devkitARM) shellHook;