mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-02-03 09:44:26 -05:00
Bookmarks/Recents now loading & saving
This commit is contained in:
parent
746b7cfcae
commit
2cc05baaa1
@ -24,8 +24,7 @@ void BookmarkMgr::saveToFile(std::string bookmarkFn) {
|
||||
}
|
||||
}
|
||||
|
||||
DataNode *recent = s.rootNode()->newChild("recent");
|
||||
DataNode *recent_modems = recent->newChild("recent_modems");
|
||||
DataNode *recent_modems = s.rootNode()->newChild("recent_modems");
|
||||
|
||||
for (auto demod : wxGetApp().getDemodMgr().getDemodulators()) {
|
||||
wxGetApp().getDemodMgr().saveInstance(recent_modems->newChild("modem"),demod);
|
||||
@ -36,15 +35,67 @@ void BookmarkMgr::saveToFile(std::string bookmarkFn) {
|
||||
recent_modems->newChildCloneFrom("modem", r_i->node);
|
||||
}
|
||||
|
||||
s.SaveToFileXML(wxFileName(wxGetApp().getConfig()->getConfigDir(), bookmarkFn).GetFullPath(wxPATH_NATIVE).ToStdString());
|
||||
wxFileName saveFile(wxGetApp().getConfig()->getConfigDir(), bookmarkFn);
|
||||
wxFileName saveFileBackup(wxGetApp().getConfig()->getConfigDir(), bookmarkFn + ".backup");
|
||||
|
||||
if (saveFile.IsDirWritable()) {
|
||||
// Hopefully leave at least a readable backup in case of failure..
|
||||
if (saveFile.FileExists() && (!saveFileBackup.FileExists() || saveFileBackup.IsFileWritable())) {
|
||||
wxCopyFile(saveFile.GetFullPath(wxPATH_NATIVE).ToStdString(), saveFileBackup.GetFullPath(wxPATH_NATIVE).ToStdString());
|
||||
}
|
||||
s.SaveToFileXML(saveFile.GetFullPath(wxPATH_NATIVE).ToStdString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void BookmarkMgr::loadFromFile(std::string bookmarkFn) {
|
||||
|
||||
|
||||
}
|
||||
wxFileName loadFile(wxGetApp().getConfig()->getConfigDir(), bookmarkFn);
|
||||
|
||||
DataTree s;
|
||||
|
||||
if (!loadFile.IsFileReadable()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!s.LoadFromFileXML(loadFile.GetFullPath(wxPATH_NATIVE).ToStdString())) {
|
||||
// TODO: if exists; inform user & optionally load backup
|
||||
return;
|
||||
}
|
||||
|
||||
if (s.rootNode()->hasAnother("modems")) {
|
||||
DataNode *modems = s.rootNode()->getNext("modems");
|
||||
while (modems->hasAnother("group")) {
|
||||
DataNode *group = modems->getNext("group");
|
||||
std::string groupName = "Unnamed";
|
||||
if (group->hasAnother("@name")) {
|
||||
groupName = group->getNext("@name")->element()->toString();
|
||||
}
|
||||
while (group->hasAnother("modem")) {
|
||||
DataNode *modem = group->getNext("modem");
|
||||
BookmarkEntry *be = nodeToBookmark("modem", modem);
|
||||
if (be) {
|
||||
addBookmark(groupName.c_str(), be);
|
||||
} else {
|
||||
std::cout << "error loading bookmarked modem.." << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (s.rootNode()->hasAnother("recent_modems")) {
|
||||
DataNode *recent_modems = s.rootNode()->getNext("recent_modems");
|
||||
|
||||
while (recent_modems->hasAnother("modem")) {
|
||||
DataNode *modem = recent_modems->getNext("modem");
|
||||
BookmarkEntry *be = nodeToBookmark("modem", modem);
|
||||
if (be) {
|
||||
addRecent(be);
|
||||
} else {
|
||||
std::cout << "error loading recent modem.." << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BookmarkMgr::addBookmark(std::string group, DemodulatorInstance *demod) {
|
||||
std::lock_guard < std::mutex > lock(busy_lock);
|
||||
@ -209,12 +260,19 @@ void BookmarkMgr::updateBookmarks(std::string group) {
|
||||
void BookmarkMgr::addRecent(DemodulatorInstance *demod) {
|
||||
std::lock_guard < std::mutex > lock(busy_lock);
|
||||
recents.push_back(demodToBookmarkEntry(demod));
|
||||
if (recents.size() > BOOKMARK_RECENTS_MAX) {
|
||||
delete *(recents.begin());
|
||||
recents.erase(recents.begin(), recents.begin()+1);
|
||||
}
|
||||
|
||||
trimRecents();
|
||||
}
|
||||
|
||||
void BookmarkMgr::addRecent(BookmarkEntry *be) {
|
||||
std::lock_guard < std::mutex > lock(busy_lock);
|
||||
|
||||
recents.push_back(be);
|
||||
|
||||
trimRecents();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void BookmarkMgr::removeRecent(BookmarkEntry *be) {
|
||||
std::lock_guard < std::mutex > lock(busy_lock);
|
||||
@ -232,6 +290,14 @@ BookmarkList BookmarkMgr::getRecents() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
void BookmarkMgr::trimRecents() {
|
||||
if (recents.size() > BOOKMARK_RECENTS_MAX) {
|
||||
delete *(recents.begin());
|
||||
recents.erase(recents.begin(), recents.begin()+1);
|
||||
}
|
||||
}
|
||||
|
||||
BookmarkEntry *BookmarkMgr::demodToBookmarkEntry(DemodulatorInstance *demod) {
|
||||
BookmarkEntry *be = new BookmarkEntry;
|
||||
|
||||
@ -245,3 +311,23 @@ BookmarkEntry *BookmarkMgr::demodToBookmarkEntry(DemodulatorInstance *demod) {
|
||||
|
||||
return be;
|
||||
}
|
||||
|
||||
BookmarkEntry *BookmarkMgr::nodeToBookmark(const char *name_in, DataNode *node) {
|
||||
if (!node->hasAnother("frequency") || !node->hasAnother("type") || !node->hasAnother("bandwidth")) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
BookmarkEntry *be = new BookmarkEntry();
|
||||
node->getNext("frequency")->element()->get(be->frequency);
|
||||
node->getNext("type")->element()->get(be->type);
|
||||
node->getNext("bandwidth")->element()->get(be->bandwidth);
|
||||
|
||||
if (node->hasAnother("user_label")) {
|
||||
node->getNext("user_label")->element()->get(be->label);
|
||||
}
|
||||
|
||||
be->node = new DataNode("node",*node);
|
||||
|
||||
return be;
|
||||
}
|
||||
|
||||
|
@ -40,7 +40,7 @@ class BookmarkMgr {
|
||||
public:
|
||||
void saveToFile(std::string bookmarkFn);
|
||||
void loadFromFile(std::string bookmarkFn);
|
||||
|
||||
|
||||
void addBookmark(std::string group, DemodulatorInstance *demod);
|
||||
void addBookmark(std::string group, BookmarkEntry *be);
|
||||
void removeBookmark(std::string group, BookmarkEntry *be);
|
||||
@ -59,13 +59,17 @@ public:
|
||||
void updateBookmarks(std::string group);
|
||||
|
||||
void addRecent(DemodulatorInstance *demod);
|
||||
void addRecent(BookmarkEntry *be);
|
||||
void removeRecent(BookmarkEntry *be);
|
||||
BookmarkList getRecents();
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
void trimRecents();
|
||||
|
||||
BookmarkEntry *demodToBookmarkEntry(DemodulatorInstance *demod);
|
||||
BookmarkEntry *demodToBookmarkEntry(DemodulatorInstance *demod);
|
||||
BookmarkEntry *nodeToBookmark(const char *name_in, DataNode *node);
|
||||
|
||||
BookmarkMap bmData;
|
||||
BookmarkMapSorted bmDataSorted;
|
||||
|
@ -405,6 +405,7 @@ bool CubicSDR::OnCmdLineParsed(wxCmdLineParser& parser) {
|
||||
}
|
||||
|
||||
config.load();
|
||||
wxGetApp().getBookmarkMgr().loadFromFile("bookmarks.xml");
|
||||
|
||||
#ifdef BUNDLE_SOAPY_MODS
|
||||
if (parser.Found("b")) {
|
||||
|
@ -435,7 +435,12 @@ std::string DataElement::toString() {
|
||||
strValue = std::to_string(floatSettingValue);
|
||||
} else if (dataType == DATA_NULL) {
|
||||
strValue = "";
|
||||
} else {
|
||||
} else if (dataType == DATA_WSTRING) {
|
||||
std::wstring wstr;
|
||||
get(wstr);
|
||||
strValue = *wstr.c_str();
|
||||
}
|
||||
else {
|
||||
std::cout << "Unhandled DataElement toString for type: " << dataType << std::endl;
|
||||
}
|
||||
} catch (DataTypeMismatchException e) {
|
||||
@ -490,6 +495,16 @@ DataNode::DataNode(const char *name_in): parentNode(NULL), ptr(0) {
|
||||
data_elem = new DataElement();
|
||||
}
|
||||
|
||||
DataNode::DataNode(const char *name_in, DataNode &cloneFrom): parentNode(NULL), ptr(0) {
|
||||
node_name = name_in;
|
||||
data_elem = new DataElement(*cloneFrom.element());
|
||||
|
||||
// TODO: stack recursion optimization
|
||||
while (cloneFrom.hasAnother()) {
|
||||
DataNode *cNode = cloneFrom.getNext();
|
||||
newChildCloneFrom(cNode->getName().c_str(), cNode);
|
||||
}
|
||||
}
|
||||
|
||||
DataNode::DataNode(const char *name_in, DataElement &cloneFrom): parentNode(NULL), ptr(0) {
|
||||
node_name = name_in;
|
||||
@ -540,6 +555,7 @@ DataNode *DataNode::newChildCloneFrom(const char *name_in, DataNode *cloneFrom)
|
||||
childmap[name_in].push_back(children.back());
|
||||
children.back()->setParentNode(*this);
|
||||
|
||||
// TODO: stack recursion optimization
|
||||
while (cloneFrom->hasAnother()) {
|
||||
DataNode *cNode = cloneFrom->getNext();
|
||||
cloneNode->newChildCloneFrom(cNode->getName().c_str(), cNode);
|
||||
|
@ -237,8 +237,9 @@ public:
|
||||
DataNode();
|
||||
DataNode(const char *name_in);
|
||||
DataNode(const char *name_in, DataElement &cloneFrom);
|
||||
|
||||
~DataNode();
|
||||
DataNode(const char *name_in, DataNode &cloneFrom);
|
||||
|
||||
~DataNode();
|
||||
|
||||
void setName(const char *name_in);
|
||||
string &getName() { return node_name; }
|
||||
|
Loading…
Reference in New Issue
Block a user