From e2d0a86d3ed9f86b1eb82b7af69d0e2a5bc4d7b0 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 17 Oct 2024 17:06:51 +0300 Subject: [PATCH] merge js stuff by Willy-JL --- applications/system/js_app/application.fam | 8 ++++ applications/system/js_app/js_thread.c | 2 +- .../js_app/modules/js_gui/file_picker.c | 47 +++++++++++++++++++ .../system/js_app/types/gui/file_picker.d.ts | 6 +++ 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 applications/system/js_app/modules/js_gui/file_picker.c create mode 100644 applications/system/js_app/types/gui/file_picker.d.ts diff --git a/applications/system/js_app/application.fam b/applications/system/js_app/application.fam index 3dabee4b0..fd9f0fe09 100644 --- a/applications/system/js_app/application.fam +++ b/applications/system/js_app/application.fam @@ -90,6 +90,14 @@ App( sources=["modules/js_gui/dialog.c"], ) +App( + appid="js_gui__file_picker", + apptype=FlipperAppType.PLUGIN, + entry_point="js_gui_file_picker_ep", + requires=["js_app"], + sources=["modules/js_gui/file_picker.c"], +) + App( appid="js_notification", apptype=FlipperAppType.PLUGIN, diff --git a/applications/system/js_app/js_thread.c b/applications/system/js_app/js_thread.c index c448945de..d26fe1fb0 100644 --- a/applications/system/js_app/js_thread.c +++ b/applications/system/js_app/js_thread.c @@ -198,7 +198,7 @@ static void js_require(struct mjs* mjs) { static void js_global_to_string(struct mjs* mjs) { int base = 10; if(mjs_nargs(mjs) > 1) base = mjs_get_int(mjs, mjs_arg(mjs, 1)); - double num = mjs_get_int(mjs, mjs_arg(mjs, 0)); + double num = mjs_get_double(mjs, mjs_arg(mjs, 0)); char tmp_str[] = "-2147483648"; itoa(num, tmp_str, base); mjs_val_t ret = mjs_mk_string(mjs, tmp_str, ~0, true); diff --git a/applications/system/js_app/modules/js_gui/file_picker.c b/applications/system/js_app/modules/js_gui/file_picker.c new file mode 100644 index 000000000..49cf5e89d --- /dev/null +++ b/applications/system/js_app/modules/js_gui/file_picker.c @@ -0,0 +1,47 @@ +#include "../../js_modules.h" +#include +#include + +static void js_gui_file_picker_pick_file(struct mjs* mjs) { + const char *base_path, *extension; + JS_FETCH_ARGS_OR_RETURN(mjs, JS_EXACTLY, JS_ARG_STR(&base_path), JS_ARG_STR(&extension)); + + DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); + const DialogsFileBrowserOptions browser_options = { + .extension = extension, + .icon = &I_file_10px, + .base_path = base_path, + }; + FuriString* path = furi_string_alloc_set(base_path); + if(dialog_file_browser_show(dialogs, path, path, &browser_options)) { + mjs_return(mjs, mjs_mk_string(mjs, furi_string_get_cstr(path), ~0, true)); + } else { + mjs_return(mjs, MJS_UNDEFINED); + } + furi_string_free(path); + furi_record_close(RECORD_DIALOGS); +} + +static void* js_gui_file_picker_create(struct mjs* mjs, mjs_val_t* object, JsModules* modules) { + UNUSED(modules); + *object = mjs_mk_object(mjs); + mjs_set(mjs, *object, "pickFile", ~0, MJS_MK_FN(js_gui_file_picker_pick_file)); + return NULL; +} + +static const JsModuleDescriptor js_gui_file_picker_desc = { + "gui__file_picker", + js_gui_file_picker_create, + NULL, + NULL, +}; + +static const FlipperAppPluginDescriptor plugin_descriptor = { + .appid = PLUGIN_APP_ID, + .ep_api_version = PLUGIN_API_VERSION, + .entry_point = &js_gui_file_picker_desc, +}; + +const FlipperAppPluginDescriptor* js_gui_file_picker_ep(void) { + return &plugin_descriptor; +} diff --git a/applications/system/js_app/types/gui/file_picker.d.ts b/applications/system/js_app/types/gui/file_picker.d.ts new file mode 100644 index 000000000..2051e1432 --- /dev/null +++ b/applications/system/js_app/types/gui/file_picker.d.ts @@ -0,0 +1,6 @@ +/** + * @brief Displays a file picker and returns the selected file, or undefined if cancelled + * @param basePath The path to start at + * @param extension The file extension(s) to show (like `.sub`, `.iso|.img`, `*`) + */ +export declare function pickFile(basePath: string, extension: string): string | undefined;