diff --git a/src/engine/song.h b/src/engine/song.h index 8912ec4a1..5976b904f 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -141,6 +141,8 @@ enum DivSystem { DIV_SYSTEM_5E01, DIV_SYSTEM_BIFURCATOR, DIV_SYSTEM_SID2, + + DIV_SYSTEM_MAX }; enum DivEffectType: unsigned short { diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index aca5523f0..bb223aac4 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -249,16 +249,18 @@ void FurnaceGUI::drawExportROM(bool onWindow) { for (int i=0; igetROMExportDef((DivROMExportOptions)i); if (newDef!=NULL) { - if (ImGui::Selectable(newDef->name)) { - romTarget=(DivROMExportOptions)i; - romMultiFile=newDef->multiOutput; - romConfig=DivConfig(); - if (newDef->fileExt==NULL) { - romFilterName=""; - romFilterExt=""; - } else { - romFilterName=newDef->fileType; - romFilterExt=newDef->fileExt; + if (romExportAvail[i]) { + if (ImGui::Selectable(newDef->name)) { + romTarget=(DivROMExportOptions)i; + romMultiFile=newDef->multiOutput; + romConfig=DivConfig(); + if (newDef->fileExt==NULL) { + romFilterName=""; + romFilterExt=""; + } else { + romFilterName=newDef->fileType; + romFilterExt=newDef->fileExt; + } } } } @@ -436,9 +438,11 @@ void FurnaceGUI::drawExport() { drawExportVGM(true); ImGui::EndTabItem(); } - if (ImGui::BeginTabItem(_("ROM"))) { - drawExportROM(true); - ImGui::EndTabItem(); + if (romExportExists) { + if (ImGui::BeginTabItem(_("ROM"))) { + drawExportROM(true); + ImGui::EndTabItem(); + } } int numZSMCompat=0; for (int i=0; isong.systemLen; i++) { diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 45d71e95f..37443c46e 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -752,6 +752,88 @@ void FurnaceGUI::autoDetectSystem() { } } +void FurnaceGUI::updateROMExportAvail() { + unsigned char sysReqCount[DIV_SYSTEM_MAX]; + unsigned char defReqCount[DIV_SYSTEM_MAX]; + + memset(sysReqCount,0,DIV_SYSTEM_MAX); + for (int i=0; isong.systemLen; i++) { + sysReqCount[e->song.system[i]]++; + } + + memset(romExportAvail,0,sizeof(bool)*DIV_ROM_MAX); + romExportExists=false; + + for (int i=0; igetROMExportDef((DivROMExportOptions)i); + if (newDef!=NULL) { + // check for viability + bool viable=true; + + memset(defReqCount,0,DIV_SYSTEM_MAX); + for (DivSystem j: newDef->requisites) { + defReqCount[j]++; + } + + switch (newDef->requisitePolicy) { + case DIV_REQPOL_EXACT: + for (int j=0; jsysReqCount[j]) { + viable=false; + break; + } + } + break; + case DIV_REQPOL_LAX: + viable=false; + for (DivSystem j: newDef->requisites) { + if (defReqCount[j]<=sysReqCount[j]) { + viable=true; + break; + } + } + break; + } + + if (viable) { + romExportAvail[i]=true; + romExportExists=true; + } + } + } + + if (!romExportAvail[romTarget]) { + // find a new one + romTarget=DIV_ROM_ABSTRACT; + for (int i=0; igetROMExportDef((DivROMExportOptions)i); + if (newDef!=NULL) { + if (romExportAvail[i]) { + romTarget=(DivROMExportOptions)i; + romMultiFile=newDef->multiOutput; + romConfig=DivConfig(); + if (newDef->fileExt==NULL) { + romFilterName=""; + romFilterExt=""; + } else { + romFilterName=newDef->fileType; + romFilterExt=newDef->fileExt; + } + break; + } + } + } + } +} + ImVec4 FurnaceGUI::channelColor(int ch) { switch (settings.channelColors) { case 0: @@ -2359,6 +2441,7 @@ int FurnaceGUI::load(String path) { undoHist.clear(); redoHist.clear(); updateWindowTitle(); + updateROMExportAvail(); updateScroll(0); if (!e->getWarnings().empty()) { showWarning(e->getWarnings(),GUI_WARN_GENERIC); @@ -4301,9 +4384,11 @@ bool FurnaceGUI::loop() { drawExportVGM(); ImGui::EndMenu(); } - if (ImGui::BeginMenu(_("export ROM..."))) { - drawExportROM(); - ImGui::EndMenu(); + if (romExportExists) { + if (ImGui::BeginMenu(_("export ROM..."))) { + drawExportROM(); + ImGui::EndMenu(); + } } int numZSMCompat=0; for (int i=0; isong.systemLen; i++) { @@ -4336,9 +4421,11 @@ bool FurnaceGUI::loop() { curExportType=GUI_EXPORT_VGM; displayExport=true; } - if (ImGui::MenuItem(_("export ROM..."))) { - curExportType=GUI_EXPORT_ROM; - displayExport=true; + if (romExportExists) { + if (ImGui::MenuItem(_("export ROM..."))) { + curExportType=GUI_EXPORT_ROM; + displayExport=true; + } } int numZSMCompat=0; for (int i=0; isong.systemLen; i++) { @@ -4387,6 +4474,7 @@ bool FurnaceGUI::loop() { autoDetectSystem(); } updateWindowTitle(); + updateROMExportAvail(); } ImGui::EndMenu(); } @@ -4413,6 +4501,7 @@ bool FurnaceGUI::loop() { autoDetectSystem(); } updateWindowTitle(); + updateROMExportAvail(); } else { showError(fmt::sprintf(_("cannot change chip! (%s)"),e->getLastError())); } @@ -4437,6 +4526,7 @@ bool FurnaceGUI::loop() { autoDetectSystem(); updateWindowTitle(); } + updateROMExportAvail(); } } ImGui::EndMenu(); @@ -5695,6 +5785,7 @@ bool FurnaceGUI::loop() { selEnd=SelectionPoint(); cursor=SelectionPoint(); updateWindowTitle(); + updateROMExportAvail(); } else { ImGui::OpenPopup(_("New Song")); } @@ -6245,6 +6336,7 @@ bool FurnaceGUI::loop() { updateWindowTitle(); MARK_MODIFIED; } + updateROMExportAvail(); ImGui::CloseCurrentPopup(); } ImGui::SameLine(); @@ -7263,6 +7355,7 @@ bool FurnaceGUI::init() { } updateWindowTitle(); + updateROMExportAvail(); logV("max texture size: %dx%d",rend->getMaxTextureWidth(),rend->getMaxTextureHeight()); @@ -8397,7 +8490,8 @@ FurnaceGUI::FurnaceGUI(): romTarget(DIV_ROM_ABSTRACT), romMultiFile(false), romExportSave(false), - pendingExport(NULL) { + pendingExport(NULL), + romExportExists(false) { // value keys valueKeys[SDLK_0]=0; valueKeys[SDLK_1]=1; @@ -8516,6 +8610,8 @@ FurnaceGUI::FurnaceGUI(): // effect sorting memset(effectsShow,1,sizeof(bool)*10); + memset(romExportAvail,0,sizeof(bool)*DIV_ROM_MAX); + strncpy(noteOffLabel,"OFF",32); strncpy(noteRelLabel,"===",32); strncpy(macroRelLabel,"REL",32); diff --git a/src/gui/gui.h b/src/gui/gui.h index 7f0fd18ff..0a4f434f5 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2683,6 +2683,8 @@ class FurnaceGUI { String romFilterName, romFilterExt; String romExportPath; DivROMExport* pendingExport; + bool romExportAvail[DIV_ROM_MAX]; + bool romExportExists; // user presets window std::vector selectedUserPreset; @@ -2732,6 +2734,7 @@ class FurnaceGUI { bool portSet(String label, unsigned int portSetID, int ins, int outs, int activeIns, int activeOuts, int& clickedPort, std::map& portPos); void updateWindowTitle(); + void updateROMExportAvail(); void autoDetectSystem(); void autoDetectSystemIter(std::vector& category, bool& isMatch, std::map& defCountMap, std::map& defConfMap, std::map& sysCountMap, std::map& sysConfMap); void prepareLayout(); diff --git a/src/gui/newSong.cpp b/src/gui/newSong.cpp index d542188a4..f03715be5 100644 --- a/src/gui/newSong.cpp +++ b/src/gui/newSong.cpp @@ -289,6 +289,7 @@ void FurnaceGUI::drawNewSong() { selEnd=SelectionPoint(); cursor=SelectionPoint(); updateWindowTitle(); + updateROMExportAvail(); ImGui::CloseCurrentPopup(); } diff --git a/src/gui/sysManager.cpp b/src/gui/sysManager.cpp index e7a25d67c..b4e08fc36 100644 --- a/src/gui/sysManager.cpp +++ b/src/gui/sysManager.cpp @@ -91,6 +91,11 @@ void FurnaceGUI::drawSysManager() { if (!e->duplicateSystem(i,sysDupCloneChannels,sysDupEnd)) { showError(fmt::sprintf(_("cannot clone chip! (%s)"),e->getLastError())); } else { + if (e->song.autoSystem) { + autoDetectSystem(); + updateWindowTitle(); + } + updateROMExportAvail(); MARK_MODIFIED; } } @@ -105,6 +110,7 @@ void FurnaceGUI::drawSysManager() { autoDetectSystem(); } updateWindowTitle(); + updateROMExportAvail(); } else { showError(fmt::sprintf(_("cannot change chip! (%s)"),e->getLastError())); } @@ -143,6 +149,7 @@ void FurnaceGUI::drawSysManager() { autoDetectSystem(); } updateWindowTitle(); + updateROMExportAvail(); ImGui::CloseCurrentPopup(); } ImGui::EndPopup();