diff --git a/src/baseutils.cpp b/src/baseutils.cpp index fdda9c40a..a9111353b 100644 --- a/src/baseutils.cpp +++ b/src/baseutils.cpp @@ -87,3 +87,7 @@ std::string taDecodeBase64(const char* buf) { return data; } + +std::string taDecodeBase64(const std::string& str) { + return taDecodeBase64(str.c_str()); +} diff --git a/src/baseutils.h b/src/baseutils.h index c0a5665a5..c2ed2721a 100644 --- a/src/baseutils.h +++ b/src/baseutils.h @@ -24,5 +24,6 @@ std::string taEncodeBase64(const std::string& data); std::string taDecodeBase64(const char* str); +std::string taDecodeBase64(const std::string& str); #endif diff --git a/src/engine/config.cpp b/src/engine/config.cpp index 5a027cdbb..fe817ed2c 100644 --- a/src/engine/config.cpp +++ b/src/engine/config.cpp @@ -340,6 +340,34 @@ std::vector DivConfig::getIntList(String key, std::initializer_list fa return fallback; } +std::vector DivConfig::getStringList(String key, std::initializer_list fallback) const { + String next; + std::vector ret; + auto val=conf.find(key); + if (val!=conf.cend()) { + try { + for (char i: val->second) { + if (i==',') { + String result=taDecodeBase64(next); + ret.push_back(result); + next=""; + } else { + next+=i; + } + } + if (!next.empty()) { + String result=taDecodeBase64(next); + ret.push_back(result); + } + + return ret; + } catch (std::out_of_range& e) { + } catch (std::invalid_argument& e) { + } + } + return fallback; +} + bool DivConfig::has(String key) const { auto val=conf.find(key); return (val!=conf.cend()); @@ -384,6 +412,17 @@ void DivConfig::set(String key, const std::vector& value) { conf[key]=val; } +void DivConfig::set(String key, const std::vector& value) { + String val; + bool comma=false; + for (const String& i: value) { + if (comma) val+=','; + val+=taEncodeBase64(i); + comma=true; + } + conf[key]=val; +} + bool DivConfig::remove(String key) { return conf.erase(key); } diff --git a/src/engine/config.h b/src/engine/config.h index 68a4dab20..558bc34ba 100644 --- a/src/engine/config.h +++ b/src/engine/config.h @@ -45,6 +45,7 @@ class DivConfig { double getDouble(String key, double fallback) const; String getString(String key, String fallback) const; std::vector getIntList(String key, std::initializer_list fallback) const; + std::vector getStringList(String key, std::initializer_list fallback) const; // check for existence bool has(String key) const; @@ -57,6 +58,7 @@ class DivConfig { void set(String key, const char* value); void set(String key, String value); void set(String key, const std::vector& value); + void set(String key, const std::vector& value); // remove a config value bool remove(String key); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index b812b149b..37c2483ea 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -7516,6 +7516,9 @@ bool FurnaceGUI::loop() { bool FurnaceGUI::init() { logI("initializing GUI."); + newFilePicker=new FurnaceFilePicker; + newFilePicker->setConfigPrefix("fp_"); + opTouched=new bool[DIV_MAX_PATTERNS*DIV_MAX_ROWS]; syncState(); @@ -7831,8 +7834,6 @@ bool FurnaceGUI::init() { } } - newFilePicker=new FurnaceFilePicker; - updateWindowTitle(); updateROMExportAvail(); @@ -8250,6 +8251,8 @@ void FurnaceGUI::syncState() { xyOscThickness=e->getConfFloat("xyOscThickness",2.0f); cvHiScore=e->getConfInt("cvHiScore",25000); + + newFilePicker->loadSettings(e->getConfObject()); } void FurnaceGUI::commitState(DivConfig& conf) { @@ -8414,6 +8417,8 @@ void FurnaceGUI::commitState(DivConfig& conf) { } conf.set("cvHiScore",cvHiScore); + + newFilePicker->saveSettings(e->getConfObject()); } bool FurnaceGUI::finish(bool saveConfig) { diff --git a/src/gui/newFilePicker.cpp b/src/gui/newFilePicker.cpp index e2899d1ab..7b82fc558 100644 --- a/src/gui/newFilePicker.cpp +++ b/src/gui/newFilePicker.cpp @@ -1326,11 +1326,29 @@ FilePickerStatus FurnaceFilePicker::getStatus() { } void FurnaceFilePicker::loadSettings(DivConfig& conf) { - + showHiddenFiles=conf.getBool(configPrefix+"showHiddenFiles",true); + singleClickSelect=conf.getBool(configPrefix+"singleClickSelect",false); + clearSearchOnDirChange=conf.getBool(configPrefix+"clearSearchOnDirChange",false); + sortDirsFirst=conf.getBool(configPrefix+"sortDirsFirst",true); + displayType=conf.getBool(configPrefix+"displayType",true); + displaySize=conf.getBool(configPrefix+"displaySize",true); + displayDate=conf.getBool(configPrefix+"displayDate",true); + bookmarks=conf.getStringList(configPrefix+"bookmarks",{}); } void FurnaceFilePicker::saveSettings(DivConfig& conf) { + conf.set(configPrefix+"showHiddenFiles",showHiddenFiles); + conf.set(configPrefix+"singleClickSelect",singleClickSelect); + conf.set(configPrefix+"clearSearchOnDirChange",clearSearchOnDirChange); + conf.set(configPrefix+"sortDirsFirst",sortDirsFirst); + conf.set(configPrefix+"displayType",displayType); + conf.set(configPrefix+"displaySize",displaySize); + conf.set(configPrefix+"displayDate",displayDate); + conf.set(configPrefix+"bookmarks",bookmarks); +} +void FurnaceFilePicker::setConfigPrefix(String prefix) { + configPrefix=prefix; } const String& FurnaceFilePicker::getPath() { diff --git a/src/gui/newFilePicker.h b/src/gui/newFilePicker.h index 7e6d73c80..83b04c35c 100644 --- a/src/gui/newFilePicker.h +++ b/src/gui/newFilePicker.h @@ -127,6 +127,7 @@ class FurnaceFilePicker { bool editingPath; // configuration + String configPrefix; std::vector bookmarks; bool showHiddenFiles; bool singleClickSelect; @@ -162,6 +163,7 @@ class FurnaceFilePicker { void setTypeStyle(FileType type, ImVec4 color, String icon); void registerType(String ext, ImVec4 color, String icon); void clearTypes(); + void setConfigPrefix(String prefix); FurnaceFilePicker(); };