From 7cd4c9535a7d7ec97590b8fdd15b8cb9aec932b8 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 12 Mar 2023 01:48:01 -0500 Subject: [PATCH 1/5] GUI: fix IGFD parent dir being sorted --- extern/igfd/ImGuiFileDialog.cpp | 20 ++++++++++++++++++-- src/engine/fileOps.cpp | 2 ++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/extern/igfd/ImGuiFileDialog.cpp b/extern/igfd/ImGuiFileDialog.cpp index 36bd122b7..1cf7903dd 100644 --- a/extern/igfd/ImGuiFileDialog.cpp +++ b/extern/igfd/ImGuiFileDialog.cpp @@ -132,8 +132,11 @@ namespace IGFD #define resetButtonString ICON_FA_REPEAT #endif // resetButtonString #ifndef drivesButtonString -#define drivesButtonString "Drives" +#define drivesButtonString ICON_FA_HDD_O #endif // drivesButtonString +#ifndef parentDirString +#define parentDirString ICON_FA_CHEVRON_UP +#endif // parentDirString #ifndef editPathButtonString #define editPathButtonString ICON_FA_PENCIL #endif // editPathButtonString @@ -167,6 +170,9 @@ namespace IGFD #ifndef buttonResetPathString #define buttonResetPathString "Reset to current directory" #endif // buttonResetPathString +#ifndef buttonParentDirString +#define buttonParentDirString "Go to parent directory" +#endif #ifndef buttonCreateDirString #define buttonCreateDirString "Create Directory" #endif // buttonCreateDirString @@ -1475,7 +1481,7 @@ namespace IGFD infos->fileNameExt_optimized = prOptimizeFilenameForSearchOperations(infos->fileNameExt); infos->fileType = vFileType; - if (infos->fileNameExt.empty() || (infos->fileNameExt == "." && !vFileDialogInternal.puFilterManager.puDLGFilters.empty())) return; // filename empty or filename is the current dir '.' //-V807 + if (infos->fileNameExt.empty() || ((infos->fileNameExt == "." || infos->fileNameExt == "..") && !vFileDialogInternal.puFilterManager.puDLGFilters.empty())) return; // filename empty or filename is the current dir '.' //-V807 if (infos->fileNameExt != ".." && (vFileDialogInternal.puDLGflags & ImGuiFileDialogFlags_DontShowHiddenFiles) && infos->fileNameExt[0] == '.') // dont show hidden files if (!vFileDialogInternal.puFilterManager.puDLGFilters.empty() || (vFileDialogInternal.puFilterManager.puDLGFilters.empty() && infos->fileNameExt != ".")) // except "." if in directory mode //-V728 return; @@ -2217,6 +2223,16 @@ namespace IGFD if (ImGui::IsItemHovered()) ImGui::SetTooltip(buttonResetPathString); + ImGui::SameLine(); + if (IMGUI_BUTTON(parentDirString)) + { + if (SetPathOnParentDirectoryIfAny()) { + OpenCurrentPath(vFileDialogInternal); + } + } + if (ImGui::IsItemHovered()) + ImGui::SetTooltip(buttonParentDirString); + #ifdef WIN32 ImGui::SameLine(); diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index 47e6fcaba..c1ce34897 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -2935,6 +2935,7 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) { size_t pos=reader.tell(); logD("reading sample data..."); for (int i=0; isamples,sampLens[i]); if (!reader.seek(pos,SEEK_SET)) { logD("%d: couldn't seek to %d",i,pos); throw EndOfFileException(&reader,reader.tell()); @@ -2944,6 +2945,7 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) { } // convert effects + logD("converting module..."); for (int ch=0; ch<=chCount; ch++) { unsigned char fxCols=1; for (int pat=0; pat<=patMax; pat++) { From 43d330831ade1673607d7080ed615f6a7151a328 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 12 Mar 2023 01:55:29 -0500 Subject: [PATCH 2/5] GUI: fix / appearing as file name in IGFD every time the dialog is opened --- extern/igfd/ImGuiFileDialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extern/igfd/ImGuiFileDialog.cpp b/extern/igfd/ImGuiFileDialog.cpp index 1cf7903dd..734b4f3eb 100644 --- a/extern/igfd/ImGuiFileDialog.cpp +++ b/extern/igfd/ImGuiFileDialog.cpp @@ -1197,7 +1197,7 @@ namespace IGFD if (puDLGDirectoryMode) // directory mode SetDefaultFileName("."); else - SetDefaultFileName(puDLGDefaultFileName); + SetDefaultFileName(""); ScanDir(vFileDialogInternal, GetCurrentPath()); } @@ -3417,7 +3417,7 @@ namespace IGFD if (ps.isOk) { prFileDialogInternal.puFileManager.puDLGpath = ps.path; - prFileDialogInternal.puFileManager.SetDefaultFileName(vFilePathName); + prFileDialogInternal.puFileManager.SetDefaultFileName(""); prFileDialogInternal.puFilterManager.puDLGdefaultExt = "." + ps.ext; } else From b768d46ef12a2359597bcf818b688a54b754541b Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 12 Mar 2023 02:06:02 -0500 Subject: [PATCH 3/5] GUI: fix IGFD path reset if it is "/" --- extern/igfd/ImGuiFileDialog.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extern/igfd/ImGuiFileDialog.cpp b/extern/igfd/ImGuiFileDialog.cpp index 734b4f3eb..535fb267f 100644 --- a/extern/igfd/ImGuiFileDialog.cpp +++ b/extern/igfd/ImGuiFileDialog.cpp @@ -608,6 +608,10 @@ namespace IGFD res.ext = pfn.substr(lastPoint + 1); IGFD::Utils::ReplaceString(res.name, "." + res.ext, ""); } + + if (res.path.empty()) { + res.path=separator; + } if (!res.isOk) { From 2c66e2d1d6c31ab488d762dd8982a0851a73af31 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 12 Mar 2023 03:31:33 -0500 Subject: [PATCH 4/5] Amiga: fix interrupt on useWave --- src/engine/platform/amiga.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index d7131a9ef..a83921adf 100644 --- a/src/engine/platform/amiga.cpp +++ b/src/engine/platform/amiga.cpp @@ -411,6 +411,7 @@ void DivPlatformAmiga::tick(bool sysTick) { if (chan[i].keyOn) { rWrite(0x96,1<getIns(chan[c.chan].ins,DIV_INS_AMIGA); if (ins->amiga.useWave) { + if (!chan[c.chan].useWave) chan[c.chan].updateWave=true; chan[c.chan].useWave=true; chan[c.chan].audLen=(ins->amiga.waveLen+1)>>1; if (chan[c.chan].insChanged) { From 40e153300f60ef1f093f00b313d6990118fc1ea1 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 12 Mar 2023 04:10:46 -0500 Subject: [PATCH 5/5] prepare to add asset directories --- src/engine/engine.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ src/engine/engine.h | 3 +++ src/engine/song.h | 14 ++++++++++++++ 3 files changed, 60 insertions(+) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 2dcd8c9b9..04469b63f 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1567,6 +1567,49 @@ void DivEngine::changeSong(size_t songIndex) { prevRow=0; } +void DivEngine::checkAssetDir(std::vector& dir, size_t entries) { + bool* inAssetDir=new bool[entries]; + memset(inAssetDir,0,entries*sizeof(bool)); + + for (DivAssetDir& i: dir) { + for (size_t j=0; j=(int)entries) { + i.entries.erase(i.entries.begin()+j); + j--; + continue; + } + + // mark entry as present + inAssetDir[j]=true; + } + } + + // get unsorted directory + DivAssetDir* unsortedDir=NULL; + for (DivAssetDir& i: dir) { + if (i.name=="Unsorted") { + unsortedDir=&i; + break; + } + } + + // create unsorted directory if it doesn't exist + if (unsortedDir==NULL) { + dir.push_back(DivAssetDir("Unsorted")); + unsortedDir=&(*dir.rbegin()); + } + + // add missing items to unsorted directory + for (size_t i=0; ientries.push_back(i); + } + } + + delete[] inAssetDir; +} + void DivEngine::swapChannelsP(int src, int dest) { if (src<0 || src>=chans) return; if (dest<0 || dest>=chans) return; diff --git a/src/engine/engine.h b/src/engine/engine.h index 0c57e2d8b..f1e5e91f8 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -490,6 +490,9 @@ class DivEngine { // change song (UNSAFE) void changeSong(size_t songIndex); + // check whether an asset directory is complete + void checkAssetDir(std::vector& dir, size_t entries); + public: DivSong song; DivOrders* curOrders; diff --git a/src/engine/song.h b/src/engine/song.h index cb838f24a..8b6da13b2 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -181,6 +181,16 @@ struct DivSubSong { } }; +struct DivAssetDir { + String name; + std::vector entries; + + DivAssetDir(): + name("New Directory") {} + DivAssetDir(String n): + name(n) {} +}; + struct DivSong { // version number used for saving the song. // Furnace will save using the latest possible version, @@ -351,6 +361,10 @@ struct DivSong { std::vector patchbay; std::vector grooves; + std::vector insDir; + std::vector waveDir; + std::vector sampleDir; + DivInstrument nullIns, nullInsOPLL, nullInsOPL, nullInsOPLDrums, nullInsQSound; DivWavetable nullWave; DivSample nullSample;