From 5848c48a763482e326b3e950fa4127e5e1956c36 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 20 Mar 2024 17:39:22 -0500 Subject: [PATCH] GUI: fix system detection --- src/gui/gui.cpp | 127 ++++++++++++++++++++++++++---------------------- src/gui/gui.h | 1 + 2 files changed, 69 insertions(+), 59 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 925b272c5..d34f7a753 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -635,6 +635,73 @@ void FurnaceGUI::updateWindowTitle() { } } +void FurnaceGUI::autoDetectSystemIter(std::vector& category, bool& isMatch, std::map& defCountMap, std::map& defConfMap, std::map& sysCountMap, std::map& sysConfMap) { + for (FurnaceGUISysDef& j: category) { + if (!j.orig.empty()) { + defCountMap.clear(); + defConfMap.clear(); + for (FurnaceGUISysDefChip& k: j.orig) { + auto it=defCountMap.find(k.sys); + if (it==defCountMap.cend()) { + defCountMap[k.sys]=1; + } else { + it->second++; + } + DivConfig dc; + dc.loadFromMemory(k.flags); + defConfMap[k.sys]=dc; + } + if (defCountMap.size()==sysCountMap.size()) { + isMatch=true; + logV("trying on defCountMap: %s",j.name); + for (std::pair k: defCountMap) { + logV("- %s: %d",e->getSystemName(k.first),k.second); + } + for (std::pair k: defCountMap) { + auto countI=sysCountMap.find(k.first); + if (countI==sysCountMap.cend()) { + isMatch=false; + break; + } else if (countI->second!=k.second) { + isMatch=false; + break; + } + + auto confI=sysConfMap.find(k.first); + if (confI==sysConfMap.cend()) { + isMatch=false; + break; + } + DivConfig& sysDC=confI->second; + auto defConfI=defConfMap.find(k.first); + if (defConfI==defConfMap.cend()) { + isMatch=false; + break; + } + for (std::pair l: defConfI->second.configMap()) { + if (!sysDC.has(l.first)) { + isMatch=false; + break; + } + if (sysDC.getString(l.first,"")!=l.second) { + isMatch=false; + break; + } + } + if (!isMatch) break; + } + if (isMatch) { + logV("match found!"); + e->song.systemName=j.name; + break; + } + } + } + if (!j.subDefs.empty()) autoDetectSystemIter(j.subDefs,isMatch,defCountMap,defConfMap,sysCountMap,sysConfMap); + if (isMatch) break; + } +} + void FurnaceGUI::autoDetectSystem() { std::map sysCountMap; std::map sysConfMap; @@ -657,65 +724,7 @@ void FurnaceGUI::autoDetectSystem() { std::map defCountMap; std::map defConfMap; for (FurnaceGUISysCategory& i: sysCategories) { - for (FurnaceGUISysDef& j: i.systems) { - defCountMap.clear(); - defConfMap.clear(); - for (FurnaceGUISysDefChip& k: j.orig) { - auto it=defCountMap.find(k.sys); - if (it==defCountMap.cend()) { - defCountMap[k.sys]=1; - } else { - it->second++; - } - DivConfig dc; - dc.loadFromMemory(k.flags); - defConfMap[k.sys]=dc; - } - if (defCountMap.size()!=sysCountMap.size()) continue; - isMatch=true; - /*logV("trying on defCountMap: %s",j.name); - for (std::pair k: defCountMap) { - logV("- %s: %d",e->getSystemName(k.first),k.second); - }*/ - for (std::pair k: defCountMap) { - auto countI=sysCountMap.find(k.first); - if (countI==sysCountMap.cend()) { - isMatch=false; - break; - } else if (countI->second!=k.second) { - isMatch=false; - break; - } - - auto confI=sysConfMap.find(k.first); - if (confI==sysConfMap.cend()) { - isMatch=false; - break; - } - DivConfig& sysDC=confI->second; - auto defConfI=defConfMap.find(k.first); - if (defConfI==defConfMap.cend()) { - isMatch=false; - break; - } - for (std::pair l: defConfI->second.configMap()) { - if (!sysDC.has(l.first)) { - isMatch=false; - break; - } - if (sysDC.getString(l.first,"")!=l.second) { - isMatch=false; - break; - } - } - if (!isMatch) break; - } - if (isMatch) { - logV("match found!"); - e->song.systemName=j.name; - break; - } - } + autoDetectSystemIter(i.systems,isMatch,defCountMap,defConfMap,sysCountMap,sysConfMap); if (isMatch) break; } diff --git a/src/gui/gui.h b/src/gui/gui.h index a7149bc00..8983e345a 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2511,6 +2511,7 @@ class FurnaceGUI { void updateWindowTitle(); void autoDetectSystem(); + void autoDetectSystemIter(std::vector& category, bool& isMatch, std::map& defCountMap, std::map& defConfMap, std::map& sysCountMap, std::map& sysConfMap); void prepareLayout(); ImVec4 channelColor(int ch); ImVec4 channelTextColor(int ch);