From ba08d3515f3d58538bc040b558e487cfe88ff601 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 1 Feb 2022 02:52:36 -0500 Subject: [PATCH] GUI: fix several file dialog bugs damn it --- extern/igfd/ImGuiFileDialog.cpp | 55 +++++++++++++++++++++++++-------- extern/igfd/ImGuiFileDialog.h | 6 ++-- src/engine/engine.cpp | 1 - src/gui/gui.cpp | 35 ++++++++++++++------- src/gui/gui.h | 2 ++ 5 files changed, 70 insertions(+), 29 deletions(-) diff --git a/extern/igfd/ImGuiFileDialog.cpp b/extern/igfd/ImGuiFileDialog.cpp index 000ac74f..4b8be969 100644 --- a/extern/igfd/ImGuiFileDialog.cpp +++ b/extern/igfd/ImGuiFileDialog.cpp @@ -1541,7 +1541,19 @@ namespace IGFD case DT_DIR: fileType = 'd'; break; case DT_LNK: - fileType = 'l'; break; + std::string where = path+std::string("/")+std::string(ent->d_name); + DIR* dirTest = opendir(where.c_str()); + if (dirTest==NULL) { + if (errno==ENOTDIR) { + fileType = 'f'; + } else { + fileType = 'l'; + } + } else { + fileType = 'd'; + closedir(dirTest); + } + break; } auto fileNameExt = ent->d_name; @@ -3661,8 +3673,9 @@ namespace IGFD // draw dialog parts prDrawHeader(); // bookmark, directory, path - prDrawContent(); // bookmark, files view, side pane - res = prDrawFooter(); // file field, filter combobox, ok/cancel buttons + res = prDrawContent(); // bookmark, files view, side pane + bool res1 = prDrawFooter(); // file field, filter combobox, ok/cancel buttons + if (!res) res=res1; EndFrame(); @@ -3734,8 +3747,9 @@ namespace IGFD prFileDialogInternal.puSearchManager.DrawSearchBar(prFileDialogInternal); } - void IGFD::FileDialog::prDrawContent() + bool IGFD::FileDialog::prDrawContent() { + bool escape = false; ImVec2 size = ImGui::GetContentRegionAvail() - ImVec2(0.0f, prFileDialogInternal.puFooterHeight); #ifdef USE_BOOKMARK @@ -3783,13 +3797,15 @@ namespace IGFD } } #else - prDrawFileListView(size); + escape = prDrawFileListView(size); #endif // USE_THUMBNAILS if (prFileDialogInternal.puDLGoptionsPane) { prDrawSidePane(size.y); } + + return escape; } bool IGFD::FileDialog::prDrawFooter() @@ -3845,10 +3861,11 @@ namespace IGFD return res; } - bool IGFD::FileDialog::prSelectableItem(int vidx, std::shared_ptr vInfos, bool vSelected, const char* vFmt, ...) + // returns 0 if not break loop, 1 if break loop, 2 if exit dialog + int IGFD::FileDialog::prSelectableItem(int vidx, std::shared_ptr vInfos, bool vSelected, const char* vFmt, ...) { if (!vInfos.use_count()) - return false; + return 0; auto& fdi = prFileDialogInternal.puFileManager; @@ -3880,6 +3897,7 @@ namespace IGFD { if (vInfos->fileType == 'd') { + bool isSelectingDir=false; // nav system, selectebale cause open directory or select directory if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) { @@ -3890,12 +3908,14 @@ namespace IGFD else { fdi.puPathClicked = fdi.SelectDirectory(vInfos); + isSelectingDir=true; } } else // no nav system => classic behavior { if (ImGui::IsMouseDoubleClicked(0)) // 0 -> left mouse button double click { + isSelectingDir=true; fdi.puPathClicked = fdi.SelectDirectory(vInfos); } else if (fdi.puDLGDirectoryMode) // directory chooser @@ -3904,15 +3924,21 @@ namespace IGFD } } - return true; // needToBreakTheloop + return isSelectingDir; // needToBreakTheloop } else { - fdi.SelectFileName(prFileDialogInternal, vInfos); + if (ImGui::IsMouseDoubleClicked(0)) { + fdi.SelectFileName(prFileDialogInternal, vInfos); + prFileDialogInternal.puIsOk = true; + return 2; + } else { + fdi.SelectFileName(prFileDialogInternal, vInfos); + } } } - return false; + return 0; } void IGFD::FileDialog::prBeginFileColorIconStyle(std::shared_ptr vFileInfos, bool& vOutShowColor, std::string& vOutStr, ImFont** vOutFont) @@ -3948,8 +3974,9 @@ namespace IGFD ImGui::PopStyleColor(); } - void IGFD::FileDialog::prDrawFileListView(ImVec2 vSize) + bool IGFD::FileDialog::prDrawFileListView(ImVec2 vSize) { + bool escape = false; auto& fdi = prFileDialogInternal.puFileManager; ImGui::PushID(this); @@ -4038,11 +4065,12 @@ namespace IGFD ImGui::TableNextRow(); - bool needToBreakTheloop = false; + int needToBreakTheloop = false; if (ImGui::TableNextColumn()) // file name { needToBreakTheloop = prSelectableItem(i, infos, selected, _str.c_str()); + if (needToBreakTheloop==2) escape=true; } if (ImGui::TableNextColumn()) // file type { @@ -4066,7 +4094,7 @@ namespace IGFD prEndFileColorIconStyle(_showColor, _font); - if (needToBreakTheloop) + if (needToBreakTheloop==1) break; } } @@ -4091,6 +4119,7 @@ namespace IGFD } ImGui::PopID(); + return escape; } #ifdef USE_THUMBNAILS diff --git a/extern/igfd/ImGuiFileDialog.h b/extern/igfd/ImGuiFileDialog.h index 4c7515c4..0b69f830 100644 --- a/extern/igfd/ImGuiFileDialog.h +++ b/extern/igfd/ImGuiFileDialog.h @@ -1293,15 +1293,15 @@ namespace IGFD public: // dialog parts virtual void prDrawHeader(); // draw header part of the dialog (bookmark btn, dir creation, path composer, search bar) - virtual void prDrawContent(); // draw content part of the dialog (bookmark pane, file list, side pane) + virtual bool prDrawContent(); // draw content part of the dialog (bookmark pane, file list, side pane) virtual bool prDrawFooter(); // draw footer part of the dialog (file field, fitler combobox, ok/cancel btn's) // widgets components virtual void prDrawSidePane(float vHeight); // draw side pane - virtual bool prSelectableItem(int vidx, + virtual int prSelectableItem(int vidx, std::shared_ptr vInfos, bool vSelected, const char* vFmt, ...); // draw a custom selectable behavior item - virtual void prDrawFileListView(ImVec2 vSize); // draw file list view (default mode) + virtual bool prDrawFileListView(ImVec2 vSize); // draw file list view (default mode) #ifdef USE_THUMBNAILS virtual void prDrawThumbnailsListView(ImVec2 vSize); // draw file list view with small thumbnails on the same line diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 429def8c..4622a65e 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -4419,7 +4419,6 @@ bool DivEngine::addInstrumentFromFile(const char *path) { } if (version>=11) { // 1.0 - logI("version 10 or higher, so load\n"); try { sys=reader.readC(); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index d58c417b..ade22140 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2610,8 +2610,9 @@ void FurnaceGUI::drawAbout() { float r=0; float g=0; float b=0; - ImGui::ColorConvertHSVtoRGB(aboutHue,1.0,0.5,r,g,b); - aboutHue+=0.001; + float peakMix=settings.partyTime?((peak[0]+peak[1])*0.5):0.3; + ImGui::ColorConvertHSVtoRGB(aboutHue,1.0,0.25+MIN(0.75f,peakMix*0.75f),r,g,b); + aboutHue+=0.001+peakMix*0.004; dl->AddRectFilled(ImVec2(0,0),ImVec2(scrW*dpiScale,scrH*dpiScale),0xff000000); bool skip=false; bool skip2=false; @@ -2670,8 +2671,9 @@ void FurnaceGUI::drawAbout() { 0xffffffff,aboutLine[i]); } ImGui::PopFont(); - aboutScroll+=2; - if (++aboutSin>=2400) aboutSin=0; + aboutScroll+=2+(peakMix>0.78)*3; + aboutSin+=1+(peakMix>0.75)*2; + if (aboutSin>=2400) aboutSin-=2400; if (aboutScroll>(42*56+scrH)) aboutScroll=-20; } ImGui::End(); @@ -2883,6 +2885,11 @@ void FurnaceGUI::drawSettings() { settings.overflowHighlight=overflowHighlightB; } + bool partyTimeB=settings.partyTime; + if (ImGui::Checkbox("About screen party time",&partyTimeB)) { + settings.partyTime=partyTimeB; + } + ImGui::Separator(); if (ImGui::TreeNode("Color scheme")) { @@ -3011,6 +3018,7 @@ void FurnaceGUI::syncSettings() { settings.chipNames=e->getConfInt("chipNames",0); settings.overflowHighlight=e->getConfInt("overflowHighlight",0); if (settings.fmNames<0 || settings.fmNames>2) settings.fmNames=0; + settings.partyTime=e->getConfInt("partyTime",0); } #define PUT_UI_COLOR(source) e->setConf(#source,(int)ImGui::GetColorU32(uiColors[source])); @@ -3039,6 +3047,7 @@ void FurnaceGUI::commitSettings() { e->setConf("allowEditDocking",settings.allowEditDocking); e->setConf("chipNames",settings.chipNames); e->setConf("overflowHighlight",settings.overflowHighlight); + e->setConf("partyTime",settings.partyTime); PUT_UI_COLOR(GUI_COLOR_BACKGROUND); PUT_UI_COLOR(GUI_COLOR_FRAME_BACKGROUND); @@ -4256,43 +4265,44 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) { ImGuiFileDialog::Instance()->OpenModal("FileDialog","Open File","compatible files{.fur,.dmf},.*",workingDir); break; case GUI_FILE_SAVE: - ImGuiFileDialog::Instance()->OpenModal("FileDialog","Save File","Furnace song{.fur},DefleMask module{.dmf}",workingDir); + ImGuiFileDialog::Instance()->OpenModal("FileDialog","Save File","Furnace song{.fur},DefleMask module{.dmf}",workingDir,1,nullptr,ImGuiFileDialogFlags_ConfirmOverwrite); break; case GUI_FILE_INS_OPEN: ImGuiFileDialog::Instance()->OpenModal("FileDialog","Load Instrument","compatible files{.fui,.dmp},.*",workingDir); break; case GUI_FILE_INS_SAVE: - ImGuiFileDialog::Instance()->OpenModal("FileDialog","Save Instrument","Furnace instrument{.fui}",workingDir); + ImGuiFileDialog::Instance()->OpenModal("FileDialog","Save Instrument","Furnace instrument{.fui}",workingDir,1,nullptr,ImGuiFileDialogFlags_ConfirmOverwrite); break; case GUI_FILE_WAVE_OPEN: ImGuiFileDialog::Instance()->OpenModal("FileDialog","Load Wavetable","compatible files{.fuw,.dmw},.*",workingDir); break; case GUI_FILE_WAVE_SAVE: - ImGuiFileDialog::Instance()->OpenModal("FileDialog","Save Wavetable","Furnace wavetable{.fuw}",workingDir); + ImGuiFileDialog::Instance()->OpenModal("FileDialog","Save Wavetable","Furnace wavetable{.fuw}",workingDir,1,nullptr,ImGuiFileDialogFlags_ConfirmOverwrite); break; case GUI_FILE_SAMPLE_OPEN: ImGuiFileDialog::Instance()->OpenModal("FileDialog","Load Sample","Wave file{.wav},.*",workingDir); break; case GUI_FILE_SAMPLE_SAVE: - ImGuiFileDialog::Instance()->OpenModal("FileDialog","Save Sample","Wave file{.wav}",workingDir); + ImGuiFileDialog::Instance()->OpenModal("FileDialog","Save Sample","Wave file{.wav}",workingDir,1,nullptr,ImGuiFileDialogFlags_ConfirmOverwrite); break; case GUI_FILE_EXPORT_AUDIO_ONE: - ImGuiFileDialog::Instance()->OpenModal("FileDialog","Export Audio","Wave file{.wav}",workingDir); + ImGuiFileDialog::Instance()->OpenModal("FileDialog","Export Audio","Wave file{.wav}",workingDir,1,nullptr,ImGuiFileDialogFlags_ConfirmOverwrite); break; case GUI_FILE_EXPORT_AUDIO_PER_SYS: - ImGuiFileDialog::Instance()->OpenModal("FileDialog","Export Audio","Wave file{.wav}",workingDir); + ImGuiFileDialog::Instance()->OpenModal("FileDialog","Export Audio","Wave file{.wav}",workingDir,1,nullptr,ImGuiFileDialogFlags_ConfirmOverwrite); break; case GUI_FILE_EXPORT_AUDIO_PER_CHANNEL: - ImGuiFileDialog::Instance()->OpenModal("FileDialog","Export Audio","Wave file{.wav}",workingDir); + ImGuiFileDialog::Instance()->OpenModal("FileDialog","Export Audio","Wave file{.wav}",workingDir,1,nullptr,ImGuiFileDialogFlags_ConfirmOverwrite); break; case GUI_FILE_EXPORT_VGM: - ImGuiFileDialog::Instance()->OpenModal("FileDialog","Export VGM",".vgm",workingDir); + ImGuiFileDialog::Instance()->OpenModal("FileDialog","Export VGM",".vgm",workingDir,1,nullptr,ImGuiFileDialogFlags_ConfirmOverwrite); break; case GUI_FILE_EXPORT_ROM: showError("Coming soon!"); break; } curFileDialog=type; + //ImGui::GetIO().ConfigFlags|=ImGuiConfigFlags_NavEnableKeyboard; } #define FURNACE_ZLIB_COMPRESS @@ -5062,6 +5072,7 @@ bool FurnaceGUI::loop() { drawDebug(); if (ImGuiFileDialog::Instance()->Display("FileDialog",ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove,ImVec2(600.0f*dpiScale,400.0f*dpiScale),ImVec2(scrW*dpiScale,scrH*dpiScale))) { + //ImGui::GetIO().ConfigFlags&=~ImGuiConfigFlags_NavEnableKeyboard; if (ImGuiFileDialog::Instance()->IsOk()) { fileName=ImGuiFileDialog::Instance()->GetFilePathName(); if (fileName!="") { diff --git a/src/gui/gui.h b/src/gui/gui.h index d4c43d07..245f2f55 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -210,6 +210,7 @@ class FurnaceGUI { int allowEditDocking; int chipNames; int overflowHighlight; + int partyTime; unsigned int maxUndoSteps; String mainFontPath; String patFontPath; @@ -236,6 +237,7 @@ class FurnaceGUI { allowEditDocking(0), chipNames(0), overflowHighlight(0), + partyTime(0), maxUndoSteps(100), mainFontPath(""), patFontPath("") {}