diff --git a/src/gui/debugWindow.cpp b/src/gui/debugWindow.cpp index 343a578c9..88740afc7 100644 --- a/src/gui/debugWindow.cpp +++ b/src/gui/debugWindow.cpp @@ -355,7 +355,7 @@ void FurnaceGUI::drawDebug() { ); if (ImGui::Button("Open")) { - newFilePicker->open("New File Picker","/home",fpFlags, + newFilePicker->open("New File Picker","/home","",fpFlags, {_("songs"), "*.fur *.dmf *.mod *.s3m *.xm *.it *.fc13 *.fc14 *.smod *.fc *.ftm *.0cc *.dnm *.eft *.fub *.tfe", _("instruments"), "*.fui *.dmp *.tfi *.vgi *.s3i *.sbi *.opli *.opni *.y12 *.bnk *.ff *.gyb *.opm *.wopl *.wopn", _("audio"), "*.wav", diff --git a/src/gui/fileDialog.cpp b/src/gui/fileDialog.cpp index d8771172c..5ec09a2b8 100644 --- a/src/gui/fileDialog.cpp +++ b/src/gui/fileDialog.cpp @@ -191,9 +191,9 @@ bool FurnaceGUIFileDialog::openLoad(String header, std::vector filter, S } #endif - // TODO: hint, clickCallback, "FileDialog" ID + // TODO: clickCallback newFilePicker->setHomeDir(getHomeDir()); - newFilePicker->open(header+"##FileDialog",path,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); } opened=true; return true; @@ -276,9 +276,8 @@ bool FurnaceGUIFileDialog::openSave(String header, std::vector filter, S } else { hasError=false; - // TODO: hint, clickCallback, "FileDialog" ID newFilePicker->setHomeDir(getHomeDir()); - newFilePicker->open(header+"##FileDialog",path,FP_FLAGS_MODAL|FP_FLAGS_SAVE,filter); + newFilePicker->open(header+"##FileDialog",path,hint,FP_FLAGS_MODAL|FP_FLAGS_SAVE,filter); } opened=true; return true; @@ -325,9 +324,8 @@ bool FurnaceGUIFileDialog::openSelectDir(String header, String path, double dpiS } #endif - // TODO: hint, "FileDialog" ID newFilePicker->setHomeDir(getHomeDir()); - newFilePicker->open(header+"##FileDialog",path,FP_FLAGS_MODAL|FP_FLAGS_DIR_SELECT,{}); + newFilePicker->open(header+"##FileDialog",path,hint,FP_FLAGS_MODAL|FP_FLAGS_DIR_SELECT,{}); } opened=true; return true; @@ -457,7 +455,8 @@ bool FurnaceGUIFileDialog::render(const ImVec2& min, const ImVec2& max) { return false; #endif } else { - return newFilePicker->draw(); + newFilePicker->setSizeConstraints(min,max); + return newFilePicker->draw(ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoScrollWithMouse); } } diff --git a/src/gui/newFilePicker.cpp b/src/gui/newFilePicker.cpp index ce1774083..7c0db7d4e 100644 --- a/src/gui/newFilePicker.cpp +++ b/src/gui/newFilePicker.cpp @@ -26,6 +26,7 @@ #include "../ta-log.h" #include #include +#include #ifdef _WIN32 #include #include "../utfutils.h" @@ -369,6 +370,9 @@ void FurnaceFilePicker::readDirectory(String path) { entries.clear(); chosenEntries.clear(); updateEntryName(); + if (!entryNameHint.empty()) { + entryName=entryNameHint; + } // start new file thread this->path=normalizePath(path); @@ -548,8 +552,17 @@ bool FurnaceFilePicker::isPathAbsolute(const String& p) { #endif } -bool FurnaceFilePicker::draw() { - if (!isOpen) return false; +void FurnaceFilePicker::setSizeConstraints(const ImVec2& min, const ImVec2& max) { + minSize=min; + maxSize=max; + hasSizeConstraints=true; +} + +bool FurnaceFilePicker::draw(ImGuiWindowFlags winFlags) { + if (!isOpen) { + hasSizeConstraints=false; + return false; + } String newDir; bool acknowledged=false; @@ -561,12 +574,28 @@ bool FurnaceFilePicker::draw() { began=true; } else if (isModal) { ImGui::OpenPopup(windowName.c_str()); - began=ImGui::BeginPopupModal(windowName.c_str(),NULL,ImGuiWindowFlags_NoSavedSettings); + if (hasSizeConstraints) ImGui::SetNextWindowSizeConstraints(minSize,maxSize); + began=ImGui::BeginPopupModal(windowName.c_str(),NULL,ImGuiWindowFlags_NoScrollbar|winFlags); } else { - began=ImGui::Begin(windowName.c_str(),NULL,ImGuiWindowFlags_NoSavedSettings); + if (hasSizeConstraints) ImGui::SetNextWindowSizeConstraints(minSize,maxSize); + began=ImGui::Begin(windowName.c_str(),NULL,ImGuiWindowFlags_NoScrollbar|winFlags); } if (began) { + // center the window if it is unmovable + if (winFlags&ImGuiWindowFlags_NoMove) { + ImGui::SetWindowPos(ImVec2( + (ImGui::GetMainViewport()->Size.x-ImGui::GetWindowWidth())*0.5f, + (ImGui::GetMainViewport()->Size.y-ImGui::GetWindowHeight())*0.5f) + ); + } + // enforce window constraints if necessary + if (hasSizeConstraints) { + if (ImGui::GetWindowSize().x& filter) { +bool FurnaceFilePicker::open(String name, String pa, String hint, int flags, const std::vector& filter) { 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."); @@ -1151,6 +1182,7 @@ bool FurnaceFilePicker::open(String name, String pa, int flags, const std::vecto readDirectory(pa); windowName=name; + hint=entryNameHint; isOpen=true; return true; } @@ -1222,6 +1254,7 @@ FurnaceFilePicker::FurnaceFilePicker(): noClose(false), isModal(false), isEmbed(false), + hasSizeConstraints(false), scheduledSort(0), curFilterType(0), sortMode(FP_SORT_NAME), diff --git a/src/gui/newFilePicker.h b/src/gui/newFilePicker.h index ca3c8b07d..74aac7ce5 100644 --- a/src/gui/newFilePicker.h +++ b/src/gui/newFilePicker.h @@ -101,10 +101,12 @@ class FurnaceFilePicker { String failMessage; String homeDir; String entryName; + String entryNameHint; ImGuiListClipper listClipper; + ImVec2 minSize, maxSize; bool haveFiles, haveStat, stopReading, isOpen, isMobile, sortInvert, multiSelect; - bool confirmOverwrite, dirSelect, noClose, isModal, isEmbed; - int scheduledSort; + bool confirmOverwrite, dirSelect, noClose, isModal, isEmbed, hasSizeConstraints; + int scheduledSort, imguiFlags; size_t curFilterType; SortModes sortMode; FilePickerStatus curStatus; @@ -135,10 +137,11 @@ class FurnaceFilePicker { const String& getEntryName(); const std::vector& getSelected(); void setMobile(bool val); - bool draw(); + void setSizeConstraints(const ImVec2& min, const ImVec2& max); + bool draw(ImGuiWindowFlags winFlags=0); bool isOpened(); void close(); - bool open(String name, String path, int flags, const std::vector& filter); + bool open(String name, String path, String hint, int flags, const std::vector& filter); void loadSettings(DivConfig& conf); void saveSettings(DivConfig& conf); void setTypeStyle(FileType type, ImVec4 color, String icon);