From 1ddb43b990129df50b3a94cf451b3e8f078ba149 Mon Sep 17 00:00:00 2001 From: "Lars A. Doucet" Date: Thu, 17 Dec 2015 10:34:41 -0600 Subject: [PATCH] CFFI hookups for nfd "open directory" functionality --- lime/ui/FileDialog.hx | 13 +++++++++++-- lime/ui/FileDialogType.hx | 1 + project/include/ui/FileDialog.h | 1 + project/src/ExternalInterface.cpp | 12 ++++++++++++ project/src/ui/FileDialog.cpp | 28 ++++++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 2 deletions(-) diff --git a/lime/ui/FileDialog.hx b/lime/ui/FileDialog.hx index 5d3d5e541..4427fa894 100644 --- a/lime/ui/FileDialog.hx +++ b/lime/ui/FileDialog.hx @@ -52,6 +52,10 @@ class FileDialog { worker.sendComplete (lime_file_dialog_open_files (filter, defaultPath)); + case OPEN_DIRECTORY: + + worker.sendComplete (lime_file_dialog_open_directory (filter, defaultPath)); + case SAVE: worker.sendComplete (lime_file_dialog_save_file (filter, defaultPath)); @@ -64,7 +68,7 @@ class FileDialog { switch (type) { - case OPEN, SAVE: + case OPEN, OPEN_DIRECTORY, SAVE: var path:String = cast result; @@ -108,6 +112,10 @@ class FileDialog { case OPEN: path = lime_file_dialog_open_file (filter, defaultPath); + + case OPEN_DIRECTORY: + + path = lime_file_dialog_open_directory (filter, defaultPath); case OPEN_MULTIPLE: @@ -121,7 +129,7 @@ class FileDialog { switch (type) { - case OPEN, SAVE: + case OPEN, OPEN_DIRECTORY, SAVE: if (path != null) { @@ -301,6 +309,7 @@ class FileDialog { #if (cpp || neko || nodejs) + @:cffi private static function lime_file_dialog_open_directory (filter:String, defaultPath:String):Dynamic; @:cffi private static function lime_file_dialog_open_file (filter:String, defaultPath:String):Dynamic; @:cffi private static function lime_file_dialog_open_files (filter:String, defaultPath:String):Dynamic; @:cffi private static function lime_file_dialog_save_file (filter:String, defaultPath:String):Dynamic; diff --git a/lime/ui/FileDialogType.hx b/lime/ui/FileDialogType.hx index de9bfc0aa..095fe4480 100644 --- a/lime/ui/FileDialogType.hx +++ b/lime/ui/FileDialogType.hx @@ -6,5 +6,6 @@ enum FileDialogType { OPEN; OPEN_MULTIPLE; SAVE; + OPEN_DIRECTORY; } \ No newline at end of file diff --git a/project/include/ui/FileDialog.h b/project/include/ui/FileDialog.h index 3a765669a..815c77f6e 100644 --- a/project/include/ui/FileDialog.h +++ b/project/include/ui/FileDialog.h @@ -12,6 +12,7 @@ namespace lime { public: + static const char* OpenDirectory (const char* filter = 0, const char* defaultPath = 0); static const char* OpenFile (const char* filter = 0, const char* defaultPath = 0); static void OpenFiles (std::vector* files, const char* filter = 0, const char* defaultPath = 0); static const char* SaveFile (const char* filter = 0, const char* defaultPath = 0); diff --git a/project/src/ExternalInterface.cpp b/project/src/ExternalInterface.cpp index 26bd4f7bf..34f77b62a 100644 --- a/project/src/ExternalInterface.cpp +++ b/project/src/ExternalInterface.cpp @@ -264,6 +264,17 @@ namespace lime { } + value lime_file_dialog_open_directory (HxString filter, HxString defaultPath) { + + #ifdef LIME_NFD + const char* path = FileDialog::OpenDirectory (filter.__s, defaultPath.__s); + return path ? alloc_string (path) : alloc_null (); + #endif + + return 0; + + } + value lime_file_dialog_open_file (HxString filter, HxString defaultPath) { #ifdef LIME_NFD @@ -1410,6 +1421,7 @@ namespace lime { DEFINE_PRIME1 (lime_cffi_set_finalizer); DEFINE_PRIME0 (lime_clipboard_get_text); DEFINE_PRIME1v (lime_clipboard_set_text); + DEFINE_PRIME2 (lime_file_dialog_open_directory); DEFINE_PRIME2 (lime_file_dialog_open_file); DEFINE_PRIME2 (lime_file_dialog_open_files); DEFINE_PRIME2 (lime_file_dialog_save_file); diff --git a/project/src/ui/FileDialog.cpp b/project/src/ui/FileDialog.cpp index af1a299ac..9bd7fe0c9 100644 --- a/project/src/ui/FileDialog.cpp +++ b/project/src/ui/FileDialog.cpp @@ -6,6 +6,34 @@ namespace lime { + const char* FileDialog::OpenDirectory (const char* filter, const char* defaultPath) { + + nfdchar_t *savePath = 0; + nfdresult_t result = NFD_OpenDirectoryDialog (filter, defaultPath, &savePath); + + switch (result) { + + case NFD_OKAY: + + return savePath; + break; + + case NFD_CANCEL: + + break; + + default: + + printf ("Error: %s\n", NFD_GetError ()); + break; + + } + + return savePath; + + } + + const char* FileDialog::OpenFile (const char* filter, const char* defaultPath) { nfdchar_t *savePath = 0;