mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2024-09-28 08:16:37 -04: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 = s.rootNode()->newChild("recent_modems");
|
||||||
DataNode *recent_modems = recent->newChild("recent_modems");
|
|
||||||
|
|
||||||
for (auto demod : wxGetApp().getDemodMgr().getDemodulators()) {
|
for (auto demod : wxGetApp().getDemodMgr().getDemodulators()) {
|
||||||
wxGetApp().getDemodMgr().saveInstance(recent_modems->newChild("modem"),demod);
|
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);
|
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) {
|
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) {
|
void BookmarkMgr::addBookmark(std::string group, DemodulatorInstance *demod) {
|
||||||
std::lock_guard < std::mutex > lock(busy_lock);
|
std::lock_guard < std::mutex > lock(busy_lock);
|
||||||
@ -209,12 +260,19 @@ void BookmarkMgr::updateBookmarks(std::string group) {
|
|||||||
void BookmarkMgr::addRecent(DemodulatorInstance *demod) {
|
void BookmarkMgr::addRecent(DemodulatorInstance *demod) {
|
||||||
std::lock_guard < std::mutex > lock(busy_lock);
|
std::lock_guard < std::mutex > lock(busy_lock);
|
||||||
recents.push_back(demodToBookmarkEntry(demod));
|
recents.push_back(demodToBookmarkEntry(demod));
|
||||||
if (recents.size() > BOOKMARK_RECENTS_MAX) {
|
|
||||||
delete *(recents.begin());
|
trimRecents();
|
||||||
recents.erase(recents.begin(), recents.begin()+1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BookmarkMgr::addRecent(BookmarkEntry *be) {
|
||||||
|
std::lock_guard < std::mutex > lock(busy_lock);
|
||||||
|
|
||||||
|
recents.push_back(be);
|
||||||
|
|
||||||
|
trimRecents();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void BookmarkMgr::removeRecent(BookmarkEntry *be) {
|
void BookmarkMgr::removeRecent(BookmarkEntry *be) {
|
||||||
std::lock_guard < std::mutex > lock(busy_lock);
|
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 *BookmarkMgr::demodToBookmarkEntry(DemodulatorInstance *demod) {
|
||||||
BookmarkEntry *be = new BookmarkEntry;
|
BookmarkEntry *be = new BookmarkEntry;
|
||||||
|
|
||||||
@ -245,3 +311,23 @@ BookmarkEntry *BookmarkMgr::demodToBookmarkEntry(DemodulatorInstance *demod) {
|
|||||||
|
|
||||||
return be;
|
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:
|
public:
|
||||||
void saveToFile(std::string bookmarkFn);
|
void saveToFile(std::string bookmarkFn);
|
||||||
void loadFromFile(std::string bookmarkFn);
|
void loadFromFile(std::string bookmarkFn);
|
||||||
|
|
||||||
void addBookmark(std::string group, DemodulatorInstance *demod);
|
void addBookmark(std::string group, DemodulatorInstance *demod);
|
||||||
void addBookmark(std::string group, BookmarkEntry *be);
|
void addBookmark(std::string group, BookmarkEntry *be);
|
||||||
void removeBookmark(std::string group, BookmarkEntry *be);
|
void removeBookmark(std::string group, BookmarkEntry *be);
|
||||||
@ -59,13 +59,17 @@ public:
|
|||||||
void updateBookmarks(std::string group);
|
void updateBookmarks(std::string group);
|
||||||
|
|
||||||
void addRecent(DemodulatorInstance *demod);
|
void addRecent(DemodulatorInstance *demod);
|
||||||
|
void addRecent(BookmarkEntry *be);
|
||||||
void removeRecent(BookmarkEntry *be);
|
void removeRecent(BookmarkEntry *be);
|
||||||
BookmarkList getRecents();
|
BookmarkList getRecents();
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
void trimRecents();
|
||||||
|
|
||||||
BookmarkEntry *demodToBookmarkEntry(DemodulatorInstance *demod);
|
BookmarkEntry *demodToBookmarkEntry(DemodulatorInstance *demod);
|
||||||
|
BookmarkEntry *nodeToBookmark(const char *name_in, DataNode *node);
|
||||||
|
|
||||||
BookmarkMap bmData;
|
BookmarkMap bmData;
|
||||||
BookmarkMapSorted bmDataSorted;
|
BookmarkMapSorted bmDataSorted;
|
||||||
|
@ -405,6 +405,7 @@ bool CubicSDR::OnCmdLineParsed(wxCmdLineParser& parser) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
config.load();
|
config.load();
|
||||||
|
wxGetApp().getBookmarkMgr().loadFromFile("bookmarks.xml");
|
||||||
|
|
||||||
#ifdef BUNDLE_SOAPY_MODS
|
#ifdef BUNDLE_SOAPY_MODS
|
||||||
if (parser.Found("b")) {
|
if (parser.Found("b")) {
|
||||||
|
@ -435,7 +435,12 @@ std::string DataElement::toString() {
|
|||||||
strValue = std::to_string(floatSettingValue);
|
strValue = std::to_string(floatSettingValue);
|
||||||
} else if (dataType == DATA_NULL) {
|
} else if (dataType == DATA_NULL) {
|
||||||
strValue = "";
|
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;
|
std::cout << "Unhandled DataElement toString for type: " << dataType << std::endl;
|
||||||
}
|
}
|
||||||
} catch (DataTypeMismatchException e) {
|
} catch (DataTypeMismatchException e) {
|
||||||
@ -490,6 +495,16 @@ DataNode::DataNode(const char *name_in): parentNode(NULL), ptr(0) {
|
|||||||
data_elem = new DataElement();
|
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) {
|
DataNode::DataNode(const char *name_in, DataElement &cloneFrom): parentNode(NULL), ptr(0) {
|
||||||
node_name = name_in;
|
node_name = name_in;
|
||||||
@ -540,6 +555,7 @@ DataNode *DataNode::newChildCloneFrom(const char *name_in, DataNode *cloneFrom)
|
|||||||
childmap[name_in].push_back(children.back());
|
childmap[name_in].push_back(children.back());
|
||||||
children.back()->setParentNode(*this);
|
children.back()->setParentNode(*this);
|
||||||
|
|
||||||
|
// TODO: stack recursion optimization
|
||||||
while (cloneFrom->hasAnother()) {
|
while (cloneFrom->hasAnother()) {
|
||||||
DataNode *cNode = cloneFrom->getNext();
|
DataNode *cNode = cloneFrom->getNext();
|
||||||
cloneNode->newChildCloneFrom(cNode->getName().c_str(), cNode);
|
cloneNode->newChildCloneFrom(cNode->getName().c_str(), cNode);
|
||||||
|
@ -237,8 +237,9 @@ public:
|
|||||||
DataNode();
|
DataNode();
|
||||||
DataNode(const char *name_in);
|
DataNode(const char *name_in);
|
||||||
DataNode(const char *name_in, DataElement &cloneFrom);
|
DataNode(const char *name_in, DataElement &cloneFrom);
|
||||||
|
DataNode(const char *name_in, DataNode &cloneFrom);
|
||||||
~DataNode();
|
|
||||||
|
~DataNode();
|
||||||
|
|
||||||
void setName(const char *name_in);
|
void setName(const char *name_in);
|
||||||
string &getName() { return node_name; }
|
string &getName() { return node_name; }
|
||||||
|
Loading…
Reference in New Issue
Block a user