diff --git a/src/gui/fileDialog.cpp b/src/gui/fileDialog.cpp index 68e275a08..6238e625e 100644 --- a/src/gui/fileDialog.cpp +++ b/src/gui/fileDialog.cpp @@ -191,9 +191,8 @@ bool FurnaceGUIFileDialog::openLoad(String header, std::vector filter, S } #endif - // TODO: clickCallback newFilePicker->setHomeDir(getHomeDir()); - newFilePicker->open(header+"###FileDialog",path,hint,FP_FLAGS_MODAL|(allowMultiple?FP_FLAGS_MULTI_SELECT:0),filter); + newFilePicker->open(header+"###FileDialog",path,hint,FP_FLAGS_MODAL|(allowMultiple?FP_FLAGS_MULTI_SELECT:0),filter,clickCallback); } opened=true; return true; diff --git a/src/gui/newFilePicker.cpp b/src/gui/newFilePicker.cpp index bd1391915..eeb881eef 100644 --- a/src/gui/newFilePicker.cpp +++ b/src/gui/newFilePicker.cpp @@ -1029,6 +1029,21 @@ void FurnaceFilePicker::drawFileList(ImVec2& tableSize, bool& acknowledged) { acknowledged=true; } } + + // trigger callback if set + if (selCallback!=NULL) { + String callbackPath; + if (path.empty()) { + callbackPath=i->name; + } else { + if (*path.rbegin()==DIR_SEPARATOR) { + callbackPath=path+i->name; + } else { + callbackPath=path+DIR_SEPARATOR+i->name; + } + } + selCallback(callbackPath.c_str()); + } } } ImGui::PopID(); @@ -1720,7 +1735,7 @@ bool FurnaceFilePicker::isOpened() { return isOpen; } -bool FurnaceFilePicker::open(String name, String pa, String hint, int flags, const std::vector& filter) { +bool FurnaceFilePicker::open(String name, String pa, String hint, int flags, const std::vector& filter, FilePickerSelectCallback selectCallback) { if (isOpen) return false; if (filter.size()&1) { logE("invalid filter data! it should be an even-sized vector with even elements containing names and odd ones being the filters."); @@ -1742,6 +1757,8 @@ bool FurnaceFilePicker::open(String name, String pa, String hint, int flags, con } curFilterType=0; + selectCallback=selCallback; + if (!isSearch || windowName!=name) { if (isSearch) this->filter=""; isSearch=false; @@ -1846,6 +1863,7 @@ FurnaceFilePicker::FurnaceFilePicker(): curFilterType(0), sortMode(FP_SORT_NAME), curStatus(FP_STATUS_WAITING), + selCallback(NULL), editingPath(false), showBookmarks(true), showHiddenFiles(true), diff --git a/src/gui/newFilePicker.h b/src/gui/newFilePicker.h index 181eb490e..7b748e149 100644 --- a/src/gui/newFilePicker.h +++ b/src/gui/newFilePicker.h @@ -23,6 +23,7 @@ #include "../ta-utils.h" #include "../engine/config.h" #include +#include #include #include "imgui.h" @@ -61,6 +62,8 @@ enum FilePickerFlags { FP_FLAGS_EMBEDDABLE=32 }; +typedef std::function FilePickerSelectCallback; + class FurnaceFilePicker { enum SortModes { FP_SORT_NAME=0, @@ -115,6 +118,7 @@ class FurnaceFilePicker { size_t curFilterType; SortModes sortMode; FilePickerStatus curStatus; + FilePickerSelectCallback selCallback; std::vector fileTypeRegistry; FileTypeStyle defaultTypeStyle[FP_TYPE_MAX]; @@ -166,7 +170,7 @@ class FurnaceFilePicker { bool draw(ImGuiWindowFlags winFlags=0); bool isOpened(); void close(); - bool open(String name, String path, String hint, int flags, const std::vector& filter); + bool open(String name, String path, String hint, int flags, const std::vector& filter, FilePickerSelectCallback selectCallback=NULL); void loadSettings(DivConfig& conf); void saveSettings(DivConfig& conf); void setTypeStyle(FileType type, ImVec4 color, String icon);