From 442ccd0e0910f7cfdf79f6e9bb8788e70e610617 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 15 May 2023 23:27:45 -0500 Subject: [PATCH] asset directories, part 5 --- src/engine/engine.cpp | 27 +++++++++++++++++++++++++++ src/engine/engine.h | 3 +++ src/gui/dataList.cpp | 5 ++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 60c46341d..744d7274d 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1572,6 +1572,21 @@ void DivEngine::changeSong(size_t songIndex) { prevRow=0; } +void DivEngine::removeAsset(std::vector& dir, int entry) { + if (entry<0) return; + for (DivAssetDir& i: dir) { + for (size_t j=0; jentry) { + i.entries[j]--; + } + } + } +} + void DivEngine::checkAssetDir(std::vector& dir, size_t entries) { bool* inAssetDir=new bool[entries]; memset(inAssetDir,0,entries*sizeof(bool)); @@ -3032,6 +3047,7 @@ int DivEngine::addInstrument(int refChan, DivInstrumentType fallbackType) { saveLock.lock(); song.ins.push_back(ins); song.insLen=insCount+1; + checkAssetDir(song.insDir,song.ins.size()); saveLock.unlock(); BUSY_END; return insCount; @@ -3046,6 +3062,7 @@ int DivEngine::addInstrumentPtr(DivInstrument* which) { saveLock.lock(); song.ins.push_back(which); song.insLen=song.ins.size(); + checkAssetDir(song.insDir,song.ins.size()); saveLock.unlock(); BUSY_END; return song.insLen; @@ -3082,6 +3099,8 @@ void DivEngine::delInstrument(int index) { } } } + removeAsset(song.insDir,index); + checkAssetDir(song.insDir,song.ins.size()); } saveLock.unlock(); BUSY_END; @@ -3098,6 +3117,7 @@ int DivEngine::addWave() { int waveCount=(int)song.wave.size(); song.wave.push_back(wave); song.waveLen=waveCount+1; + checkAssetDir(song.waveDir,song.wave.size()); saveLock.unlock(); BUSY_END; return waveCount; @@ -3114,6 +3134,7 @@ int DivEngine::addWavePtr(DivWavetable* which) { int waveCount=(int)song.wave.size(); song.wave.push_back(which); song.waveLen=waveCount+1; + checkAssetDir(song.waveDir,song.wave.size()); saveLock.unlock(); BUSY_END; return song.waveLen; @@ -3268,6 +3289,8 @@ void DivEngine::delWave(int index) { delete song.wave[index]; song.wave.erase(song.wave.begin()+index); song.waveLen=song.wave.size(); + removeAsset(song.waveDir,index); + checkAssetDir(song.waveDir,song.wave.size()); } saveLock.unlock(); BUSY_END; @@ -3288,6 +3311,7 @@ int DivEngine::addSample() { sPreview.sample=-1; sPreview.pos=0; sPreview.dir=false; + checkAssetDir(song.sampleDir,song.sample.size()); saveLock.unlock(); renderSamples(); BUSY_END; @@ -3305,6 +3329,7 @@ int DivEngine::addSamplePtr(DivSample* which) { saveLock.lock(); song.sample.push_back(which); song.sampleLen=sampleCount+1; + checkAssetDir(song.sampleDir,song.sample.size()); saveLock.unlock(); renderSamples(); BUSY_END; @@ -3774,6 +3799,8 @@ void DivEngine::delSample(int index) { delete song.sample[index]; song.sample.erase(song.sample.begin()+index); song.sampleLen=song.sample.size(); + removeAsset(song.sampleDir,index); + checkAssetDir(song.sampleDir,song.sample.size()); renderSamples(); } saveLock.unlock(); diff --git a/src/engine/engine.h b/src/engine/engine.h index 21b1c2728..20cec077c 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -517,6 +517,9 @@ class DivEngine { // change song (UNSAFE) void changeSong(size_t songIndex); + // remove an asset + void removeAsset(std::vector& dir, int entry); + // check whether an asset directory is complete void checkAssetDir(std::vector& dir, size_t entries); diff --git a/src/gui/dataList.cpp b/src/gui/dataList.cpp index dceeca59f..733b1a6b4 100644 --- a/src/gui/dataList.cpp +++ b/src/gui/dataList.cpp @@ -74,7 +74,7 @@ void FurnaceGUI::insListItem(int i, int dir, int asset) { ImGui::PushID(i); String name=ICON_FA_CIRCLE_O; const char* insType="Bug!"; - if (i>=0) { + if (i>=0 && isong.insLen) { DivInstrument* ins=e->song.ins[i]; insType=(ins->type>DIV_INS_MAX)?"Unknown":insTypes[ins->type]; if (ins->type==DIV_INS_N163) insType=settings.c163Name.c_str(); @@ -342,6 +342,9 @@ void FurnaceGUI::insListItem(int i, int dir, int asset) { DivInstrument* ins=e->song.ins[i]; ImGui::SameLine(); ImGui::Text("%.2X: %s",i,ins->name.c_str()); + } else { + ImGui::SameLine(); + ImGui::Text("%.2X: ",i); } } else { ImGui::SameLine();