diff --git a/extern/igfd/ImGuiFileDialog.cpp b/extern/igfd/ImGuiFileDialog.cpp index 36bd122b..535fb267 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 @@ -602,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) { @@ -1191,7 +1201,7 @@ namespace IGFD if (puDLGDirectoryMode) // directory mode SetDefaultFileName("."); else - SetDefaultFileName(puDLGDefaultFileName); + SetDefaultFileName(""); ScanDir(vFileDialogInternal, GetCurrentPath()); } @@ -1475,7 +1485,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 +2227,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(); @@ -3401,7 +3421,7 @@ namespace IGFD if (ps.isOk) { prFileDialogInternal.puFileManager.puDLGpath = ps.path; - prFileDialogInternal.puFileManager.SetDefaultFileName(vFilePathName); + prFileDialogInternal.puFileManager.SetDefaultFileName(""); prFileDialogInternal.puFilterManager.puDLGdefaultExt = "." + ps.ext; } else diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 2dcd8c9b..04469b63 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 0c57e2d8..f1e5e91f 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/fileOps.cpp b/src/engine/fileOps.cpp index 47e6fcab..c1ce3489 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++) { diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index d7131a9e..a83921ad 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) { diff --git a/src/engine/song.h b/src/engine/song.h index cb838f24..8b6da13b 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;