From bf7d67751e9d34eeadda2f87b564253125097284 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 13 Sep 2016 22:59:21 -0400 Subject: [PATCH 01/51] Initial bookmark form, move demod data node load/save to demod mgr --- CMakeLists.txt | 5 + src/AppFrame.cpp | 143 +-- src/demod/DemodulatorMgr.cpp | 139 ++- src/demod/DemodulatorMgr.h | 7 + src/forms/Bookmark/BookmarkPanel.cpp | 106 +++ src/forms/Bookmark/BookmarkPanel.fbp | 1220 ++++++++++++++++++++++++++ src/forms/Bookmark/BookmarkPanel.h | 71 ++ src/forms/Bookmark/BookmarkView.cpp | 50 ++ src/forms/Bookmark/BookmarkView.h | 26 + 9 files changed, 1628 insertions(+), 139 deletions(-) create mode 100644 src/forms/Bookmark/BookmarkPanel.cpp create mode 100644 src/forms/Bookmark/BookmarkPanel.fbp create mode 100644 src/forms/Bookmark/BookmarkPanel.h create mode 100644 src/forms/Bookmark/BookmarkView.cpp create mode 100644 src/forms/Bookmark/BookmarkView.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a817a1d..c38c471 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -304,6 +304,8 @@ SET (cubicsdr_sources src/forms/SDRDevices/SDRDevicesForm.cpp src/forms/SDRDevices/SDRDeviceAdd.cpp src/forms/SDRDevices/SDRDeviceAddForm.cpp + src/forms/Bookmark/BookmarkPanel.cpp + src/forms/Bookmark/BookmarkView.cpp external/rtaudio/RtAudio.cpp external/lodepng/lodepng.cpp external/tinyxml/tinyxml.cpp @@ -408,6 +410,8 @@ SET (cubicsdr_headers src/forms/SDRDevices/SDRDevicesForm.h src/forms/SDRDevices/SDRDeviceAdd.h src/forms/SDRDevices/SDRDeviceAddForm.h + src/forms/Bookmark/BookmarkPanel.h + src/forms/Bookmark/BookmarkView.h external/rtaudio/RtAudio.h external/lodepng/lodepng.h external/tinyxml/tinyxml.h @@ -495,6 +499,7 @@ set(REG_EXT "[^/]*([.]cpp|[.]c|[.]h|[.]hpp)$") SOURCE_GROUP("Base" REGULAR_EXPRESSION "src/${REG_EXT}") SOURCE_GROUP("Forms\\SDRDevices" REGULAR_EXPRESSION "src/forms/SDRDevices/${REG_EXT}") +SOURCE_GROUP("Forms\\Bookmark" REGULAR_EXPRESSION "src/forms/Bookmark/${REG_EXT}") SOURCE_GROUP("SDR" REGULAR_EXPRESSION "src/sdr/${REG_EXT}") IF(USE_HAMLIB) SOURCE_GROUP("Rig" REGULAR_EXPRESSION "src/rig/${REG_EXT}") diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index d9eb0ce..b15e9d2 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -375,6 +375,8 @@ AppFrame::AppFrame() : } i++; } + + wxGetApp().getDemodMgr().setOutputDevices(outputDevices); // // for (mdevices_i = outputDevices.begin(); mdevices_i != outputDevices.end(); mdevices_i++) { // wxMenuItem *itm = menu->AppendRadioItem(wxID_RT_AUDIO_DEVICE + mdevices_i->first, mdevices_i->second.name, wxT("Description?")); @@ -1649,35 +1651,10 @@ void AppFrame::saveSession(std::string fileName) { DataNode *demods = s.rootNode()->newChild("demodulators"); std::vector &instances = wxGetApp().getDemodMgr().getDemodulators(); - std::vector::iterator instance_i; - for (instance_i = instances.begin(); instance_i != instances.end(); instance_i++) { + + for (auto instance_i : instances) { DataNode *demod = demods->newChild("demodulator"); - *demod->newChild("bandwidth") = (*instance_i)->getBandwidth(); - *demod->newChild("frequency") = (*instance_i)->getFrequency(); - *demod->newChild("type") = (*instance_i)->getDemodulatorType(); - - demod->newChild("user_label")->element()->set((*instance_i)->getDemodulatorUserLabel()); - - *demod->newChild("squelch_level") = (*instance_i)->getSquelchLevel(); - *demod->newChild("squelch_enabled") = (*instance_i)->isSquelchEnabled() ? 1 : 0; - *demod->newChild("output_device") = outputDevices[(*instance_i)->getOutputDevice()].name; - *demod->newChild("gain") = (*instance_i)->getGain(); - *demod->newChild("muted") = (*instance_i)->isMuted() ? 1 : 0; - if ((*instance_i)->isDeltaLock()) { - *demod->newChild("delta_lock") = (*instance_i)->isDeltaLock() ? 1 : 0; - *demod->newChild("delta_ofs") = (*instance_i)->getDeltaLockOfs(); - } - if ((*instance_i) == wxGetApp().getDemodMgr().getLastActiveDemodulator()) { - *demod->newChild("active") = 1; - } - - ModemSettings saveSettings = (*instance_i)->readModemSettings(); - if (saveSettings.size()) { - DataNode *settingsNode = demod->newChild("settings"); - for (ModemSettings::const_iterator msi = saveSettings.begin(); msi != saveSettings.end(); msi++) { - *settingsNode->newChild(msi->first.c_str()) = msi->second; - } - } + wxGetApp().getDemodMgr().saveInstance(demod, instance_i); } //end for demodulators // Make sure the file name actually ends in .xml @@ -1751,7 +1728,6 @@ bool AppFrame::loadSession(std::string fileName) { DataNode *demodulators = l.rootNode()->getNext("demodulators"); - int numDemodulators = 0; std::vector demodsLoaded; while (demodulators->hasAnother("demodulator")) { @@ -1761,122 +1737,15 @@ bool AppFrame::loadSession(std::string fileName) { continue; } - long bandwidth = *demod->getNext("bandwidth"); - long long freq = *demod->getNext("frequency"); - float squelch_level = demod->hasAnother("squelch_level") ? (float) *demod->getNext("squelch_level") : 0; - int squelch_enabled = demod->hasAnother("squelch_enabled") ? (int) *demod->getNext("squelch_enabled") : 0; - int muted = demod->hasAnother("muted") ? (int) *demod->getNext("muted") : 0; - int delta_locked = demod->hasAnother("delta_lock") ? (int) *demod->getNext("delta_lock") : 0; - int delta_ofs = demod->hasAnother("delta_ofs") ? (int) *demod->getNext("delta_ofs") : 0; - std::string output_device = demod->hasAnother("output_device") ? string(*(demod->getNext("output_device"))) : ""; - float gain = demod->hasAnother("gain") ? (float) *demod->getNext("gain") : 1.0; + newDemod = wxGetApp().getDemodMgr().loadInstance(demod); - std::string type = "FM"; - - - DataNode *demodTypeNode = demod->hasAnother("type")?demod->getNext("type"):nullptr; - - if (demodTypeNode && demodTypeNode->element()->getDataType() == DATA_INT) { - int legacyType = *demodTypeNode; - int legacyStereo = demod->hasAnother("stereo") ? (int) *demod->getNext("stereo") : 0; - switch (legacyType) { // legacy demod ID - case 1: type = legacyStereo?"FMS":"FM"; break; - case 2: type = "AM"; break; - case 3: type = "LSB"; break; - case 4: type = "USB"; break; - case 5: type = "DSB"; break; - case 6: type = "ASK"; break; - case 7: type = "APSK"; break; - case 8: type = "BPSK"; break; - case 9: type = "DPSK"; break; - case 10: type = "PSK"; break; - case 11: type = "OOK"; break; - case 12: type = "ST"; break; - case 13: type = "SQAM"; break; - case 14: type = "QAM"; break; - case 15: type = "QPSK"; break; - case 16: type = "I/Q"; break; - default: type = "FM"; break; - } - } else if (demodTypeNode && demodTypeNode->element()->getDataType() == DATA_STRING) { - demodTypeNode->element()->get(type); - } - - //read the user label associated with the demodulator - std::wstring user_label = L""; - - DataNode *demodUserLabel = demod->hasAnother("user_label") ? demod->getNext("user_label") : nullptr; - - if (demodUserLabel) { - - demodUserLabel->element()->get(user_label); - } - - - ModemSettings mSettings; - - if (demod->hasAnother("settings")) { - DataNode *modemSettings = demod->getNext("settings"); - for (int msi = 0, numSettings = modemSettings->numChildren(); msi < numSettings; msi++) { - DataNode *settingNode = modemSettings->child(msi); - std::string keyName = settingNode->getName(); - std::string strSettingValue = settingNode->element()->toString(); - - if (keyName != "" && strSettingValue != "") { - mSettings[keyName] = strSettingValue; - } - } - } - - - - newDemod = wxGetApp().getDemodMgr().newThread(); - if (demod->hasAnother("active")) { loadedActiveDemod = newDemod; } - numDemodulators++; - newDemod->setDemodulatorType(type); - newDemod->setDemodulatorUserLabel(user_label); - newDemod->writeModemSettings(mSettings); - newDemod->setBandwidth(bandwidth); - newDemod->setFrequency(freq); - newDemod->setGain(gain); - newDemod->updateLabel(freq); - newDemod->setMuted(muted?true:false); - if (delta_locked) { - newDemod->setDeltaLock(true); - newDemod->setDeltaLockOfs(delta_ofs); - } - if (squelch_enabled) { - newDemod->setSquelchEnabled(true); - newDemod->setSquelchLevel(squelch_level); - } - - bool found_device = false; - std::map::iterator i; - for (i = outputDevices.begin(); i != outputDevices.end(); i++) { - if (i->second.name == output_device) { - newDemod->setOutputDevice(i->first); - found_device = true; - } - } - -// if (!found_device) { -// std::cout << "\tWarning: named output device '" << output_device << "' was not found. Using default output."; -// } - newDemod->run(); newDemod->setActive(true); demodsLoaded.push_back(newDemod); -// wxGetApp().bindDemodulator(newDemod); - - std::cout << "\tAdded demodulator at frequency " << newDemod->getFrequency() << " type " << type << std::endl; -// std::cout << "\t\tBandwidth: " << bandwidth << std::endl; -// std::cout << "\t\tSquelch Level: " << squelch_level << std::endl; -// std::cout << "\t\tSquelch Enabled: " << (squelch_enabled ? "true" : "false") << std::endl; -// std::cout << "\t\tOutput Device: " << output_device << std::endl; } if (demodsLoaded.size()) { diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp index 61be65c..b312bf7 100644 --- a/src/demod/DemodulatorMgr.cpp +++ b/src/demod/DemodulatorMgr.cpp @@ -1,15 +1,17 @@ -#include #include #include -#include "CubicSDR.h" #include #include #include +#include "DemodulatorMgr.h" + #if USE_HAMLIB #include "RigThread.h" #endif +#include "DataTree.h" + bool demodFreqCompare (DemodulatorInstance *i, DemodulatorInstance *j) { return (i->getFrequency()getFrequency()); } bool inactiveCompare (DemodulatorInstance *i, DemodulatorInstance *j) { return (i->isActive()isActive()); } @@ -368,3 +370,136 @@ ModemSettings DemodulatorMgr::getLastModemSettings(std::string modemType) { void DemodulatorMgr::setLastModemSettings(std::string modemType, ModemSettings settings) { lastModemSettings[modemType] = settings; } + +void DemodulatorMgr::setOutputDevices(std::map devs) { + outputDevices = devs; +} + +void DemodulatorMgr::saveInstance(DataNode *node, DemodulatorInstance *inst) { + *node->newChild("bandwidth") = inst->getBandwidth(); + *node->newChild("frequency") = inst->getFrequency(); + *node->newChild("type") = inst->getDemodulatorType(); + + node->newChild("user_label")->element()->set(inst->getDemodulatorUserLabel()); + + *node->newChild("squelch_level") = inst->getSquelchLevel(); + *node->newChild("squelch_enabled") = inst->isSquelchEnabled() ? 1 : 0; + *node->newChild("output_device") = outputDevices[inst->getOutputDevice()].name; + *node->newChild("gain") = inst->getGain(); + *node->newChild("muted") = inst->isMuted() ? 1 : 0; + if (inst->isDeltaLock()) { + *node->newChild("delta_lock") = inst->isDeltaLock() ? 1 : 0; + *node->newChild("delta_ofs") = inst->getDeltaLockOfs(); + } + if (inst == getLastActiveDemodulator()) { + *node->newChild("active") = 1; + } + + ModemSettings saveSettings = inst->readModemSettings(); + if (saveSettings.size()) { + DataNode *settingsNode = node->newChild("settings"); + for (ModemSettings::const_iterator msi = saveSettings.begin(); msi != saveSettings.end(); msi++) { + *settingsNode->newChild(msi->first.c_str()) = msi->second; + } + } + +} + +DemodulatorInstance *DemodulatorMgr::loadInstance(DataNode *node) { + DemodulatorInstance *newDemod = nullptr; + + long bandwidth = *node->getNext("bandwidth"); + long long freq = *node->getNext("frequency"); + float squelch_level = node->hasAnother("squelch_level") ? (float) *node->getNext("squelch_level") : 0; + int squelch_enabled = node->hasAnother("squelch_enabled") ? (int) *node->getNext("squelch_enabled") : 0; + int muted = node->hasAnother("muted") ? (int) *node->getNext("muted") : 0; + int delta_locked = node->hasAnother("delta_lock") ? (int) *node->getNext("delta_lock") : 0; + int delta_ofs = node->hasAnother("delta_ofs") ? (int) *node->getNext("delta_ofs") : 0; + std::string output_device = node->hasAnother("output_device") ? string(*(node->getNext("output_device"))) : ""; + float gain = node->hasAnother("gain") ? (float) *node->getNext("gain") : 1.0; + + std::string type = "FM"; + + DataNode *demodTypeNode = node->hasAnother("type")?node->getNext("type"):nullptr; + + if (demodTypeNode && demodTypeNode->element()->getDataType() == DATA_INT) { + int legacyType = *demodTypeNode; + int legacyStereo = node->hasAnother("stereo") ? (int) *node->getNext("stereo") : 0; + switch (legacyType) { // legacy demod ID + case 1: type = legacyStereo?"FMS":"FM"; break; + case 2: type = "AM"; break; + case 3: type = "LSB"; break; + case 4: type = "USB"; break; + case 5: type = "DSB"; break; + case 6: type = "ASK"; break; + case 7: type = "APSK"; break; + case 8: type = "BPSK"; break; + case 9: type = "DPSK"; break; + case 10: type = "PSK"; break; + case 11: type = "OOK"; break; + case 12: type = "ST"; break; + case 13: type = "SQAM"; break; + case 14: type = "QAM"; break; + case 15: type = "QPSK"; break; + case 16: type = "I/Q"; break; + default: type = "FM"; break; + } + } else if (demodTypeNode && demodTypeNode->element()->getDataType() == DATA_STRING) { + demodTypeNode->element()->get(type); + } + + //read the user label associated with the demodulator + std::wstring user_label = L""; + + DataNode *demodUserLabel = node->hasAnother("user_label") ? node->getNext("user_label") : nullptr; + + if (demodUserLabel) { + demodUserLabel->element()->get(user_label); + } + + ModemSettings mSettings; + + if (node->hasAnother("settings")) { + DataNode *modemSettings = node->getNext("settings"); + for (int msi = 0, numSettings = modemSettings->numChildren(); msi < numSettings; msi++) { + DataNode *settingNode = modemSettings->child(msi); + std::string keyName = settingNode->getName(); + std::string strSettingValue = settingNode->element()->toString(); + + if (keyName != "" && strSettingValue != "") { + mSettings[keyName] = strSettingValue; + } + } + } + + newDemod = wxGetApp().getDemodMgr().newThread(); + + newDemod->setDemodulatorType(type); + newDemod->setDemodulatorUserLabel(user_label); + newDemod->writeModemSettings(mSettings); + newDemod->setBandwidth(bandwidth); + newDemod->setFrequency(freq); + newDemod->setGain(gain); + newDemod->updateLabel(freq); + newDemod->setMuted(muted?true:false); + if (delta_locked) { + newDemod->setDeltaLock(true); + newDemod->setDeltaLockOfs(delta_ofs); + } + if (squelch_enabled) { + newDemod->setSquelchEnabled(true); + newDemod->setSquelchLevel(squelch_level); + } + + bool found_device = false; + std::map::iterator i; + for (i = outputDevices.begin(); i != outputDevices.end(); i++) { + if (i->second.name == output_device) { + newDemod->setOutputDevice(i->first); + found_device = true; + } + } + + return newDemod; +} + diff --git a/src/demod/DemodulatorMgr.h b/src/demod/DemodulatorMgr.h index a993f84..348815e 100644 --- a/src/demod/DemodulatorMgr.h +++ b/src/demod/DemodulatorMgr.h @@ -6,6 +6,8 @@ #include "DemodulatorInstance.h" +class DataNode; + class DemodulatorMgr { public: DemodulatorMgr(); @@ -54,6 +56,10 @@ public: void updateLastState(); + void setOutputDevices(std::map devs); + void saveInstance(DataNode *node, DemodulatorInstance *inst); + DemodulatorInstance *loadInstance(DataNode *node); + private: void garbageCollect(); @@ -79,4 +85,5 @@ private: std::recursive_mutex demods_busy; std::map lastModemSettings; + std::map outputDevices; }; diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp new file mode 100644 index 0000000..ea8d4a1 --- /dev/null +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -0,0 +1,106 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Aug 23 2015) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "BookmarkPanel.h" + +/////////////////////////////////////////////////////////////////////////// + +BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) +{ + wxBoxSizer* bSizer1; + bSizer1 = new wxBoxSizer( wxVERTICAL ); + + m_treeView = new wxTreeCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE ); + bSizer1->Add( m_treeView, 5, wxEXPAND, 5 ); + + m_propPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxFlexGridSizer* fgPropSizer; + fgPropSizer = new wxFlexGridSizer( 0, 2, 0, 0 ); + fgPropSizer->AddGrowableCol( 1 ); + fgPropSizer->SetFlexibleDirection( wxBOTH ); + fgPropSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticText1 = new wxStaticText( m_propPanel, wxID_ANY, wxT("Label"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1->Wrap( -1 ); + fgPropSizer->Add( m_staticText1, 0, wxALIGN_RIGHT|wxALL, 5 ); + + m_labelText = new wxTextCtrl( m_propPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + fgPropSizer->Add( m_labelText, 0, wxALL|wxEXPAND|wxLEFT|wxTOP, 5 ); + + m_frequencyLabel = new wxStaticText( m_propPanel, wxID_ANY, wxT("Freq"), wxDefaultPosition, wxDefaultSize, 0 ); + m_frequencyLabel->Wrap( -1 ); + fgPropSizer->Add( m_frequencyLabel, 0, wxALIGN_RIGHT|wxALL, 5 ); + + m_frequencyVal = new wxStaticText( m_propPanel, wxID_ANY, wxT("FrequencyVal"), wxDefaultPosition, wxDefaultSize, 0 ); + m_frequencyVal->Wrap( -1 ); + fgPropSizer->Add( m_frequencyVal, 0, wxALL, 5 ); + + m_bandwidthLabel = new wxStaticText( m_propPanel, wxID_ANY, wxT("BW"), wxDefaultPosition, wxDefaultSize, 0 ); + m_bandwidthLabel->Wrap( -1 ); + fgPropSizer->Add( m_bandwidthLabel, 0, wxALIGN_RIGHT|wxALL, 5 ); + + m_bandwidthVal = new wxStaticText( m_propPanel, wxID_ANY, wxT("BandwidthVal"), wxDefaultPosition, wxDefaultSize, 0 ); + m_bandwidthVal->Wrap( -1 ); + fgPropSizer->Add( m_bandwidthVal, 0, wxALL, 5 ); + + m_modulationLabel = new wxStaticText( m_propPanel, wxID_ANY, wxT("Type"), wxDefaultPosition, wxDefaultSize, 0 ); + m_modulationLabel->Wrap( -1 ); + fgPropSizer->Add( m_modulationLabel, 0, wxALIGN_RIGHT|wxALL, 5 ); + + m_typeVal = new wxStaticText( m_propPanel, wxID_ANY, wxT("TypeVal"), wxDefaultPosition, wxDefaultSize, 0 ); + m_typeVal->Wrap( -1 ); + fgPropSizer->Add( m_typeVal, 0, wxALL, 5 ); + + + m_propPanel->SetSizer( fgPropSizer ); + m_propPanel->Layout(); + fgPropSizer->Fit( m_propPanel ); + bSizer1->Add( m_propPanel, 1, wxBOTTOM|wxEXPAND|wxTOP, 5 ); + + m_bookmarkButton = new wxButton( this, wxID_ANY, wxT("Bookmark"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer1->Add( m_bookmarkButton, 0, wxALIGN_RIGHT|wxALL|wxEXPAND, 5 ); + + m_activateButton = new wxButton( this, wxID_ANY, wxT("Activate"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer1->Add( m_activateButton, 0, wxALIGN_RIGHT|wxALL|wxEXPAND, 5 ); + + m_removeButton = new wxButton( this, wxID_ANY, wxT("Remove"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer1->Add( m_removeButton, 0, wxALL|wxEXPAND, 5 ); + + + this->SetSizer( bSizer1 ); + this->Layout(); + + // Connect Events + m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this ); + m_treeView->Connect( wxEVT_COMMAND_TREE_END_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeEndLabelEdit ), NULL, this ); + m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this ); + m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxTreeEventHandler( BookmarkPanel::onTreeCollapse ), NULL, this ); + m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEventHandler( BookmarkPanel::onTreeExpanded ), NULL, this ); + m_treeView->Connect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( BookmarkPanel::onTreeSelect ), NULL, this ); + m_treeView->Connect( wxEVT_COMMAND_TREE_SEL_CHANGING, wxTreeEventHandler( BookmarkPanel::onTreeSelectChanging ), NULL, this ); + m_labelText->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); + m_bookmarkButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onBookmark ), NULL, this ); + m_activateButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onActivate ), NULL, this ); + m_removeButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onRemove ), NULL, this ); +} + +BookmarkPanel::~BookmarkPanel() +{ + // Disconnect Events + m_treeView->Disconnect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this ); + m_treeView->Disconnect( wxEVT_COMMAND_TREE_END_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeEndLabelEdit ), NULL, this ); + m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this ); + m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxTreeEventHandler( BookmarkPanel::onTreeCollapse ), NULL, this ); + m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEventHandler( BookmarkPanel::onTreeExpanded ), NULL, this ); + m_treeView->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( BookmarkPanel::onTreeSelect ), NULL, this ); + m_treeView->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGING, wxTreeEventHandler( BookmarkPanel::onTreeSelectChanging ), NULL, this ); + m_labelText->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); + m_bookmarkButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onBookmark ), NULL, this ); + m_activateButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onActivate ), NULL, this ); + m_removeButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onRemove ), NULL, this ); + +} diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp new file mode 100644 index 0000000..1899c8f --- /dev/null +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -0,0 +1,1220 @@ + + + + + + C++ + 1 + source_name + 0 + 0 + res + UTF-8 + connect + BookmarkPanel + 1000 + none + 0 + BookmarkPanel + + . + + 1 + 1 + 1 + 1 + UI + 0 + 0 + + 0 + wxAUI_MGR_DEFAULT + + + 1 + 1 + impl_virtual + + + 0 + wxID_ANY + + + BookmarkPanel + + 169,471 + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer1 + wxVERTICAL + none + + 5 + wxEXPAND + 5 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 0 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_treeView + 1 + + + protected + 1 + + Resizable + 1 + + wxTR_DEFAULT_STYLE + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + onTreeBeginLabelEdit + + + + onTreeEndLabelEdit + + onTreeActivate + onTreeCollapse + + onTreeExpanded + + + + + + + onTreeSelect + onTreeSelectChanging + + + + + + + 5 + wxBOTTOM|wxEXPAND|wxTOP + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_propPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + 2 + wxBOTH + 1 + + 0 + + fgPropSizer + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 0 + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Label + + 0 + + + 0 + + 1 + m_staticText1 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND|wxLEFT|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_labelText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + onLabelText + + + + + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Freq + + 0 + + + 0 + + 1 + m_frequencyLabel + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + FrequencyVal + + 0 + + + 0 + + 1 + m_frequencyVal + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + BW + + 0 + + + 0 + + 1 + m_bandwidthLabel + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + BandwidthVal + + 0 + + + 0 + + 1 + m_bandwidthVal + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Type + + 0 + + + 0 + + 1 + m_modulationLabel + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + TypeVal + + 0 + + + 0 + + 1 + m_typeVal + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_RIGHT|wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Bookmark + + 0 + + + 0 + + 1 + m_bookmarkButton + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + onBookmark + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_RIGHT|wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Activate + + 0 + + + 0 + + 1 + m_activateButton + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + onActivate + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Remove + + 0 + + + 0 + + 1 + m_removeButton + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + onRemove + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/forms/Bookmark/BookmarkPanel.h b/src/forms/Bookmark/BookmarkPanel.h new file mode 100644 index 0000000..97e5848 --- /dev/null +++ b/src/forms/Bookmark/BookmarkPanel.h @@ -0,0 +1,71 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Aug 23 2015) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __BOOKMARKPANEL_H__ +#define __BOOKMARKPANEL_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +/// Class BookmarkPanel +/////////////////////////////////////////////////////////////////////////////// +class BookmarkPanel : public wxPanel +{ + private: + + protected: + wxTreeCtrl* m_treeView; + wxPanel* m_propPanel; + wxStaticText* m_staticText1; + wxTextCtrl* m_labelText; + wxStaticText* m_frequencyLabel; + wxStaticText* m_frequencyVal; + wxStaticText* m_bandwidthLabel; + wxStaticText* m_bandwidthVal; + wxStaticText* m_modulationLabel; + wxStaticText* m_typeVal; + wxButton* m_bookmarkButton; + wxButton* m_activateButton; + wxButton* m_removeButton; + + // Virtual event handlers, overide them in your derived class + virtual void onTreeBeginLabelEdit( wxTreeEvent& event ) { event.Skip(); } + virtual void onTreeEndLabelEdit( wxTreeEvent& event ) { event.Skip(); } + virtual void onTreeActivate( wxTreeEvent& event ) { event.Skip(); } + virtual void onTreeCollapse( wxTreeEvent& event ) { event.Skip(); } + virtual void onTreeExpanded( wxTreeEvent& event ) { event.Skip(); } + virtual void onTreeSelect( wxTreeEvent& event ) { event.Skip(); } + virtual void onTreeSelectChanging( wxTreeEvent& event ) { event.Skip(); } + virtual void onLabelText( wxCommandEvent& event ) { event.Skip(); } + virtual void onBookmark( wxCommandEvent& event ) { event.Skip(); } + virtual void onActivate( wxCommandEvent& event ) { event.Skip(); } + virtual void onRemove( wxCommandEvent& event ) { event.Skip(); } + + + public: + + BookmarkPanel( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 169,471 ), long style = wxTAB_TRAVERSAL ); + ~BookmarkPanel(); + +}; + +#endif //__BOOKMARKPANEL_H__ diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp new file mode 100644 index 0000000..f988604 --- /dev/null +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -0,0 +1,50 @@ +#include "BookmarkView.h" + +BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { + +} + +void BookmarkView::onTreeBeginLabelEdit( wxTreeEvent& event ) { + event.Skip(); +} + +void BookmarkView::onTreeEndLabelEdit( wxTreeEvent& event ) { + event.Skip(); +} + +void BookmarkView::onTreeActivate( wxTreeEvent& event ) { + event.Skip(); +} + +void BookmarkView::onTreeCollapse( wxTreeEvent& event ) { + event.Skip(); +} + +void BookmarkView::onTreeExpanded( wxTreeEvent& event ) { + event.Skip(); +} + +void BookmarkView::onTreeSelect( wxTreeEvent& event ) { + event.Skip(); +} + +void BookmarkView::onTreeSelectChanging( wxTreeEvent& event ) { + event.Skip(); +} + +void BookmarkView::onLabelText( wxCommandEvent& event ) { + event.Skip(); +} + +void BookmarkView::onBookmark( wxCommandEvent& event ) { + event.Skip(); +} + +void BookmarkView::onActivate( wxCommandEvent& event ) { + event.Skip(); +} + +void BookmarkView::onRemove( wxCommandEvent& event ) { + event.Skip(); +} + diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h new file mode 100644 index 0000000..6ed3e17 --- /dev/null +++ b/src/forms/Bookmark/BookmarkView.h @@ -0,0 +1,26 @@ +#pragma once + +#include "BookmarkPanel.h" + +class BookmarkView : public BookmarkPanel { +public: + BookmarkView( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxTAB_TRAVERSAL ); + + void updateActiveList(); + void saveToFile(std::string bookmarkFn); + void loadFromFile(std::string bookmarkFn); + +protected: + void onTreeBeginLabelEdit( wxTreeEvent& event ); + void onTreeEndLabelEdit( wxTreeEvent& event ); + void onTreeActivate( wxTreeEvent& event ); + void onTreeCollapse( wxTreeEvent& event ); + void onTreeExpanded( wxTreeEvent& event ); + void onTreeSelect( wxTreeEvent& event ); + void onTreeSelectChanging( wxTreeEvent& event ); + void onLabelText( wxCommandEvent& event ); + void onBookmark( wxCommandEvent& event ); + void onActivate( wxCommandEvent& event ); + void onRemove( wxCommandEvent& event ); + +}; \ No newline at end of file From ba7a0d8cd3edf597b21a1d9fd2aafddcd1972aef Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 14 Sep 2016 19:46:57 -0400 Subject: [PATCH 02/51] Init bookmark manager --- CMakeLists.txt | 3 +++ src/AppFrame.h | 2 ++ src/BookmarkMgr.cpp | 28 +++++++++++++++++++++++ src/BookmarkMgr.h | 38 +++++++++++++++++++++++++++++++ src/forms/Bookmark/BookmarkView.h | 7 +++--- 5 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 src/BookmarkMgr.cpp create mode 100644 src/BookmarkMgr.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c38c471..518482a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -247,6 +247,7 @@ SET (cubicsdr_sources src/DemodLabelDialog.cpp src/IOThread.cpp src/ModemProperties.cpp + src/BookmarkMgr.cpp src/sdr/SDRDeviceInfo.cpp src/sdr/SDRPostThread.cpp src/sdr/SDREnumerator.cpp @@ -349,6 +350,7 @@ SET (cubicsdr_headers src/DemodLabelDialog.h src/IOThread.h src/ModemProperties.h + src/BookmarkMgr.h src/sdr/SDRDeviceInfo.h src/sdr/SDRPostThread.h src/sdr/SDREnumerator.h @@ -525,6 +527,7 @@ SOURCE_GROUP("_ext-CubicVR2" REGULAR_EXPRESSION "external/cubicvr2/.*${REG_EXT}" include_directories ( ${PROJECT_SOURCE_DIR}/src/forms/SDRDevices ${PROJECT_SOURCE_DIR}/src/forms/DigitalConsole + ${PROJECT_SOURCE_DIR}/src/forms/Bookmark ${PROJECT_SOURCE_DIR}/src/sdr ${PROJECT_SOURCE_DIR}/src/demod ${PROJECT_SOURCE_DIR}/src/modules diff --git a/src/AppFrame.h b/src/AppFrame.h index 4c2acee..ea258b9 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -19,6 +19,8 @@ #include "ModemProperties.h" //#include "UITestCanvas.h" #include "FrequencyDialog.h" +#include "BookmarkMgr.h" +#include "BookmarkView.h" #include diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp new file mode 100644 index 0000000..9c292dd --- /dev/null +++ b/src/BookmarkMgr.cpp @@ -0,0 +1,28 @@ +#include "BookmarkMgr.h" + + +void BookmarkMgr::saveToFile(std::string bookmarkFn) { + + +} + + +void BookmarkMgr::loadFromFile(std::string bookmarkFn) { + + +} + +void BookmarkMgr::addBookmark(std::string group, DemodulatorInstance *demod) { + std::lock_guard < std::mutex > lock(busy_lock); + +} + +BookmarkList BookmarkMgr::getBookmarks(std::string group, std::string folder) { + std::lock_guard < std::mutex > lock(busy_lock); + + BookmarkList results; + + + + return results; +} diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h new file mode 100644 index 0000000..726d061 --- /dev/null +++ b/src/BookmarkMgr.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include + +#include "DataTree.h" +#include "DemodulatorInstance.h" + +class BookmarkEntry { +public: + std::mutex busy_lock; + + std::string folder; + std::string type; + std::string label; + + long long frequency; + int bandwidth; + + DataNode *node; +}; + +typedef std::vector BookmarkList; +typedef std::map > BookmarkMap; + +class BookmarkMgr { +public: + void saveToFile(std::string bookmarkFn); + void loadFromFile(std::string bookmarkFn); + + void addBookmark(std::string group, DemodulatorInstance *demod); + BookmarkList getBookmarks(std::string group, std::string folder = ""); + +protected: + + BookmarkMap bmData; + std::mutex busy_lock; +}; diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 6ed3e17..8319e5c 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -2,13 +2,13 @@ #include "BookmarkPanel.h" +#include "BookmarkMgr.h" + class BookmarkView : public BookmarkPanel { public: BookmarkView( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxTAB_TRAVERSAL ); void updateActiveList(); - void saveToFile(std::string bookmarkFn); - void loadFromFile(std::string bookmarkFn); protected: void onTreeBeginLabelEdit( wxTreeEvent& event ); @@ -22,5 +22,6 @@ protected: void onBookmark( wxCommandEvent& event ); void onActivate( wxCommandEvent& event ); void onRemove( wxCommandEvent& event ); - + + }; \ No newline at end of file From 488e8ed9e70721869b0ca231f278f31fe230a636 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 14 Sep 2016 22:10:27 -0400 Subject: [PATCH 03/51] Add bookmark panel to appframe layout, implement some methods --- src/AppFrame.cpp | 15 ++++++++--- src/AppFrame.h | 4 +-- src/BookmarkMgr.cpp | 38 +++++++++++++++++++++++++--- src/BookmarkMgr.h | 19 +++++++++++--- src/CubicSDR.cpp | 4 +++ src/CubicSDR.h | 3 +++ src/forms/Bookmark/BookmarkPanel.cpp | 14 +++++----- src/forms/Bookmark/BookmarkPanel.fbp | 14 +++++----- src/forms/Bookmark/BookmarkView.cpp | 22 ++++++++++++++++ src/forms/Bookmark/BookmarkView.h | 4 ++- 10 files changed, 109 insertions(+), 28 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index b15e9d2..527a8b9 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -232,10 +232,13 @@ AppFrame::AppFrame() : // vbox->Add(demodTray, 12, wxEXPAND | wxALL, 0); // vbox->AddSpacer(1); - - mainVisSplitter = new wxSplitterWindow( mainSplitter, wxID_VIS_SPLITTER, wxDefaultPosition, wxDefaultSize, wxSP_3DSASH | wxSP_LIVE_UPDATE ); - mainVisSplitter->SetSashGravity(6.0/25.0); + bookmarkSplitter = new wxSplitterWindow( mainSplitter, wxID_VIS_SPLITTER, wxDefaultPosition, wxDefaultSize, wxSP_3DSASH | wxSP_LIVE_UPDATE ); + bookmarkSplitter->SetMinimumPaneSize(1); + bookmarkSplitter->SetSashGravity(1.0/20.0); + + mainVisSplitter = new wxSplitterWindow( bookmarkSplitter, wxID_VIS_SPLITTER, wxDefaultPosition, wxDefaultSize, wxSP_3DSASH | wxSP_LIVE_UPDATE ); mainVisSplitter->SetMinimumPaneSize(1); + mainVisSplitter->SetSashGravity(6.0/25.0); // mainVisSplitter->Connect( wxEVT_IDLE, wxIdleEventHandler( AppFrame::mainVisSplitterIdle ), NULL, this ); @@ -309,7 +312,11 @@ AppFrame::AppFrame() : // vbox->Add(wfSizer, 20, wxEXPAND | wxALL, 0); mainVisSplitter->SplitHorizontally( spectrumPanel, waterfallPanel, 0 ); - mainSplitter->SplitHorizontally( demodPanel, mainVisSplitter ); + + bookmarkPanel = new BookmarkPanel(bookmarkSplitter, wxID_ANY, wxDefaultPosition, wxSize(120,-1)); + + bookmarkSplitter->SplitVertically( bookmarkPanel, mainVisSplitter ); + mainSplitter->SplitHorizontally( demodPanel, bookmarkSplitter ); vbox->Add(mainSplitter, 1, wxEXPAND | wxALL, 0); diff --git a/src/AppFrame.h b/src/AppFrame.h index ea258b9..6124b8c 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -19,7 +19,6 @@ #include "ModemProperties.h" //#include "UITestCanvas.h" #include "FrequencyDialog.h" -#include "BookmarkMgr.h" #include "BookmarkView.h" #include @@ -135,8 +134,9 @@ private: ModeSelectorCanvas *demodMuteButton, *peakHoldButton, *soloModeButton, *deltaLockButton; GainCanvas *gainCanvas; wxSizerItem *gainSizerItem, *gainSpacerItem; - wxSplitterWindow *mainVisSplitter, *mainSplitter; + wxSplitterWindow *mainVisSplitter, *mainSplitter, *bookmarkSplitter; wxBoxSizer *demodTray; + BookmarkPanel *bookmarkPanel; DemodulatorInstance *activeDemodulator; diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 9c292dd..006dafc 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -1,4 +1,6 @@ #include "BookmarkMgr.h" +#include "CubicSDR.h" +#include "DataTree.h" void BookmarkMgr::saveToFile(std::string bookmarkFn) { @@ -12,17 +14,47 @@ void BookmarkMgr::loadFromFile(std::string bookmarkFn) { } -void BookmarkMgr::addBookmark(std::string group, DemodulatorInstance *demod) { +void BookmarkMgr::addBookmark(std::string group, DemodulatorInstance *demod, std::string folder) { std::lock_guard < std::mutex > lock(busy_lock); - + + BookmarkEntry *be = new BookmarkEntry; + + be->bandwidth = demod->getBandwidth(); + be->type = demod->getDemodulatorType(); + be->label = demod->getLabel(); + be->frequency = demod->getFrequency(); + be->folder = folder; + + wxGetApp().getDemodMgr().saveInstance(be->node, demod); + + bmData[group].insert(be); } +void BookmarkMgr::removeBookmark(std::string group, BookmarkEntry *be) { + std::lock_guard < std::mutex > lockData(busy_lock); + std::lock_guard < std::mutex > lockEnt(be->busy_lock); + + bmData[group].erase(be); +} + + BookmarkList BookmarkMgr::getBookmarks(std::string group, std::string folder) { std::lock_guard < std::mutex > lock(busy_lock); BookmarkList results; - + if (folder != "") { + for (auto be_i : bmData[group]) { + results.push_back(be_i); + } + } else { + for (auto be_i : bmData[group]) { + if (be_i->folder != folder) { + continue; + } + results.push_back(be_i); + } + } return results; } diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 726d061..ff09969 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -1,11 +1,12 @@ #pragma once #include -#include +#include -#include "DataTree.h" #include "DemodulatorInstance.h" +class DataNode; + class BookmarkEntry { public: std::mutex busy_lock; @@ -20,15 +21,25 @@ public: DataNode *node; }; +struct BookmarkEntryCompare : public std::binary_function +{ + bool operator()(const BookmarkEntry *a, BookmarkEntry *b) const + { + return a->frequency < b->frequency; + } +}; + + typedef std::vector BookmarkList; -typedef std::map > BookmarkMap; +typedef std::map > BookmarkMap; 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, DemodulatorInstance *demod, std::string folder = ""); + void removeBookmark(std::string group, BookmarkEntry *be); BookmarkList getBookmarks(std::string group, std::string folder = ""); protected: diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 11195f9..acc888e 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -671,6 +671,10 @@ DemodulatorMgr &CubicSDR::getDemodMgr() { return demodMgr; } +BookmarkMgr &CubicSDR::getBookmarkMgr() { + return bookmarkMgr; +} + SDRPostThread *CubicSDR::getSDRPostThread() { return sdrPostThread; } diff --git a/src/CubicSDR.h b/src/CubicSDR.h index 07b28cb..171949f 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -23,6 +23,7 @@ #include "AppFrame.h" #include "FrequencyDialog.h" #include "DemodLabelDialog.h" +#include "BookmarkMgr.h" #include "ScopeVisualProcessor.h" #include "SpectrumVisualProcessor.h" @@ -111,6 +112,7 @@ public: DemodulatorThreadInputQueue* getWaterfallVisualQueue(); DemodulatorThreadInputQueue* getActiveDemodVisualQueue(); DemodulatorMgr &getDemodMgr(); + BookmarkMgr &getBookmarkMgr(); SDRPostThread *getSDRPostThread(); SDRThread *getSDRThread(); @@ -179,6 +181,7 @@ private: std::vector *devs = nullptr; DemodulatorMgr demodMgr; + BookmarkMgr bookmarkMgr; std::atomic_llong frequency; std::atomic_llong offset; diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index ea8d4a1..decffca 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -26,14 +26,14 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_staticText1 = new wxStaticText( m_propPanel, wxID_ANY, wxT("Label"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText1->Wrap( -1 ); - fgPropSizer->Add( m_staticText1, 0, wxALIGN_RIGHT|wxALL, 5 ); + fgPropSizer->Add( m_staticText1, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_labelText = new wxTextCtrl( m_propPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - fgPropSizer->Add( m_labelText, 0, wxALL|wxEXPAND|wxLEFT|wxTOP, 5 ); + fgPropSizer->Add( m_labelText, 0, wxALL|wxEXPAND, 5 ); m_frequencyLabel = new wxStaticText( m_propPanel, wxID_ANY, wxT("Freq"), wxDefaultPosition, wxDefaultSize, 0 ); m_frequencyLabel->Wrap( -1 ); - fgPropSizer->Add( m_frequencyLabel, 0, wxALIGN_RIGHT|wxALL, 5 ); + fgPropSizer->Add( m_frequencyLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_frequencyVal = new wxStaticText( m_propPanel, wxID_ANY, wxT("FrequencyVal"), wxDefaultPosition, wxDefaultSize, 0 ); m_frequencyVal->Wrap( -1 ); @@ -41,7 +41,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_bandwidthLabel = new wxStaticText( m_propPanel, wxID_ANY, wxT("BW"), wxDefaultPosition, wxDefaultSize, 0 ); m_bandwidthLabel->Wrap( -1 ); - fgPropSizer->Add( m_bandwidthLabel, 0, wxALIGN_RIGHT|wxALL, 5 ); + fgPropSizer->Add( m_bandwidthLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_bandwidthVal = new wxStaticText( m_propPanel, wxID_ANY, wxT("BandwidthVal"), wxDefaultPosition, wxDefaultSize, 0 ); m_bandwidthVal->Wrap( -1 ); @@ -49,7 +49,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_modulationLabel = new wxStaticText( m_propPanel, wxID_ANY, wxT("Type"), wxDefaultPosition, wxDefaultSize, 0 ); m_modulationLabel->Wrap( -1 ); - fgPropSizer->Add( m_modulationLabel, 0, wxALIGN_RIGHT|wxALL, 5 ); + fgPropSizer->Add( m_modulationLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_typeVal = new wxStaticText( m_propPanel, wxID_ANY, wxT("TypeVal"), wxDefaultPosition, wxDefaultSize, 0 ); m_typeVal->Wrap( -1 ); @@ -62,10 +62,10 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po bSizer1->Add( m_propPanel, 1, wxBOTTOM|wxEXPAND|wxTOP, 5 ); m_bookmarkButton = new wxButton( this, wxID_ANY, wxT("Bookmark"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer1->Add( m_bookmarkButton, 0, wxALIGN_RIGHT|wxALL|wxEXPAND, 5 ); + bSizer1->Add( m_bookmarkButton, 0, wxALL|wxEXPAND, 5 ); m_activateButton = new wxButton( this, wxID_ANY, wxT("Activate"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer1->Add( m_activateButton, 0, wxALIGN_RIGHT|wxALL|wxEXPAND, 5 ); + bSizer1->Add( m_activateButton, 0, wxALL|wxEXPAND, 5 ); m_removeButton = new wxButton( this, wxID_ANY, wxT("Remove"), wxDefaultPosition, wxDefaultSize, 0 ); bSizer1->Add( m_removeButton, 0, wxALL|wxEXPAND, 5 ); diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index 1899c8f..9a34b9b 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -277,7 +277,7 @@ 0 5 - wxALIGN_RIGHT|wxALL + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT 0 1 @@ -360,7 +360,7 @@ 5 - wxALL|wxEXPAND|wxLEFT|wxTOP + wxALL|wxEXPAND 0 1 @@ -451,7 +451,7 @@ 5 - wxALIGN_RIGHT|wxALL + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT 0 1 @@ -617,7 +617,7 @@ 5 - wxALIGN_RIGHT|wxALL + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT 0 1 @@ -783,7 +783,7 @@ 5 - wxALIGN_RIGHT|wxALL + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT 0 1 @@ -952,7 +952,7 @@ 5 - wxALIGN_RIGHT|wxALL|wxEXPAND + wxALL|wxEXPAND 0 1 @@ -1040,7 +1040,7 @@ 5 - wxALIGN_RIGHT|wxALL|wxEXPAND + wxALL|wxEXPAND 0 1 diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index f988604..fd82918 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -1,7 +1,29 @@ #include "BookmarkView.h" +#include "CubicSDR.h" BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { + doUpdateActive = false; +} + +void BookmarkView::updateActiveList() { + std::vector &demods = wxGetApp().getDemodMgr().getDemodulators(); + DemodulatorInstance *activeDemodulator = wxGetApp().getDemodMgr().getActiveDemodulator(); + DemodulatorInstance *lastActiveDemodulator = wxGetApp().getDemodMgr().getLastActiveDemodulator(); + + m_treeView->Disable(); + m_treeView->DeleteAllItems(); + activeItems.erase(activeItems.begin(),activeItems.end()); + + activeBranch = m_treeView->AddRoot("Active"); + + for (auto demod_i : demods) { + wxTreeItemId itm = m_treeView->AppendItem(activeBranch,demod_i->getLabel()); + activeItems[itm] = demod_i; + } + + m_treeView->Enable(); + m_treeView->ExpandAll(); } void BookmarkView::onTreeBeginLabelEdit( wxTreeEvent& event ) { diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 8319e5c..bbef98c 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -23,5 +23,7 @@ protected: void onActivate( wxCommandEvent& event ); void onRemove( wxCommandEvent& event ); - + bool doUpdateActive; + wxTreeItemId activeBranch; + std::map activeItems; }; \ No newline at end of file From f4ab6fbaad5c2544de81a589362d0b46d41fe778 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 14 Sep 2016 22:49:32 -0400 Subject: [PATCH 04/51] Bookmark panel active list testing --- src/AppFrame.cpp | 8 ++++++-- src/AppFrame.h | 6 ++++-- src/forms/Bookmark/BookmarkPanel.cpp | 3 +++ src/forms/Bookmark/BookmarkPanel.fbp | 9 +++++++++ src/forms/Bookmark/BookmarkPanel.h | 3 +++ src/forms/Bookmark/BookmarkView.cpp | 27 ++++++++++++++++++++------- src/forms/Bookmark/BookmarkView.h | 3 +++ 7 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 527a8b9..25ef1c8 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -313,9 +313,9 @@ AppFrame::AppFrame() : mainVisSplitter->SplitHorizontally( spectrumPanel, waterfallPanel, 0 ); - bookmarkPanel = new BookmarkPanel(bookmarkSplitter, wxID_ANY, wxDefaultPosition, wxSize(120,-1)); + bookmarkView = new BookmarkView(bookmarkSplitter, wxID_ANY, wxDefaultPosition, wxSize(120,-1)); - bookmarkSplitter->SplitVertically( bookmarkPanel, mainVisSplitter ); + bookmarkSplitter->SplitVertically( bookmarkView, mainVisSplitter ); mainSplitter->SplitHorizontally( demodPanel, bookmarkSplitter ); vbox->Add(mainSplitter, 1, wxEXPAND | wxALL, 0); @@ -1836,6 +1836,10 @@ bool AppFrame::isUserDemodBusy() { wxGetApp().getDemodMgr().getLastActiveDemodulator() != wxGetApp().getDemodMgr().getActiveDemodulator()); } +BookmarkView *AppFrame::getBookmarkView() { + return bookmarkView; +} + #ifdef _WIN32 bool AppFrame::canFocus() { diff --git a/src/AppFrame.h b/src/AppFrame.h index 6124b8c..c0b0299 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -103,7 +103,9 @@ public: void setViewState(long long center_freq); bool isUserDemodBusy(); - + + BookmarkView *getBookmarkView(); + #ifdef _WIN32 bool canFocus(); #endif @@ -136,7 +138,7 @@ private: wxSizerItem *gainSizerItem, *gainSpacerItem; wxSplitterWindow *mainVisSplitter, *mainSplitter, *bookmarkSplitter; wxBoxSizer *demodTray; - BookmarkPanel *bookmarkPanel; + BookmarkView *bookmarkView; DemodulatorInstance *activeDemodulator; diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index decffca..78c7f11 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -73,6 +73,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po this->SetSizer( bSizer1 ); this->Layout(); + m_updateTimer.SetOwner( this, wxID_ANY ); // Connect Events m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this ); @@ -86,6 +87,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_bookmarkButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onBookmark ), NULL, this ); m_activateButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onActivate ), NULL, this ); m_removeButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onRemove ), NULL, this ); + this->Connect( wxID_ANY, wxEVT_TIMER, wxTimerEventHandler( BookmarkPanel::onUpdateTimer ) ); } BookmarkPanel::~BookmarkPanel() @@ -102,5 +104,6 @@ BookmarkPanel::~BookmarkPanel() m_bookmarkButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onBookmark ), NULL, this ); m_activateButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onActivate ), NULL, this ); m_removeButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onRemove ), NULL, this ); + this->Disconnect( wxID_ANY, wxEVT_TIMER, wxTimerEventHandler( BookmarkPanel::onUpdateTimer ) ); } diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index 9a34b9b..b1ec872 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -1215,6 +1215,15 @@ + + 0 + wxID_ANY + m_updateTimer + 0 + 500 + protected + onUpdateTimer + diff --git a/src/forms/Bookmark/BookmarkPanel.h b/src/forms/Bookmark/BookmarkPanel.h index 97e5848..7ef675f 100644 --- a/src/forms/Bookmark/BookmarkPanel.h +++ b/src/forms/Bookmark/BookmarkPanel.h @@ -21,6 +21,7 @@ #include #include #include +#include /////////////////////////////////////////////////////////////////////////// @@ -46,6 +47,7 @@ class BookmarkPanel : public wxPanel wxButton* m_bookmarkButton; wxButton* m_activateButton; wxButton* m_removeButton; + wxTimer m_updateTimer; // Virtual event handlers, overide them in your derived class virtual void onTreeBeginLabelEdit( wxTreeEvent& event ) { event.Skip(); } @@ -59,6 +61,7 @@ class BookmarkPanel : public wxPanel virtual void onBookmark( wxCommandEvent& event ) { event.Skip(); } virtual void onActivate( wxCommandEvent& event ) { event.Skip(); } virtual void onRemove( wxCommandEvent& event ) { event.Skip(); } + virtual void onUpdateTimer( wxTimerEvent& event ) { event.Skip(); } public: diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index fd82918..7b52abc 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -2,20 +2,32 @@ #include "CubicSDR.h" BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { - doUpdateActive = false; + + activeBranch = m_treeView->AddRoot("Active"); + doUpdateActive = true; + m_updateTimer.Start(500); +} + +void BookmarkView::onUpdateTimer( wxTimerEvent& event ) { + if (doUpdateActive) { + doUpdateActiveList(); + +// doUpdateActive = false; + } } void BookmarkView::updateActiveList() { + doUpdateActive = true; +} + +void BookmarkView::doUpdateActiveList() { std::vector &demods = wxGetApp().getDemodMgr().getDemodulators(); - DemodulatorInstance *activeDemodulator = wxGetApp().getDemodMgr().getActiveDemodulator(); - DemodulatorInstance *lastActiveDemodulator = wxGetApp().getDemodMgr().getLastActiveDemodulator(); +// DemodulatorInstance *activeDemodulator = wxGetApp().getDemodMgr().getActiveDemodulator(); +// DemodulatorInstance *lastActiveDemodulator = wxGetApp().getDemodMgr().getLastActiveDemodulator(); - m_treeView->Disable(); - m_treeView->DeleteAllItems(); activeItems.erase(activeItems.begin(),activeItems.end()); - - activeBranch = m_treeView->AddRoot("Active"); + m_treeView->DeleteChildren(activeBranch); for (auto demod_i : demods) { wxTreeItemId itm = m_treeView->AppendItem(activeBranch,demod_i->getLabel()); @@ -24,6 +36,7 @@ void BookmarkView::updateActiveList() { m_treeView->Enable(); m_treeView->ExpandAll(); + } void BookmarkView::onTreeBeginLabelEdit( wxTreeEvent& event ) { diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index bbef98c..53aa07d 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -11,6 +11,9 @@ public: void updateActiveList(); protected: + void onUpdateTimer( wxTimerEvent& event ); + void doUpdateActiveList(); + void onTreeBeginLabelEdit( wxTreeEvent& event ); void onTreeEndLabelEdit( wxTreeEvent& event ); void onTreeActivate( wxTreeEvent& event ); From 367a72394716d72b2718614d57c5c4ec5be24187 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 22 Sep 2016 20:40:07 -0400 Subject: [PATCH 05/51] Active modem tracking; update only when necessary --- src/BookmarkMgr.cpp | 8 ++++++++ src/BookmarkMgr.h | 2 ++ src/demod/DemodulatorInstance.cpp | 10 ++++++++++ src/forms/Bookmark/BookmarkView.cpp | 4 ++-- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 006dafc..bf0411a 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -58,3 +58,11 @@ BookmarkList BookmarkMgr::getBookmarks(std::string group, std::string folder) { return results; } + +void BookmarkMgr::updateActiveList() { + BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView(); + + if (bmv) { + bmv->updateActiveList(); + } +} \ No newline at end of file diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index ff09969..d396f21 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -42,6 +42,8 @@ public: void removeBookmark(std::string group, BookmarkEntry *be); BookmarkList getBookmarks(std::string group, std::string folder = ""); + void updateActiveList(); + protected: BookmarkMap bmData; diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index bf3d788..ffe8065 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -80,6 +80,8 @@ DemodulatorInstance::~DemodulatorInstance() { delete pipeIQDemodData; delete threadQueueControl; delete pipeAudioData; + + wxGetApp().getBookmarkMgr().updateActiveList(); } void DemodulatorInstance::setVisualOutputQueue(DemodulatorThreadOutputQueue *tQueue) { @@ -118,6 +120,7 @@ void DemodulatorInstance::run() { active = true; + wxGetApp().getBookmarkMgr().updateActiveList(); } void DemodulatorInstance::updateLabel(long long freq) { @@ -125,6 +128,7 @@ void DemodulatorInstance::updateLabel(long long freq) { newLabel.precision(3); newLabel << std::fixed << ((long double) freq / 1000000.0); setLabel(newLabel.str()); + wxGetApp().getBookmarkMgr().updateActiveList(); } void DemodulatorInstance::terminate() { @@ -227,6 +231,8 @@ void DemodulatorInstance::setActive(bool state) { tracking = false; } active = state; + + wxGetApp().getBookmarkMgr().updateActiveList(); } void DemodulatorInstance::squelchAuto() { @@ -391,6 +397,10 @@ void DemodulatorInstance::setFrequency(long long freq) { wxGetApp().getRigThread()->setFrequency(freq,true); } #endif + + if (this->isActive()) { + wxGetApp().getBookmarkMgr().updateActiveList(); + } } long long DemodulatorInstance::getFrequency() { diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 7b52abc..3d89511 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -4,7 +4,7 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { activeBranch = m_treeView->AddRoot("Active"); - doUpdateActive = true; +// doUpdateActive = true; m_updateTimer.Start(500); } @@ -12,7 +12,7 @@ void BookmarkView::onUpdateTimer( wxTimerEvent& event ) { if (doUpdateActive) { doUpdateActiveList(); -// doUpdateActive = false; + doUpdateActive = false; } } From 9ffdf6808dd437b478956b4ed75e8f427703ece8 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 28 Sep 2016 20:37:39 -0400 Subject: [PATCH 06/51] Active selection / removal functional --- src/forms/Bookmark/BookmarkPanel.cpp | 12 ++--- src/forms/Bookmark/BookmarkPanel.fbp | 4 +- src/forms/Bookmark/BookmarkPanel.h | 4 +- src/forms/Bookmark/BookmarkView.cpp | 76 ++++++++++++++++++++++++++-- src/forms/Bookmark/BookmarkView.h | 5 ++ 5 files changed, 88 insertions(+), 13 deletions(-) diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index 78c7f11..a3ae15c 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -24,9 +24,9 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po fgPropSizer->SetFlexibleDirection( wxBOTH ); fgPropSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticText1 = new wxStaticText( m_propPanel, wxID_ANY, wxT("Label"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1->Wrap( -1 ); - fgPropSizer->Add( m_staticText1, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); + m_labelLabel = new wxStaticText( m_propPanel, wxID_ANY, wxT("Label"), wxDefaultPosition, wxDefaultSize, 0 ); + m_labelLabel->Wrap( -1 ); + fgPropSizer->Add( m_labelLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_labelText = new wxTextCtrl( m_propPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); fgPropSizer->Add( m_labelText, 0, wxALL|wxEXPAND, 5 ); @@ -51,9 +51,9 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_modulationLabel->Wrap( -1 ); fgPropSizer->Add( m_modulationLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); - m_typeVal = new wxStaticText( m_propPanel, wxID_ANY, wxT("TypeVal"), wxDefaultPosition, wxDefaultSize, 0 ); - m_typeVal->Wrap( -1 ); - fgPropSizer->Add( m_typeVal, 0, wxALL, 5 ); + m_modulationVal = new wxStaticText( m_propPanel, wxID_ANY, wxT("TypeVal"), wxDefaultPosition, wxDefaultSize, 0 ); + m_modulationVal->Wrap( -1 ); + fgPropSizer->Add( m_modulationVal, 0, wxALL, 5 ); m_propPanel->SetSizer( fgPropSizer ); diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index b1ec872..23d466c 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -315,7 +315,7 @@ 0 1 - m_staticText1 + m_labelLabel 1 @@ -904,7 +904,7 @@ 0 1 - m_typeVal + m_modulationVal 1 diff --git a/src/forms/Bookmark/BookmarkPanel.h b/src/forms/Bookmark/BookmarkPanel.h index 7ef675f..6bc1293 100644 --- a/src/forms/Bookmark/BookmarkPanel.h +++ b/src/forms/Bookmark/BookmarkPanel.h @@ -36,14 +36,14 @@ class BookmarkPanel : public wxPanel protected: wxTreeCtrl* m_treeView; wxPanel* m_propPanel; - wxStaticText* m_staticText1; + wxStaticText* m_labelLabel; wxTextCtrl* m_labelText; wxStaticText* m_frequencyLabel; wxStaticText* m_frequencyVal; wxStaticText* m_bandwidthLabel; wxStaticText* m_bandwidthVal; wxStaticText* m_modulationLabel; - wxStaticText* m_typeVal; + wxStaticText* m_modulationVal; wxButton* m_bookmarkButton; wxButton* m_activateButton; wxButton* m_removeButton; diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 3d89511..c144390 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -4,8 +4,11 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { activeBranch = m_treeView->AddRoot("Active"); -// doUpdateActive = true; + doUpdateActive = false; + activeSel = nullptr; m_updateTimer.Start(500); + hideProps(); + m_propPanel->Hide(); } void BookmarkView::onUpdateTimer( wxTimerEvent& event ) { @@ -59,8 +62,68 @@ void BookmarkView::onTreeExpanded( wxTreeEvent& event ) { event.Skip(); } +void BookmarkView::hideProps() { + m_frequencyLabel->Hide(); + m_frequencyVal->Hide(); + + m_bandwidthLabel->Hide(); + m_bandwidthVal->Hide(); + + m_modulationVal->Hide(); + m_modulationLabel->Hide(); + + m_labelText->Hide(); + m_labelLabel->Hide(); + + m_bookmarkButton->Hide(); + m_activateButton->Hide(); + m_removeButton->Hide(); +} + +void BookmarkView::activeSelection(DemodulatorInstance *dsel) { + activeSel = dsel; + + m_frequencyVal->SetLabelText(frequencyToStr(dsel->getFrequency())); + m_bandwidthVal->SetLabelText(frequencyToStr(dsel->getBandwidth())); + m_modulationVal->SetLabelText(dsel->getDemodulatorType()); + m_labelText->SetValue(dsel->getLabel()); + + hideProps(); + + m_frequencyVal->Show(); + m_frequencyLabel->Show(); + + m_bandwidthVal->Show(); + m_bandwidthLabel->Show(); + + m_modulationVal->Show(); + m_modulationLabel->Show(); + + m_labelText->Show(); + m_labelLabel->Show(); + + m_bookmarkButton->Show(); + m_removeButton->Show(); + + this->Layout(); +} + void BookmarkView::onTreeSelect( wxTreeEvent& event ) { - event.Skip(); + if (activeItems.find(event.GetItem()) != activeItems.end()) { + DemodulatorInstance *dsel = activeItems[event.GetItem()]; + m_propPanel->Show(); + activeSelection(dsel); + wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); + } else { + activeSel = nullptr; + + m_propPanel->Hide(); + hideProps(); + this->Layout(); + + wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); + event.Skip(); + } } void BookmarkView::onTreeSelectChanging( wxTreeEvent& event ) { @@ -80,6 +143,13 @@ void BookmarkView::onActivate( wxCommandEvent& event ) { } void BookmarkView::onRemove( wxCommandEvent& event ) { - event.Skip(); + if (activeSel != nullptr) { + wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, false); + wxGetApp().removeDemodulator(activeSel); + wxGetApp().getDemodMgr().deleteThread(activeSel); + activeSel = nullptr; + } else { + event.Skip(); + } } diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 53aa07d..dd00217 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -9,8 +9,12 @@ public: BookmarkView( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxTAB_TRAVERSAL ); void updateActiveList(); + void activeSelection(DemodulatorInstance *dsel); protected: + + void hideProps(); + void onUpdateTimer( wxTimerEvent& event ); void doUpdateActiveList(); @@ -29,4 +33,5 @@ protected: bool doUpdateActive; wxTreeItemId activeBranch; std::map activeItems; + DemodulatorInstance *activeSel; }; \ No newline at end of file From 003758b799eb262737b61066453fbe91814faa6b Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 29 Sep 2016 20:47:38 -0400 Subject: [PATCH 07/51] Improve active list integration/interactivity --- src/BookmarkMgr.cpp | 13 ++++++++++ src/BookmarkMgr.h | 7 +++-- src/CubicSDR.cpp | 1 + src/demod/DemodulatorMgr.cpp | 1 + src/forms/Bookmark/BookmarkPanel.cpp | 6 ++++- src/forms/Bookmark/BookmarkPanel.fbp | 6 ++--- src/forms/Bookmark/BookmarkPanel.h | 2 ++ src/forms/Bookmark/BookmarkView.cpp | 38 +++++++++++++++++++++++++--- src/forms/Bookmark/BookmarkView.h | 6 ++++- 9 files changed, 70 insertions(+), 10 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index bf0411a..4b4f172 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -59,6 +59,19 @@ BookmarkList BookmarkMgr::getBookmarks(std::string group, std::string folder) { return results; } +BookmarkGroup BookmarkMgr::getGroup(std::string group) { + return bmData[group]; +} + +BookmarkNames BookmarkMgr::getGroups() { + BookmarkNames results; + for (BookmarkMap::iterator i = bmData.begin(); i!= bmData.end(); ++i) { + results.push_back(i->first); + } + return results; +} + + void BookmarkMgr::updateActiveList() { BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView(); diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index d396f21..b88160b 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -31,7 +31,9 @@ struct BookmarkEntryCompare : public std::binary_function BookmarkList; -typedef std::map > BookmarkMap; +typedef std::set BookmarkGroup; +typedef std::map BookmarkMap; +typedef std::vector BookmarkNames; class BookmarkMgr { public: @@ -41,7 +43,8 @@ public: void addBookmark(std::string group, DemodulatorInstance *demod, std::string folder = ""); void removeBookmark(std::string group, BookmarkEntry *be); BookmarkList getBookmarks(std::string group, std::string folder = ""); - + BookmarkGroup getGroup(std::string group); + BookmarkNames getGroups(); void updateActiveList(); protected: diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index acc888e..db82134 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -753,6 +753,7 @@ void CubicSDR::showFrequencyInput(FrequencyDialog::FrequencyDialogTarget targetM switch (targetMode) { case FrequencyDialog::FDIALOG_TARGET_DEFAULT: + case FrequencyDialog::FDIALOG_TARGET_FREQ: title = demodMgr.getActiveDemodulator()?demodTitle:freqTitle; break; case FrequencyDialog::FDIALOG_TARGET_BANDWIDTH: diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp index b312bf7..5aa2da9 100644 --- a/src/demod/DemodulatorMgr.cpp +++ b/src/demod/DemodulatorMgr.cpp @@ -217,6 +217,7 @@ void DemodulatorMgr::setActiveDemodulator(DemodulatorInstance *demod, bool tempo wxGetApp().getRigThread()->setFrequency(lastActiveDemodulator.load()->getFrequency(),true); } #endif + wxGetApp().getBookmarkMgr().updateActiveList(); } else { std::lock_guard < std::recursive_mutex > lock(demods_busy); garbageCollect(); diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index a3ae15c..4090714 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -14,7 +14,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po wxBoxSizer* bSizer1; bSizer1 = new wxBoxSizer( wxVERTICAL ); - m_treeView = new wxTreeCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE ); + m_treeView = new wxTreeCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_HIDE_ROOT ); bSizer1->Add( m_treeView, 5, wxEXPAND, 5 ); m_propPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); @@ -84,6 +84,8 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_treeView->Connect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( BookmarkPanel::onTreeSelect ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_SEL_CHANGING, wxTreeEventHandler( BookmarkPanel::onTreeSelectChanging ), NULL, this ); m_labelText->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); + m_frequencyVal->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( BookmarkPanel::onDoubleClickFreq ), NULL, this ); + m_bandwidthVal->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( BookmarkPanel::onDoubleClickBandwidth ), NULL, this ); m_bookmarkButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onBookmark ), NULL, this ); m_activateButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onActivate ), NULL, this ); m_removeButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onRemove ), NULL, this ); @@ -101,6 +103,8 @@ BookmarkPanel::~BookmarkPanel() m_treeView->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( BookmarkPanel::onTreeSelect ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGING, wxTreeEventHandler( BookmarkPanel::onTreeSelectChanging ), NULL, this ); m_labelText->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); + m_frequencyVal->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( BookmarkPanel::onDoubleClickFreq ), NULL, this ); + m_bandwidthVal->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( BookmarkPanel::onDoubleClickBandwidth ), NULL, this ); m_bookmarkButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onBookmark ), NULL, this ); m_activateButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onActivate ), NULL, this ); m_removeButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onRemove ), NULL, this ); diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index 23d466c..10f3f80 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -132,7 +132,7 @@ Resizable 1 - wxTR_DEFAULT_STYLE + wxTR_DEFAULT_STYLE|wxTR_HIDE_ROOT 0 @@ -597,7 +597,7 @@ - + onDoubleClickFreq @@ -763,7 +763,7 @@ - + onDoubleClickBandwidth diff --git a/src/forms/Bookmark/BookmarkPanel.h b/src/forms/Bookmark/BookmarkPanel.h index 6bc1293..bb07915 100644 --- a/src/forms/Bookmark/BookmarkPanel.h +++ b/src/forms/Bookmark/BookmarkPanel.h @@ -58,6 +58,8 @@ class BookmarkPanel : public wxPanel virtual void onTreeSelect( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeSelectChanging( wxTreeEvent& event ) { event.Skip(); } virtual void onLabelText( wxCommandEvent& event ) { event.Skip(); } + virtual void onDoubleClickFreq( wxMouseEvent& event ) { event.Skip(); } + virtual void onDoubleClickBandwidth( wxMouseEvent& event ) { event.Skip(); } virtual void onBookmark( wxCommandEvent& event ) { event.Skip(); } virtual void onActivate( wxCommandEvent& event ) { event.Skip(); } virtual void onRemove( wxCommandEvent& event ) { event.Skip(); } diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index c144390..ed98ccb 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -2,8 +2,9 @@ #include "CubicSDR.h" BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { - - activeBranch = m_treeView->AddRoot("Active"); + rootBranch = m_treeView->AddRoot("Root"); + activeBranch = m_treeView->AppendItem(rootBranch, "Active"); + bookmarkBranch = m_treeView->AppendItem(rootBranch, "Bookmarks"); doUpdateActive = false; activeSel = nullptr; m_updateTimer.Start(500); @@ -26,15 +27,28 @@ void BookmarkView::updateActiveList() { void BookmarkView::doUpdateActiveList() { std::vector &demods = wxGetApp().getDemodMgr().getDemodulators(); -// DemodulatorInstance *activeDemodulator = wxGetApp().getDemodMgr().getActiveDemodulator(); + DemodulatorInstance *activeDemodulator = wxGetApp().getDemodMgr().getActiveDemodulator(); // DemodulatorInstance *lastActiveDemodulator = wxGetApp().getDemodMgr().getLastActiveDemodulator(); activeItems.erase(activeItems.begin(),activeItems.end()); m_treeView->DeleteChildren(activeBranch); + wxTreeItemId selItem = nullptr; for (auto demod_i : demods) { wxTreeItemId itm = m_treeView->AppendItem(activeBranch,demod_i->getLabel()); activeItems[itm] = demod_i; + if (activeDemodulator) { + if (activeDemodulator == demod_i) { + selItem = itm; + activeSel = demod_i; + } + } + else if (activeSel == demod_i) { + selItem = itm; + } + } + if (selItem != nullptr) { + m_treeView->SelectItem(selItem); } m_treeView->Enable(); @@ -134,6 +148,24 @@ void BookmarkView::onLabelText( wxCommandEvent& event ) { event.Skip(); } +void BookmarkView::onDoubleClickFreq( wxMouseEvent& event ) { + if (activeSel) { + wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); + wxGetApp().showFrequencyInput(FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_DEFAULT); + } else { + event.Skip(); + } +} + +void BookmarkView::onDoubleClickBandwidth( wxMouseEvent& event ) { + if (activeSel) { + wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); + wxGetApp().showFrequencyInput(FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_BANDWIDTH); + } else { + event.Skip(); + } +} + void BookmarkView::onBookmark( wxCommandEvent& event ) { event.Skip(); } diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index dd00217..0519fde 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -26,12 +26,16 @@ protected: void onTreeSelect( wxTreeEvent& event ); void onTreeSelectChanging( wxTreeEvent& event ); void onLabelText( wxCommandEvent& event ); + void onDoubleClickFreq( wxMouseEvent& event ); + void onDoubleClickBandwidth( wxMouseEvent& event ); void onBookmark( wxCommandEvent& event ); void onActivate( wxCommandEvent& event ); void onRemove( wxCommandEvent& event ); bool doUpdateActive; - wxTreeItemId activeBranch; + wxTreeItemId rootBranch, activeBranch, bookmarkBranch; + std::map groups; + std::map activeItems; DemodulatorInstance *activeSel; }; \ No newline at end of file From 560caccbc713164947e425fa4b0512df2a7445ad Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 29 Sep 2016 21:57:23 -0400 Subject: [PATCH 08/51] Apply theme to bookmark panel, implement RGBA4f->wxColour operator --- src/AppFrame.cpp | 2 ++ src/ModemProperties.cpp | 24 ++++-------------------- src/demod/DemodulatorInstance.cpp | 4 +++- src/forms/Bookmark/BookmarkPanel.cpp | 6 +++--- src/forms/Bookmark/BookmarkPanel.fbp | 6 +++--- src/forms/Bookmark/BookmarkView.cpp | 27 ++++++++++++++++++++++++++- src/forms/Bookmark/BookmarkView.h | 1 + src/visual/ColorTheme.h | 9 +++++++++ 8 files changed, 51 insertions(+), 28 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 25ef1c8..bdc116d 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -594,6 +594,7 @@ AppFrame::AppFrame() : waterfallCanvas->setLinesPerSecond(wflps); ThemeMgr::mgr.setTheme(wxGetApp().getConfig()->getTheme()); + bookmarkView->updateTheme(); int mpc =wxGetApp().getConfig()->getModemPropsCollapsed(); @@ -1035,6 +1036,7 @@ void AppFrame::OnMenu(wxCommandEvent& event) { spectrumAvgMeter->Refresh(); gainCanvas->setThemeColors(); modemProps->updateTheme(); + bookmarkView->updateTheme(); } switch (event.GetId()) { diff --git a/src/ModemProperties.cpp b/src/ModemProperties.cpp index be3e6ba..a52ca64 100644 --- a/src/ModemProperties.cpp +++ b/src/ModemProperties.cpp @@ -30,26 +30,10 @@ void ModemProperties::OnShow(wxShowEvent & /* event */) { } void ModemProperties::updateTheme() { - wxColour bgColor( - (unsigned char) (ThemeMgr::mgr.currentTheme->generalBackground.r * 255.0), - (unsigned char) (ThemeMgr::mgr.currentTheme->generalBackground.g * 255.0), - (unsigned char) (ThemeMgr::mgr.currentTheme->generalBackground.b * 255.0)); - - wxColour textColor( - (unsigned char) (ThemeMgr::mgr.currentTheme->text.r * 255.0), - (unsigned char) (ThemeMgr::mgr.currentTheme->text.g * 255.0), - (unsigned char) (ThemeMgr::mgr.currentTheme->text.b * 255.0)); - - wxColour btn( - (unsigned char) (ThemeMgr::mgr.currentTheme->button.r * 255.0), - (unsigned char) (ThemeMgr::mgr.currentTheme->button.g * 255.0), - (unsigned char) (ThemeMgr::mgr.currentTheme->button.b * 255.0)); - - wxColour btnHl( - (unsigned char) (ThemeMgr::mgr.currentTheme->buttonHighlight.r * 255.0), - (unsigned char) (ThemeMgr::mgr.currentTheme->buttonHighlight.g * 255.0), - (unsigned char) (ThemeMgr::mgr.currentTheme->buttonHighlight.b * 255.0)); - + wxColour bgColor(ThemeMgr::mgr.currentTheme->generalBackground); + wxColour textColor(ThemeMgr::mgr.currentTheme->text); + wxColour btn(ThemeMgr::mgr.currentTheme->button); + wxColour btnHl(ThemeMgr::mgr.currentTheme->buttonHighlight); m_propertyGrid->SetEmptySpaceColour(bgColor); m_propertyGrid->SetCellBackgroundColour(bgColor); diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index ffe8065..f8955fe 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -337,7 +337,9 @@ void DemodulatorInstance::setDemodulatorType(std::string demod_type_in) { outp->setTitle(getDemodulatorType() + ": " + frequencyToStr(getFrequency())); } #endif -} + } + + wxGetApp().getBookmarkMgr().updateActiveList(); } std::string DemodulatorInstance::getDemodulatorType() { diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index 4090714..6d54fef 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -62,13 +62,13 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po bSizer1->Add( m_propPanel, 1, wxBOTTOM|wxEXPAND|wxTOP, 5 ); m_bookmarkButton = new wxButton( this, wxID_ANY, wxT("Bookmark"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer1->Add( m_bookmarkButton, 0, wxALL|wxEXPAND, 5 ); + bSizer1->Add( m_bookmarkButton, 0, wxEXPAND, 5 ); m_activateButton = new wxButton( this, wxID_ANY, wxT("Activate"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer1->Add( m_activateButton, 0, wxALL|wxEXPAND, 5 ); + bSizer1->Add( m_activateButton, 0, wxEXPAND, 5 ); m_removeButton = new wxButton( this, wxID_ANY, wxT("Remove"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer1->Add( m_removeButton, 0, wxALL|wxEXPAND, 5 ); + bSizer1->Add( m_removeButton, 0, wxEXPAND, 5 ); this->SetSizer( bSizer1 ); diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index 10f3f80..f79f744 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -952,7 +952,7 @@ 5 - wxALL|wxEXPAND + wxEXPAND 0 1 @@ -1040,7 +1040,7 @@ 5 - wxALL|wxEXPAND + wxEXPAND 0 1 @@ -1128,7 +1128,7 @@ 5 - wxALL|wxEXPAND + wxEXPAND 0 1 diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index ed98ccb..5b4fcc2 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -20,6 +20,32 @@ void BookmarkView::onUpdateTimer( wxTimerEvent& event ) { } } +void BookmarkView::updateTheme() { + wxColour bgColor(ThemeMgr::mgr.currentTheme->generalBackground); + wxColour textColor(ThemeMgr::mgr.currentTheme->text); + wxColour btn(ThemeMgr::mgr.currentTheme->button); + wxColour btnHl(ThemeMgr::mgr.currentTheme->buttonHighlight); + + m_treeView->SetBackgroundColour(bgColor); + m_treeView->SetForegroundColour(textColor); + + m_propPanel->SetBackgroundColour(bgColor); + m_propPanel->SetForegroundColour(textColor); + + m_labelLabel->SetForegroundColour(textColor); + m_frequencyVal->SetForegroundColour(textColor); + m_frequencyLabel->SetForegroundColour(textColor); + m_bandwidthVal->SetForegroundColour(textColor); + m_bandwidthLabel->SetForegroundColour(textColor); + m_modulationVal->SetForegroundColour(textColor); + m_modulationLabel->SetForegroundColour(textColor); + + m_bookmarkButton->SetBackgroundColour(bgColor); + m_removeButton->SetBackgroundColour(bgColor); + m_activateButton->SetBackgroundColour(bgColor); +} + + void BookmarkView::updateActiveList() { doUpdateActive = true; } @@ -53,7 +79,6 @@ void BookmarkView::doUpdateActiveList() { m_treeView->Enable(); m_treeView->ExpandAll(); - } void BookmarkView::onTreeBeginLabelEdit( wxTreeEvent& event ) { diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 0519fde..567c46c 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -10,6 +10,7 @@ public: void updateActiveList(); void activeSelection(DemodulatorInstance *dsel); + void updateTheme(); protected: diff --git a/src/visual/ColorTheme.h b/src/visual/ColorTheme.h index 6f35324..b4289d4 100644 --- a/src/visual/ColorTheme.h +++ b/src/visual/ColorTheme.h @@ -5,6 +5,7 @@ #include #include #include +#include #define COLOR_THEME_DEFAULT 0 #define COLOR_THEME_BW 1 @@ -38,6 +39,14 @@ public: } RGBA4f operator*(float v) { return RGBA4f(r*v, g*v, b*v); } + + operator wxColour() { + return wxColour( + (unsigned char) (r * 255.0), + (unsigned char) (g * 255.0), + (unsigned char) (b * 255.0)); + + } }; From 020cef12c917826f7ac89eecd8c322211bf49839 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 5 Oct 2016 19:10:01 -0400 Subject: [PATCH 09/51] Recents list, DataTree rewindAll(), Bookmark view updates --- src/BookmarkMgr.cpp | 57 ++++++++----- src/BookmarkMgr.h | 15 +++- src/demod/DemodulatorMgr.cpp | 4 + src/forms/Bookmark/BookmarkView.cpp | 121 +++++++++++++++++++++++++--- src/forms/Bookmark/BookmarkView.h | 9 ++- src/util/DataTree.cpp | 33 ++++++++ src/util/DataTree.h | 4 +- 7 files changed, 205 insertions(+), 38 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 4b4f172..0fedc23 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -14,16 +14,11 @@ void BookmarkMgr::loadFromFile(std::string bookmarkFn) { } -void BookmarkMgr::addBookmark(std::string group, DemodulatorInstance *demod, std::string folder) { + +void BookmarkMgr::addBookmark(std::string group, DemodulatorInstance *demod) { std::lock_guard < std::mutex > lock(busy_lock); - BookmarkEntry *be = new BookmarkEntry; - - be->bandwidth = demod->getBandwidth(); - be->type = demod->getDemodulatorType(); - be->label = demod->getLabel(); - be->frequency = demod->getFrequency(); - be->folder = folder; + BookmarkEntry *be = demodToBookmarkEntry(demod); wxGetApp().getDemodMgr().saveInstance(be->node, demod); @@ -38,22 +33,13 @@ void BookmarkMgr::removeBookmark(std::string group, BookmarkEntry *be) { } -BookmarkList BookmarkMgr::getBookmarks(std::string group, std::string folder) { +BookmarkList BookmarkMgr::getBookmarks(std::string group) { std::lock_guard < std::mutex > lock(busy_lock); BookmarkList results; - if (folder != "") { - for (auto be_i : bmData[group]) { - results.push_back(be_i); - } - } else { - for (auto be_i : bmData[group]) { - if (be_i->folder != folder) { - continue; - } - results.push_back(be_i); - } + for (auto be_i : bmData[group]) { + results.push_back(be_i); } return results; @@ -78,4 +64,33 @@ void BookmarkMgr::updateActiveList() { if (bmv) { bmv->updateActiveList(); } -} \ No newline at end of file +} + +void BookmarkMgr::addRecent(DemodulatorInstance *demod) { + std::lock_guard < std::mutex > lock(busy_lock); + recents.push_back(demodToBookmarkEntry(demod)); + if (recents.size() > 10) { + delete *(recents.begin()); + recents.erase(recents.begin(), recents.begin()+1); + } +} + + +BookmarkList BookmarkMgr::getRecents() { + return recents; +} + + +BookmarkEntry *BookmarkMgr::demodToBookmarkEntry(DemodulatorInstance *demod) { + BookmarkEntry *be = new BookmarkEntry; + + be->bandwidth = demod->getBandwidth(); + be->type = demod->getDemodulatorType(); + be->label = demod->getLabel(); + be->frequency = demod->getFrequency(); + + be->node = new DataNode; + wxGetApp().getDemodMgr().saveInstance(be->node, demod); + + return be; +} diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index b88160b..4b65e05 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -11,7 +11,6 @@ class BookmarkEntry { public: std::mutex busy_lock; - std::string folder; std::string type; std::string label; @@ -40,15 +39,25 @@ public: void saveToFile(std::string bookmarkFn); void loadFromFile(std::string bookmarkFn); - void addBookmark(std::string group, DemodulatorInstance *demod, std::string folder = ""); + void addBookmark(std::string group, DemodulatorInstance *demod); void removeBookmark(std::string group, BookmarkEntry *be); - BookmarkList getBookmarks(std::string group, std::string folder = ""); + + BookmarkList getBookmarks(std::string group); + BookmarkGroup getGroup(std::string group); BookmarkNames getGroups(); + void updateActiveList(); + + void addRecent(DemodulatorInstance *demod); + BookmarkList getRecents(); + protected: + BookmarkEntry *demodToBookmarkEntry(DemodulatorInstance *demod); + BookmarkMap bmData; + BookmarkList recents; std::mutex busy_lock; }; diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp index 5aa2da9..5801102 100644 --- a/src/demod/DemodulatorMgr.cpp +++ b/src/demod/DemodulatorMgr.cpp @@ -132,6 +132,8 @@ DemodulatorInstance *DemodulatorMgr::getFirstDemodulator() { void DemodulatorMgr::deleteThread(DemodulatorInstance *demod) { std::lock_guard < std::recursive_mutex > lock(demods_busy); + + wxGetApp().getBookmarkMgr().addRecent(demod); std::vector::iterator i; @@ -409,6 +411,8 @@ void DemodulatorMgr::saveInstance(DataNode *node, DemodulatorInstance *inst) { DemodulatorInstance *DemodulatorMgr::loadInstance(DataNode *node) { DemodulatorInstance *newDemod = nullptr; + node->rewindAll(); + long bandwidth = *node->getNext("bandwidth"); long long freq = *node->getNext("frequency"); float squelch_level = node->hasAnother("squelch_level") ? (float) *node->getNext("squelch_level") : 0; diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 5b4fcc2..a6d2d00 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -2,14 +2,20 @@ #include "CubicSDR.h" BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { + rootBranch = m_treeView->AddRoot("Root"); activeBranch = m_treeView->AppendItem(rootBranch, "Active"); bookmarkBranch = m_treeView->AppendItem(rootBranch, "Bookmarks"); + recentBranch = m_treeView->AppendItem(rootBranch, "Recents"); + doUpdateActive = false; activeSel = nullptr; - m_updateTimer.Start(500); + recentSel = nullptr; + hideProps(); m_propPanel->Hide(); + + m_updateTimer.Start(500); } void BookmarkView::onUpdateTimer( wxTimerEvent& event ) { @@ -56,6 +62,7 @@ void BookmarkView::doUpdateActiveList() { DemodulatorInstance *activeDemodulator = wxGetApp().getDemodMgr().getActiveDemodulator(); // DemodulatorInstance *lastActiveDemodulator = wxGetApp().getDemodMgr().getLastActiveDemodulator(); + // Actives activeItems.erase(activeItems.begin(),activeItems.end()); m_treeView->DeleteChildren(activeBranch); @@ -73,10 +80,24 @@ void BookmarkView::doUpdateActiveList() { selItem = itm; } } + + // Recents + BookmarkList bmRecents = wxGetApp().getBookmarkMgr().getRecents(); + recentItems.erase(recentItems.begin(),recentItems.end()); + m_treeView->DeleteChildren(recentBranch); + + for (auto bmr_i: bmRecents) { + wxTreeItemId itm = m_treeView->AppendItem(recentBranch, bmr_i->label); + recentItems[itm] = bmr_i; + if (recentSel == bmr_i) { + selItem = itm; + } + } + if (selItem != nullptr) { m_treeView->SelectItem(selItem); } - + m_treeView->Enable(); m_treeView->ExpandAll(); } @@ -90,7 +111,9 @@ void BookmarkView::onTreeEndLabelEdit( wxTreeEvent& event ) { } void BookmarkView::onTreeActivate( wxTreeEvent& event ) { - event.Skip(); + if (recentSel) { + activateBookmark(recentSel); + } } void BookmarkView::onTreeCollapse( wxTreeEvent& event ) { @@ -121,6 +144,7 @@ void BookmarkView::hideProps() { void BookmarkView::activeSelection(DemodulatorInstance *dsel) { activeSel = dsel; + recentSel = nullptr; m_frequencyVal->SetLabelText(frequencyToStr(dsel->getFrequency())); m_bandwidthVal->SetLabelText(frequencyToStr(dsel->getBandwidth())); @@ -147,21 +171,100 @@ void BookmarkView::activeSelection(DemodulatorInstance *dsel) { this->Layout(); } +void BookmarkView::activateBookmark(BookmarkEntry *bmEnt) { + DemodulatorInstance *newDemod = wxGetApp().getDemodMgr().loadInstance(bmEnt->node); + newDemod->run(); + newDemod->setActive(true); + wxGetApp().bindDemodulator(newDemod); + if (bmEnt == recentSel) { + activeSel = newDemod; + recentSel = nullptr; + } + doUpdateActiveList(); +} + +void BookmarkView::bookmarkSelection(BookmarkEntry *bmSel) { + bookmarkSel = bmSel; + recentSel = nullptr; + activeSel = nullptr; + + m_frequencyVal->SetLabelText(frequencyToStr(bmSel->frequency)); + m_bandwidthVal->SetLabelText(frequencyToStr(bmSel->bandwidth)); + m_modulationVal->SetLabelText(bmSel->type); + m_labelText->SetValue(bmSel->label); + + hideProps(); + + m_frequencyVal->Show(); + m_frequencyLabel->Show(); + + m_bandwidthVal->Show(); + m_bandwidthLabel->Show(); + + m_modulationVal->Show(); + m_modulationLabel->Show(); + + m_labelText->Show(); + m_labelLabel->Show(); + + m_activateButton->Show(); + m_bookmarkButton->Show(); + m_removeButton->Show(); + + this->Layout(); +} + + +void BookmarkView::recentSelection(BookmarkEntry *bmSel) { + recentSel = bmSel; + activeSel = nullptr; + bookmarkSel = nullptr; + + m_frequencyVal->SetLabelText(frequencyToStr(bmSel->frequency)); + m_bandwidthVal->SetLabelText(frequencyToStr(bmSel->bandwidth)); + m_modulationVal->SetLabelText(bmSel->type); + m_labelText->SetValue(bmSel->label); + + hideProps(); + + m_frequencyVal->Show(); + m_frequencyLabel->Show(); + + m_bandwidthVal->Show(); + m_bandwidthLabel->Show(); + + m_modulationVal->Show(); + m_modulationLabel->Show(); + + m_labelText->Show(); + m_labelLabel->Show(); + + m_activateButton->Show(); + m_bookmarkButton->Show(); + m_removeButton->Hide(); + + this->Layout(); +} + void BookmarkView::onTreeSelect( wxTreeEvent& event ) { if (activeItems.find(event.GetItem()) != activeItems.end()) { DemodulatorInstance *dsel = activeItems[event.GetItem()]; m_propPanel->Show(); activeSelection(dsel); wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); + } else if (recentItems.find(event.GetItem()) != recentItems.end()) { + recentSel = recentItems[event.GetItem()]; + m_propPanel->Show(); + recentSelection(recentSel); } else { activeSel = nullptr; + recentSel = nullptr; m_propPanel->Hide(); hideProps(); this->Layout(); wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); - event.Skip(); } } @@ -177,8 +280,6 @@ void BookmarkView::onDoubleClickFreq( wxMouseEvent& event ) { if (activeSel) { wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); wxGetApp().showFrequencyInput(FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_DEFAULT); - } else { - event.Skip(); } } @@ -186,8 +287,6 @@ void BookmarkView::onDoubleClickBandwidth( wxMouseEvent& event ) { if (activeSel) { wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); wxGetApp().showFrequencyInput(FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_BANDWIDTH); - } else { - event.Skip(); } } @@ -196,7 +295,9 @@ void BookmarkView::onBookmark( wxCommandEvent& event ) { } void BookmarkView::onActivate( wxCommandEvent& event ) { - event.Skip(); + if (recentSel) { + activateBookmark(recentSel); + } } void BookmarkView::onRemove( wxCommandEvent& event ) { @@ -205,8 +306,6 @@ void BookmarkView::onRemove( wxCommandEvent& event ) { wxGetApp().removeDemodulator(activeSel); wxGetApp().getDemodMgr().deleteThread(activeSel); activeSel = nullptr; - } else { - event.Skip(); } } diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 567c46c..a6cd5b0 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -10,6 +10,9 @@ public: void updateActiveList(); void activeSelection(DemodulatorInstance *dsel); + void bookmarkSelection(BookmarkEntry *bmSel); + void activateBookmark(BookmarkEntry *bmEnt); + void recentSelection(BookmarkEntry *bmSel); void updateTheme(); protected: @@ -34,9 +37,13 @@ protected: void onRemove( wxCommandEvent& event ); bool doUpdateActive; - wxTreeItemId rootBranch, activeBranch, bookmarkBranch; + wxTreeItemId rootBranch, activeBranch, bookmarkBranch, recentBranch; std::map groups; std::map activeItems; + std::map recentItems; DemodulatorInstance *activeSel; + BookmarkEntry *recentSel; + BookmarkEntry *bookmarkSel; + }; \ No newline at end of file diff --git a/src/util/DataTree.cpp b/src/util/DataTree.cpp index 3c1d1ce..ee3d469 100755 --- a/src/util/DataTree.cpp +++ b/src/util/DataTree.cpp @@ -565,6 +565,7 @@ DataNode *DataNode::getNext(const char *name_in) { void DataNode::rewind() { ptr = 0; + childmap_ptr.erase(childmap_ptr.begin(),childmap_ptr.end()); } void DataNode::rewind(const char *name_in) { @@ -1342,6 +1343,38 @@ long DataTree::getSerializedSize(DataElement &de_node_names, bool debug) /* get return total_size; } +void DataNode::rewindAll() { + stack dn_stack; + + /* start at the root */ + dn_stack.push(this); + + while (!dn_stack.empty()) { + dn_stack.top()->rewind(); + + /* if it has children, traverse into them */ + if (dn_stack.top()->hasAnother()) { + dn_stack.push(dn_stack.top()->getNext()); + dn_stack.top()->rewind(); + } else { + /* no more children, back out until we have children, then add next child to the top */ + while (!dn_stack.empty()) { + if (!dn_stack.top()->hasAnother()) { + dn_stack.top()->rewind(); + dn_stack.pop(); + } else + break; + } + + if (!dn_stack.empty()) { + dn_stack.push(dn_stack.top()->getNext()); + dn_stack.top()->rewind(); + } + } + } + +} + void DataNode::findAll(const char *name_in, vector &node_list_out) { stack dn_stack; diff --git a/src/util/DataTree.h b/src/util/DataTree.h index 5baa6e5..dad6947 100755 --- a/src/util/DataTree.h +++ b/src/util/DataTree.h @@ -260,7 +260,8 @@ public: DataNode *getNext(); /* get next child */ void rewind(const char *name_in); /* rewind specific */ void rewind(); /* rewind generic */ - + void rewindAll(); + void findAll(const char *name_in, vector &node_list_out); // operator string () { string s; element()->get(s); return s; } @@ -316,7 +317,6 @@ public: bool operator() () { return hasAnother(); } DataNode *operator ^(const char *name_in) { return newChild(name_in); } - }; From fab41f30be524feebc484677172420d6d78121df Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 6 Oct 2016 21:08:45 -0400 Subject: [PATCH 10/51] Add bookmark group context menu --- src/forms/Bookmark/BookmarkPanel.cpp | 2 + src/forms/Bookmark/BookmarkPanel.fbp | 2 +- src/forms/Bookmark/BookmarkPanel.h | 1 + src/forms/Bookmark/BookmarkView.cpp | 64 ++++++++++++++++++++++++++-- src/forms/Bookmark/BookmarkView.h | 23 +++++++--- 5 files changed, 81 insertions(+), 11 deletions(-) diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index 6d54fef..c60e4f7 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -81,6 +81,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxTreeEventHandler( BookmarkPanel::onTreeCollapse ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEventHandler( BookmarkPanel::onTreeExpanded ), NULL, this ); + m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_MENU, wxTreeEventHandler( BookmarkPanel::onTreeItemMenu ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( BookmarkPanel::onTreeSelect ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_SEL_CHANGING, wxTreeEventHandler( BookmarkPanel::onTreeSelectChanging ), NULL, this ); m_labelText->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); @@ -100,6 +101,7 @@ BookmarkPanel::~BookmarkPanel() m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxTreeEventHandler( BookmarkPanel::onTreeCollapse ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEventHandler( BookmarkPanel::onTreeExpanded ), NULL, this ); + m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_MENU, wxTreeEventHandler( BookmarkPanel::onTreeItemMenu ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( BookmarkPanel::onTreeSelect ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGING, wxTreeEventHandler( BookmarkPanel::onTreeSelectChanging ), NULL, this ); m_labelText->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index f79f744..5352bc0 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -174,7 +174,7 @@ onTreeExpanded - + onTreeItemMenu diff --git a/src/forms/Bookmark/BookmarkPanel.h b/src/forms/Bookmark/BookmarkPanel.h index bb07915..adf25e8 100644 --- a/src/forms/Bookmark/BookmarkPanel.h +++ b/src/forms/Bookmark/BookmarkPanel.h @@ -55,6 +55,7 @@ class BookmarkPanel : public wxPanel virtual void onTreeActivate( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeCollapse( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeExpanded( wxTreeEvent& event ) { event.Skip(); } + virtual void onTreeItemMenu( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeSelect( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeSelectChanging( wxTreeEvent& event ) { event.Skip(); } virtual void onLabelText( wxCommandEvent& event ) { event.Skip(); } diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index a6d2d00..dd1657b 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -1,6 +1,10 @@ #include "BookmarkView.h" #include "CubicSDR.h" +#include +#include +#define wxCONTEXT_ADD_GROUP_ID 1000 + BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { rootBranch = m_treeView->AddRoot("Root"); @@ -8,9 +12,10 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, bookmarkBranch = m_treeView->AppendItem(rootBranch, "Bookmarks"); recentBranch = m_treeView->AppendItem(rootBranch, "Recents"); - doUpdateActive = false; + doUpdateActive.store(true); activeSel = nullptr; recentSel = nullptr; + bookmarksInitialized = false; hideProps(); m_propPanel->Hide(); @@ -19,10 +24,10 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, } void BookmarkView::onUpdateTimer( wxTimerEvent& event ) { - if (doUpdateActive) { + if (doUpdateActive.load()) { doUpdateActiveList(); - doUpdateActive = false; + doUpdateActive.store(false); } } @@ -53,7 +58,35 @@ void BookmarkView::updateTheme() { void BookmarkView::updateActiveList() { - doUpdateActive = true; + doUpdateActive.store(true); +} + +void BookmarkView::refreshBookmarks() { +// if (!bookmarksInitialized) { + groupNames = wxGetApp().getBookmarkMgr().getGroups(); + if (!groupNames.size()) { + wxGetApp().getBookmarkMgr().getGroup("Uncategorized"); + groupNames = wxGetApp().getBookmarkMgr().getGroups(); + } + for (auto gn_i : groupNames) { + if (groups.find(gn_i) == groups.end()) { + groups[gn_i] = m_treeView->AppendItem(bookmarkBranch, gn_i); + } + + wxTreeItemId groupItem = groups[gn_i]; + m_treeView->DeleteChildren(groupItem); + + std::vector &groupEnts = groupEntries[groupItem]; + groupEnts.erase(groupEnts.begin(),groupEnts.end()); + + BookmarkGroup bmList = wxGetApp().getBookmarkMgr().getGroup(gn_i); + for (auto bmEnt : bmList) { + wxTreeItemId bmItem = m_treeView->AppendItem(groupItem, bmEnt->label); + groupEnts.push_back(bmItem); + } + } +// bookmarksInitialized = true; +// } } void BookmarkView::doUpdateActiveList() { @@ -81,6 +114,9 @@ void BookmarkView::doUpdateActiveList() { } } + // Bookmarks + refreshBookmarks(); + // Recents BookmarkList bmRecents = wxGetApp().getBookmarkMgr().getRecents(); recentItems.erase(recentItems.begin(),recentItems.end()); @@ -124,6 +160,26 @@ void BookmarkView::onTreeExpanded( wxTreeEvent& event ) { event.Skip(); } +void BookmarkView::onTreeItemMenu( wxTreeEvent& event ) { + if (m_treeView->GetSelection() == bookmarkBranch) { + wxMenu menu; + menu.Append(wxCONTEXT_ADD_GROUP_ID, "Add Group"); + menu.Connect(wxCONTEXT_ADD_GROUP_ID, wxEVT_MENU, (wxObjectEventFunction)&BookmarkView::onMenuItem); + PopupMenu(&menu); + } +} + +void BookmarkView::onMenuItem(wxCommandEvent& event) { + if (event.GetId() == wxCONTEXT_ADD_GROUP_ID) { + wxString stringVal = wxGetTextFromUser("Enter Group Name", "Add Group", ""); + if (stringVal.ToStdString() != "") { + wxGetApp().getBookmarkMgr().getGroup(stringVal.ToStdString()); + wxGetApp().getBookmarkMgr().updateActiveList(); + } + } +} + + void BookmarkView::hideProps() { m_frequencyLabel->Hide(); m_frequencyVal->Hide(); diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index a6cd5b0..fd81396 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -13,7 +13,9 @@ public: void bookmarkSelection(BookmarkEntry *bmSel); void activateBookmark(BookmarkEntry *bmEnt); void recentSelection(BookmarkEntry *bmSel); + void refreshBookmarks(); void updateTheme(); + void onMenuItem(wxCommandEvent& event); protected: @@ -27,6 +29,7 @@ protected: void onTreeActivate( wxTreeEvent& event ); void onTreeCollapse( wxTreeEvent& event ); void onTreeExpanded( wxTreeEvent& event ); + void onTreeItemMenu( wxTreeEvent& event ); void onTreeSelect( wxTreeEvent& event ); void onTreeSelectChanging( wxTreeEvent& event ); void onLabelText( wxCommandEvent& event ); @@ -36,14 +39,22 @@ protected: void onActivate( wxCommandEvent& event ); void onRemove( wxCommandEvent& event ); - bool doUpdateActive; + std::atomic_bool doUpdateActive; wxTreeItemId rootBranch, activeBranch, bookmarkBranch, recentBranch; - std::map groups; - std::map activeItems; - std::map recentItems; - DemodulatorInstance *activeSel; - BookmarkEntry *recentSel; + // Bookmarks + BookmarkNames groupNames; + std::map groups; + std::map > groupEntries; BookmarkEntry *bookmarkSel; + bool bookmarksInitialized; + + // Active + std::map activeItems; + DemodulatorInstance *activeSel; + + // Recent + std::map recentItems; + BookmarkEntry *recentSel; }; \ No newline at end of file From 07c55ede216152ce04333e6c3584a5a5b97452dd Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 6 Oct 2016 22:27:12 -0400 Subject: [PATCH 11/51] Basic bookmarking test --- src/BookmarkMgr.cpp | 17 +++++++ src/BookmarkMgr.h | 2 + src/forms/Bookmark/BookmarkView.cpp | 78 ++++++++++++++++++++++++----- src/forms/Bookmark/BookmarkView.h | 10 +++- 4 files changed, 93 insertions(+), 14 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 0fedc23..b39f758 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -66,6 +66,23 @@ void BookmarkMgr::updateActiveList() { } } +void BookmarkMgr::updateBookmarks() { + BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView(); + + if (bmv) { + bmv->updateBookmarks(); + } +} + +void BookmarkMgr::updateBookmarks(std::string group) { + BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView(); + + if (bmv) { + bmv->updateBookmarks(group); + } +} + + void BookmarkMgr::addRecent(DemodulatorInstance *demod) { std::lock_guard < std::mutex > lock(busy_lock); recents.push_back(demodToBookmarkEntry(demod)); diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 4b65e05..8aa378d 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -48,6 +48,8 @@ public: BookmarkNames getGroups(); void updateActiveList(); + void updateBookmarks(); + void updateBookmarks(std::string group); void addRecent(DemodulatorInstance *demod); BookmarkList getRecents(); diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index dd1657b..96ccf68 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -3,6 +3,7 @@ #include #include +#include #define wxCONTEXT_ADD_GROUP_ID 1000 BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { @@ -29,6 +30,13 @@ void BookmarkView::onUpdateTimer( wxTimerEvent& event ) { doUpdateActive.store(false); } + if (doUpdateBookmarks.load()) { + wxTreeItemId bmSel = refreshBookmarks(); + if (bmSel) { + m_treeView->SelectItem(bmSel); + } + doUpdateBookmarks.store(false); + } } void BookmarkView::updateTheme() { @@ -61,13 +69,28 @@ void BookmarkView::updateActiveList() { doUpdateActive.store(true); } -void BookmarkView::refreshBookmarks() { +void BookmarkView::updateBookmarks() { + doUpdateBookmarks.store(true); +} + +void BookmarkView::updateBookmarks(std::string group) { + doUpdateBookmarkGroup.insert(group); + doUpdateBookmarks.store(true); +} + + +wxTreeItemId BookmarkView::refreshBookmarks() { // if (!bookmarksInitialized) { groupNames = wxGetApp().getBookmarkMgr().getGroups(); if (!groupNames.size()) { - wxGetApp().getBookmarkMgr().getGroup("Uncategorized"); + wxGetApp().getBookmarkMgr().getGroup("Ungrouped"); groupNames = wxGetApp().getBookmarkMgr().getGroups(); } + if (doUpdateBookmarkGroup.size()) { // Nothing for the moment.. + doUpdateBookmarkGroup.erase(doUpdateBookmarkGroup.begin(), doUpdateBookmarkGroup.end()); + } + + wxTreeItemId bmSelFound = nullptr; for (auto gn_i : groupNames) { if (groups.find(gn_i) == groups.end()) { groups[gn_i] = m_treeView->AppendItem(bookmarkBranch, gn_i); @@ -77,15 +100,23 @@ void BookmarkView::refreshBookmarks() { m_treeView->DeleteChildren(groupItem); std::vector &groupEnts = groupEntries[groupItem]; + std::vector &groupBMEnts = groupBookmarkEntries[groupItem]; groupEnts.erase(groupEnts.begin(),groupEnts.end()); + groupBMEnts.erase(groupBMEnts.begin(),groupBMEnts.end()); BookmarkGroup bmList = wxGetApp().getBookmarkMgr().getGroup(gn_i); for (auto bmEnt : bmList) { wxTreeItemId bmItem = m_treeView->AppendItem(groupItem, bmEnt->label); groupEnts.push_back(bmItem); + groupBMEnts.push_back(bmEnt); + if (bookmarkSel == bmEnt) { + bmSelFound = bmItem; + } } } -// bookmarksInitialized = true; + + return bmSelFound; + // bookmarksInitialized = true; // } } @@ -114,9 +145,6 @@ void BookmarkView::doUpdateActiveList() { } } - // Bookmarks - refreshBookmarks(); - // Recents BookmarkList bmRecents = wxGetApp().getBookmarkMgr().getRecents(); recentItems.erase(recentItems.begin(),recentItems.end()); @@ -150,6 +178,9 @@ void BookmarkView::onTreeActivate( wxTreeEvent& event ) { if (recentSel) { activateBookmark(recentSel); } + if (bookmarkSel) { + activateBookmark(bookmarkSel); + } } void BookmarkView::onTreeCollapse( wxTreeEvent& event ) { @@ -313,14 +344,31 @@ void BookmarkView::onTreeSelect( wxTreeEvent& event ) { m_propPanel->Show(); recentSelection(recentSel); } else { + bool bFound = false; + bookmarkSel = nullptr; + + for (auto ge_i : groupEntries) { + wxTreeItemId itm = event.GetItem(); + for (int i = 0, iMax = ge_i.second.size(); i < iMax; i++) { + if (ge_i.second[i] == itm) { + bookmarkSel = groupBookmarkEntries[ge_i.first][i]; + bFound = true; + } + } + } + activeSel = nullptr; recentSel = nullptr; - - m_propPanel->Hide(); - hideProps(); + + if (bFound) { + m_propPanel->Show(); + bookmarkSelection(bookmarkSel); + } else { + m_propPanel->Hide(); + hideProps(); + wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); + } this->Layout(); - - wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); } } @@ -347,13 +395,19 @@ void BookmarkView::onDoubleClickBandwidth( wxMouseEvent& event ) { } void BookmarkView::onBookmark( wxCommandEvent& event ) { - event.Skip(); + if (activeSel) { + wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", activeSel); + wxGetApp().getBookmarkMgr().updateBookmarks(); + } } void BookmarkView::onActivate( wxCommandEvent& event ) { if (recentSel) { activateBookmark(recentSel); } + if (bookmarkSel) { + activateBookmark(bookmarkSel); + } } void BookmarkView::onRemove( wxCommandEvent& event ) { diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index fd81396..f244145 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -9,11 +9,13 @@ public: BookmarkView( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxTAB_TRAVERSAL ); void updateActiveList(); + void updateBookmarks(); + void updateBookmarks(std::string group); void activeSelection(DemodulatorInstance *dsel); void bookmarkSelection(BookmarkEntry *bmSel); void activateBookmark(BookmarkEntry *bmEnt); void recentSelection(BookmarkEntry *bmSel); - void refreshBookmarks(); + wxTreeItemId refreshBookmarks(); void updateTheme(); void onMenuItem(wxCommandEvent& event); @@ -39,17 +41,21 @@ protected: void onActivate( wxCommandEvent& event ); void onRemove( wxCommandEvent& event ); - std::atomic_bool doUpdateActive; wxTreeItemId rootBranch, activeBranch, bookmarkBranch, recentBranch; // Bookmarks + std::atomic_bool doUpdateBookmarks; + std::set< std::string > doUpdateBookmarkGroup; BookmarkNames groupNames; std::map groups; std::map > groupEntries; + std::map > groupBookmarkEntries; BookmarkEntry *bookmarkSel; bool bookmarksInitialized; + // Active + std::atomic_bool doUpdateActive; std::map activeItems; DemodulatorInstance *activeSel; From 824598cb1a071d32e0a7ec9f9f05b792883f7353 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 10 Oct 2016 22:28:48 -0400 Subject: [PATCH 12/51] Simplify treectrl selection/item data --- src/forms/Bookmark/BookmarkView.cpp | 91 ++++++++++++++--------------- src/forms/Bookmark/BookmarkView.h | 30 +++++++--- 2 files changed, 66 insertions(+), 55 deletions(-) diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 96ccf68..62c9d3d 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -93,24 +93,27 @@ wxTreeItemId BookmarkView::refreshBookmarks() { wxTreeItemId bmSelFound = nullptr; for (auto gn_i : groupNames) { if (groups.find(gn_i) == groups.end()) { - groups[gn_i] = m_treeView->AppendItem(bookmarkBranch, gn_i); + TreeViewItem* tvi = new TreeViewItem(); + tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP; + tvi->groupName = gn_i; + wxTreeItemId itm = m_treeView->AppendItem(bookmarkBranch, gn_i); + m_treeView->SetItemData(itm, tvi); + groups[gn_i] = itm; } wxTreeItemId groupItem = groups[gn_i]; m_treeView->DeleteChildren(groupItem); - std::vector &groupEnts = groupEntries[groupItem]; - std::vector &groupBMEnts = groupBookmarkEntries[groupItem]; - groupEnts.erase(groupEnts.begin(),groupEnts.end()); - groupBMEnts.erase(groupBMEnts.begin(),groupBMEnts.end()); - BookmarkGroup bmList = wxGetApp().getBookmarkMgr().getGroup(gn_i); for (auto bmEnt : bmList) { - wxTreeItemId bmItem = m_treeView->AppendItem(groupItem, bmEnt->label); - groupEnts.push_back(bmItem); - groupBMEnts.push_back(bmEnt); + TreeViewItem* tvi = new TreeViewItem(); + tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK; + tvi->bookmarkEnt = bmEnt; + tvi->groupName = gn_i; + wxTreeItemId itm = m_treeView->AppendItem(groupItem, bmEnt->label); + m_treeView->SetItemData(itm, tvi); if (bookmarkSel == bmEnt) { - bmSelFound = bmItem; + bmSelFound = itm; } } } @@ -127,13 +130,17 @@ void BookmarkView::doUpdateActiveList() { // DemodulatorInstance *lastActiveDemodulator = wxGetApp().getDemodMgr().getLastActiveDemodulator(); // Actives - activeItems.erase(activeItems.begin(),activeItems.end()); m_treeView->DeleteChildren(activeBranch); wxTreeItemId selItem = nullptr; for (auto demod_i : demods) { + TreeViewItem* tvi = new TreeViewItem(); + tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE; + tvi->demod = demod_i; + wxTreeItemId itm = m_treeView->AppendItem(activeBranch,demod_i->getLabel()); - activeItems[itm] = demod_i; + m_treeView->SetItemData(itm, tvi); + if (activeDemodulator) { if (activeDemodulator == demod_i) { selItem = itm; @@ -147,12 +154,15 @@ void BookmarkView::doUpdateActiveList() { // Recents BookmarkList bmRecents = wxGetApp().getBookmarkMgr().getRecents(); - recentItems.erase(recentItems.begin(),recentItems.end()); m_treeView->DeleteChildren(recentBranch); for (auto bmr_i: bmRecents) { + TreeViewItem* tvi = new TreeViewItem(); + tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT; + tvi->bookmarkEnt = bmr_i; + wxTreeItemId itm = m_treeView->AppendItem(recentBranch, bmr_i->label); - recentItems[itm] = bmr_i; + m_treeView->SetItemData(itm, tvi); if (recentSel == bmr_i) { selItem = itm; } @@ -295,7 +305,7 @@ void BookmarkView::bookmarkSelection(BookmarkEntry *bmSel) { m_labelLabel->Show(); m_activateButton->Show(); - m_bookmarkButton->Show(); + m_bookmarkButton->Hide(); m_removeButton->Show(); this->Layout(); @@ -334,40 +344,25 @@ void BookmarkView::recentSelection(BookmarkEntry *bmSel) { } void BookmarkView::onTreeSelect( wxTreeEvent& event ) { - if (activeItems.find(event.GetItem()) != activeItems.end()) { - DemodulatorInstance *dsel = activeItems[event.GetItem()]; - m_propPanel->Show(); - activeSelection(dsel); - wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); - } else if (recentItems.find(event.GetItem()) != recentItems.end()) { - recentSel = recentItems[event.GetItem()]; - m_propPanel->Show(); - recentSelection(recentSel); - } else { - bool bFound = false; - bookmarkSel = nullptr; - - for (auto ge_i : groupEntries) { - wxTreeItemId itm = event.GetItem(); - for (int i = 0, iMax = ge_i.second.size(); i < iMax; i++) { - if (ge_i.second[i] == itm) { - bookmarkSel = groupBookmarkEntries[ge_i.first][i]; - bFound = true; - } - } - } - - activeSel = nullptr; - recentSel = nullptr; + TreeViewItem* tvi = dynamic_cast(m_treeView->GetItemData(event.GetItem())); - if (bFound) { - m_propPanel->Show(); - bookmarkSelection(bookmarkSel); - } else { - m_propPanel->Hide(); - hideProps(); - wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); - } + if (!tvi) { + return; + } + + if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { + m_propPanel->Show(); + activeSelection(tvi->demod); + wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod, false); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { + m_propPanel->Show(); + recentSelection(tvi->bookmarkEnt); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { + m_propPanel->Show(); + bookmarkSelection(tvi->bookmarkEnt); + } else { + m_propPanel->Hide(); + hideProps(); this->Layout(); } } diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index f244145..03815af 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -4,6 +4,27 @@ #include "BookmarkMgr.h" +class TreeViewItem : public wxTreeItemData { +public: + enum TreeViewItemType { + TREEVIEW_ITEM_TYPE_GROUP, + TREEVIEW_ITEM_TYPE_ACTIVE, + TREEVIEW_ITEM_TYPE_RECENT, + TREEVIEW_ITEM_TYPE_BOOKMARK + }; + + TreeViewItem() { + bookmarkEnt = nullptr; + demod = nullptr; + }; + + TreeViewItemType type; + BookmarkEntry *bookmarkEnt; + DemodulatorInstance *demod; + std::string groupName; +}; + + class BookmarkView : public BookmarkPanel { public: BookmarkView( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxTAB_TRAVERSAL ); @@ -48,19 +69,14 @@ protected: std::set< std::string > doUpdateBookmarkGroup; BookmarkNames groupNames; std::map groups; - std::map > groupEntries; - std::map > groupBookmarkEntries; BookmarkEntry *bookmarkSel; bool bookmarksInitialized; // Active std::atomic_bool doUpdateActive; - std::map activeItems; DemodulatorInstance *activeSel; // Recent - std::map recentItems; - BookmarkEntry *recentSel; - -}; \ No newline at end of file + BookmarkEntry *recentSel; +}; From 14cf709447649db42c201423973ec15486cea247 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 13 Oct 2016 00:41:35 -0400 Subject: [PATCH 13/51] Some basic BookmarkView drag+drop functionality --- src/AppFrame.cpp | 8 ++ src/BookmarkMgr.cpp | 18 +++ src/BookmarkMgr.h | 2 + src/forms/Bookmark/BookmarkPanel.cpp | 14 ++- src/forms/Bookmark/BookmarkPanel.fbp | 14 +-- src/forms/Bookmark/BookmarkPanel.h | 6 + src/forms/Bookmark/BookmarkView.cpp | 182 +++++++++++++++++++++++++-- src/forms/Bookmark/BookmarkView.h | 14 ++- 8 files changed, 241 insertions(+), 17 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index bdc116d..ab506ef 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -1901,6 +1901,10 @@ int AppFrame::OnGlobalKeyDown(wxKeyEvent &event) { return -1; } + if (bookmarkView && bookmarkView->isMouseInView()) { + return -1; + } + DemodulatorInstance *demod = nullptr, *lastDemod = wxGetApp().getDemodMgr().getLastActiveDemodulator(); int snap = wxGetApp().getFrequencySnap(); @@ -2002,6 +2006,10 @@ int AppFrame::OnGlobalKeyUp(wxKeyEvent &event) { return -1; } + if (bookmarkView && bookmarkView->isMouseInView()) { + return -1; + } + if (event.ControlDown()) { return 1; } diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index b39f758..77eddb8 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -25,6 +25,13 @@ void BookmarkMgr::addBookmark(std::string group, DemodulatorInstance *demod) { bmData[group].insert(be); } +void BookmarkMgr::addBookmark(std::string group, BookmarkEntry *be) { + std::lock_guard < std::mutex > lock(busy_lock); + + bmData[group].insert(be); +} + + void BookmarkMgr::removeBookmark(std::string group, BookmarkEntry *be) { std::lock_guard < std::mutex > lockData(busy_lock); std::lock_guard < std::mutex > lockEnt(be->busy_lock); @@ -93,6 +100,17 @@ void BookmarkMgr::addRecent(DemodulatorInstance *demod) { } +void BookmarkMgr::removeRecent(BookmarkEntry *be) { + std::lock_guard < std::mutex > lock(busy_lock); + + BookmarkList::iterator bm_i = std::find(recents.begin(),recents.end(), be); + + if (bm_i != recents.end()) { + recents.erase(bm_i); + } +} + + BookmarkList BookmarkMgr::getRecents() { return recents; } diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 8aa378d..9faca51 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -40,6 +40,7 @@ public: 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); BookmarkList getBookmarks(std::string group); @@ -52,6 +53,7 @@ public: void updateBookmarks(std::string group); void addRecent(DemodulatorInstance *demod); + void removeRecent(BookmarkEntry *be); BookmarkList getRecents(); diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index c60e4f7..7c7d50d 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -14,7 +14,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po wxBoxSizer* bSizer1; bSizer1 = new wxBoxSizer( wxVERTICAL ); - m_treeView = new wxTreeCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_HIDE_ROOT ); + m_treeView = new wxTreeCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_EDIT_LABELS|wxTR_HAS_VARIABLE_ROW_HEIGHT|wxTR_HIDE_ROOT|wxTR_SINGLE ); bSizer1->Add( m_treeView, 5, wxEXPAND, 5 ); m_propPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); @@ -76,11 +76,17 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_updateTimer.SetOwner( this, wxID_ANY ); // Connect Events + this->Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( BookmarkPanel::onEnterWindow ) ); + this->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BookmarkPanel::onLeaveWindow ) ); + m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeBeginDrag ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this ); + m_treeView->Connect( wxEVT_COMMAND_TREE_DELETE_ITEM, wxTreeEventHandler( BookmarkPanel::onTreeDeleteItem ), NULL, this ); + m_treeView->Connect( wxEVT_COMMAND_TREE_END_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeEndDrag ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_END_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeEndLabelEdit ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxTreeEventHandler( BookmarkPanel::onTreeCollapse ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEventHandler( BookmarkPanel::onTreeExpanded ), NULL, this ); + m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, wxTreeEventHandler( BookmarkPanel::onTreeItemGetTooltip ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_MENU, wxTreeEventHandler( BookmarkPanel::onTreeItemMenu ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( BookmarkPanel::onTreeSelect ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_SEL_CHANGING, wxTreeEventHandler( BookmarkPanel::onTreeSelectChanging ), NULL, this ); @@ -96,11 +102,17 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po BookmarkPanel::~BookmarkPanel() { // Disconnect Events + this->Disconnect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( BookmarkPanel::onEnterWindow ) ); + this->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BookmarkPanel::onLeaveWindow ) ); + m_treeView->Disconnect( wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeBeginDrag ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this ); + m_treeView->Disconnect( wxEVT_COMMAND_TREE_DELETE_ITEM, wxTreeEventHandler( BookmarkPanel::onTreeDeleteItem ), NULL, this ); + m_treeView->Disconnect( wxEVT_COMMAND_TREE_END_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeEndDrag ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_END_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeEndLabelEdit ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxTreeEventHandler( BookmarkPanel::onTreeCollapse ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEventHandler( BookmarkPanel::onTreeExpanded ), NULL, this ); + m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, wxTreeEventHandler( BookmarkPanel::onTreeItemGetTooltip ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_MENU, wxTreeEventHandler( BookmarkPanel::onTreeItemMenu ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( BookmarkPanel::onTreeSelect ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGING, wxTreeEventHandler( BookmarkPanel::onTreeSelectChanging ), NULL, this ); diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index 5352bc0..aa64d86 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -55,13 +55,13 @@ - + onEnterWindow - + onLeaveWindow @@ -132,7 +132,7 @@ Resizable 1 - wxTR_DEFAULT_STYLE|wxTR_HIDE_ROOT + wxTR_DEFAULT_STYLE|wxTR_EDIT_LABELS|wxTR_HAS_VARIABLE_ROW_HEIGHT|wxTR_HIDE_ROOT|wxTR_SINGLE 0 @@ -161,11 +161,11 @@ - + onTreeBeginDrag onTreeBeginLabelEdit - - + onTreeDeleteItem + onTreeEndDrag onTreeEndLabelEdit onTreeActivate @@ -173,7 +173,7 @@ onTreeExpanded - + onTreeItemGetTooltip onTreeItemMenu diff --git a/src/forms/Bookmark/BookmarkPanel.h b/src/forms/Bookmark/BookmarkPanel.h index adf25e8..45904a1 100644 --- a/src/forms/Bookmark/BookmarkPanel.h +++ b/src/forms/Bookmark/BookmarkPanel.h @@ -50,11 +50,17 @@ class BookmarkPanel : public wxPanel wxTimer m_updateTimer; // Virtual event handlers, overide them in your derived class + virtual void onEnterWindow( wxMouseEvent& event ) { event.Skip(); } + virtual void onLeaveWindow( wxMouseEvent& event ) { event.Skip(); } + virtual void onTreeBeginDrag( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeBeginLabelEdit( wxTreeEvent& event ) { event.Skip(); } + virtual void onTreeDeleteItem( wxTreeEvent& event ) { event.Skip(); } + virtual void onTreeEndDrag( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeEndLabelEdit( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeActivate( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeCollapse( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeExpanded( wxTreeEvent& event ) { event.Skip(); } + virtual void onTreeItemGetTooltip( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeItemMenu( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeSelect( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeSelectChanging( wxTreeEvent& event ) { event.Skip(); } diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 62c9d3d..9db31e0 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -14,16 +14,22 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, recentBranch = m_treeView->AppendItem(rootBranch, "Recents"); doUpdateActive.store(true); + doUpdateBookmarks.store(true); activeSel = nullptr; recentSel = nullptr; - bookmarksInitialized = false; + dragItem = nullptr; + dragItemId = nullptr; hideProps(); m_propPanel->Hide(); m_updateTimer.Start(500); +// m_treeView->SetDropEffectAboveItem(); + mouseInView.store(false); + } + void BookmarkView::onUpdateTimer( wxTimerEvent& event ) { if (doUpdateActive.load()) { doUpdateActiveList(); @@ -39,6 +45,7 @@ void BookmarkView::onUpdateTimer( wxTimerEvent& event ) { } } + void BookmarkView::updateTheme() { wxColour bgColor(ThemeMgr::mgr.currentTheme->generalBackground); wxColour textColor(ThemeMgr::mgr.currentTheme->text); @@ -69,10 +76,12 @@ void BookmarkView::updateActiveList() { doUpdateActive.store(true); } + void BookmarkView::updateBookmarks() { doUpdateBookmarks.store(true); } + void BookmarkView::updateBookmarks(std::string group) { doUpdateBookmarkGroup.insert(group); doUpdateBookmarks.store(true); @@ -80,7 +89,6 @@ void BookmarkView::updateBookmarks(std::string group) { wxTreeItemId BookmarkView::refreshBookmarks() { -// if (!bookmarksInitialized) { groupNames = wxGetApp().getBookmarkMgr().getGroups(); if (!groupNames.size()) { wxGetApp().getBookmarkMgr().getGroup("Ungrouped"); @@ -119,10 +127,9 @@ wxTreeItemId BookmarkView::refreshBookmarks() { } return bmSelFound; - // bookmarksInitialized = true; -// } } + void BookmarkView::doUpdateActiveList() { std::vector &demods = wxGetApp().getDemodMgr().getDemodulators(); @@ -171,19 +178,36 @@ void BookmarkView::doUpdateActiveList() { if (selItem != nullptr) { m_treeView->SelectItem(selItem); } - - m_treeView->Enable(); - m_treeView->ExpandAll(); } + void BookmarkView::onTreeBeginLabelEdit( wxTreeEvent& event ) { - event.Skip(); + TreeViewItem* tvi = dynamic_cast(m_treeView->GetItemData(event.GetItem())); + + if (!tvi) { + event.Veto(); + return; + } + + if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { + event.Allow(); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { + event.Veto(); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { + event.Allow(); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { + event.Allow(); + } else { + event.Veto(); + } } + void BookmarkView::onTreeEndLabelEdit( wxTreeEvent& event ) { event.Skip(); } + void BookmarkView::onTreeActivate( wxTreeEvent& event ) { if (recentSel) { activateBookmark(recentSel); @@ -193,14 +217,17 @@ void BookmarkView::onTreeActivate( wxTreeEvent& event ) { } } + void BookmarkView::onTreeCollapse( wxTreeEvent& event ) { event.Skip(); } + void BookmarkView::onTreeExpanded( wxTreeEvent& event ) { event.Skip(); } + void BookmarkView::onTreeItemMenu( wxTreeEvent& event ) { if (m_treeView->GetSelection() == bookmarkBranch) { wxMenu menu; @@ -210,6 +237,7 @@ void BookmarkView::onTreeItemMenu( wxTreeEvent& event ) { } } + void BookmarkView::onMenuItem(wxCommandEvent& event) { if (event.GetId() == wxCONTEXT_ADD_GROUP_ID) { wxString stringVal = wxGetTextFromUser("Enter Group Name", "Add Group", ""); @@ -221,6 +249,11 @@ void BookmarkView::onMenuItem(wxCommandEvent& event) { } +bool BookmarkView::isMouseInView() { + return mouseInView.load(); +} + + void BookmarkView::hideProps() { m_frequencyLabel->Hide(); m_frequencyVal->Hide(); @@ -239,6 +272,7 @@ void BookmarkView::hideProps() { m_removeButton->Hide(); } + void BookmarkView::activeSelection(DemodulatorInstance *dsel) { activeSel = dsel; recentSel = nullptr; @@ -268,6 +302,7 @@ void BookmarkView::activeSelection(DemodulatorInstance *dsel) { this->Layout(); } + void BookmarkView::activateBookmark(BookmarkEntry *bmEnt) { DemodulatorInstance *newDemod = wxGetApp().getDemodMgr().loadInstance(bmEnt->node); newDemod->run(); @@ -280,6 +315,7 @@ void BookmarkView::activateBookmark(BookmarkEntry *bmEnt) { doUpdateActiveList(); } + void BookmarkView::bookmarkSelection(BookmarkEntry *bmSel) { bookmarkSel = bmSel; recentSel = nullptr; @@ -343,6 +379,7 @@ void BookmarkView::recentSelection(BookmarkEntry *bmSel) { this->Layout(); } + void BookmarkView::onTreeSelect( wxTreeEvent& event ) { TreeViewItem* tvi = dynamic_cast(m_treeView->GetItemData(event.GetItem())); @@ -367,14 +404,17 @@ void BookmarkView::onTreeSelect( wxTreeEvent& event ) { } } + void BookmarkView::onTreeSelectChanging( wxTreeEvent& event ) { event.Skip(); } + void BookmarkView::onLabelText( wxCommandEvent& event ) { event.Skip(); } + void BookmarkView::onDoubleClickFreq( wxMouseEvent& event ) { if (activeSel) { wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); @@ -382,6 +422,7 @@ void BookmarkView::onDoubleClickFreq( wxMouseEvent& event ) { } } + void BookmarkView::onDoubleClickBandwidth( wxMouseEvent& event ) { if (activeSel) { wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); @@ -389,6 +430,7 @@ void BookmarkView::onDoubleClickBandwidth( wxMouseEvent& event ) { } } + void BookmarkView::onBookmark( wxCommandEvent& event ) { if (activeSel) { wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", activeSel); @@ -396,6 +438,7 @@ void BookmarkView::onBookmark( wxCommandEvent& event ) { } } + void BookmarkView::onActivate( wxCommandEvent& event ) { if (recentSel) { activateBookmark(recentSel); @@ -405,6 +448,7 @@ void BookmarkView::onActivate( wxCommandEvent& event ) { } } + void BookmarkView::onRemove( wxCommandEvent& event ) { if (activeSel != nullptr) { wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, false); @@ -414,3 +458,125 @@ void BookmarkView::onRemove( wxCommandEvent& event ) { } } + +void BookmarkView::onTreeBeginDrag( wxTreeEvent& event ) { + TreeViewItem* tvi = dynamic_cast(m_treeView->GetItemData(event.GetItem())); + + dragItem = nullptr; + dragItemId = nullptr; + + if (!tvi) { + event.Veto(); + return; + } + + bool bAllow = false; + std::string dragItemName; + + if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { + bAllow = true; + dragItemName = tvi->demod->getLabel(); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { + bAllow = true; + dragItemName = tvi->bookmarkEnt->label; + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { + bAllow = true; + dragItemName = tvi->bookmarkEnt->label; + } + + if (bAllow) { + wxColour bgColor(ThemeMgr::mgr.currentTheme->generalBackground); + wxColour textColor(ThemeMgr::mgr.currentTheme->text); + + m_treeView->SetBackgroundColour(textColor); + m_treeView->SetForegroundColour(bgColor); + m_treeView->SetToolTip("Dragging " + dragItemName); + + dragItem = tvi; + dragItemId = event.GetItem(); + + event.Allow(); + } else { + event.Veto(); + } +} + + +void BookmarkView::onTreeEndDrag( wxTreeEvent& event ) { + + wxColour bgColor(ThemeMgr::mgr.currentTheme->generalBackground); + wxColour textColor(ThemeMgr::mgr.currentTheme->text); + + m_treeView->SetBackgroundColour(bgColor); + m_treeView->SetForegroundColour(textColor); + m_treeView->UnsetToolTip(); + + if (!event.GetItem()) { + event.Veto(); + return; + } + + TreeViewItem* tvi = dynamic_cast(m_treeView->GetItemData(event.GetItem())); + + if (!tvi) { + if (event.GetItem() == bookmarkBranch) { + if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { + wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", dragItem->demod); + wxGetApp().getBookmarkMgr().updateBookmarks(); + }else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { + wxGetApp().getBookmarkMgr().removeRecent(dragItem->bookmarkEnt); + wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", dragItem->bookmarkEnt); + m_treeView->Delete(dragItemId); + wxGetApp().getBookmarkMgr().updateBookmarks(); + wxGetApp().getBookmarkMgr().updateActiveList(); + } + } + + return; + } + + if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { + if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { // Active -> Group Item + wxGetApp().getBookmarkMgr().addBookmark(tvi->groupName, dragItem->demod); + wxGetApp().getBookmarkMgr().updateBookmarks(); + } else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { // Recent -> Group Item + wxGetApp().getBookmarkMgr().removeRecent(dragItem->bookmarkEnt); + wxGetApp().getBookmarkMgr().addBookmark(tvi->groupName, dragItem->bookmarkEnt); + m_treeView->Delete(dragItemId); + wxGetApp().getBookmarkMgr().updateBookmarks(); + wxGetApp().getBookmarkMgr().updateActiveList(); + } + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { + if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { // Active -> Same Group + wxGetApp().getBookmarkMgr().addBookmark(tvi->groupName, dragItem->demod); + wxGetApp().getBookmarkMgr().updateBookmarks(); + } else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { // Recent -> Same Group + wxGetApp().getBookmarkMgr().removeRecent(dragItem->bookmarkEnt); + wxGetApp().getBookmarkMgr().addBookmark(tvi->groupName, dragItem->bookmarkEnt); + m_treeView->Delete(dragItemId); + wxGetApp().getBookmarkMgr().updateBookmarks(); + wxGetApp().getBookmarkMgr().updateActiveList(); + } + } +} + + +void BookmarkView::onTreeDeleteItem( wxTreeEvent& event ) { + event.Skip(); +} + + +void BookmarkView::onTreeItemGetTooltip( wxTreeEvent& event ) { + + event.Skip(); +} + + +void BookmarkView::onEnterWindow( wxMouseEvent& event ) { + mouseInView.store(true); +} + + +void BookmarkView::onLeaveWindow( wxMouseEvent& event ) { + mouseInView.store(false); +} diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 03815af..6bf2625 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -39,6 +39,8 @@ public: wxTreeItemId refreshBookmarks(); void updateTheme(); void onMenuItem(wxCommandEvent& event); + bool isMouseInView(); + protected: @@ -61,16 +63,26 @@ protected: void onBookmark( wxCommandEvent& event ); void onActivate( wxCommandEvent& event ); void onRemove( wxCommandEvent& event ); + void onTreeBeginDrag( wxTreeEvent& event ); + void onTreeEndDrag( wxTreeEvent& event ); + void onTreeDeleteItem( wxTreeEvent& event ); + void onTreeItemGetTooltip( wxTreeEvent& event ); + void onEnterWindow( wxMouseEvent& event ); + void onLeaveWindow( wxMouseEvent& event ); + + std::atomic_bool mouseInView; wxTreeItemId rootBranch, activeBranch, bookmarkBranch, recentBranch; + TreeViewItem *dragItem; + wxTreeItemId dragItemId; + // Bookmarks std::atomic_bool doUpdateBookmarks; std::set< std::string > doUpdateBookmarkGroup; BookmarkNames groupNames; std::map groups; BookmarkEntry *bookmarkSel; - bool bookmarksInitialized; // Active From 979e5b709c8df0e411fa1e80b6c28d0f0f0420c2 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 20 Oct 2016 21:44:33 -0400 Subject: [PATCH 14/51] Custom build flags, Power level offset, Persistent modem props --- CMakeLists.txt | 89 ++++++++++++++++-- src/AppConfig.cpp | 18 +++- src/AppConfig.h | 4 + src/AppFrame.cpp | 168 +++++++++++++++++++++++++--------- src/AppFrame.h | 1 + src/CubicSDR.cpp | 56 ++++++++---- src/CubicSDR.h | 3 + src/CubicSDRDefs.h | 2 +- src/ModemProperties.cpp | 4 +- src/panel/SpectrumPanel.cpp | 16 +++- src/panel/SpectrumPanel.h | 9 +- src/visual/SpectrumCanvas.cpp | 12 ++- src/visual/SpectrumCanvas.h | 3 + 13 files changed, 307 insertions(+), 78 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a817a1d..2bda349 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,18 +7,67 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/") SET(CUBICSDR_VERSION_MAJOR "0") SET(CUBICSDR_VERSION_MINOR "2") SET(CUBICSDR_VERSION_PATCH "0") -SET(CUBICSDR_VERSION_REL "") -SET(CUBICSDR_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}${CUBICSDR_VERSION_REL}") +SET(CUBICSDR_VERSION_SUFFIX "") +SET(CUBICSDR_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}${CUBICSDR_VERSION_SUFFIX}") SET(CPACK_PACKAGE_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}") SET(CPACK_PACKAGE_VERSION_MAJOR ${CUBICSDR_VERSION_MAJOR}) SET(CPACK_PACKAGE_VERSION_MINOR ${CUBICSDR_VERSION_MINOR}) SET(CPACK_PACKAGE_VERSION_PATCH ${CUBICSDR_VERSION_PATCH}) -SET (VERSION_SUFFIX "" CACHE STRING "Add custom version suffix to CubicSDR application title.") +SET (CUSTOM_BUILD OFF CACHE BOOL "Enable custom build options") +# Build options for custom deploys, optimization and debugging +IF(CUSTOM_BUILD) + SET (CUBICSDR_BUILD_TITLE CACHE STRING "Custom Title") + # bundle flags + SET (CUBICSDR_INSTALL_NAME CACHE "CubicSDR" "Installation Name") + SET (CUBICSDR_INSTALL_TITLE CACHE "CubicSDR" "Installation Title") + SET (CUBICSDR_HEADER_IMAGE CACHE "" "Image file to display in header") + SET (CUBICSDR_HEADER_BG CACHE "000000" "Background Color (HEX) for header") + # feature flags + SET (CUBICSDR_ENABLE_VIEW_DEMOD ON CACHE BOOL "Enable Second Demodulator Spectrum/Waterfall view.") + SET (CUBICSDR_ENABLE_VIEW_SCOPE ON CACHE BOOL "Enable Demodulator Scope/Spectrum view.") + SET (CUBICSDR_MODEM_EXCLUDE CACHE "" "Comma-separated list of modems to exclude.") + + IF (NOT CUBICSDR_HEADER_IMAGE STREQUAL "") + SET(CUBICSDR_HAS_HEADER_IMAGE TRUE) + GET_FILENAME_COMPONENT(CUBICSDR_HEADER_IMAGE_FILE "${CUBICSDR_HEADER_IMAGE}" NAME) + GET_FILENAME_COMPONENT(CUBICSDR_HEADER_IMAGE_DIR "${CUBICSDR_HEADER_IMAGE}" PATH) + ADD_DEFINITIONS( + -DCUBICSDR_HEADER_IMAGE="${CUBICSDR_HEADER_IMAGE_FILE}" + -DCUBICSDR_HEADER_BG="${CUBICSDR_HEADER_BG}" + ) + ENDIF() + + IF (NOT CUBICSDR_MODEM_EXCLUDE STREQUAL "") + ADD_DEFINITIONS( + -DCUBICSDR_MODEM_EXCLUDE="${CUBICSDR_MODEM_EXCLUDE}" + ) + ENDIF() +ELSE() + SET (CUBICSDR_BUILD_TITLE "CubicSDR v{$CUBICSDR_VERSION} by Charles J. Cliffe (@ccliffe) :: www.cubicsdr.com") + # bundle flags + SET (CUBICSDR_INSTALL_NAME "CubicSDR") + SET (CUBICSDR_INSTALL_TITLE "CubicSDR ${CUBICSDR_VERSION} Installer") + SET (CUBICSDR_HEADER_IMAGE "") + SET (CUBICSDR_HEADER_BG "") + # feature flags + SET (CUBICSDR_ENABLE_VIEW_DEMOD TRUE) + SET (CUBICSDR_ENABLE_VIEW_SCOPE TRUE) + SET (CUBICSDR_EXCLUDE_MODEM "") +ENDIF() + +IF(CUBICSDR_ENABLE_VIEW_DEMOD) + ADD_DEFINITIONS( -DCUBICSDR_ENABLE_VIEW_DEMOD=1 ) +ENDIF() + +IF(CUBICSDR_ENABLE_VIEW_SCOPE) + ADD_DEFINITIONS( -DCUBICSDR_ENABLE_VIEW_SCOPE=1 ) +ENDIF() ADD_DEFINITIONS( - -DCUBICSDR_VERSION="${CUBICSDR_VERSION}${VERSION_SUFFIX}" + -DCUBICSDR_VERSION="${CUBICSDR_VERSION}" + -DCUBICSDR_BUILD_TITLE="${CUBICSDR_BUILD_TITLE}" ) SET (ENABLE_DIGITAL_LAB OFF CACHE BOOL "Enable 'Digital Lab' testing features.") @@ -561,6 +610,9 @@ IF (NOT BUNDLE_APP) IF(MSVC) configure_files(${PROJECT_SOURCE_DIR}/external/liquid-dsp/msvc/${EX_PLATFORM}/ ${CMAKE_BINARY_DIR}/${EX_PLATFORM_NAME} "*.dll") ENDIF() + IF (CUBICSDR_HAS_HEADER_IMAGE) + configure_files(${CUBICSDR_HEADER_IMAGE_DIR} ${CMAKE_BINARY_DIR}/${EX_PLATFORM_NAME} ${CUBICSDR_HEADER_IMAGE_FILE}) + ENDIF() add_executable(CubicSDR ${cubicsdr_sources} ${cubicsdr_headers} ${RES_FILES}) target_link_libraries(CubicSDR ${LIQUID_LIB} ${wxWidgets_LIBRARIES} ${OPENGL_LIBRARIES} ${OTHER_LIBRARIES}) ENDIF (NOT BUNDLE_APP) @@ -639,7 +691,7 @@ IF (APPLE AND BUNDLE_APP) MACOSX_BUNDLE_INFO_STRING "CubicSDR Open-Source Software-Defined Radio Application" MACOSX_BUNDLE_BUNDLE_NAME "CubicSDR" MACOSX_BUNDLE_BUNDLE_VERSION "${CUBICSDR_VERSION}" - MACOSX_BUNDLE_LONG_VERSION_STRING "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}.${CUBICSDR_VERSION_REL}" + MACOSX_BUNDLE_LONG_VERSION_STRING "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}${CUBICSDR_VERSION_SUFFIX}" MACOSX_BUNDLE_SHORT_VERSION_STRING "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}" MACOSX_BUNDLE_GUI_IDENTIFIER "com.cubicproductions.cubicsdr" MACOSX_BUNDLE_ICON_FILE "CubicSDR.icns" @@ -734,6 +786,7 @@ IF (APPLE AND BUNDLE_APP) include(CPack) ENDIF() + IF(APPLE AND NOT BUNDLE_APP) IF (NOT CMAKE_INSTALL_PREFIX) SET(CMAKE_INSTALL_PREFIX "/usr/") @@ -790,16 +843,23 @@ IF (WIN32 AND NOT BUILD_INSTALLER) INSTALL(FILES ${CUBICSDR_FONTS} DESTINATION share/cubicsdr/fonts) + + IF (CUBICSDR_HAS_HEADER_IMAGE) + INSTALL(FILES + ${CUBICSDR_HEADER_IMAGE} + DESTINATION share/cubicsdr/) + ENDIF() + ENDIF() IF (WIN32 AND BUILD_INSTALLER) set(BUNDLE_SOAPY_MODS OFF CACHE BOOL "Bundle local SoapySDR modules") set(CPACK_GENERATOR NSIS) - set(CPACK_PACKAGE_NAME "CubicSDR") + set(CPACK_PACKAGE_NAME "${CUBICSDR_INSTALL_NAME}") set(CPACK_PACKAGE_VENDOR "cubicsdr.com") - set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "CubicSDR ${CUBICSDR_VERSION} Installer") - set(CPACK_PACKAGE_INSTALL_DIRECTORY "CubicSDR") + set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${CUBICSDR_INSTALL_TITLE}") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CUBICSDR_INSTALL_NAME}") SET(CPACK_NSIS_INSTALLED_ICON_NAME "CubicSDR.ico") SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE") set(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/icon\\\\NSIS_Header.bmp") @@ -826,6 +886,12 @@ IF (WIN32 AND BUILD_INSTALLER) install(FILES ${CUBICSDR_FONTS} DESTINATION fonts) + + IF (CUBICSDR_HAS_HEADER_IMAGE) + INSTALL(FILES + ${CUBICSDR_HEADER_IMAGE} + DESTINATION .) + ENDIF() IF(USE_HAMLIB) FOREACH(HAMLIB_DLL ${HAMLIB_DLLS}) @@ -938,6 +1004,13 @@ IF(UNIX AND NOT APPLE AND NOT BUILD_DEB) ${CUBICSDR_FONTS} DESTINATION share/cubicsdr/fonts) + + IF (CUBICSDR_HAS_HEADER_IMAGE) + INSTALL(FILES + ${CUBICSDR_HEADER_IMAGE} + DESTINATION share/cubicsdr) + ENDIF() + INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/CubicSDR.desktop" DESTINATION share/applications) diff --git a/src/AppConfig.cpp b/src/AppConfig.cpp index 39d2f4d..2772ddb 100644 --- a/src/AppConfig.cpp +++ b/src/AppConfig.cpp @@ -28,7 +28,6 @@ long long DeviceConfig::getOffset() { return offset.load(); } - void DeviceConfig::setSampleRate(long srate) { sampleRate.store(srate); } @@ -289,6 +288,7 @@ AppConfig::AppConfig() : configName("") { centerFreq.store(100000000); waterfallLinesPerSec.store(DEFAULT_WATERFALL_LPS); spectrumAvgSpeed.store(0.65f); + dbOffset.store(0); modemPropsCollapsed.store(false); #ifdef USE_HAMLIB rigEnabled.store(false); @@ -425,6 +425,14 @@ float AppConfig::getSpectrumAvgSpeed() { return spectrumAvgSpeed.load(); } +void AppConfig::setDBOffset(int offset) { + this->dbOffset.store(offset); +} + +int AppConfig::getDBOffset() { + return dbOffset.load(); +} + void AppConfig::setManualDevices(std::vector manuals) { manualDevices = manuals; } @@ -478,6 +486,7 @@ bool AppConfig::save() { *window_node->newChild("waterfall_lps") = waterfallLinesPerSec.load(); *window_node->newChild("spectrum_avg") = spectrumAvgSpeed.load(); *window_node->newChild("modemprops_collapsed") = modemPropsCollapsed.load();; + *window_node->newChild("db_offset") = dbOffset.load(); } DataNode *devices_node = cfg.rootNode()->newChild("devices"); @@ -628,6 +637,13 @@ bool AppConfig::load() { win_node->getNext("modemprops_collapsed")->element()->get(mpc); modemPropsCollapsed.store(mpc?true:false); } + + if (win_node->hasAnother("db_offset")) { + DataNode *offset_node = win_node->getNext("db_offset"); + int offsetValue = 0; + offset_node->element()->get(offsetValue); + setDBOffset(offsetValue); + } } if (cfg.rootNode()->hasAnother("devices")) { diff --git a/src/AppConfig.h b/src/AppConfig.h index 96570aa..f8d31e3 100644 --- a/src/AppConfig.h +++ b/src/AppConfig.h @@ -112,6 +112,9 @@ public: void setSpectrumAvgSpeed(float avgSpeed); float getSpectrumAvgSpeed(); + void setDBOffset(int offset); + int getDBOffset(); + void setManualDevices(std::vector manuals); std::vector getManualDevices(); @@ -158,6 +161,7 @@ private: std::atomic_llong centerFreq; std::atomic_int waterfallLinesPerSec; std::atomic spectrumAvgSpeed; + std::atomic_int dbOffset; std::vector manualDevices; #if USE_HAMLIB std::atomic_int rigModel, rigRate; diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index d9eb0ce..8f7cb21 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -43,6 +43,10 @@ wxEND_EVENT_TABLE() #include "RigThread.h" #endif + +/* split a string by 'seperator' into a vector of string */ +std::vector str_explode(const std::string &seperator, const std::string &in_str); + #define APPFRAME_MODEMPROPS_MINSIZE 20 #define APPFRAME_MODEMPROPS_MAXSIZE 240 @@ -54,7 +58,6 @@ AppFrame::AppFrame() : #endif wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL); - wxBoxSizer *demodVisuals = new wxBoxSizer(wxVERTICAL); demodTray = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *demodScopeTray = new wxBoxSizer(wxVERTICAL); wxBoxSizer *demodTunerTray = new wxBoxSizer(wxHORIZONTAL); @@ -69,6 +72,21 @@ AppFrame::AppFrame() : mainSplitter->SetMinimumPaneSize(1); wxPanel *demodPanel = new wxPanel(mainSplitter, wxID_ANY); + +#ifdef CUBICSDR_HEADER_IMAGE + //get the dir path of the executable + wxFileName exePath = wxFileName(wxStandardPaths::Get().GetExecutablePath()); + std::string headerPath = exePath.GetPath().ToStdString(); + headerPath += filePathSeparator + std::string("" CUBICSDR_HEADER_IMAGE); + wxInitAllImageHandlers(); + wxStaticBitmap *headerImgStatic = new wxStaticBitmap(demodPanel, wxID_ANY, wxBitmap( headerPath, wxBITMAP_TYPE_ANY )); + std::string headerBgColor = "" CUBICSDR_HEADER_BG; + if (headerBgColor != "") { + demodPanel->SetBackgroundColour(wxColour(headerBgColor)); + } + demodTray->Add(headerImgStatic, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); + demodTray->AddSpacer(1); +#endif gainCanvas = new GainCanvas(demodPanel, attribList); @@ -77,16 +95,24 @@ AppFrame::AppFrame() : gainSpacerItem = demodTray->AddSpacer(1); gainSpacerItem->Show(false); + std::string modemListArr[] = { "FM", "FMS", "NBFM", "AM", "LSB", "USB", "DSB", "I/Q" }; + std::vector modemList( modemListArr, modemListArr + 8 ); + +#ifdef CUBICSDR_MODEM_EXCLUDE + std::string excludeListStr = "" CUBICSDR_MODEM_EXCLUDE; + std::vector excludeList = str_explode(",",excludeListStr); + for (auto ex_i : excludeList) { + std::vector::iterator found_i = std::find(modemList.begin(),modemList.end(),ex_i); + if (found_i != modemList.end()) { + modemList.erase(found_i); + } + } +#endif + demodModeSelector = new ModeSelectorCanvas(demodPanel, attribList); - demodModeSelector->addChoice("FM"); - demodModeSelector->addChoice("FMS"); - demodModeSelector->addChoice("NBFM"); - demodModeSelector->addChoice("AM"); - demodModeSelector->addChoice("LSB"); - demodModeSelector->addChoice("USB"); - demodModeSelector->addChoice("DSB"); - demodModeSelector->addChoice("I/Q"); - demodModeSelector->setSelection("FM"); + for (auto mt_i : modemList) { + demodModeSelector->addChoice(mt_i); + } demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation (Hotkey F), Amplitude Modulation (A) and Lower (L), Upper (U), Double Side-Band and more."); demodModeSelector->SetMinSize(wxSize(50,-1)); demodModeSelector->SetMaxSize(wxSize(50,-1)); @@ -117,13 +143,19 @@ AppFrame::AppFrame() : modemProps->SetMinSize(wxSize(APPFRAME_MODEMPROPS_MAXSIZE,-1)); modemProps->SetMaxSize(wxSize(APPFRAME_MODEMPROPS_MAXSIZE,-1)); - modemProps->Hide(); + ModemArgInfoList dummyInfo; + modemProps->initProperties(dummyInfo, nullptr); + modemProps->updateTheme(); + demodTray->Add(modemProps, 15, wxEXPAND | wxALL, 0); #ifndef __APPLE__ demodTray->AddSpacer(1); #endif - + +#if CUBICSDR_ENABLE_VIEW_DEMOD + wxBoxSizer *demodVisuals = new wxBoxSizer(wxVERTICAL); + wxGetApp().getDemodSpectrumProcessor()->setup(1024); demodSpectrumCanvas = new SpectrumCanvas(demodPanel, attribList); demodSpectrumCanvas->setView(wxGetApp().getConfig()->getCenterFreq(), 300000); @@ -147,7 +179,11 @@ AppFrame::AppFrame() : demodTray->Add(demodVisuals, 30, wxEXPAND | wxALL, 0); demodTray->AddSpacer(1); - +#else + demodSpectrumCanvas = nullptr; + demodWaterfallCanvas = nullptr; +#endif + demodSignalMeter = new MeterCanvas(demodPanel, attribList); demodSignalMeter->setMax(DEMOD_SIGNAL_MAX); demodSignalMeter->setMin(DEMOD_SIGNAL_MIN); @@ -160,6 +196,7 @@ AppFrame::AppFrame() : demodTray->AddSpacer(1); +#if CUBICSDR_ENABLE_VIEW_SCOPE scopeCanvas = new ScopeCanvas(demodPanel, attribList); scopeCanvas->setHelpTip("Audio Visuals, drag left/right to toggle Scope or Spectrum."); scopeCanvas->SetMinSize(wxSize(128,-1)); @@ -168,7 +205,10 @@ AppFrame::AppFrame() : wxGetApp().getScopeProcessor()->attachOutput(scopeCanvas->getInputQueue()); demodScopeTray->AddSpacer(1); - +#else + scopeCanvas = nullptr; +#endif + deltaLockButton = new ModeSelectorCanvas(demodPanel, attribList); deltaLockButton->addChoice(1, "V"); deltaLockButton->setPadding(-1,-1); @@ -245,6 +285,7 @@ AppFrame::AppFrame() : wxGetApp().getSpectrumProcessor()->setup(2048); spectrumCanvas = new SpectrumCanvas(spectrumPanel, attribList); spectrumCanvas->setShowDb(true); + spectrumCanvas->setUseDBOfs(true); spectrumCanvas->setScaleFactorEnabled(true); wxGetApp().getSpectrumProcessor()->attachOutput(spectrumCanvas->getVisualDataQueue()); @@ -649,6 +690,7 @@ void AppFrame::updateDeviceParams() { newSettingsMenu->AppendSeparator(); + newSettingsMenu->Append(wxID_SET_DB_OFFSET, "Power Level Offset"); newSettingsMenu->Append(wxID_SET_FREQ_OFFSET, "Frequency Offset"); if (devInfo->hasCORR(SOAPY_SDR_RX, 0)) { @@ -864,6 +906,12 @@ void AppFrame::OnMenu(wxCommandEvent& event) { if (ofs != -1) { wxGetApp().setOffset(ofs); } + } else if (event.GetId() == wxID_SET_DB_OFFSET) { + long ofs = wxGetNumberFromUser("Shift the displayed RF power level by this amount.\ni.e. -30 for -30 dB", "Decibels (dB)", + "Power Level Offset", wxGetApp().getConfig()->getDBOffset(), -1000, 1000, this); + if (ofs != -1) { + wxGetApp().getConfig()->setDBOffset(ofs); + } } else if (event.GetId() == wxID_AGC_CONTROL) { if (wxGetApp().getDevice() == NULL) { agcMenuItem->Check(true); @@ -1209,8 +1257,10 @@ void AppFrame::OnMenu(wxCommandEvent& event) { void AppFrame::OnClose(wxCloseEvent& event) { wxGetApp().closeDeviceSelector(); - wxGetApp().getDemodSpectrumProcessor()->removeOutput(demodSpectrumCanvas->getVisualDataQueue()); - wxGetApp().getDemodSpectrumProcessor()->removeOutput(demodWaterfallCanvas->getVisualDataQueue()); + if (wxGetApp().getDemodSpectrumProcessor()) { + wxGetApp().getDemodSpectrumProcessor()->removeOutput(demodSpectrumCanvas->getVisualDataQueue()); + wxGetApp().getDemodSpectrumProcessor()->removeOutput(demodWaterfallCanvas->getVisualDataQueue()); + } wxGetApp().getSpectrumProcessor()->removeOutput(spectrumCanvas->getVisualDataQueue()); wxGetApp().getConfig()->setWindow(this->GetPosition(), this->GetClientSize()); @@ -1281,7 +1331,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { demodGainMeter->setInputValue(demod->getGain()); wxGetApp().getDemodMgr().setLastGain(demod->getGain()); int outputDevice = demod->getOutputDevice(); - scopeCanvas->setDeviceName(outputDevices[outputDevice].name); + if (scopeCanvas) scopeCanvas->setDeviceName(outputDevices[outputDevice].name); // outputDeviceMenuItems[outputDevice]->Check(true); std::string dType = demod->getDemodulatorType(); demodModeSelector->setSelection(dType); @@ -1293,7 +1343,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { modemPropertiesUpdated.store(true); demodTuner->setHalfBand(dType=="USB" || dType=="LSB"); } - if (demodWaterfallCanvas->getDragState() == WaterfallCanvas::WF_DRAG_NONE) { + if (!demodWaterfallCanvas || demodWaterfallCanvas->getDragState() == WaterfallCanvas::WF_DRAG_NONE) { long long centerFreq = demod->getFrequency(); unsigned int demodBw = (unsigned int) ceil((float) demod->getBandwidth() * 2.25); @@ -1314,7 +1364,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { demodBw = 20000; } - if (centerFreq != demodWaterfallCanvas->getCenterFrequency()) { + if (demodWaterfallCanvas && centerFreq != demodWaterfallCanvas->getCenterFrequency()) { demodWaterfallCanvas->setCenterFrequency(centerFreq); demodSpectrumCanvas->setCenterFrequency(centerFreq); } @@ -1400,8 +1450,10 @@ void AppFrame::OnIdle(wxIdleEvent& event) { } } - demodWaterfallCanvas->setBandwidth(demodBw); - demodSpectrumCanvas->setBandwidth(demodBw); + if (demodWaterfallCanvas) { + demodWaterfallCanvas->setBandwidth(demodBw); + demodSpectrumCanvas->setBandwidth(demodBw); + } } demodSignalMeter->setLevel(demod->getSignalLevel()); @@ -1457,9 +1509,9 @@ void AppFrame::OnIdle(wxIdleEvent& event) { demodGainMeter->setLevel(demodGainMeter->getInputValue()); } - if (wxGetApp().getFrequency() != demodWaterfallCanvas->getCenterFrequency()) { + if (demodWaterfallCanvas && wxGetApp().getFrequency() != demodWaterfallCanvas->getCenterFrequency()) { demodWaterfallCanvas->setCenterFrequency(wxGetApp().getFrequency()); - demodSpectrumCanvas->setCenterFrequency(wxGetApp().getFrequency()); + if (demodSpectrumCanvas) demodSpectrumCanvas->setCenterFrequency(wxGetApp().getFrequency()); } if (spectrumCanvas->getViewState() && abs(wxGetApp().getFrequency()-spectrumCanvas->getCenterFrequency()) > (wxGetApp().getSampleRate()/2)) { spectrumCanvas->setCenterFrequency(wxGetApp().getFrequency()); @@ -1476,15 +1528,17 @@ void AppFrame::OnIdle(wxIdleEvent& event) { } } - scopeCanvas->setPPMMode(demodTuner->isAltDown()); + if (scopeCanvas) { + scopeCanvas->setPPMMode(demodTuner->isAltDown()); + + scopeCanvas->setShowDb(spectrumCanvas->getShowDb()); + wxGetApp().getScopeProcessor()->setScopeEnabled(scopeCanvas->scopeVisible()); + wxGetApp().getScopeProcessor()->setSpectrumEnabled(scopeCanvas->spectrumVisible()); + wxGetApp().getAudioVisualQueue()->set_max_num_items((scopeCanvas->scopeVisible()?1:0) + (scopeCanvas->spectrumVisible()?1:0)); + + wxGetApp().getScopeProcessor()->run(); + } - scopeCanvas->setShowDb(spectrumCanvas->getShowDb()); - wxGetApp().getScopeProcessor()->setScopeEnabled(scopeCanvas->scopeVisible()); - wxGetApp().getScopeProcessor()->setSpectrumEnabled(scopeCanvas->spectrumVisible()); - wxGetApp().getAudioVisualQueue()->set_max_num_items((scopeCanvas->scopeVisible()?1:0) + (scopeCanvas->spectrumVisible()?1:0)); - - wxGetApp().getScopeProcessor()->run(); - SpectrumVisualProcessor *proc = wxGetApp().getSpectrumProcessor(); if (spectrumAvgMeter->inputChanged()) { @@ -1502,9 +1556,11 @@ void AppFrame::OnIdle(wxIdleEvent& event) { } SpectrumVisualProcessor *dproc = wxGetApp().getDemodSpectrumProcessor(); - - dproc->setView(demodWaterfallCanvas->getViewState(), demodWaterfallCanvas->getCenterFrequency(),demodWaterfallCanvas->getBandwidth()); + if (dproc) { + dproc->setView(demodWaterfallCanvas->getViewState(), demodWaterfallCanvas->getCenterFrequency(),demodWaterfallCanvas->getBandwidth()); + } + SpectrumVisualProcessor *wproc = waterfallDataThread->getProcessor(); if (waterfallSpeedMeter->inputChanged()) { @@ -1536,13 +1592,15 @@ void AppFrame::OnIdle(wxIdleEvent& event) { ModemDigitalOutputConsole *outp = (ModemDigitalOutputConsole *)demod->getOutput(); if (!outp->getDialog()) { outp->setTitle(demod->getDemodulatorType() + ": " + frequencyToStr(demod->getFrequency())); - outp->setDialog(new DigitalConsole(this, outp)); + outp->setDialog(new DigitalConsole(this, outp)) ; } demod->showOutput(); } #endif - } else if (!demod) { - modemProps->Hide(); + } else if (!demod && modemPropertiesUpdated.load()) { + ModemArgInfoList dummyInfo; + modemProps->initProperties(dummyInfo, nullptr); + modemProps->updateTheme(); demodTray->Layout(); } @@ -1563,7 +1621,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { wxGetApp().getSpectrumProcessor()->setPeakHold(peakHoldMode == 1); //make the peak hold act on the current dmod also, like a zoomed-in version. - wxGetApp().getDemodSpectrumProcessor()->setPeakHold(peakHoldMode == 1); + if (wxGetApp().getDemodSpectrumProcessor()) wxGetApp().getDemodSpectrumProcessor()->setPeakHold(peakHoldMode == 1); peakHoldButton->clearModeChanged(); } @@ -1577,7 +1635,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { #endif #ifdef _WIN32 - if (scopeCanvas->HasFocus()) { + if (scopeCanvas && scopeCanvas->HasFocus()) { waterfallCanvas->SetFocus(); } #endif @@ -1942,7 +2000,7 @@ void AppFrame::setMainWaterfallFFTSize(int fftSize) { } void AppFrame::setScopeDeviceName(std::string deviceName) { - scopeCanvas->setDeviceName(deviceName); + if (scopeCanvas) scopeCanvas->setDeviceName(deviceName); } @@ -1954,7 +2012,7 @@ void AppFrame::refreshGainUI() { bool AppFrame::isUserDemodBusy() { return (modemProps && modemProps->isMouseInView()) || (waterfallCanvas->isMouseInView() && waterfallCanvas->isMouseDown()) - || (demodWaterfallCanvas->isMouseInView() && demodWaterfallCanvas->isMouseDown()) + || (demodWaterfallCanvas && demodWaterfallCanvas->isMouseInView() && demodWaterfallCanvas->isMouseDown()) || (wxGetApp().getDemodMgr().getLastActiveDemodulator() && wxGetApp().getDemodMgr().getActiveDemodulator() && wxGetApp().getDemodMgr().getLastActiveDemodulator() != wxGetApp().getDemodMgr().getActiveDemodulator()); @@ -2192,7 +2250,7 @@ int AppFrame::OnGlobalKeyUp(wxKeyEvent &event) { break; case 'P': wxGetApp().getSpectrumProcessor()->setPeakHold(!wxGetApp().getSpectrumProcessor()->getPeakHold()); - wxGetApp().getDemodSpectrumProcessor()->setPeakHold(wxGetApp().getSpectrumProcessor()->getPeakHold()); + if (wxGetApp().getDemodSpectrumProcessor()) wxGetApp().getDemodSpectrumProcessor()->setPeakHold(wxGetApp().getSpectrumProcessor()->getPeakHold()); peakHoldButton->setSelection(wxGetApp().getSpectrumProcessor()->getPeakHold()?1:0); peakHoldButton->clearModeChanged(); break; @@ -2243,3 +2301,31 @@ void AppFrame::setViewState(long long center_freq) { spectrumCanvas->disableView(); waterfallCanvas->disableView(); } + + +/* split a string by 'seperator' into a vector of string */ +std::vector str_explode(const std::string &seperator, const std::string &in_str) +{ + std::vector vect_out; + + int i = 0, j = 0; + int seperator_len = seperator.length(); + int str_len = in_str.length(); + + while(i < str_len) + { + j = in_str.find_first_of(seperator,i); + + if (j == std::string::npos && i < str_len) j = str_len; + + if (j == std::string::npos) break; + + vect_out.push_back(in_str.substr(i,j-i)); + + i = j; + + i+=seperator_len; + } + + return vect_out; +} diff --git a/src/AppFrame.h b/src/AppFrame.h index 4c2acee..5f36d72 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -32,6 +32,7 @@ #define wxID_AGC_CONTROL 2009 #define wxID_SDR_START_STOP 2010 #define wxID_LOW_PERF 2011 +#define wxID_SET_DB_OFFSET 2012 #define wxID_MAIN_SPLITTER 2050 #define wxID_VIS_SPLITTER 2051 diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 11195f9..19bd023 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -228,25 +228,16 @@ bool CubicSDR::OnInit() { // Visual Data spectrumVisualThread = new SpectrumVisualDataThread(); - demodVisualThread = new SpectrumVisualDataThread(); pipeIQVisualData = new DemodulatorThreadInputQueue(); pipeIQVisualData->set_max_num_items(1); - - pipeDemodIQVisualData = new DemodulatorThreadInputQueue(); - pipeDemodIQVisualData->set_max_num_items(1); pipeWaterfallIQVisualData = new DemodulatorThreadInputQueue(); pipeWaterfallIQVisualData->set_max_num_items(128); - getDemodSpectrumProcessor()->setInput(pipeDemodIQVisualData); getSpectrumProcessor()->setInput(pipeIQVisualData); getSpectrumProcessor()->setHideDC(true); - pipeAudioVisualData = new DemodulatorThreadOutputQueue(); - pipeAudioVisualData->set_max_num_items(1); - - scopeProcessor.setInput(pipeAudioVisualData); // I/Q Data pipeSDRIQData = new SDRThreadIQDataQueue(); @@ -260,12 +251,32 @@ bool CubicSDR::OnInit() { sdrPostThread->setOutputQueue("IQVisualDataOutput", pipeIQVisualData); sdrPostThread->setOutputQueue("IQDataOutput", pipeWaterfallIQVisualData); - sdrPostThread->setOutputQueue("IQActiveDemodVisualDataOutput", pipeDemodIQVisualData); t_PostSDR = new std::thread(&SDRPostThread::threadMain, sdrPostThread); t_SpectrumVisual = new std::thread(&SpectrumVisualDataThread::threadMain, spectrumVisualThread); + +#if CUBICSDR_ENABLE_VIEW_SCOPE + pipeAudioVisualData = new DemodulatorThreadOutputQueue(); + pipeAudioVisualData->set_max_num_items(1); + + scopeProcessor.setInput(pipeAudioVisualData); +#else + pipeAudioVisualData = nullptr; +#endif + +#if CUBICSDR_ENABLE_VIEW_DEMOD + demodVisualThread = new SpectrumVisualDataThread(); + pipeDemodIQVisualData = new DemodulatorThreadInputQueue(); + pipeDemodIQVisualData->set_max_num_items(1); + if (getDemodSpectrumProcessor()) getDemodSpectrumProcessor()->setInput(pipeDemodIQVisualData); + sdrPostThread->setOutputQueue("IQActiveDemodVisualDataOutput", pipeDemodIQVisualData); t_DemodVisual = new std::thread(&SpectrumVisualDataThread::threadMain, demodVisualThread); - +#else + demodVisualThread = nullptr; + pipeDemodIQVisualData = nullptr; + t_DemodVisual = nullptr; +#endif + sdrEnum = new SDREnumerator(); SDREnumerator::setManuals(config.getManualDevices()); @@ -313,16 +324,20 @@ int CubicSDR::OnExit() { std::cout << "Terminating Visual Processor threads.." << std::endl; spectrumVisualThread->terminate(); - demodVisualThread->terminate(); - + if (demodVisualThread) { + demodVisualThread->terminate(); + } + //Wait nicely sdrPostThread->isTerminated(1000); spectrumVisualThread->isTerminated(1000); - demodVisualThread->isTerminated(1000); + if (demodVisualThread) { + demodVisualThread->isTerminated(1000); + } //Then join the thread themselves t_PostSDR->join(); - t_DemodVisual->join(); + if (t_DemodVisual) t_DemodVisual->join(); t_SpectrumVisual->join(); //Now only we can delete @@ -491,7 +506,9 @@ void CubicSDR::setFrequency(long long freq) { getSpectrumProcessor()->setPeakHold(getSpectrumProcessor()->getPeakHold()); //make the peak hold act on the current dmod also, like a zoomed-in version. - getDemodSpectrumProcessor()->setPeakHold(getSpectrumProcessor()->getPeakHold()); + if (getDemodSpectrumProcessor()) { + getDemodSpectrumProcessor()->setPeakHold(getSpectrumProcessor()->getPeakHold()); + } } long long CubicSDR::getOffset() { @@ -652,7 +669,11 @@ SpectrumVisualProcessor *CubicSDR::getSpectrumProcessor() { } SpectrumVisualProcessor *CubicSDR::getDemodSpectrumProcessor() { - return demodVisualThread->getProcessor(); + if (demodVisualThread) { + return demodVisualThread->getProcessor(); + } else { + return nullptr; + } } DemodulatorThreadOutputQueue* CubicSDR::getAudioVisualQueue() { @@ -704,6 +725,7 @@ void CubicSDR::removeDemodulator(DemodulatorInstance *demod) { } demod->setActive(false); sdrPostThread->removeDemodulator(demod); + wxGetApp().getAppFrame()->notifyUpdateModemProperties(); } std::vector* CubicSDR::getDevices() { diff --git a/src/CubicSDR.h b/src/CubicSDR.h index 07b28cb..c6fd209 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -93,6 +93,9 @@ public: void setOffset(long long ofs); long long getOffset(); + + void setDBOffset(int ofs); + int getDBOffset(); void setSampleRate(long long rate_in); long long getSampleRate(); diff --git a/src/CubicSDRDefs.h b/src/CubicSDRDefs.h index 210126c..c0505a3 100644 --- a/src/CubicSDRDefs.h +++ b/src/CubicSDRDefs.h @@ -1,6 +1,6 @@ #pragma once -#define CUBICSDR_TITLE "CubicSDR v" CUBICSDR_VERSION " by Charles J. Cliffe (@ccliffe) :: www.cubicsdr.com" +#define CUBICSDR_TITLE "" CUBICSDR_BUILD_TITLE #ifndef __BYTE_ORDER #ifdef _WIN32 diff --git a/src/ModemProperties.cpp b/src/ModemProperties.cpp index be3e6ba..fc58a8d 100644 --- a/src/ModemProperties.cpp +++ b/src/ModemProperties.cpp @@ -122,10 +122,8 @@ void ModemProperties::initProperties(ModemArgInfoList newArgs, DemodulatorInstan m_propertyGrid->Clear(); if (!demodInstance) { - Hide(); + m_propertyGrid->Append(new wxPropertyCategory("Modem Settings")); return; - } else { - Show(); } m_propertyGrid->Append(new wxPropertyCategory(demodInstance->getDemodulatorType() + " Settings")); diff --git a/src/panel/SpectrumPanel.cpp b/src/panel/SpectrumPanel.cpp index 60dfcd3..b6ba22f 100644 --- a/src/panel/SpectrumPanel.cpp +++ b/src/panel/SpectrumPanel.cpp @@ -3,6 +3,7 @@ #include #include #include +#include "CubicSDR.h" #include "ColorTheme.h" #include "CubicSDRDefs.h" @@ -10,6 +11,7 @@ SpectrumPanel::SpectrumPanel() { floorValue = 0; ceilValue = 1; showDb = false; + useDbOfs = false; fftSize = DEFAULT_FFT_SIZE; bandwidth = DEFAULT_DEMOD_BW; freq = 0; @@ -83,6 +85,14 @@ bool SpectrumPanel::getShowDb() { return showDb; } +void SpectrumPanel::setUseDBOffset(bool useOfs) { + this->useDbOfs = useOfs; +} + +bool SpectrumPanel::getUseDBOffset() { + return useDbOfs; +} + void SpectrumPanel::setPoints(std::vector &points) { this->points.assign(points.begin(), points.end()); @@ -269,11 +279,11 @@ void SpectrumPanel::drawPanelContents() { if (showDb) { float dbPanelWidth = (1.0 / viewWidth)*88.0 * GLFont::getScaleFactor(); float dbPanelHeight = (1.0/viewHeight)*14.0 * GLFont::getScaleFactor(); - + float dbOfs = useDbOfs?wxGetApp().getConfig()->getDBOffset():0; std::stringstream ssLabel(""); if (getCeilValue() != getFloorValue() && fftSize) { - ssLabel << std::fixed << std::setprecision(1) << (20.0 * log10(2.0*(getCeilValue())/(double)fftSize)) << "dB"; + ssLabel << std::fixed << std::setprecision(1) << (dbOfs + 20.0 * log10(2.0*(getCeilValue())/(double)fftSize)) << "dB"; } dbPanelCeil.setText(ssLabel.str(), GLFont::GLFONT_ALIGN_RIGHT); dbPanelCeil.setSize(dbPanelWidth, dbPanelHeight); @@ -282,7 +292,7 @@ void SpectrumPanel::drawPanelContents() { ssLabel.str(""); if (getCeilValue() != getFloorValue() && fftSize) { - ssLabel << (20.0 * log10(2.0*(getFloorValue())/(double)fftSize)) << "dB"; + ssLabel << (dbOfs + 20.0 * log10(2.0*(getFloorValue())/(double)fftSize)) << "dB"; } dbPanelFloor.setText(ssLabel.str(), GLFont::GLFONT_ALIGN_RIGHT); diff --git a/src/panel/SpectrumPanel.h b/src/panel/SpectrumPanel.h index 39aa3fe..ea45588 100644 --- a/src/panel/SpectrumPanel.h +++ b/src/panel/SpectrumPanel.h @@ -26,7 +26,10 @@ public: void setShowDb(bool showDb); bool getShowDb(); - + + void setUseDBOffset(bool useOfs); + bool getUseDBOffset(); + protected: void drawPanelContents(); @@ -40,5 +43,5 @@ private: GLTextPanel dbPanelCeil; GLTextPanel dbPanelFloor; - bool showDb; -}; \ No newline at end of file + bool showDb, useDbOfs; +}; diff --git a/src/visual/SpectrumCanvas.cpp b/src/visual/SpectrumCanvas.cpp index 8a31c85..fcb8399 100644 --- a/src/visual/SpectrumCanvas.cpp +++ b/src/visual/SpectrumCanvas.cpp @@ -174,6 +174,14 @@ bool SpectrumCanvas::getShowDb() { return spectrumPanel.getShowDb(); } +void SpectrumCanvas::setUseDBOfs(bool showDb) { + spectrumPanel.setUseDBOffset(showDb); +} + +bool SpectrumCanvas::getUseDBOfs() { + return spectrumPanel.getUseDBOffset(); +} + void SpectrumCanvas::setView(long long center_freq_in, int bandwidth_in) { bwChange += bandwidth_in-bandwidth; #define BW_RESET_TH 400000 @@ -293,7 +301,9 @@ void SpectrumCanvas::OnMouseRightReleased(wxMouseEvent& event) { wxGetApp().getSpectrumProcessor()->setPeakHold(wxGetApp().getSpectrumProcessor()->getPeakHold()); //make the peak hold act on the current dmod also, like a zoomed-in version. - wxGetApp().getDemodSpectrumProcessor()->setPeakHold(wxGetApp().getSpectrumProcessor()->getPeakHold()); + if (wxGetApp().getDemodSpectrumProcessor()) { + wxGetApp().getDemodSpectrumProcessor()->setPeakHold(wxGetApp().getSpectrumProcessor()->getPeakHold()); + } } mouseTracker.OnMouseRightReleased(event); } diff --git a/src/visual/SpectrumCanvas.h b/src/visual/SpectrumCanvas.h index 85af252..2b47e14 100644 --- a/src/visual/SpectrumCanvas.h +++ b/src/visual/SpectrumCanvas.h @@ -22,6 +22,9 @@ public: void setShowDb(bool showDb); bool getShowDb(); + void setUseDBOfs(bool showDb); + bool getUseDBOfs(); + void setView(long long center_freq_in, int bandwidth_in); void disableView(); From 559f8982ac4f59360ef1abf1d32dcef4e2c784d1 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 28 Oct 2016 22:10:27 -0400 Subject: [PATCH 15/51] Logo aspect fit --- src/AppFrame.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 8f7cb21..392d277 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -80,6 +80,7 @@ AppFrame::AppFrame() : headerPath += filePathSeparator + std::string("" CUBICSDR_HEADER_IMAGE); wxInitAllImageHandlers(); wxStaticBitmap *headerImgStatic = new wxStaticBitmap(demodPanel, wxID_ANY, wxBitmap( headerPath, wxBITMAP_TYPE_ANY )); + headerImgStatic->SetScaleMode(wxStaticBitmapBase::ScaleMode::Scale_AspectFit); std::string headerBgColor = "" CUBICSDR_HEADER_BG; if (headerBgColor != "") { demodPanel->SetBackgroundColour(wxColour(headerBgColor)); From f0d829b6b3ab194f4b6b35a0c6bead1a15bc1835 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 1 Nov 2016 22:29:58 -0400 Subject: [PATCH 16/51] Better image panel for custom header option --- CMakeLists.txt | 15 ++++++--- src/AppFrame.cpp | 14 +++++--- src/AppFrame.h | 5 ++- src/forms/SDRDevices/SDRDevices.cpp | 2 +- src/visual/ImagePanel.cpp | 50 +++++++++++++++++++++++++++++ src/visual/ImagePanel.h | 16 +++++++++ 6 files changed, 91 insertions(+), 11 deletions(-) create mode 100644 src/visual/ImagePanel.cpp create mode 100644 src/visual/ImagePanel.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2bda349..ea5cb8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,6 +66,7 @@ IF(CUBICSDR_ENABLE_VIEW_SCOPE) ENDIF() ADD_DEFINITIONS( + -DCUBICSDR_INSTALL_NAME="${CUBICSDR_INSTALL_NAME}" -DCUBICSDR_VERSION="${CUBICSDR_VERSION}" -DCUBICSDR_BUILD_TITLE="${CUBICSDR_BUILD_TITLE}" ) @@ -342,6 +343,7 @@ SET (cubicsdr_sources src/visual/SpectrumCanvas.cpp src/visual/WaterfallCanvas.cpp src/visual/GainCanvas.cpp + src/visual/ImagePanel.cpp src/process/VisualProcessor.cpp src/process/ScopeVisualProcessor.cpp src/process/SpectrumVisualProcessor.cpp @@ -442,6 +444,7 @@ SET (cubicsdr_headers src/visual/SpectrumCanvas.h src/visual/WaterfallCanvas.h src/visual/GainCanvas.h + src/visual/ImagePanel.h src/process/VisualProcessor.h src/process/ScopeVisualProcessor.h src/process/SpectrumVisualProcessor.h @@ -627,6 +630,8 @@ IF (MSVC) set_target_properties(CubicSDR PROPERTIES LINK_FLAGS_MINSIZEREL "/SUBSYSTEM:WINDOWS") set_target_properties(CubicSDR PROPERTIES COMPILE_DEFINITIONS_MINSIZEREL "_WINDOWS") set(CMAKE_CREATE_WIN32_EXE "/SUBSYSTEM:WINDOWS /ENTRY:\"mainCRTStartup\"") + set_target_properties (CubicSDR PROPERTIES OUTPUT_NAME "${CUBICSDR_INSTALL_NAME}") + ENDIF(MSVC) IF (APPLE) @@ -857,21 +862,21 @@ IF (WIN32 AND BUILD_INSTALLER) set(CPACK_GENERATOR NSIS) set(CPACK_PACKAGE_NAME "${CUBICSDR_INSTALL_NAME}") + set(CPACK_NSIS_DISPLAY_NAME "${CUBICSDR_INSTALL_TITLE}") set(CPACK_PACKAGE_VENDOR "cubicsdr.com") - set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${CUBICSDR_INSTALL_TITLE}") set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CUBICSDR_INSTALL_NAME}") SET(CPACK_NSIS_INSTALLED_ICON_NAME "CubicSDR.ico") SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE") set(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/icon\\\\NSIS_Header.bmp") IF(EX_PLATFORM EQUAL 64) SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") - SET(CPACK_NSIS_PACKAGE_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY}") - SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}") + SET(CPACK_NSIS_PACKAGE_NAME "${CUBICSDR_INSTALL_NAME}") + SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CUBICSDR_INSTALL_NAME} ${CPACK_PACKAGE_VERSION}") set(CMAKE_CL_64 TRUE) # This gets around a bug in the CPack installer name generation for MinGW 64-bit since 2.8 ELSE(EX_PLATFORM EQUAL 64) SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES") - SET(CPACK_NSIS_PACKAGE_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} (x86)") - SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION} (x86)") + SET(CPACK_NSIS_PACKAGE_NAME "${CUBICSDR_INSTALL_NAME} (x86)") + SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CUBICSDR_INSTALL_NAME} ${CPACK_PACKAGE_VERSION} (x86)") set(CMAKE_CL_64 FALSE) ENDIF(EX_PLATFORM EQUAL 64) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 8f7cb21..d884535 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -20,6 +20,7 @@ #include "DataTree.h" #include "ColorTheme.h" #include "DemodulatorMgr.h" +#include "ImagePanel.h" #include @@ -74,17 +75,21 @@ AppFrame::AppFrame() : wxPanel *demodPanel = new wxPanel(mainSplitter, wxID_ANY); #ifdef CUBICSDR_HEADER_IMAGE - //get the dir path of the executable wxFileName exePath = wxFileName(wxStandardPaths::Get().GetExecutablePath()); std::string headerPath = exePath.GetPath().ToStdString(); headerPath += filePathSeparator + std::string("" CUBICSDR_HEADER_IMAGE); wxInitAllImageHandlers(); - wxStaticBitmap *headerImgStatic = new wxStaticBitmap(demodPanel, wxID_ANY, wxBitmap( headerPath, wxBITMAP_TYPE_ANY )); + + ImagePanel *imgPanel = new ImagePanel(demodPanel, headerPath, wxBITMAP_TYPE_ANY); + std::string headerBgColor = "" CUBICSDR_HEADER_BG; if (headerBgColor != "") { - demodPanel->SetBackgroundColour(wxColour(headerBgColor)); + imgPanel->SetBackgroundColour(wxColour(headerBgColor)); } - demodTray->Add(headerImgStatic, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); + + imgPanel->SetBestFittingSize(wxSize(200, 0)); + + demodTray->Add(imgPanel, 0, wxEXPAND | wxALL, 0); demodTray->AddSpacer(1); #endif @@ -1291,6 +1296,7 @@ void AppFrame::OnNewWindow(wxCommandEvent& WXUNUSED(event)) { new AppFrame(); } + void AppFrame::OnThread(wxCommandEvent& event) { event.Skip(); } diff --git a/src/AppFrame.h b/src/AppFrame.h index 5f36d72..31e431c 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include "PrimaryGLContext.h" @@ -74,6 +76,7 @@ class AppFrame: public wxFrame { public: AppFrame(); ~AppFrame(); + void OnThread(wxCommandEvent& event); void OnEventInput(wxThreadEvent& event); void initDeviceParams(SDRDeviceInfo *devInfo); @@ -172,7 +175,7 @@ private: wxMenuItem *showTipMenuItem; bool lowPerfMode; - + #ifdef USE_HAMLIB void enableRig(); void disableRig(); diff --git a/src/forms/SDRDevices/SDRDevices.cpp b/src/forms/SDRDevices/SDRDevices.cpp index df81fb8..51062ec 100644 --- a/src/forms/SDRDevices/SDRDevices.cpp +++ b/src/forms/SDRDevices/SDRDevices.cpp @@ -5,7 +5,7 @@ #include "CubicSDR.h" -SDRDevicesDialog::SDRDevicesDialog( wxWindow* parent ): devFrame( parent ) { +SDRDevicesDialog::SDRDevicesDialog( wxWindow* parent ): devFrame( parent, wxID_ANY, wxT(CUBICSDR_INSTALL_NAME " :: SDR Devices")) { refresh = true; failed = false; m_refreshButton->Disable(); diff --git a/src/visual/ImagePanel.cpp b/src/visual/ImagePanel.cpp new file mode 100644 index 0000000..b67e62e --- /dev/null +++ b/src/visual/ImagePanel.cpp @@ -0,0 +1,50 @@ +#include "ImagePanel.h" + +BEGIN_EVENT_TABLE(ImagePanel, wxPanel) +EVT_PAINT(ImagePanel::paintEvent) +END_EVENT_TABLE() + + +ImagePanel::ImagePanel(wxPanel * parent, wxString file, wxBitmapType format) : + wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE) { + image.LoadFile(file, format); +} + +void ImagePanel::paintEvent(wxPaintEvent & evt) { + wxPaintDC dc(this); + render(dc); +} + + +void ImagePanel::paintNow() { + wxClientDC dc(this); + render(dc); +} + + +void ImagePanel::render(wxDC& dc) { + + double imagew = image.GetWidth(); + double imageh = image.GetHeight(); + + wxSize destSize = dc.GetSize(); + + double destw = destSize.GetWidth(); + double desth = destSize.GetHeight(); + + double sf = 1.0, wf, hf; + + wf = destw / imagew; + hf = desth / imageh; + + sf = (wf < hf)?wf:hf; + + double resulth = imageh * sf; + double resultw = imagew * sf; + + dc.SetUserScale(sf, sf); + dc.DrawBitmap( image, (destw/2 - resultw/2)/sf, (desth/2 - resulth/2)/sf, false ); +} + + + \ No newline at end of file diff --git a/src/visual/ImagePanel.h b/src/visual/ImagePanel.h new file mode 100644 index 0000000..681e0d7 --- /dev/null +++ b/src/visual/ImagePanel.h @@ -0,0 +1,16 @@ +#include +#include + +class ImagePanel : public wxPanel { + wxBitmap image; + +public: + ImagePanel(wxPanel* parent, wxString file, wxBitmapType format); + + void paintEvent(wxPaintEvent & evt); + void paintNow(); + + void render(wxDC& dc); + + DECLARE_EVENT_TABLE() +}; From 9aae2b3bd37ce50eb14e586d0d0850f96d167163 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 2 Nov 2016 22:22:51 -0400 Subject: [PATCH 17/51] cmake var typo --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ea5cb8a..c04819a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,7 @@ IF(CUSTOM_BUILD) ) ENDIF() ELSE() - SET (CUBICSDR_BUILD_TITLE "CubicSDR v{$CUBICSDR_VERSION} by Charles J. Cliffe (@ccliffe) :: www.cubicsdr.com") + SET (CUBICSDR_BUILD_TITLE "CubicSDR v${CUBICSDR_VERSION} by Charles J. Cliffe (@ccliffe) :: www.cubicsdr.com") # bundle flags SET (CUBICSDR_INSTALL_NAME "CubicSDR") SET (CUBICSDR_INSTALL_TITLE "CubicSDR ${CUBICSDR_VERSION} Installer") From b89b55735212064944af2233c6cbe94b3ccf6ea3 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 8 Nov 2016 01:35:34 -0500 Subject: [PATCH 18/51] More flexible bookmark buttons --- src/forms/Bookmark/BookmarkPanel.cpp | 19 +-- src/forms/Bookmark/BookmarkPanel.fbp | 226 +++------------------------ src/forms/Bookmark/BookmarkPanel.h | 8 +- src/forms/Bookmark/BookmarkView.cpp | 113 ++++++++++---- src/forms/Bookmark/BookmarkView.h | 20 ++- 5 files changed, 134 insertions(+), 252 deletions(-) diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index 7c7d50d..008ef47 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -61,14 +61,15 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po fgPropSizer->Fit( m_propPanel ); bSizer1->Add( m_propPanel, 1, wxBOTTOM|wxEXPAND|wxTOP, 5 ); - m_bookmarkButton = new wxButton( this, wxID_ANY, wxT("Bookmark"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer1->Add( m_bookmarkButton, 0, wxEXPAND, 5 ); + m_buttonPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* m_buttonPanelSizer; + m_buttonPanelSizer = new wxBoxSizer( wxVERTICAL ); - m_activateButton = new wxButton( this, wxID_ANY, wxT("Activate"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer1->Add( m_activateButton, 0, wxEXPAND, 5 ); - m_removeButton = new wxButton( this, wxID_ANY, wxT("Remove"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer1->Add( m_removeButton, 0, wxEXPAND, 5 ); + m_buttonPanel->SetSizer( m_buttonPanelSizer ); + m_buttonPanel->Layout(); + m_buttonPanelSizer->Fit( m_buttonPanel ); + bSizer1->Add( m_buttonPanel, 1, wxEXPAND, 5 ); this->SetSizer( bSizer1 ); @@ -93,9 +94,6 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_labelText->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); m_frequencyVal->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( BookmarkPanel::onDoubleClickFreq ), NULL, this ); m_bandwidthVal->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( BookmarkPanel::onDoubleClickBandwidth ), NULL, this ); - m_bookmarkButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onBookmark ), NULL, this ); - m_activateButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onActivate ), NULL, this ); - m_removeButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onRemove ), NULL, this ); this->Connect( wxID_ANY, wxEVT_TIMER, wxTimerEventHandler( BookmarkPanel::onUpdateTimer ) ); } @@ -119,9 +117,6 @@ BookmarkPanel::~BookmarkPanel() m_labelText->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); m_frequencyVal->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( BookmarkPanel::onDoubleClickFreq ), NULL, this ); m_bandwidthVal->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( BookmarkPanel::onDoubleClickBandwidth ), NULL, this ); - m_bookmarkButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onBookmark ), NULL, this ); - m_activateButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onActivate ), NULL, this ); - m_removeButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onRemove ), NULL, this ); this->Disconnect( wxID_ANY, wxEVT_TIMER, wxTimerEventHandler( BookmarkPanel::onUpdateTimer ) ); } diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index aa64d86..d0f3adc 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -189,7 +189,7 @@ 5 wxBOTTOM|wxEXPAND|wxTOP 1 - + 1 1 1 @@ -263,7 +263,7 @@ - + 2 wxBOTH 1 @@ -449,11 +449,11 @@ - + 5 wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT 0 - + 1 1 1 @@ -532,11 +532,11 @@ - + 5 wxALL 0 - + 1 1 1 @@ -615,11 +615,11 @@ - + 5 wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT 0 - + 1 1 1 @@ -698,11 +698,11 @@ - + 5 wxALL 0 - + 1 1 1 @@ -781,11 +781,11 @@ - + 5 wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT 0 - + 1 1 1 @@ -864,11 +864,11 @@ - + 5 wxALL 0 - + 1 1 1 @@ -953,8 +953,8 @@ 5 wxEXPAND - 0 - + 1 + 1 1 1 @@ -971,7 +971,6 @@ 1 1 - 0 0 Dock 0 @@ -983,7 +982,6 @@ 0 0 wxID_ANY - Bookmark 0 @@ -991,7 +989,7 @@ 0 1 - m_bookmarkButton + m_buttonPanel 1 @@ -1001,194 +999,12 @@ Resizable 1 - 0 - - wxFILTER_NONE - wxDefaultValidator - - - onBookmark - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Activate - - 0 - - - 0 - - 1 - m_activateButton - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - onActivate - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Remove - - 0 - - - 0 - - 1 - m_removeButton - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - onRemove + wxTAB_TRAVERSAL @@ -1212,6 +1028,12 @@ + + + m_buttonPanelSizer + wxVERTICAL + none + diff --git a/src/forms/Bookmark/BookmarkPanel.h b/src/forms/Bookmark/BookmarkPanel.h index 45904a1..99c78fd 100644 --- a/src/forms/Bookmark/BookmarkPanel.h +++ b/src/forms/Bookmark/BookmarkPanel.h @@ -20,7 +20,6 @@ #include #include #include -#include #include /////////////////////////////////////////////////////////////////////////// @@ -44,9 +43,7 @@ class BookmarkPanel : public wxPanel wxStaticText* m_bandwidthVal; wxStaticText* m_modulationLabel; wxStaticText* m_modulationVal; - wxButton* m_bookmarkButton; - wxButton* m_activateButton; - wxButton* m_removeButton; + wxPanel* m_buttonPanel; wxTimer m_updateTimer; // Virtual event handlers, overide them in your derived class @@ -67,9 +64,6 @@ class BookmarkPanel : public wxPanel virtual void onLabelText( wxCommandEvent& event ) { event.Skip(); } virtual void onDoubleClickFreq( wxMouseEvent& event ) { event.Skip(); } virtual void onDoubleClickBandwidth( wxMouseEvent& event ) { event.Skip(); } - virtual void onBookmark( wxCommandEvent& event ) { event.Skip(); } - virtual void onActivate( wxCommandEvent& event ) { event.Skip(); } - virtual void onRemove( wxCommandEvent& event ) { event.Skip(); } virtual void onUpdateTimer( wxTimerEvent& event ) { event.Skip(); } diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 9db31e0..58b1756 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -52,6 +52,8 @@ void BookmarkView::updateTheme() { wxColour btn(ThemeMgr::mgr.currentTheme->button); wxColour btnHl(ThemeMgr::mgr.currentTheme->buttonHighlight); + this->SetBackgroundColour(ThemeMgr::mgr.currentTheme->generalBackground * 4.0); + m_treeView->SetBackgroundColour(bgColor); m_treeView->SetForegroundColour(textColor); @@ -65,10 +67,11 @@ void BookmarkView::updateTheme() { m_bandwidthLabel->SetForegroundColour(textColor); m_modulationVal->SetForegroundColour(textColor); m_modulationLabel->SetForegroundColour(textColor); - - m_bookmarkButton->SetBackgroundColour(bgColor); - m_removeButton->SetBackgroundColour(bgColor); - m_activateButton->SetBackgroundColour(bgColor); + + m_buttonPanel->SetBackgroundColour(bgColor); + for (auto p : m_buttonPanel->GetChildren()) { + p->SetBackgroundColour(bgColor); + } } @@ -243,7 +246,7 @@ void BookmarkView::onMenuItem(wxCommandEvent& event) { wxString stringVal = wxGetTextFromUser("Enter Group Name", "Add Group", ""); if (stringVal.ToStdString() != "") { wxGetApp().getBookmarkMgr().getGroup(stringVal.ToStdString()); - wxGetApp().getBookmarkMgr().updateActiveList(); + wxGetApp().getBookmarkMgr().updateBookmarks(); } } } @@ -267,9 +270,34 @@ void BookmarkView::hideProps() { m_labelText->Hide(); m_labelLabel->Hide(); - m_bookmarkButton->Hide(); - m_activateButton->Hide(); - m_removeButton->Hide(); + m_buttonPanel->Hide(); +} + + +void BookmarkView::clearButtons() { + m_buttonPanel->DestroyChildren(); + m_buttonPanel->Hide(); +} + +void BookmarkView::showButtons() { + m_buttonPanel->Show(); +// m_buttonPanel->Layout(); + m_buttonPanel->GetSizer()->Layout(); +} + + +wxButton *BookmarkView::makeButton(wxWindow *parent, std::string labelVal, wxObjectEventFunction handler) { + wxButton *nButton = new wxButton( m_buttonPanel, wxID_ANY, labelVal); + nButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, handler, NULL, this); + nButton->SetBackgroundColour(ThemeMgr::mgr.currentTheme->generalBackground); + return nButton; +} + + +wxButton *BookmarkView::addButton(wxWindow *parent, std::string labelVal, wxObjectEventFunction handler) { + wxButton *nButton = makeButton(parent, labelVal, handler); + parent->GetSizer()->Add( nButton, 0, wxEXPAND); + return nButton; } @@ -286,7 +314,7 @@ void BookmarkView::activeSelection(DemodulatorInstance *dsel) { m_frequencyVal->Show(); m_frequencyLabel->Show(); - + m_bandwidthVal->Show(); m_bandwidthLabel->Show(); @@ -296,9 +324,13 @@ void BookmarkView::activeSelection(DemodulatorInstance *dsel) { m_labelText->Show(); m_labelLabel->Show(); - m_bookmarkButton->Show(); - m_removeButton->Show(); + clearButtons(); + addButton(m_buttonPanel, "Bookmark Active", wxCommandEventHandler( BookmarkView::onBookmarkActive )); + addButton(m_buttonPanel, "Remove Active", wxCommandEventHandler( BookmarkView::onRemoveActive )); + + showButtons(); + this->Layout(); } @@ -340,10 +372,13 @@ void BookmarkView::bookmarkSelection(BookmarkEntry *bmSel) { m_labelText->Show(); m_labelLabel->Show(); - m_activateButton->Show(); - m_bookmarkButton->Hide(); - m_removeButton->Show(); + clearButtons(); + addButton(m_buttonPanel, "Activate Bookmark", wxCommandEventHandler( BookmarkView::onActivateBookmark )); + addButton(m_buttonPanel, "Remove Bookmark", wxCommandEventHandler( BookmarkView::onRemoveBookmark )); + + showButtons(); + this->Layout(); } @@ -372,10 +407,13 @@ void BookmarkView::recentSelection(BookmarkEntry *bmSel) { m_labelText->Show(); m_labelLabel->Show(); - m_activateButton->Show(); - m_bookmarkButton->Show(); - m_removeButton->Hide(); + clearButtons(); + addButton(m_buttonPanel, "Activate Recent", wxCommandEventHandler( BookmarkView::onActivateRecent )); + addButton(m_buttonPanel, "Bookmark Recent", wxCommandEventHandler( BookmarkView::onBookmarkRecent )); + + showButtons(); + this->Layout(); } @@ -384,6 +422,9 @@ void BookmarkView::onTreeSelect( wxTreeEvent& event ) { TreeViewItem* tvi = dynamic_cast(m_treeView->GetItemData(event.GetItem())); if (!tvi) { + m_propPanel->Hide(); + hideProps(); + this->Layout(); return; } @@ -431,30 +472,46 @@ void BookmarkView::onDoubleClickBandwidth( wxMouseEvent& event ) { } -void BookmarkView::onBookmark( wxCommandEvent& event ) { +void BookmarkView::onBookmarkActive( wxCommandEvent& event ) { if (activeSel) { wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", activeSel); wxGetApp().getBookmarkMgr().updateBookmarks(); } } - -void BookmarkView::onActivate( wxCommandEvent& event ) { - if (recentSel) { - activateBookmark(recentSel); +void BookmarkView::onBookmarkRecent( wxCommandEvent& event ) { + if (bookmarkSel) { + wxGetApp().getBookmarkMgr().removeRecent(bookmarkSel); + wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", bookmarkSel); } +} + + +void BookmarkView::onRemoveActive( wxCommandEvent& event ) { + if (activeSel != nullptr) { + wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, false); + wxGetApp().removeDemodulator(activeSel); + wxGetApp().getDemodMgr().deleteThread(activeSel); + activeSel = nullptr; + } +} + + +void BookmarkView::onRemoveBookmark( wxCommandEvent& event ) { + // todo +} + + +void BookmarkView::onActivateBookmark( wxCommandEvent& event ) { if (bookmarkSel) { activateBookmark(bookmarkSel); } } -void BookmarkView::onRemove( wxCommandEvent& event ) { - if (activeSel != nullptr) { - wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, false); - wxGetApp().removeDemodulator(activeSel); - wxGetApp().getDemodMgr().deleteThread(activeSel); - activeSel = nullptr; +void BookmarkView::onActivateRecent( wxCommandEvent& event ) { + if (recentSel) { + activateBookmark(recentSel); } } diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 6bf2625..d444014 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -60,9 +60,6 @@ protected: void onLabelText( wxCommandEvent& event ); void onDoubleClickFreq( wxMouseEvent& event ); void onDoubleClickBandwidth( wxMouseEvent& event ); - void onBookmark( wxCommandEvent& event ); - void onActivate( wxCommandEvent& event ); - void onRemove( wxCommandEvent& event ); void onTreeBeginDrag( wxTreeEvent& event ); void onTreeEndDrag( wxTreeEvent& event ); void onTreeDeleteItem( wxTreeEvent& event ); @@ -70,6 +67,23 @@ protected: void onEnterWindow( wxMouseEvent& event ); void onLeaveWindow( wxMouseEvent& event ); + + void clearButtons(); + void showButtons(); + + wxButton *makeButton(wxWindow *parent, std::string labelVal, wxObjectEventFunction handler); + wxButton *addButton(wxWindow *parent, std::string labelVal, wxObjectEventFunction handler); + + void onBookmarkActive( wxCommandEvent& event ); + void onBookmarkRecent( wxCommandEvent& event ); + + void onRemoveActive( wxCommandEvent& event ); + void onRemoveBookmark( wxCommandEvent& event ); + + void onActivateBookmark( wxCommandEvent& event ); + void onActivateRecent( wxCommandEvent& event ); + + std::atomic_bool mouseInView; wxTreeItemId rootBranch, activeBranch, bookmarkBranch, recentBranch; From d4fb63cb77d37e0334249ec5841a16f417cda665 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 10 Nov 2016 20:43:01 -0500 Subject: [PATCH 19/51] Selection and button handlers --- src/forms/Bookmark/BookmarkView.cpp | 96 ++++++++++++++++++++++++++--- src/forms/Bookmark/BookmarkView.h | 10 +++ 2 files changed, 97 insertions(+), 9 deletions(-) diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 58b1756..b8b6150 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -243,11 +243,7 @@ void BookmarkView::onTreeItemMenu( wxTreeEvent& event ) { void BookmarkView::onMenuItem(wxCommandEvent& event) { if (event.GetId() == wxCONTEXT_ADD_GROUP_ID) { - wxString stringVal = wxGetTextFromUser("Enter Group Name", "Add Group", ""); - if (stringVal.ToStdString() != "") { - wxGetApp().getBookmarkMgr().getGroup(stringVal.ToStdString()); - wxGetApp().getBookmarkMgr().updateBookmarks(); - } + onAddGroup(event); } } @@ -417,14 +413,74 @@ void BookmarkView::recentSelection(BookmarkEntry *bmSel) { this->Layout(); } +void BookmarkView::groupSelection(std::string groupName) { + recentSel = nullptr; + activeSel = nullptr; + bookmarkSel = nullptr; + groupSel = groupName; + + clearButtons(); + + hideProps(); + + addButton(m_buttonPanel, "Remove Group", wxCommandEventHandler( BookmarkView::onRemoveGroup )); + addButton(m_buttonPanel, "Rename Group", wxCommandEventHandler( BookmarkView::onRenameGroup )); + + showButtons(); + + this->Layout(); +} + + +void BookmarkView::bookmarkBranchSelection() { + recentSel = nullptr; + activeSel = nullptr; + bookmarkSel = nullptr; + + clearButtons(); + + hideProps(); + + addButton(m_buttonPanel, "Add Group", wxCommandEventHandler( BookmarkView::onAddGroup )); + + showButtons(); + + this->Layout(); +} + + +void BookmarkView::recentBranchSelection() { + m_propPanel->Hide(); + hideProps(); + this->Layout(); +} + + +void BookmarkView::activeBranchSelection() { + m_propPanel->Hide(); + hideProps(); + this->Layout(); +} + void BookmarkView::onTreeSelect( wxTreeEvent& event ) { - TreeViewItem* tvi = dynamic_cast(m_treeView->GetItemData(event.GetItem())); + wxTreeItemId itm = event.GetItem(); + TreeViewItem* tvi = dynamic_cast(m_treeView->GetItemData(itm)); if (!tvi) { - m_propPanel->Hide(); - hideProps(); - this->Layout(); + + if (itm == bookmarkBranch) { + + } else if (itm == activeBranch) { + + } else if (itm == recentBranch) { + + } else { + m_propPanel->Hide(); + hideProps(); + this->Layout(); + } + return; } @@ -438,6 +494,9 @@ void BookmarkView::onTreeSelect( wxTreeEvent& event ) { } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { m_propPanel->Show(); bookmarkSelection(tvi->bookmarkEnt); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { + m_propPanel->Show(); + groupSelection(tvi->groupName); } else { m_propPanel->Hide(); hideProps(); @@ -516,6 +575,25 @@ void BookmarkView::onActivateRecent( wxCommandEvent& event ) { } +void BookmarkView::onAddGroup( wxCommandEvent& event ) { + wxString stringVal = wxGetTextFromUser("Enter Group Name", "Add Group", ""); + if (stringVal.ToStdString() != "") { + wxGetApp().getBookmarkMgr().getGroup(stringVal.ToStdString()); + wxGetApp().getBookmarkMgr().updateBookmarks(); + groupSel = stringVal; + } +} + +void BookmarkView::onRemoveGroup( wxCommandEvent& event ) { + +} + + +void BookmarkView::onRenameGroup( wxCommandEvent& event ) { + +} + + void BookmarkView::onTreeBeginDrag( wxTreeEvent& event ) { TreeViewItem* tvi = dynamic_cast(m_treeView->GetItemData(event.GetItem())); diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index d444014..9d4013f 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -36,6 +36,11 @@ public: void bookmarkSelection(BookmarkEntry *bmSel); void activateBookmark(BookmarkEntry *bmEnt); void recentSelection(BookmarkEntry *bmSel); + void groupSelection(std::string groupName); + void bookmarkBranchSelection(); + void recentBranchSelection(); + void activeBranchSelection(); + wxTreeItemId refreshBookmarks(); void updateTheme(); void onMenuItem(wxCommandEvent& event); @@ -83,6 +88,10 @@ protected: void onActivateBookmark( wxCommandEvent& event ); void onActivateRecent( wxCommandEvent& event ); + void onAddGroup( wxCommandEvent& event ); + void onRemoveGroup( wxCommandEvent& event ); + void onRenameGroup( wxCommandEvent& event ); + std::atomic_bool mouseInView; @@ -94,6 +103,7 @@ protected: // Bookmarks std::atomic_bool doUpdateBookmarks; std::set< std::string > doUpdateBookmarkGroup; + std::string groupSel; BookmarkNames groupNames; std::map groups; BookmarkEntry *bookmarkSel; From 1d1aa515de8dde1210ba6f191e6f6f4e4668d181 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 10 Nov 2016 21:48:57 -0500 Subject: [PATCH 20/51] Remove Bookmark functional --- src/BookmarkMgr.cpp | 11 +++++++++++ src/BookmarkMgr.h | 1 + src/forms/Bookmark/BookmarkView.cpp | 20 +++++++++++++------- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 77eddb8..f5cb324 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -39,6 +39,17 @@ void BookmarkMgr::removeBookmark(std::string group, BookmarkEntry *be) { bmData[group].erase(be); } +void BookmarkMgr::removeBookmark(BookmarkEntry *be) { + std::lock_guard < std::mutex > lockData(busy_lock); + std::lock_guard < std::mutex > lockEnt(be->busy_lock); + + for (auto &bmd_i : bmData) { + if (bmd_i.second.find(be) != bmd_i.second.end()) { + bmd_i.second.erase(be); + } + } + +} BookmarkList BookmarkMgr::getBookmarks(std::string group) { std::lock_guard < std::mutex > lock(busy_lock); diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 9faca51..5444405 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -42,6 +42,7 @@ public: void addBookmark(std::string group, DemodulatorInstance *demod); void addBookmark(std::string group, BookmarkEntry *be); void removeBookmark(std::string group, BookmarkEntry *be); + void removeBookmark(BookmarkEntry *be); BookmarkList getBookmarks(std::string group); diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index b8b6150..9bf1f4b 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -470,11 +470,11 @@ void BookmarkView::onTreeSelect( wxTreeEvent& event ) { if (!tvi) { if (itm == bookmarkBranch) { - + bookmarkBranchSelection(); } else if (itm == activeBranch) { - + activeBranchSelection(); } else if (itm == recentBranch) { - + recentBranchSelection(); } else { m_propPanel->Hide(); hideProps(); @@ -539,9 +539,11 @@ void BookmarkView::onBookmarkActive( wxCommandEvent& event ) { } void BookmarkView::onBookmarkRecent( wxCommandEvent& event ) { - if (bookmarkSel) { - wxGetApp().getBookmarkMgr().removeRecent(bookmarkSel); - wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", bookmarkSel); + if (recentSel) { + wxGetApp().getBookmarkMgr().removeRecent(recentSel); + wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", recentSel); + wxGetApp().getBookmarkMgr().updateBookmarks(); + wxGetApp().getBookmarkMgr().updateActiveList(); } } @@ -557,7 +559,11 @@ void BookmarkView::onRemoveActive( wxCommandEvent& event ) { void BookmarkView::onRemoveBookmark( wxCommandEvent& event ) { - // todo + if (bookmarkSel) { + wxGetApp().getBookmarkMgr().removeBookmark(bookmarkSel); + bookmarkSel = nullptr; + wxGetApp().getBookmarkMgr().updateBookmarks(); + } } From 9c7ff0598cd468c7ccd827eba0495fc1e3439983 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 14 Nov 2016 23:16:08 -0500 Subject: [PATCH 21/51] Layout tweaks, fixes --- src/forms/Bookmark/BookmarkPanel.cpp | 6 ++-- src/forms/Bookmark/BookmarkPanel.fbp | 10 +++--- src/forms/Bookmark/BookmarkView.cpp | 49 +++++++++++++--------------- src/forms/Bookmark/BookmarkView.h | 2 ++ 4 files changed, 32 insertions(+), 35 deletions(-) diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index 008ef47..6901fee 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -15,7 +15,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po bSizer1 = new wxBoxSizer( wxVERTICAL ); m_treeView = new wxTreeCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_EDIT_LABELS|wxTR_HAS_VARIABLE_ROW_HEIGHT|wxTR_HIDE_ROOT|wxTR_SINGLE ); - bSizer1->Add( m_treeView, 5, wxEXPAND, 5 ); + bSizer1->Add( m_treeView, 1, wxEXPAND, 5 ); m_propPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxFlexGridSizer* fgPropSizer; @@ -59,7 +59,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_propPanel->SetSizer( fgPropSizer ); m_propPanel->Layout(); fgPropSizer->Fit( m_propPanel ); - bSizer1->Add( m_propPanel, 1, wxBOTTOM|wxEXPAND|wxTOP, 5 ); + bSizer1->Add( m_propPanel, 0, wxALL|wxBOTTOM|wxEXPAND|wxTOP, 5 ); m_buttonPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer* m_buttonPanelSizer; @@ -69,7 +69,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_buttonPanel->SetSizer( m_buttonPanelSizer ); m_buttonPanel->Layout(); m_buttonPanelSizer->Fit( m_buttonPanel ); - bSizer1->Add( m_buttonPanel, 1, wxEXPAND, 5 ); + bSizer1->Add( m_buttonPanel, 0, wxALL|wxEXPAND, 5 ); this->SetSizer( bSizer1 ); diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index d0f3adc..93305d0 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -86,7 +86,7 @@ 5 wxEXPAND - 5 + 1 1 1 @@ -187,8 +187,8 @@ 5 - wxBOTTOM|wxEXPAND|wxTOP - 1 + wxALL|wxBOTTOM|wxEXPAND|wxTOP + 0 1 1 @@ -952,8 +952,8 @@ 5 - wxEXPAND - 1 + wxALL|wxEXPAND + 0 1 1 diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 9bf1f4b..7a915ef 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -21,10 +21,8 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, dragItemId = nullptr; hideProps(); - m_propPanel->Hide(); m_updateTimer.Start(500); -// m_treeView->SetDropEffectAboveItem(); mouseInView.store(false); } @@ -52,7 +50,7 @@ void BookmarkView::updateTheme() { wxColour btn(ThemeMgr::mgr.currentTheme->button); wxColour btnHl(ThemeMgr::mgr.currentTheme->buttonHighlight); - this->SetBackgroundColour(ThemeMgr::mgr.currentTheme->generalBackground * 4.0); + SetBackgroundColour(bgColor); m_treeView->SetBackgroundColour(bgColor); m_treeView->SetForegroundColour(textColor); @@ -69,9 +67,6 @@ void BookmarkView::updateTheme() { m_modulationLabel->SetForegroundColour(textColor); m_buttonPanel->SetBackgroundColour(bgColor); - for (auto p : m_buttonPanel->GetChildren()) { - p->SetBackgroundColour(bgColor); - } } @@ -266,21 +261,32 @@ void BookmarkView::hideProps() { m_labelText->Hide(); m_labelLabel->Hide(); + m_propPanel->Hide(); m_buttonPanel->Hide(); } +void BookmarkView::showProps() { + m_propPanel->Show(); + m_propPanel->GetSizer()->Layout(); +} + + void BookmarkView::clearButtons() { - m_buttonPanel->DestroyChildren(); m_buttonPanel->Hide(); + m_buttonPanel->DestroyChildren(); } void BookmarkView::showButtons() { m_buttonPanel->Show(); -// m_buttonPanel->Layout(); m_buttonPanel->GetSizer()->Layout(); } +void BookmarkView::refreshLayout() { + GetSizer()->Layout(); + Update(); +} + wxButton *BookmarkView::makeButton(wxWindow *parent, std::string labelVal, wxObjectEventFunction handler) { wxButton *nButton = new wxButton( m_buttonPanel, wxID_ANY, labelVal); @@ -325,9 +331,9 @@ void BookmarkView::activeSelection(DemodulatorInstance *dsel) { addButton(m_buttonPanel, "Bookmark Active", wxCommandEventHandler( BookmarkView::onBookmarkActive )); addButton(m_buttonPanel, "Remove Active", wxCommandEventHandler( BookmarkView::onRemoveActive )); + showProps(); showButtons(); - - this->Layout(); + refreshLayout(); } @@ -373,9 +379,9 @@ void BookmarkView::bookmarkSelection(BookmarkEntry *bmSel) { addButton(m_buttonPanel, "Activate Bookmark", wxCommandEventHandler( BookmarkView::onActivateBookmark )); addButton(m_buttonPanel, "Remove Bookmark", wxCommandEventHandler( BookmarkView::onRemoveBookmark )); + showProps(); showButtons(); - - this->Layout(); + refreshLayout(); } @@ -408,9 +414,9 @@ void BookmarkView::recentSelection(BookmarkEntry *bmSel) { addButton(m_buttonPanel, "Activate Recent", wxCommandEventHandler( BookmarkView::onActivateRecent )); addButton(m_buttonPanel, "Bookmark Recent", wxCommandEventHandler( BookmarkView::onBookmarkRecent )); + showProps(); showButtons(); - - this->Layout(); + refreshLayout(); } void BookmarkView::groupSelection(std::string groupName) { @@ -427,8 +433,7 @@ void BookmarkView::groupSelection(std::string groupName) { addButton(m_buttonPanel, "Rename Group", wxCommandEventHandler( BookmarkView::onRenameGroup )); showButtons(); - - this->Layout(); + refreshLayout(); } @@ -438,26 +443,22 @@ void BookmarkView::bookmarkBranchSelection() { bookmarkSel = nullptr; clearButtons(); - hideProps(); addButton(m_buttonPanel, "Add Group", wxCommandEventHandler( BookmarkView::onAddGroup )); showButtons(); - - this->Layout(); + refreshLayout(); } void BookmarkView::recentBranchSelection() { - m_propPanel->Hide(); hideProps(); this->Layout(); } void BookmarkView::activeBranchSelection() { - m_propPanel->Hide(); hideProps(); this->Layout(); } @@ -476,7 +477,6 @@ void BookmarkView::onTreeSelect( wxTreeEvent& event ) { } else if (itm == recentBranch) { recentBranchSelection(); } else { - m_propPanel->Hide(); hideProps(); this->Layout(); } @@ -485,20 +485,15 @@ void BookmarkView::onTreeSelect( wxTreeEvent& event ) { } if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { - m_propPanel->Show(); activeSelection(tvi->demod); wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod, false); } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { - m_propPanel->Show(); recentSelection(tvi->bookmarkEnt); } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { - m_propPanel->Show(); bookmarkSelection(tvi->bookmarkEnt); } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { - m_propPanel->Show(); groupSelection(tvi->groupName); } else { - m_propPanel->Hide(); hideProps(); this->Layout(); } diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 9d4013f..53c33ec 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -50,6 +50,7 @@ public: protected: void hideProps(); + void showProps(); void onUpdateTimer( wxTimerEvent& event ); void doUpdateActiveList(); @@ -75,6 +76,7 @@ protected: void clearButtons(); void showButtons(); + void refreshLayout(); wxButton *makeButton(wxWindow *parent, std::string labelVal, wxObjectEventFunction handler); wxButton *addButton(wxWindow *parent, std::string labelVal, wxObjectEventFunction handler); From 2f6e83c55e0cb21cd43ed214bbbff05c5f9ae192 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 14 Nov 2016 23:52:50 -0500 Subject: [PATCH 22/51] Start integrating user demod label --- src/AppFrame.cpp | 2 ++ src/BookmarkMgr.cpp | 6 +++++- src/BookmarkMgr.h | 2 +- src/DemodLabelDialog.cpp | 2 +- src/forms/Bookmark/BookmarkView.cpp | 17 +++++++++++++---- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 4182293..5bbac12 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -1864,6 +1864,8 @@ bool AppFrame::loadSession(std::string fileName) { GetStatusBar()->SetStatusText(wxString::Format(wxT("Loaded session file: %s"), currentSessionFile.c_str())); SetTitle(wxString::Format(wxT("%s: %s"), CUBICSDR_TITLE, filePart.c_str())); + wxGetApp().getBookmarkMgr().updateActiveList(); + return true; } diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index f5cb324..0e91b99 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -132,7 +132,11 @@ BookmarkEntry *BookmarkMgr::demodToBookmarkEntry(DemodulatorInstance *demod) { be->bandwidth = demod->getBandwidth(); be->type = demod->getDemodulatorType(); - be->label = demod->getLabel(); + be->label = demod->getDemodulatorUserLabel(); + if (be->label == "") { + std::string wstr = demod->getLabel(); + be->label = std::wstring(wstr.begin(),wstr.end()); + } be->frequency = demod->getFrequency(); be->node = new DataNode; diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 5444405..9b4728b 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -12,7 +12,7 @@ public: std::mutex busy_lock; std::string type; - std::string label; + std::wstring label; long long frequency; int bandwidth; diff --git a/src/DemodLabelDialog.cpp b/src/DemodLabelDialog.cpp index d5a7e50..f002296 100644 --- a/src/DemodLabelDialog.cpp +++ b/src/DemodLabelDialog.cpp @@ -57,7 +57,7 @@ void DemodLabelDialog::OnChar(wxKeyEvent& event) { else { activeDemod->setDemodulatorUserLabel(L""); } - + wxGetApp().getBookmarkMgr().updateActiveList(); Close(); break; case WXK_ESCAPE: diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 7a915ef..f38568a 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -143,7 +143,12 @@ void BookmarkView::doUpdateActiveList() { tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE; tvi->demod = demod_i; - wxTreeItemId itm = m_treeView->AppendItem(activeBranch,demod_i->getLabel()); + wxString activeLabel = demod_i->getDemodulatorUserLabel(); + if (activeLabel == "") { + activeLabel = demod_i->getLabel(); + } + + wxTreeItemId itm = m_treeView->AppendItem(activeBranch,activeLabel); m_treeView->SetItemData(itm, tvi); if (activeDemodulator) { @@ -310,7 +315,7 @@ void BookmarkView::activeSelection(DemodulatorInstance *dsel) { m_frequencyVal->SetLabelText(frequencyToStr(dsel->getFrequency())); m_bandwidthVal->SetLabelText(frequencyToStr(dsel->getBandwidth())); m_modulationVal->SetLabelText(dsel->getDemodulatorType()); - m_labelText->SetValue(dsel->getLabel()); + m_labelText->SetValue(dsel->getDemodulatorUserLabel()); hideProps(); @@ -607,11 +612,15 @@ void BookmarkView::onTreeBeginDrag( wxTreeEvent& event ) { } bool bAllow = false; - std::string dragItemName; + std::wstring dragItemName; if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { bAllow = true; - dragItemName = tvi->demod->getLabel(); + dragItemName = tvi->demod->getDemodulatorUserLabel(); + if (dragItemName == "") { + std::string wstr = tvi->demod->getLabel(); + dragItemName = std::wstring(wstr.begin(),wstr.end()); + } } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { bAllow = true; dragItemName = tvi->bookmarkEnt->label; From 73954055e63eed3d89d5b21d0e98c135ec0b1e59 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sun, 20 Nov 2016 23:26:38 -0500 Subject: [PATCH 23/51] Resolve 'Ungrouped' logic -- replace button with choice list for bookmarking. --- src/BookmarkMgr.cpp | 6 ++ src/BookmarkMgr.h | 2 + src/forms/Bookmark/BookmarkView.cpp | 88 +++++++++++++++++++++-------- src/forms/Bookmark/BookmarkView.h | 12 ++-- 4 files changed, 80 insertions(+), 28 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 0e91b99..4dbfa06 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -75,6 +75,12 @@ BookmarkNames BookmarkMgr::getGroups() { return results; } +void BookmarkMgr::getGroups(wxArrayString &arr) { + for (BookmarkMap::iterator i = bmData.begin(); i!= bmData.end(); ++i) { + arr.push_back(i->first); + } +} + void BookmarkMgr::updateActiveList() { BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView(); diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 9b4728b..7f66710 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -2,6 +2,7 @@ #include #include +#include #include "DemodulatorInstance.h" @@ -48,6 +49,7 @@ public: BookmarkGroup getGroup(std::string group); BookmarkNames getGroups(); + void getGroups(wxArrayString &arr); void updateActiveList(); void updateBookmarks(); diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index f38568a..fdcd0fc 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -4,8 +4,12 @@ #include #include #include + #define wxCONTEXT_ADD_GROUP_ID 1000 +#define BOOKMARK_VIEW_CHOICE_DEFAULT "Bookmark.." +#define BOOKMARK_VIEW_CHOICE_NEW "(New Group..)" + BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { rootBranch = m_treeView->AddRoot("Root"); @@ -15,6 +19,7 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, doUpdateActive.store(true); doUpdateBookmarks.store(true); + bookmarkChoice = nullptr; activeSel = nullptr; recentSel = nullptr; dragItem = nullptr; @@ -89,7 +94,6 @@ void BookmarkView::updateBookmarks(std::string group) { wxTreeItemId BookmarkView::refreshBookmarks() { groupNames = wxGetApp().getBookmarkMgr().getGroups(); if (!groupNames.size()) { - wxGetApp().getBookmarkMgr().getGroup("Ungrouped"); groupNames = wxGetApp().getBookmarkMgr().getGroups(); } if (doUpdateBookmarkGroup.size()) { // Nothing for the moment.. @@ -280,6 +284,7 @@ void BookmarkView::showProps() { void BookmarkView::clearButtons() { m_buttonPanel->Hide(); m_buttonPanel->DestroyChildren(); + bookmarkChoice = nullptr; } void BookmarkView::showButtons() { @@ -295,7 +300,7 @@ void BookmarkView::refreshLayout() { wxButton *BookmarkView::makeButton(wxWindow *parent, std::string labelVal, wxObjectEventFunction handler) { wxButton *nButton = new wxButton( m_buttonPanel, wxID_ANY, labelVal); - nButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, handler, NULL, this); + nButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, handler, nullptr, this); nButton->SetBackgroundColour(ThemeMgr::mgr.currentTheme->generalBackground); return nButton; } @@ -307,6 +312,60 @@ wxButton *BookmarkView::addButton(wxWindow *parent, std::string labelVal, wxObje return nButton; } +void BookmarkView::updateBookmarkChoices() { + if (!bookmarkChoices.empty()) { + bookmarkChoices.erase(bookmarkChoices.begin(),bookmarkChoices.end()); + } + bookmarkChoices.push_back(BOOKMARK_VIEW_CHOICE_DEFAULT); + wxGetApp().getBookmarkMgr().getGroups(bookmarkChoices); + bookmarkChoices.push_back(BOOKMARK_VIEW_CHOICE_NEW); +} + +void BookmarkView::addBookmarkChoice(wxWindow *parent) { + updateBookmarkChoices(); + bookmarkChoice = new wxChoice(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, bookmarkChoices, wxALL|wxEXPAND, wxDefaultValidator, "Bookmark"); + bookmarkChoice->Connect( wxEVT_COMMAND_CHOICE_SELECTED, (wxObjectEventFunction)&BookmarkView::onBookmarkChoice, nullptr, this); + parent->GetSizer()->Add(bookmarkChoice, 0, wxALL | wxEXPAND); +} + + +void BookmarkView::onBookmarkChoice( wxCommandEvent &event ) { + + int numSel = bookmarkChoice->GetCount(); + int sel = bookmarkChoice->GetSelection(); + + if (sel == 0) { + return; + } + + wxString stringVal = ""; + + if (sel == (numSel-1)) { + stringVal = wxGetTextFromUser("Enter Group Name", "Add Group", ""); + } else { + stringVal = bookmarkChoices[sel]; + } + + if (stringVal == "") { + return; + } + + groupSel = stringVal; + + if (activeSel) { + wxGetApp().getBookmarkMgr().addBookmark(groupSel, activeSel); + wxGetApp().getBookmarkMgr().updateBookmarks(); + activeSelection(activeSel); + } + if (recentSel) { + wxGetApp().getBookmarkMgr().removeRecent(recentSel); + wxGetApp().getBookmarkMgr().addBookmark(groupSel, recentSel); + wxGetApp().getBookmarkMgr().updateBookmarks(); + wxGetApp().getBookmarkMgr().updateActiveList(); + bookmarkSelection(recentSel); + } +} + void BookmarkView::activeSelection(DemodulatorInstance *dsel) { activeSel = dsel; @@ -332,8 +391,8 @@ void BookmarkView::activeSelection(DemodulatorInstance *dsel) { m_labelLabel->Show(); clearButtons(); - - addButton(m_buttonPanel, "Bookmark Active", wxCommandEventHandler( BookmarkView::onBookmarkActive )); + + addBookmarkChoice(m_buttonPanel); addButton(m_buttonPanel, "Remove Active", wxCommandEventHandler( BookmarkView::onRemoveActive )); showProps(); @@ -417,7 +476,7 @@ void BookmarkView::recentSelection(BookmarkEntry *bmSel) { clearButtons(); addButton(m_buttonPanel, "Activate Recent", wxCommandEventHandler( BookmarkView::onActivateRecent )); - addButton(m_buttonPanel, "Bookmark Recent", wxCommandEventHandler( BookmarkView::onBookmarkRecent )); + addBookmarkChoice(m_buttonPanel); showProps(); showButtons(); @@ -531,23 +590,6 @@ void BookmarkView::onDoubleClickBandwidth( wxMouseEvent& event ) { } -void BookmarkView::onBookmarkActive( wxCommandEvent& event ) { - if (activeSel) { - wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", activeSel); - wxGetApp().getBookmarkMgr().updateBookmarks(); - } -} - -void BookmarkView::onBookmarkRecent( wxCommandEvent& event ) { - if (recentSel) { - wxGetApp().getBookmarkMgr().removeRecent(recentSel); - wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", recentSel); - wxGetApp().getBookmarkMgr().updateBookmarks(); - wxGetApp().getBookmarkMgr().updateActiveList(); - } -} - - void BookmarkView::onRemoveActive( wxCommandEvent& event ) { if (activeSel != nullptr) { wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, false); @@ -668,7 +710,7 @@ void BookmarkView::onTreeEndDrag( wxTreeEvent& event ) { if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", dragItem->demod); wxGetApp().getBookmarkMgr().updateBookmarks(); - }else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { + } else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { wxGetApp().getBookmarkMgr().removeRecent(dragItem->bookmarkEnt); wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", dragItem->bookmarkEnt); m_treeView->Delete(dragItemId); diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 53c33ec..60f4614 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -1,8 +1,8 @@ #pragma once #include "BookmarkPanel.h" - #include "BookmarkMgr.h" +#include "wx/choice.h" class TreeViewItem : public wxTreeItemData { public: @@ -81,9 +81,10 @@ protected: wxButton *makeButton(wxWindow *parent, std::string labelVal, wxObjectEventFunction handler); wxButton *addButton(wxWindow *parent, std::string labelVal, wxObjectEventFunction handler); - void onBookmarkActive( wxCommandEvent& event ); - void onBookmarkRecent( wxCommandEvent& event ); - + void updateBookmarkChoices(); + void addBookmarkChoice(wxWindow *parent); + void onBookmarkChoice( wxCommandEvent &event ); + void onRemoveActive( wxCommandEvent& event ); void onRemoveBookmark( wxCommandEvent& event ); @@ -109,7 +110,8 @@ protected: BookmarkNames groupNames; std::map groups; BookmarkEntry *bookmarkSel; - + wxArrayString bookmarkChoices; + wxChoice *bookmarkChoice; // Active std::atomic_bool doUpdateActive; From cc8c992123e492ec306656585ec94a46302a9146 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 21 Nov 2016 20:12:10 -0500 Subject: [PATCH 24/51] Better group/sort handling; sets don't like duplicate compares. --- src/BookmarkMgr.cpp | 43 +++++++++++++++++------------ src/BookmarkMgr.h | 9 +++--- src/forms/Bookmark/BookmarkView.cpp | 12 ++++---- 3 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 4dbfa06..313a7b3 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -22,21 +22,31 @@ void BookmarkMgr::addBookmark(std::string group, DemodulatorInstance *demod) { wxGetApp().getDemodMgr().saveInstance(be->node, demod); - bmData[group].insert(be); + bmData[group].push_back(be); + bmDataSorted[group] = false; } void BookmarkMgr::addBookmark(std::string group, BookmarkEntry *be) { std::lock_guard < std::mutex > lock(busy_lock); - bmData[group].insert(be); + bmData[group].push_back(be); + bmDataSorted[group] = false; } void BookmarkMgr::removeBookmark(std::string group, BookmarkEntry *be) { std::lock_guard < std::mutex > lockData(busy_lock); std::lock_guard < std::mutex > lockEnt(be->busy_lock); + + if (bmData.find(group) == bmData.end()) { + return; + } + + BookmarkList::iterator i = std::find(bmData[group].begin(), bmData[group].end(), be); - bmData[group].erase(be); + if (i != bmData[group].end()) { + bmData[group].erase(i); + } } void BookmarkMgr::removeBookmark(BookmarkEntry *be) { @@ -44,8 +54,9 @@ void BookmarkMgr::removeBookmark(BookmarkEntry *be) { std::lock_guard < std::mutex > lockEnt(be->busy_lock); for (auto &bmd_i : bmData) { - if (bmd_i.second.find(be) != bmd_i.second.end()) { - bmd_i.second.erase(be); + BookmarkList::iterator i = std::find(bmd_i.second.begin(), bmd_i.second.end(), be); + if (i != bmd_i.second.end()) { + bmd_i.second.erase(i); } } @@ -53,26 +64,24 @@ void BookmarkMgr::removeBookmark(BookmarkEntry *be) { BookmarkList BookmarkMgr::getBookmarks(std::string group) { std::lock_guard < std::mutex > lock(busy_lock); - - BookmarkList results; - for (auto be_i : bmData[group]) { - results.push_back(be_i); + if (bmData.find(group) == bmData.end()) { + BookmarkList results; + return results; + } + + if (!bmDataSorted[group]) { + std::sort(bmData[group].begin(), bmData[group].end(), BookmarkEntryCompare()); + bmDataSorted[group] = true; } - return results; -} - -BookmarkGroup BookmarkMgr::getGroup(std::string group) { return bmData[group]; } -BookmarkNames BookmarkMgr::getGroups() { - BookmarkNames results; +void BookmarkMgr::getGroups(BookmarkNames &arr) { for (BookmarkMap::iterator i = bmData.begin(); i!= bmData.end(); ++i) { - results.push_back(i->first); + arr.push_back(i->first); } - return results; } void BookmarkMgr::getGroups(wxArrayString &arr) { diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 7f66710..cebe497 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -31,8 +31,8 @@ struct BookmarkEntryCompare : public std::binary_function BookmarkList; -typedef std::set BookmarkGroup; -typedef std::map BookmarkMap; +typedef std::map BookmarkMap; +typedef std::map BookmarkMapSorted; typedef std::vector BookmarkNames; class BookmarkMgr { @@ -46,9 +46,7 @@ public: void removeBookmark(BookmarkEntry *be); BookmarkList getBookmarks(std::string group); - - BookmarkGroup getGroup(std::string group); - BookmarkNames getGroups(); + void getGroups(BookmarkNames &arr); void getGroups(wxArrayString &arr); void updateActiveList(); @@ -65,6 +63,7 @@ protected: BookmarkEntry *demodToBookmarkEntry(DemodulatorInstance *demod); BookmarkMap bmData; + BookmarkMapSorted bmDataSorted; BookmarkList recents; std::mutex busy_lock; }; diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index fdcd0fc..ad1e075 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -92,10 +92,10 @@ void BookmarkView::updateBookmarks(std::string group) { wxTreeItemId BookmarkView::refreshBookmarks() { - groupNames = wxGetApp().getBookmarkMgr().getGroups(); - if (!groupNames.size()) { - groupNames = wxGetApp().getBookmarkMgr().getGroups(); - } + + BookmarkNames groupNames; + wxGetApp().getBookmarkMgr().getGroups(groupNames); + if (doUpdateBookmarkGroup.size()) { // Nothing for the moment.. doUpdateBookmarkGroup.erase(doUpdateBookmarkGroup.begin(), doUpdateBookmarkGroup.end()); } @@ -114,7 +114,7 @@ wxTreeItemId BookmarkView::refreshBookmarks() { wxTreeItemId groupItem = groups[gn_i]; m_treeView->DeleteChildren(groupItem); - BookmarkGroup bmList = wxGetApp().getBookmarkMgr().getGroup(gn_i); + BookmarkList bmList = wxGetApp().getBookmarkMgr().getBookmarks(gn_i); for (auto bmEnt : bmList) { TreeViewItem* tvi = new TreeViewItem(); tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK; @@ -626,7 +626,7 @@ void BookmarkView::onActivateRecent( wxCommandEvent& event ) { void BookmarkView::onAddGroup( wxCommandEvent& event ) { wxString stringVal = wxGetTextFromUser("Enter Group Name", "Add Group", ""); if (stringVal.ToStdString() != "") { - wxGetApp().getBookmarkMgr().getGroup(stringVal.ToStdString()); + wxGetApp().getBookmarkMgr().getBookmarks(stringVal.ToStdString()); wxGetApp().getBookmarkMgr().updateBookmarks(); groupSel = stringVal; } From 6237317cdbceb81d57ce3adbfc3a007115d850ba Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 21 Nov 2016 20:47:16 -0500 Subject: [PATCH 25/51] Consolidate / tweak bookmark & recent bookmark / activation behavior --- src/BookmarkMgr.cpp | 11 +++++ src/BookmarkMgr.h | 1 + src/forms/Bookmark/BookmarkView.cpp | 74 ++++++++++++++++------------- src/forms/Bookmark/BookmarkView.h | 3 ++ 4 files changed, 55 insertions(+), 34 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 313a7b3..6ca35b1 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -62,6 +62,16 @@ void BookmarkMgr::removeBookmark(BookmarkEntry *be) { } + +void BookmarkMgr::addGroup(std::string group) { + std::lock_guard < std::mutex > lock(busy_lock); + + if (bmData.find(group) == bmData.end()) { + BookmarkList dummy = bmData[group]; + } +} + + BookmarkList BookmarkMgr::getBookmarks(std::string group) { std::lock_guard < std::mutex > lock(busy_lock); @@ -78,6 +88,7 @@ BookmarkList BookmarkMgr::getBookmarks(std::string group) { return bmData[group]; } + void BookmarkMgr::getGroups(BookmarkNames &arr) { for (BookmarkMap::iterator i = bmData.begin(); i!= bmData.end(); ++i) { arr.push_back(i->first); diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index cebe497..da663c2 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -45,6 +45,7 @@ public: void removeBookmark(std::string group, BookmarkEntry *be); void removeBookmark(BookmarkEntry *be); + void addGroup(std::string group); BookmarkList getBookmarks(std::string group); void getGroups(BookmarkNames &arr); void getGroups(wxArrayString &arr); diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index ad1e075..b083de9 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -10,6 +10,9 @@ #define BOOKMARK_VIEW_CHOICE_DEFAULT "Bookmark.." #define BOOKMARK_VIEW_CHOICE_NEW "(New Group..)" +#define BOOKMARK_VIEW_STR_ADD_GROUP "Add Group" +#define BOOKMARK_VIEW_STR_ADD_GROUP_DESC "Enter Group Name" + BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { rootBranch = m_treeView->AddRoot("Root"); @@ -217,7 +220,9 @@ void BookmarkView::onTreeEndLabelEdit( wxTreeEvent& event ) { void BookmarkView::onTreeActivate( wxTreeEvent& event ) { if (recentSel) { + wxGetApp().getBookmarkMgr().removeRecent(recentSel); activateBookmark(recentSel); + wxGetApp().getBookmarkMgr().updateActiveList(); } if (bookmarkSel) { activateBookmark(bookmarkSel); @@ -238,8 +243,8 @@ void BookmarkView::onTreeExpanded( wxTreeEvent& event ) { void BookmarkView::onTreeItemMenu( wxTreeEvent& event ) { if (m_treeView->GetSelection() == bookmarkBranch) { wxMenu menu; - menu.Append(wxCONTEXT_ADD_GROUP_ID, "Add Group"); - menu.Connect(wxCONTEXT_ADD_GROUP_ID, wxEVT_MENU, (wxObjectEventFunction)&BookmarkView::onMenuItem); + menu.Append(wxCONTEXT_ADD_GROUP_ID, BOOKMARK_VIEW_STR_ADD_GROUP); + menu.Connect(wxCONTEXT_ADD_GROUP_ID, wxEVT_MENU, (wxObjectEventFunction)&BookmarkView::onMenuItem, nullptr, this); PopupMenu(&menu); } } @@ -312,6 +317,24 @@ wxButton *BookmarkView::addButton(wxWindow *parent, std::string labelVal, wxObje return nButton; } + +void BookmarkView::doBookmarkActive(std::string group, DemodulatorInstance *demod) { + wxGetApp().getBookmarkMgr().addBookmark(group, demod); + wxGetApp().getBookmarkMgr().updateBookmarks(); + activeSelection(demod); +} + + +void BookmarkView::doBookmarkRecent(std::string group, BookmarkEntry *be) { + wxGetApp().getBookmarkMgr().removeRecent(be); + wxGetApp().getBookmarkMgr().addBookmark(group, be); + wxGetApp().getBookmarkMgr().updateBookmarks(); + wxGetApp().getBookmarkMgr().updateActiveList(); + bookmarkSelection(be); + +} + + void BookmarkView::updateBookmarkChoices() { if (!bookmarkChoices.empty()) { bookmarkChoices.erase(bookmarkChoices.begin(),bookmarkChoices.end()); @@ -341,7 +364,7 @@ void BookmarkView::onBookmarkChoice( wxCommandEvent &event ) { wxString stringVal = ""; if (sel == (numSel-1)) { - stringVal = wxGetTextFromUser("Enter Group Name", "Add Group", ""); + stringVal = wxGetTextFromUser(BOOKMARK_VIEW_STR_ADD_GROUP_DESC, BOOKMARK_VIEW_STR_ADD_GROUP, ""); } else { stringVal = bookmarkChoices[sel]; } @@ -353,16 +376,10 @@ void BookmarkView::onBookmarkChoice( wxCommandEvent &event ) { groupSel = stringVal; if (activeSel) { - wxGetApp().getBookmarkMgr().addBookmark(groupSel, activeSel); - wxGetApp().getBookmarkMgr().updateBookmarks(); - activeSelection(activeSel); + doBookmarkActive(groupSel, activeSel); } if (recentSel) { - wxGetApp().getBookmarkMgr().removeRecent(recentSel); - wxGetApp().getBookmarkMgr().addBookmark(groupSel, recentSel); - wxGetApp().getBookmarkMgr().updateBookmarks(); - wxGetApp().getBookmarkMgr().updateActiveList(); - bookmarkSelection(recentSel); + doBookmarkRecent(groupSel, recentSel); } } @@ -509,7 +526,7 @@ void BookmarkView::bookmarkBranchSelection() { clearButtons(); hideProps(); - addButton(m_buttonPanel, "Add Group", wxCommandEventHandler( BookmarkView::onAddGroup )); + addButton(m_buttonPanel, BOOKMARK_VIEW_STR_ADD_GROUP, wxCommandEventHandler( BookmarkView::onAddGroup )); showButtons(); refreshLayout(); @@ -618,15 +635,18 @@ void BookmarkView::onActivateBookmark( wxCommandEvent& event ) { void BookmarkView::onActivateRecent( wxCommandEvent& event ) { if (recentSel) { + wxGetApp().getBookmarkMgr().removeRecent(recentSel); activateBookmark(recentSel); + wxGetApp().getBookmarkMgr().updateActiveList(); + recentSel = nullptr; } } void BookmarkView::onAddGroup( wxCommandEvent& event ) { - wxString stringVal = wxGetTextFromUser("Enter Group Name", "Add Group", ""); + wxString stringVal = wxGetTextFromUser(BOOKMARK_VIEW_STR_ADD_GROUP_DESC, BOOKMARK_VIEW_STR_ADD_GROUP, ""); if (stringVal.ToStdString() != "") { - wxGetApp().getBookmarkMgr().getBookmarks(stringVal.ToStdString()); + wxGetApp().getBookmarkMgr().addGroup(stringVal.ToStdString()); wxGetApp().getBookmarkMgr().updateBookmarks(); groupSel = stringVal; } @@ -708,41 +728,27 @@ void BookmarkView::onTreeEndDrag( wxTreeEvent& event ) { if (!tvi) { if (event.GetItem() == bookmarkBranch) { if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { - wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", dragItem->demod); - wxGetApp().getBookmarkMgr().updateBookmarks(); + doBookmarkActive("Ungrouped", dragItem->demod); } else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { - wxGetApp().getBookmarkMgr().removeRecent(dragItem->bookmarkEnt); - wxGetApp().getBookmarkMgr().addBookmark("Ungrouped", dragItem->bookmarkEnt); - m_treeView->Delete(dragItemId); - wxGetApp().getBookmarkMgr().updateBookmarks(); - wxGetApp().getBookmarkMgr().updateActiveList(); + doBookmarkRecent("Ungrouped", dragItem->bookmarkEnt); } } - return; } if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { // Active -> Group Item - wxGetApp().getBookmarkMgr().addBookmark(tvi->groupName, dragItem->demod); - wxGetApp().getBookmarkMgr().updateBookmarks(); + doBookmarkActive(tvi->groupName, dragItem->demod); } else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { // Recent -> Group Item - wxGetApp().getBookmarkMgr().removeRecent(dragItem->bookmarkEnt); - wxGetApp().getBookmarkMgr().addBookmark(tvi->groupName, dragItem->bookmarkEnt); + doBookmarkRecent(tvi->groupName, dragItem->bookmarkEnt); m_treeView->Delete(dragItemId); - wxGetApp().getBookmarkMgr().updateBookmarks(); - wxGetApp().getBookmarkMgr().updateActiveList(); } } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { // Active -> Same Group - wxGetApp().getBookmarkMgr().addBookmark(tvi->groupName, dragItem->demod); - wxGetApp().getBookmarkMgr().updateBookmarks(); + doBookmarkActive(tvi->groupName, dragItem->demod); } else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { // Recent -> Same Group - wxGetApp().getBookmarkMgr().removeRecent(dragItem->bookmarkEnt); - wxGetApp().getBookmarkMgr().addBookmark(tvi->groupName, dragItem->bookmarkEnt); + doBookmarkRecent(tvi->groupName, dragItem->bookmarkEnt); m_treeView->Delete(dragItemId); - wxGetApp().getBookmarkMgr().updateBookmarks(); - wxGetApp().getBookmarkMgr().updateActiveList(); } } } diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 60f4614..e6ad77a 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -81,6 +81,9 @@ protected: wxButton *makeButton(wxWindow *parent, std::string labelVal, wxObjectEventFunction handler); wxButton *addButton(wxWindow *parent, std::string labelVal, wxObjectEventFunction handler); + void doBookmarkActive(std::string group, DemodulatorInstance *demod); + void doBookmarkRecent(std::string group, BookmarkEntry *be); + void updateBookmarkChoices(); void addBookmarkChoice(wxWindow *parent); void onBookmarkChoice( wxCommandEvent &event ); From 849a706871367a1b4769212c268d1cc4e68d65cd Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 25 Nov 2016 22:19:19 -0500 Subject: [PATCH 26/51] Improved tree behaviour, remember expansion states, rename groups, drag bookmarks between groups, remove groups, don't steal tree focus when collapsed --- src/BookmarkMgr.cpp | 45 ++++++++++ src/BookmarkMgr.h | 3 + src/forms/Bookmark/BookmarkView.cpp | 129 ++++++++++++++++++++++++---- src/forms/Bookmark/BookmarkView.h | 5 +- 4 files changed, 165 insertions(+), 17 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 6ca35b1..927315b 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -45,6 +45,7 @@ void BookmarkMgr::removeBookmark(std::string group, BookmarkEntry *be) { BookmarkList::iterator i = std::find(bmData[group].begin(), bmData[group].end(), be); if (i != bmData[group].end()) { + delete *i; bmData[group].erase(i); } } @@ -59,7 +60,22 @@ void BookmarkMgr::removeBookmark(BookmarkEntry *be) { bmd_i.second.erase(i); } } +} +void BookmarkMgr::moveBookmark(BookmarkEntry *be, std::string group) { + std::lock_guard < std::mutex > lockData(busy_lock); + std::lock_guard < std::mutex > lockEnt(be->busy_lock); + + for (auto &bmd_i : bmData) { + BookmarkList::iterator i = std::find(bmd_i.second.begin(), bmd_i.second.end(), be); + if (i != bmd_i.second.end()) { + bmData[group].push_back(*i); + bmd_i.second.erase(i); + bmDataSorted[group] = false; + bmDataSorted[bmd_i.first] = false; + return; + } + } } @@ -71,6 +87,35 @@ void BookmarkMgr::addGroup(std::string group) { } } +void BookmarkMgr::removeGroup(std::string group) { + std::lock_guard < std::mutex > lock(busy_lock); + + BookmarkMap::iterator i = bmData.find(group); + + if (i != bmData.end()) { + for (auto ii : bmData[group]) { + delete ii; + } + bmData.erase(group); + } +} + +void BookmarkMgr::renameGroup(std::string group, std::string ngroup) { + std::lock_guard < std::mutex > lock(busy_lock); + + BookmarkMap::iterator i = bmData.find(group); + BookmarkMap::iterator it = bmData.find(group); + + if (i != bmData.end() && it != bmData.end()) { + for (auto ii : bmData[group]) { + bmData[ngroup].push_back(ii); + } + bmData.erase(group); + } else if (i != bmData.end()) { + bmData[ngroup] = bmData[group]; + bmData.erase(group); + } +} BookmarkList BookmarkMgr::getBookmarks(std::string group) { std::lock_guard < std::mutex > lock(busy_lock); diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index da663c2..5ff9c7f 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -44,8 +44,11 @@ public: void addBookmark(std::string group, BookmarkEntry *be); void removeBookmark(std::string group, BookmarkEntry *be); void removeBookmark(BookmarkEntry *be); + void moveBookmark(BookmarkEntry *be, std::string group); void addGroup(std::string group); + void removeGroup(std::string group); + void renameGroup(std::string group, std::string ngroup); BookmarkList getBookmarks(std::string group); void getGroups(BookmarkNames &arr); void getGroups(wxArrayString &arr); diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index b083de9..164bc4c 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -20,6 +20,10 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, bookmarkBranch = m_treeView->AppendItem(rootBranch, "Bookmarks"); recentBranch = m_treeView->AppendItem(rootBranch, "Recents"); + expandState["active"] = true; + expandState["bookmark"] = true; + expandState["recent"] = true; + doUpdateActive.store(true); doUpdateBookmarks.store(true); bookmarkChoice = nullptr; @@ -104,19 +108,42 @@ wxTreeItemId BookmarkView::refreshBookmarks() { } wxTreeItemId bmSelFound = nullptr; + + std::map groupExpandState; + + for (auto g_i : groups) { + groupExpandState[g_i.first] = m_treeView->IsExpanded(g_i.second); + } + + groups.erase(groups.begin(),groups.end()); + m_treeView->DeleteChildren(bookmarkBranch); + + bool bmExpandState = expandState["bookmark"]; + + for (auto gn_i : groupNames) { + TreeViewItem* tvi = new TreeViewItem(); + tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP; + tvi->groupName = gn_i; + wxTreeItemId group_itm = m_treeView->AppendItem(bookmarkBranch, gn_i); + m_treeView->SetItemData(group_itm, tvi); + groups[gn_i] = group_itm; + } + + if (bmExpandState) { + m_treeView->Expand(bookmarkBranch); + } + for (auto gn_i : groupNames) { - if (groups.find(gn_i) == groups.end()) { - TreeViewItem* tvi = new TreeViewItem(); - tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP; - tvi->groupName = gn_i; - wxTreeItemId itm = m_treeView->AppendItem(bookmarkBranch, gn_i); - m_treeView->SetItemData(itm, tvi); - groups[gn_i] = itm; - } - wxTreeItemId groupItem = groups[gn_i]; - m_treeView->DeleteChildren(groupItem); + + bool groupExpanded = false; + if (groupExpandState.find(gn_i) != groupExpandState.end()) { + groupExpanded = groupExpandState[gn_i]; + } else { // New + groupExpanded = true; + } + BookmarkList bmList = wxGetApp().getBookmarkMgr().getBookmarks(gn_i); for (auto bmEnt : bmList) { TreeViewItem* tvi = new TreeViewItem(); @@ -125,11 +152,16 @@ wxTreeItemId BookmarkView::refreshBookmarks() { tvi->groupName = gn_i; wxTreeItemId itm = m_treeView->AppendItem(groupItem, bmEnt->label); m_treeView->SetItemData(itm, tvi); - if (bookmarkSel == bmEnt) { + if (bookmarkSel == bmEnt && groupExpanded) { bmSelFound = itm; } } + + if (groupExpanded) { + m_treeView->Expand(groupItem); + } } + return bmSelFound; } @@ -144,6 +176,8 @@ void BookmarkView::doUpdateActiveList() { // Actives m_treeView->DeleteChildren(activeBranch); + bool activeExpandState = expandState["active"]; + wxTreeItemId selItem = nullptr; for (auto demod_i : demods) { TreeViewItem* tvi = new TreeViewItem(); @@ -159,15 +193,17 @@ void BookmarkView::doUpdateActiveList() { m_treeView->SetItemData(itm, tvi); if (activeDemodulator) { - if (activeDemodulator == demod_i) { + if (activeDemodulator == demod_i && activeExpandState) { selItem = itm; activeSel = demod_i; } } - else if (activeSel == demod_i) { + else if (activeSel == demod_i && activeExpandState) { selItem = itm; } } + + bool recentExpandState = expandState["recent"]; // Recents BookmarkList bmRecents = wxGetApp().getBookmarkMgr().getRecents(); @@ -180,11 +216,17 @@ void BookmarkView::doUpdateActiveList() { wxTreeItemId itm = m_treeView->AppendItem(recentBranch, bmr_i->label); m_treeView->SetItemData(itm, tvi); - if (recentSel == bmr_i) { + if (recentSel == bmr_i && recentExpandState) { selItem = itm; } } - + + if (activeExpandState) { + m_treeView->Expand(activeBranch); + } + if (recentExpandState) { + m_treeView->Expand(recentBranch); + } if (selItem != nullptr) { m_treeView->SelectItem(selItem); } @@ -231,11 +273,28 @@ void BookmarkView::onTreeActivate( wxTreeEvent& event ) { void BookmarkView::onTreeCollapse( wxTreeEvent& event ) { + if (event.GetItem() == activeBranch) { + expandState["active"] = false; + } else if (event.GetItem() == bookmarkBranch) { + expandState["bookmark"] = false; + } else if (event.GetItem() == recentBranch) { + expandState["recent"] = false; + } + event.Skip(); } void BookmarkView::onTreeExpanded( wxTreeEvent& event ) { + + if (event.GetItem() == activeBranch) { + expandState["active"] = true; + } else if (event.GetItem() == bookmarkBranch) { + expandState["bookmark"] = true; + } else if (event.GetItem() == recentBranch) { + expandState["recent"] = true; + } + event.Skip(); } @@ -335,6 +394,13 @@ void BookmarkView::doBookmarkRecent(std::string group, BookmarkEntry *be) { } +void BookmarkView::doMoveBookmark(BookmarkEntry *be, std::string group) { + wxGetApp().getBookmarkMgr().moveBookmark(be, group); + wxGetApp().getBookmarkMgr().updateBookmarks(); + bookmarkSelection(be); +} + + void BookmarkView::updateBookmarkChoices() { if (!bookmarkChoices.empty()) { bookmarkChoices.erase(bookmarkChoices.begin(),bookmarkChoices.end()); @@ -386,7 +452,9 @@ void BookmarkView::onBookmarkChoice( wxCommandEvent &event ) { void BookmarkView::activeSelection(DemodulatorInstance *dsel) { activeSel = dsel; + bookmarkSel = nullptr; recentSel = nullptr; + groupSel = ""; m_frequencyVal->SetLabelText(frequencyToStr(dsel->getFrequency())); m_bandwidthVal->SetLabelText(frequencyToStr(dsel->getBandwidth())); @@ -435,6 +503,7 @@ void BookmarkView::bookmarkSelection(BookmarkEntry *bmSel) { bookmarkSel = bmSel; recentSel = nullptr; activeSel = nullptr; + groupSel = ""; m_frequencyVal->SetLabelText(frequencyToStr(bmSel->frequency)); m_bandwidthVal->SetLabelText(frequencyToStr(bmSel->bandwidth)); @@ -470,6 +539,7 @@ void BookmarkView::recentSelection(BookmarkEntry *bmSel) { recentSel = bmSel; activeSel = nullptr; bookmarkSel = nullptr; + groupSel = ""; m_frequencyVal->SetLabelText(frequencyToStr(bmSel->frequency)); m_bandwidthVal->SetLabelText(frequencyToStr(bmSel->bandwidth)); @@ -492,8 +562,8 @@ void BookmarkView::recentSelection(BookmarkEntry *bmSel) { clearButtons(); - addButton(m_buttonPanel, "Activate Recent", wxCommandEventHandler( BookmarkView::onActivateRecent )); addBookmarkChoice(m_buttonPanel); + addButton(m_buttonPanel, "Activate Recent", wxCommandEventHandler( BookmarkView::onActivateRecent )); showProps(); showButtons(); @@ -522,6 +592,7 @@ void BookmarkView::bookmarkBranchSelection() { recentSel = nullptr; activeSel = nullptr; bookmarkSel = nullptr; + groupSel = ""; clearButtons(); hideProps(); @@ -653,12 +724,34 @@ void BookmarkView::onAddGroup( wxCommandEvent& event ) { } void BookmarkView::onRemoveGroup( wxCommandEvent& event ) { + if (groupSel == "") { + return; + } + wxGetApp().getBookmarkMgr().removeGroup(groupSel); + + groupSel = ""; + + wxGetApp().getBookmarkMgr().updateBookmarks(); } void BookmarkView::onRenameGroup( wxCommandEvent& event ) { + if (groupSel == "") { + return; + } + + wxString stringVal = ""; + stringVal = wxGetTextFromUser("Rename Group", "New Group Name", groupSel); + + std::string newGroupName = stringVal.ToStdString(); + + wxGetApp().getBookmarkMgr().renameGroup(groupSel, newGroupName); + + groupSel = newGroupName; + + wxGetApp().getBookmarkMgr().updateBookmarks(); } @@ -742,6 +835,8 @@ void BookmarkView::onTreeEndDrag( wxTreeEvent& event ) { } else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { // Recent -> Group Item doBookmarkRecent(tvi->groupName, dragItem->bookmarkEnt); m_treeView->Delete(dragItemId); + } else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { // Bookmark -> Group Item + doMoveBookmark(dragItem->bookmarkEnt, tvi->groupName); } } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { // Active -> Same Group @@ -749,6 +844,8 @@ void BookmarkView::onTreeEndDrag( wxTreeEvent& event ) { } else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { // Recent -> Same Group doBookmarkRecent(tvi->groupName, dragItem->bookmarkEnt); m_treeView->Delete(dragItemId); + } else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { // Bookmark -> Same Group + doMoveBookmark(dragItem->bookmarkEnt, tvi->groupName); } } } diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index e6ad77a..71e287b 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -83,7 +83,8 @@ protected: void doBookmarkActive(std::string group, DemodulatorInstance *demod); void doBookmarkRecent(std::string group, BookmarkEntry *be); - + void doMoveBookmark(BookmarkEntry *be, std::string group); + void updateBookmarkChoices(); void addBookmarkChoice(wxWindow *parent); void onBookmarkChoice( wxCommandEvent &event ); @@ -103,6 +104,8 @@ protected: wxTreeItemId rootBranch, activeBranch, bookmarkBranch, recentBranch; + std::map expandState; + TreeViewItem *dragItem; wxTreeItemId dragItemId; From 6f822b96cd93fec07daa72f41595d14c8b9d5bf1 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 25 Nov 2016 23:21:32 -0500 Subject: [PATCH 27/51] User Label editing --- src/BookmarkMgr.cpp | 4 ---- src/forms/Bookmark/BookmarkPanel.cpp | 6 ++--- src/forms/Bookmark/BookmarkPanel.fbp | 10 ++++---- src/forms/Bookmark/BookmarkView.cpp | 34 +++++++++++++++++++++++++--- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 927315b..d1aaa14 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -204,10 +204,6 @@ BookmarkEntry *BookmarkMgr::demodToBookmarkEntry(DemodulatorInstance *demod) { be->bandwidth = demod->getBandwidth(); be->type = demod->getDemodulatorType(); be->label = demod->getDemodulatorUserLabel(); - if (be->label == "") { - std::string wstr = demod->getLabel(); - be->label = std::wstring(wstr.begin(),wstr.end()); - } be->frequency = demod->getFrequency(); be->node = new DataNode; diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index 6901fee..5bace65 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -28,7 +28,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_labelLabel->Wrap( -1 ); fgPropSizer->Add( m_labelLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); - m_labelText = new wxTextCtrl( m_propPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_labelText = new wxTextCtrl( m_propPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); fgPropSizer->Add( m_labelText, 0, wxALL|wxEXPAND, 5 ); m_frequencyLabel = new wxStaticText( m_propPanel, wxID_ANY, wxT("Freq"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -91,7 +91,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_MENU, wxTreeEventHandler( BookmarkPanel::onTreeItemMenu ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( BookmarkPanel::onTreeSelect ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_SEL_CHANGING, wxTreeEventHandler( BookmarkPanel::onTreeSelectChanging ), NULL, this ); - m_labelText->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); + m_labelText->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); m_frequencyVal->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( BookmarkPanel::onDoubleClickFreq ), NULL, this ); m_bandwidthVal->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( BookmarkPanel::onDoubleClickBandwidth ), NULL, this ); this->Connect( wxID_ANY, wxEVT_TIMER, wxTimerEventHandler( BookmarkPanel::onUpdateTimer ) ); @@ -114,7 +114,7 @@ BookmarkPanel::~BookmarkPanel() m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_MENU, wxTreeEventHandler( BookmarkPanel::onTreeItemMenu ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( BookmarkPanel::onTreeSelect ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGING, wxTreeEventHandler( BookmarkPanel::onTreeSelectChanging ), NULL, this ); - m_labelText->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); + m_labelText->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); m_frequencyVal->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( BookmarkPanel::onDoubleClickFreq ), NULL, this ); m_bandwidthVal->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( BookmarkPanel::onDoubleClickBandwidth ), NULL, this ); this->Disconnect( wxID_ANY, wxEVT_TIMER, wxTimerEventHandler( BookmarkPanel::onUpdateTimer ) ); diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index 93305d0..f3e9a21 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -189,7 +189,7 @@ 5 wxALL|wxBOTTOM|wxEXPAND|wxTOP 0 - + 1 1 1 @@ -263,7 +263,7 @@ - + 2 wxBOTH 1 @@ -408,7 +408,7 @@ Resizable 1 - + wxTE_PROCESS_ENTER 0 @@ -442,8 +442,8 @@ - onLabelText - + + onLabelText diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 164bc4c..8ae81a9 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -150,6 +150,13 @@ wxTreeItemId BookmarkView::refreshBookmarks() { tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK; tvi->bookmarkEnt = bmEnt; tvi->groupName = gn_i; + + std::wstring labelVal; + if (bmEnt->label == "") { + std::string wstr = frequencyToStr(tvi->bookmarkEnt->frequency) + " " + tvi->bookmarkEnt->type; + bmEnt->label = std::wstring(wstr.begin(),wstr.end()); + } + wxTreeItemId itm = m_treeView->AppendItem(groupItem, bmEnt->label); m_treeView->SetItemData(itm, tvi); if (bookmarkSel == bmEnt && groupExpanded) { @@ -186,7 +193,8 @@ void BookmarkView::doUpdateActiveList() { wxString activeLabel = demod_i->getDemodulatorUserLabel(); if (activeLabel == "") { - activeLabel = demod_i->getLabel(); + std::string wstr = frequencyToStr(demod_i->getFrequency()) + " " + demod_i->getDemodulatorType(); + activeLabel = std::wstring(wstr.begin(),wstr.end()); } wxTreeItemId itm = m_treeView->AppendItem(activeBranch,activeLabel); @@ -214,7 +222,14 @@ void BookmarkView::doUpdateActiveList() { tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT; tvi->bookmarkEnt = bmr_i; - wxTreeItemId itm = m_treeView->AppendItem(recentBranch, bmr_i->label); + std::wstring labelVal; + bmr_i->node->child("user_label")->element()->get(labelVal); + if (labelVal == "") { + std::string wstr = frequencyToStr(bmr_i->frequency) + " " + bmr_i->type; + labelVal = std::wstring(wstr.begin(),wstr.end()); + } + + wxTreeItemId itm = m_treeView->AppendItem(recentBranch, labelVal); m_treeView->SetItemData(itm, tvi); if (recentSel == bmr_i && recentExpandState) { selItem = itm; @@ -658,7 +673,20 @@ void BookmarkView::onTreeSelectChanging( wxTreeEvent& event ) { void BookmarkView::onLabelText( wxCommandEvent& event ) { - event.Skip(); + std::wstring newLabel = m_labelText->GetValue().ToStdWstring(); + + if (activeSel) { + activeSel->setDemodulatorUserLabel(newLabel); + wxGetApp().getBookmarkMgr().updateActiveList(); + } else if (bookmarkSel) { + bookmarkSel->label = m_labelText->GetValue().ToStdWstring(); + bookmarkSel->node->child("user_label")->element()->set(newLabel); + wxGetApp().getBookmarkMgr().updateBookmarks(); + } else if (recentSel) { + recentSel->label = m_labelText->GetValue().ToStdWstring(); + recentSel->node->child("user_label")->element()->set(newLabel); + wxGetApp().getBookmarkMgr().updateActiveList(); + } } From 1d1c1e3114826ef25503a78e0f935bbc98006c65 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 25 Nov 2016 23:56:27 -0500 Subject: [PATCH 28/51] Edit groups/labels directly in tree --- src/forms/Bookmark/BookmarkView.cpp | 40 +++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 8ae81a9..33a8328 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -256,13 +256,11 @@ void BookmarkView::onTreeBeginLabelEdit( wxTreeEvent& event ) { return; } - if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { - event.Allow(); - } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { - event.Veto(); - } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { - event.Allow(); - } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { + if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE || + tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT || + tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK || + tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) + { event.Allow(); } else { event.Veto(); @@ -271,7 +269,33 @@ void BookmarkView::onTreeBeginLabelEdit( wxTreeEvent& event ) { void BookmarkView::onTreeEndLabelEdit( wxTreeEvent& event ) { - event.Skip(); + wxTreeItemId itm = event.GetItem(); + TreeViewItem* tvi = dynamic_cast(m_treeView->GetItemData(itm)); + + std::wstring newText = m_treeView->GetEditControl()->GetValue().ToStdWstring(); + + if (!tvi) { + return; + } + + if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { + tvi->demod->setDemodulatorUserLabel(newText); + wxGetApp().getBookmarkMgr().updateActiveList(); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { + recentSel->label = newText; + recentSel->node->child("user_label")->element()->set(newText); + wxGetApp().getBookmarkMgr().updateActiveList(); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { + tvi->bookmarkEnt->label = newText; + tvi->bookmarkEnt->node->child("user_label")->element()->set(newText); + wxGetApp().getBookmarkMgr().updateBookmarks(); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { + std::string newGroup = m_treeView->GetEditControl()->GetValue().ToStdString(); + wxGetApp().getBookmarkMgr().renameGroup(tvi->groupName, newGroup); + groupSel = newGroup; + wxGetApp().getBookmarkMgr().renameGroup(tvi->groupName, groupSel); + wxGetApp().getBookmarkMgr().updateBookmarks(); + } } From 4e2fced000f02297064dcdf0172663ac861c77f4 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sat, 26 Nov 2016 00:39:41 -0500 Subject: [PATCH 29/51] Handle out-of-band bookmarks and actives --- src/forms/Bookmark/BookmarkView.cpp | 39 +++++++++++++++++++++++++++-- src/forms/Bookmark/BookmarkView.h | 2 ++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 33a8328..6aa6d2c 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -31,6 +31,7 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, recentSel = nullptr; dragItem = nullptr; dragItemId = nullptr; + editingLabel = false; hideProps(); @@ -262,6 +263,7 @@ void BookmarkView::onTreeBeginLabelEdit( wxTreeEvent& event ) { tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { event.Allow(); + editingLabel = true; } else { event.Veto(); } @@ -274,6 +276,8 @@ void BookmarkView::onTreeEndLabelEdit( wxTreeEvent& event ) { std::wstring newText = m_treeView->GetEditControl()->GetValue().ToStdWstring(); + editingLabel = false; + if (!tvi) { return; } @@ -300,6 +304,17 @@ void BookmarkView::onTreeEndLabelEdit( wxTreeEvent& event ) { void BookmarkView::onTreeActivate( wxTreeEvent& event ) { + wxTreeItemId itm = event.GetItem(); + TreeViewItem* tvi = dynamic_cast(m_treeView->GetItemData(itm)); + + if (tvi) { + if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { + if (!tvi->demod->isActive()) { + wxGetApp().setFrequency(tvi->demod->getFrequency()); + wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod,false); + } + } + } if (recentSel) { wxGetApp().getBookmarkMgr().removeRecent(recentSel); activateBookmark(recentSel); @@ -527,6 +542,15 @@ void BookmarkView::activeSelection(DemodulatorInstance *dsel) { void BookmarkView::activateBookmark(BookmarkEntry *bmEnt) { DemodulatorInstance *newDemod = wxGetApp().getDemodMgr().loadInstance(bmEnt->node); + + long long freq = newDemod->getFrequency(); + long long currentFreq = wxGetApp().getFrequency(); + long long currentRate = wxGetApp().getSampleRate(); + + if ( ( abs(freq - currentFreq) > currentRate / 2 ) || ( abs( currentFreq - freq) > currentRate / 2 ) ) { + wxGetApp().setFrequency(freq); + } + newDemod->run(); newDemod->setActive(true); wxGetApp().bindDemodulator(newDemod); @@ -676,8 +700,10 @@ void BookmarkView::onTreeSelect( wxTreeEvent& event ) { } if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { - activeSelection(tvi->demod); - wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod, false); + if (tvi->demod->isActive()) { + activeSelection(tvi->demod); + wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod, false); + } } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { recentSelection(tvi->bookmarkEnt); } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { @@ -732,6 +758,9 @@ void BookmarkView::onDoubleClickBandwidth( wxMouseEvent& event ) { void BookmarkView::onRemoveActive( wxCommandEvent& event ) { if (activeSel != nullptr) { + if (editingLabel) { + return; + } wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, false); wxGetApp().removeDemodulator(activeSel); wxGetApp().getDemodMgr().deleteThread(activeSel); @@ -741,6 +770,9 @@ void BookmarkView::onRemoveActive( wxCommandEvent& event ) { void BookmarkView::onRemoveBookmark( wxCommandEvent& event ) { + if (editingLabel) { + return; + } if (bookmarkSel) { wxGetApp().getBookmarkMgr().removeBookmark(bookmarkSel); bookmarkSel = nullptr; @@ -776,6 +808,9 @@ void BookmarkView::onAddGroup( wxCommandEvent& event ) { } void BookmarkView::onRemoveGroup( wxCommandEvent& event ) { + if (editingLabel) { + return; + } if (groupSel == "") { return; } diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 71e287b..714d725 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -109,6 +109,8 @@ protected: TreeViewItem *dragItem; wxTreeItemId dragItemId; + bool editingLabel; + // Bookmarks std::atomic_bool doUpdateBookmarks; std::set< std::string > doUpdateBookmarkGroup; From d48887d13282c78084bff9f18c7446a429a68559 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 12 Dec 2016 20:17:47 -0500 Subject: [PATCH 30/51] Bookmarking bugs, quirks and improvements --- src/BookmarkMgr.cpp | 5 +++- src/BookmarkMgr.h | 1 + src/forms/Bookmark/BookmarkView.cpp | 44 +++++++++++++++++++++++------ 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index d1aaa14..b2cdf1b 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -69,6 +69,9 @@ void BookmarkMgr::moveBookmark(BookmarkEntry *be, std::string group) { for (auto &bmd_i : bmData) { BookmarkList::iterator i = std::find(bmd_i.second.begin(), bmd_i.second.end(), be); if (i != bmd_i.second.end()) { + if (bmd_i.first == group) { + return; + } bmData[group].push_back(*i); bmd_i.second.erase(i); bmDataSorted[group] = false; @@ -104,7 +107,7 @@ void BookmarkMgr::renameGroup(std::string group, std::string ngroup) { std::lock_guard < std::mutex > lock(busy_lock); BookmarkMap::iterator i = bmData.find(group); - BookmarkMap::iterator it = bmData.find(group); + BookmarkMap::iterator it = bmData.find(ngroup); if (i != bmData.end() && it != bmData.end()) { for (auto ii : bmData[group]) { diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 5ff9c7f..14e9083 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -14,6 +14,7 @@ public: std::string type; std::wstring label; + std::wstring userLabel; long long frequency; int bandwidth; diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 6aa6d2c..bf1d920 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -8,10 +8,12 @@ #define wxCONTEXT_ADD_GROUP_ID 1000 #define BOOKMARK_VIEW_CHOICE_DEFAULT "Bookmark.." +#define BOOKMARK_VIEW_CHOICE_MOVE "Move to.." #define BOOKMARK_VIEW_CHOICE_NEW "(New Group..)" #define BOOKMARK_VIEW_STR_ADD_GROUP "Add Group" #define BOOKMARK_VIEW_STR_ADD_GROUP_DESC "Enter Group Name" +#define BOOKMARK_VIEW_STR_UNNAMED "Unnamed" BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { @@ -128,6 +130,9 @@ wxTreeItemId BookmarkView::refreshBookmarks() { wxTreeItemId group_itm = m_treeView->AppendItem(bookmarkBranch, gn_i); m_treeView->SetItemData(group_itm, tvi); groups[gn_i] = group_itm; + if (gn_i == groupSel) { + bmSelFound = group_itm; + } } if (bmExpandState) { @@ -152,13 +157,14 @@ wxTreeItemId BookmarkView::refreshBookmarks() { tvi->bookmarkEnt = bmEnt; tvi->groupName = gn_i; - std::wstring labelVal; - if (bmEnt->label == "") { - std::string wstr = frequencyToStr(tvi->bookmarkEnt->frequency) + " " + tvi->bookmarkEnt->type; - bmEnt->label = std::wstring(wstr.begin(),wstr.end()); + std::wstring labelVal = bmEnt->label; + + if (labelVal == "") { + std::string freqStr = frequencyToStr(bmEnt->frequency) + " " + bmEnt->type; + labelVal = wstring(freqStr.begin(),freqStr.end()); } - wxTreeItemId itm = m_treeView->AppendItem(groupItem, bmEnt->label); + wxTreeItemId itm = m_treeView->AppendItem(groupItem, labelVal); m_treeView->SetItemData(itm, tvi); if (bookmarkSel == bmEnt && groupExpanded) { bmSelFound = itm; @@ -459,7 +465,7 @@ void BookmarkView::updateBookmarkChoices() { if (!bookmarkChoices.empty()) { bookmarkChoices.erase(bookmarkChoices.begin(),bookmarkChoices.end()); } - bookmarkChoices.push_back(BOOKMARK_VIEW_CHOICE_DEFAULT); + bookmarkChoices.push_back((bookmarkSel!=nullptr)?BOOKMARK_VIEW_CHOICE_MOVE:BOOKMARK_VIEW_CHOICE_DEFAULT); wxGetApp().getBookmarkMgr().getGroups(bookmarkChoices); bookmarkChoices.push_back(BOOKMARK_VIEW_CHOICE_NEW); } @@ -501,6 +507,9 @@ void BookmarkView::onBookmarkChoice( wxCommandEvent &event ) { if (recentSel) { doBookmarkRecent(groupSel, recentSel); } + if (bookmarkSel) { + doMoveBookmark(bookmarkSel, groupSel); + } } @@ -589,9 +598,10 @@ void BookmarkView::bookmarkSelection(BookmarkEntry *bmSel) { clearButtons(); + addBookmarkChoice(m_buttonPanel); addButton(m_buttonPanel, "Activate Bookmark", wxCommandEventHandler( BookmarkView::onActivateBookmark )); addButton(m_buttonPanel, "Remove Bookmark", wxCommandEventHandler( BookmarkView::onRemoveBookmark )); - + showProps(); showButtons(); refreshLayout(); @@ -643,9 +653,16 @@ void BookmarkView::groupSelection(std::string groupName) { hideProps(); +// m_labelText->SetValue(groupSel); + +// m_labelText->Show(); +// m_labelLabel->Show(); + addButton(m_buttonPanel, "Remove Group", wxCommandEventHandler( BookmarkView::onRemoveGroup )); addButton(m_buttonPanel, "Rename Group", wxCommandEventHandler( BookmarkView::onRenameGroup )); +// showProps(); + showButtons(); refreshLayout(); } @@ -737,6 +754,12 @@ void BookmarkView::onLabelText( wxCommandEvent& event ) { recentSel->node->child("user_label")->element()->set(newLabel); wxGetApp().getBookmarkMgr().updateActiveList(); } +// else if (groupSel != "") { +// std::string newGroupName = m_labelText->GetValue().ToStdString(); +// wxGetApp().getBookmarkMgr().renameGroup(groupSel, newGroupName); +// groupSel = newGroupName; +// wxGetApp().getBookmarkMgr().updateBookmarks(); +// } } @@ -807,6 +830,7 @@ void BookmarkView::onAddGroup( wxCommandEvent& event ) { } } + void BookmarkView::onRemoveGroup( wxCommandEvent& event ) { if (editingLabel) { return; @@ -908,9 +932,11 @@ void BookmarkView::onTreeEndDrag( wxTreeEvent& event ) { if (!tvi) { if (event.GetItem() == bookmarkBranch) { if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { - doBookmarkActive("Ungrouped", dragItem->demod); + doBookmarkActive(BOOKMARK_VIEW_STR_UNNAMED, dragItem->demod); } else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { - doBookmarkRecent("Ungrouped", dragItem->bookmarkEnt); + doBookmarkRecent(BOOKMARK_VIEW_STR_UNNAMED, dragItem->bookmarkEnt); + } else if (dragItem && dragItem->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { + doMoveBookmark(dragItem->bookmarkEnt, BOOKMARK_VIEW_STR_UNNAMED); } } return; From 746b7cfcaef4fbd26b850eb1fd418266503786ea Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 12 Dec 2016 23:47:05 -0500 Subject: [PATCH 31/51] Bookmarks now save on exit; not loaded on startup yet. --- src/AppFrame.cpp | 1 + src/BookmarkMgr.cpp | 33 +++++++++++++++++++++++- src/forms/Bookmark/BookmarkView.cpp | 2 +- src/util/DataTree.cpp | 39 +++++++++++++++++++++++++++++ src/util/DataTree.h | 4 +++ 5 files changed, 77 insertions(+), 2 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 5bbac12..0ddb5ea 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -1300,6 +1300,7 @@ void AppFrame::OnClose(wxCloseEvent& event) { wxGetApp().getConfig()->setRigFollowModem(rigFollowModemMenuItem->IsChecked()); #endif wxGetApp().getConfig()->save(); + wxGetApp().getBookmarkMgr().saveToFile("bookmarks.xml"); event.Skip(); } diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index b2cdf1b..0abf79f 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -2,10 +2,41 @@ #include "CubicSDR.h" #include "DataTree.h" +#define BOOKMARK_RECENTS_MAX 25 + void BookmarkMgr::saveToFile(std::string bookmarkFn) { + DataTree s("cubicsdr_bookmarks"); + DataNode *header = s.rootNode()->newChild("header"); + header->newChild("version")->element()->set(wxString(CUBICSDR_VERSION).ToStdWstring()); + DataNode *modems = s.rootNode()->newChild("modems"); + std::lock_guard < std::mutex > lockData(busy_lock); + + for (auto &bmd_i : bmData) { + DataNode *group = modems->newChild("group"); + *group->newChild("@name") = bmd_i.first; + + for (auto &bm_i : bmd_i.second ) { + std::lock_guard < std::mutex > lockEnt(bm_i->busy_lock); + group->newChildCloneFrom("modem", bm_i->node); + } + } + + DataNode *recent = s.rootNode()->newChild("recent"); + DataNode *recent_modems = recent->newChild("recent_modems"); + + for (auto demod : wxGetApp().getDemodMgr().getDemodulators()) { + wxGetApp().getDemodMgr().saveInstance(recent_modems->newChild("modem"),demod); + } + + for (auto &r_i : this->recents) { + std::lock_guard < std::mutex > lockEnt(r_i->busy_lock); + recent_modems->newChildCloneFrom("modem", r_i->node); + } + + s.SaveToFileXML(wxFileName(wxGetApp().getConfig()->getConfigDir(), bookmarkFn).GetFullPath(wxPATH_NATIVE).ToStdString()); } @@ -178,7 +209,7 @@ 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() > 10) { + if (recents.size() > BOOKMARK_RECENTS_MAX) { delete *(recents.begin()); recents.erase(recents.begin(), recents.begin()+1); } diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index bf1d920..45c1fef 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -507,7 +507,7 @@ void BookmarkView::onBookmarkChoice( wxCommandEvent &event ) { if (recentSel) { doBookmarkRecent(groupSel, recentSel); } - if (bookmarkSel) { + if (bookmarkSel && groupSel != "") { doMoveBookmark(bookmarkSel, groupSel); } } diff --git a/src/util/DataTree.cpp b/src/util/DataTree.cpp index ee3d469..095f46a 100755 --- a/src/util/DataTree.cpp +++ b/src/util/DataTree.cpp @@ -41,6 +41,14 @@ using namespace std; DataElement::DataElement() : data_type(DATA_NULL), data_size(0), unit_size(0), data_val(NULL) { } +DataElement::DataElement(DataElement &cloneFrom) : data_type(cloneFrom.getDataType()), unit_size(cloneFrom.getUnitSize()) { + data_val = NULL; + data_init(cloneFrom.getDataSize()); + if (data_size) { + memcpy(data_val, cloneFrom.getDataPointer(), data_size); + } +} + DataElement::~DataElement() { if (data_val) { delete[] data_val; @@ -482,6 +490,12 @@ DataNode::DataNode(const char *name_in): parentNode(NULL), ptr(0) { data_elem = new DataElement(); } + +DataNode::DataNode(const char *name_in, DataElement &cloneFrom): parentNode(NULL), ptr(0) { + node_name = name_in; + data_elem = new DataElement(cloneFrom); +} + DataNode::~DataNode() { while (children.size()) { DataNode *del = children.back(); @@ -510,6 +524,31 @@ DataNode *DataNode::newChild(const char *name_in) { return children.back(); } +DataNode *DataNode::newChild(const char *name_in, DataNode *otherNode) { + children.push_back(otherNode); + childmap[name_in].push_back(children.back()); + + children.back()->setParentNode(*this); + + return children.back(); +} + +DataNode *DataNode::newChildCloneFrom(const char *name_in, DataNode *cloneFrom) { + DataNode *cloneNode = new DataNode(name_in, *cloneFrom->element()); + + children.push_back(cloneNode); + childmap[name_in].push_back(children.back()); + children.back()->setParentNode(*this); + + while (cloneFrom->hasAnother()) { + DataNode *cNode = cloneFrom->getNext(); + cloneNode->newChildCloneFrom(cNode->getName().c_str(), cNode); + } + + return children.back(); +} + + DataNode *DataNode::child(const char *name_in, int index) { DataNode *child_ret; diff --git a/src/util/DataTree.h b/src/util/DataTree.h index dad6947..4cea1c8 100755 --- a/src/util/DataTree.h +++ b/src/util/DataTree.h @@ -128,6 +128,7 @@ private: public: DataElement(); + DataElement(DataElement &cloneFrom); ~DataElement(); int getDataType(); @@ -235,6 +236,7 @@ private: public: DataNode(); DataNode(const char *name_in); + DataNode(const char *name_in, DataElement &cloneFrom); ~DataNode(); @@ -250,6 +252,8 @@ public: DataElement *element(); /* DataElement at this node */ DataNode *newChild(const char *name_in); + DataNode *newChild(const char *name_in, DataNode *otherNode); + DataNode *newChildCloneFrom(const char *name_in, DataNode *cloneFrom); DataNode *child(const char *name_in, int index = 0); DataNode *child(int index); From 2cc05baaa1b9e4389cc92c81a1c10da7b22c53a3 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 13 Dec 2016 21:09:44 -0500 Subject: [PATCH 32/51] Bookmarks/Recents now loading & saving --- src/BookmarkMgr.cpp | 106 ++++++++++++++++++++++++++++++++++++++---- src/BookmarkMgr.h | 8 +++- src/CubicSDR.cpp | 1 + src/util/DataTree.cpp | 18 ++++++- src/util/DataTree.h | 5 +- 5 files changed, 123 insertions(+), 15 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 0abf79f..ea8c78a 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -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; +} + diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 14e9083..58cdecc 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -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; diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 6e4d3b3..e8a7bf3 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -405,6 +405,7 @@ bool CubicSDR::OnCmdLineParsed(wxCmdLineParser& parser) { } config.load(); + wxGetApp().getBookmarkMgr().loadFromFile("bookmarks.xml"); #ifdef BUNDLE_SOAPY_MODS if (parser.Found("b")) { diff --git a/src/util/DataTree.cpp b/src/util/DataTree.cpp index 095f46a..293a8b8 100755 --- a/src/util/DataTree.cpp +++ b/src/util/DataTree.cpp @@ -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); diff --git a/src/util/DataTree.h b/src/util/DataTree.h index 4cea1c8..5aee690 100755 --- a/src/util/DataTree.h +++ b/src/util/DataTree.h @@ -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; } From 5924ebc057e8b69f76743a37f95b7a0bd9216e4c Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 15 Dec 2016 21:53:51 -0500 Subject: [PATCH 33/51] Clean-up some error-prone prototype cruft --- src/BookmarkMgr.cpp | 4 + src/forms/Bookmark/BookmarkView.cpp | 206 ++++++++++++++-------------- src/forms/Bookmark/BookmarkView.h | 8 +- 3 files changed, 112 insertions(+), 106 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index ea8c78a..42d722a 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -186,6 +186,10 @@ void BookmarkMgr::removeGroup(std::string group) { } void BookmarkMgr::renameGroup(std::string group, std::string ngroup) { + if (group == ngroup) { + return; + } + std::lock_guard < std::mutex > lock(busy_lock); BookmarkMap::iterator i = bmData.find(group); diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 45c1fef..e1a3a52 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -29,8 +29,6 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, doUpdateActive.store(true); doUpdateBookmarks.store(true); bookmarkChoice = nullptr; - activeSel = nullptr; - recentSel = nullptr; dragItem = nullptr; dragItemId = nullptr; editingLabel = false; @@ -100,9 +98,10 @@ void BookmarkView::updateBookmarks(std::string group) { doUpdateBookmarks.store(true); } - wxTreeItemId BookmarkView::refreshBookmarks() { + TreeViewItem *prevSel = itemToTVI(m_treeView->GetSelection()); + BookmarkNames groupNames; wxGetApp().getBookmarkMgr().getGroups(groupNames); @@ -130,7 +129,7 @@ wxTreeItemId BookmarkView::refreshBookmarks() { wxTreeItemId group_itm = m_treeView->AppendItem(bookmarkBranch, gn_i); m_treeView->SetItemData(group_itm, tvi); groups[gn_i] = group_itm; - if (gn_i == groupSel) { + if (prevSel != nullptr && prevSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP && gn_i == prevSel->groupName) { bmSelFound = group_itm; } } @@ -166,7 +165,7 @@ wxTreeItemId BookmarkView::refreshBookmarks() { wxTreeItemId itm = m_treeView->AppendItem(groupItem, labelVal); m_treeView->SetItemData(itm, tvi); - if (bookmarkSel == bmEnt && groupExpanded) { + if (prevSel != nullptr && prevSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK && prevSel->bookmarkEnt == bmEnt && groupExpanded) { bmSelFound = itm; } } @@ -187,6 +186,8 @@ void BookmarkView::doUpdateActiveList() { DemodulatorInstance *activeDemodulator = wxGetApp().getDemodMgr().getActiveDemodulator(); // DemodulatorInstance *lastActiveDemodulator = wxGetApp().getDemodMgr().getLastActiveDemodulator(); + TreeViewItem *prevSel = itemToTVI(m_treeView->GetSelection()); + // Actives m_treeView->DeleteChildren(activeBranch); @@ -210,10 +211,9 @@ void BookmarkView::doUpdateActiveList() { if (activeDemodulator) { if (activeDemodulator == demod_i && activeExpandState) { selItem = itm; - activeSel = demod_i; } } - else if (activeSel == demod_i && activeExpandState) { + else if (prevSel != nullptr && prevSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE && prevSel->demod == demod_i && activeExpandState) { selItem = itm; } } @@ -238,7 +238,7 @@ void BookmarkView::doUpdateActiveList() { wxTreeItemId itm = m_treeView->AppendItem(recentBranch, labelVal); m_treeView->SetItemData(itm, tvi); - if (recentSel == bmr_i && recentExpandState) { + if (prevSel && prevSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT && prevSel->bookmarkEnt == bmr_i && recentExpandState) { selItem = itm; } } @@ -292,8 +292,8 @@ void BookmarkView::onTreeEndLabelEdit( wxTreeEvent& event ) { tvi->demod->setDemodulatorUserLabel(newText); wxGetApp().getBookmarkMgr().updateActiveList(); } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { - recentSel->label = newText; - recentSel->node->child("user_label")->element()->set(newText); + tvi->bookmarkEnt->label = newText; + tvi->bookmarkEnt->node->child("user_label")->element()->set(newText); wxGetApp().getBookmarkMgr().updateActiveList(); } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { tvi->bookmarkEnt->label = newText; @@ -302,8 +302,6 @@ void BookmarkView::onTreeEndLabelEdit( wxTreeEvent& event ) { } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { std::string newGroup = m_treeView->GetEditControl()->GetValue().ToStdString(); wxGetApp().getBookmarkMgr().renameGroup(tvi->groupName, newGroup); - groupSel = newGroup; - wxGetApp().getBookmarkMgr().renameGroup(tvi->groupName, groupSel); wxGetApp().getBookmarkMgr().updateBookmarks(); } } @@ -319,16 +317,14 @@ void BookmarkView::onTreeActivate( wxTreeEvent& event ) { wxGetApp().setFrequency(tvi->demod->getFrequency()); wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod,false); } + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { + wxGetApp().getBookmarkMgr().removeRecent(tvi->bookmarkEnt); + activateBookmark(tvi->bookmarkEnt); + wxGetApp().getBookmarkMgr().updateActiveList(); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { + activateBookmark(tvi->bookmarkEnt); } } - if (recentSel) { - wxGetApp().getBookmarkMgr().removeRecent(recentSel); - activateBookmark(recentSel); - wxGetApp().getBookmarkMgr().updateActiveList(); - } - if (bookmarkSel) { - activateBookmark(bookmarkSel); - } } @@ -465,7 +461,9 @@ void BookmarkView::updateBookmarkChoices() { if (!bookmarkChoices.empty()) { bookmarkChoices.erase(bookmarkChoices.begin(),bookmarkChoices.end()); } - bookmarkChoices.push_back((bookmarkSel!=nullptr)?BOOKMARK_VIEW_CHOICE_MOVE:BOOKMARK_VIEW_CHOICE_DEFAULT); + TreeViewItem *activeSel = itemToTVI(m_treeView->GetSelection()); + + bookmarkChoices.push_back(((activeSel != nullptr && activeSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK))?BOOKMARK_VIEW_CHOICE_MOVE:BOOKMARK_VIEW_CHOICE_DEFAULT); wxGetApp().getBookmarkMgr().getGroups(bookmarkChoices); bookmarkChoices.push_back(BOOKMARK_VIEW_CHOICE_NEW); } @@ -479,6 +477,8 @@ void BookmarkView::addBookmarkChoice(wxWindow *parent) { void BookmarkView::onBookmarkChoice( wxCommandEvent &event ) { + + TreeViewItem *tvi = itemToTVI(m_treeView->GetSelection()); int numSel = bookmarkChoice->GetCount(); int sel = bookmarkChoice->GetSelection(); @@ -499,25 +499,21 @@ void BookmarkView::onBookmarkChoice( wxCommandEvent &event ) { return; } - groupSel = stringVal; - - if (activeSel) { - doBookmarkActive(groupSel, activeSel); - } - if (recentSel) { - doBookmarkRecent(groupSel, recentSel); - } - if (bookmarkSel && groupSel != "") { - doMoveBookmark(bookmarkSel, groupSel); + if (tvi != nullptr) { + if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { + doBookmarkActive(stringVal.ToStdString(), tvi->demod); + } + if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { + doBookmarkRecent(stringVal.ToStdString(), tvi->bookmarkEnt); + } + if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { + doMoveBookmark(tvi->bookmarkEnt, stringVal.ToStdString()); + } } } void BookmarkView::activeSelection(DemodulatorInstance *dsel) { - activeSel = dsel; - bookmarkSel = nullptr; - recentSel = nullptr; - groupSel = ""; m_frequencyVal->SetLabelText(frequencyToStr(dsel->getFrequency())); m_bandwidthVal->SetLabelText(frequencyToStr(dsel->getBandwidth())); @@ -552,6 +548,8 @@ void BookmarkView::activeSelection(DemodulatorInstance *dsel) { void BookmarkView::activateBookmark(BookmarkEntry *bmEnt) { DemodulatorInstance *newDemod = wxGetApp().getDemodMgr().loadInstance(bmEnt->node); + TreeViewItem *sel = itemToTVI(m_treeView->GetSelection()); + long long freq = newDemod->getFrequency(); long long currentFreq = wxGetApp().getFrequency(); long long currentRate = wxGetApp().getSampleRate(); @@ -563,19 +561,11 @@ void BookmarkView::activateBookmark(BookmarkEntry *bmEnt) { newDemod->run(); newDemod->setActive(true); wxGetApp().bindDemodulator(newDemod); - if (bmEnt == recentSel) { - activeSel = newDemod; - recentSel = nullptr; - } doUpdateActiveList(); } void BookmarkView::bookmarkSelection(BookmarkEntry *bmSel) { - bookmarkSel = bmSel; - recentSel = nullptr; - activeSel = nullptr; - groupSel = ""; m_frequencyVal->SetLabelText(frequencyToStr(bmSel->frequency)); m_bandwidthVal->SetLabelText(frequencyToStr(bmSel->bandwidth)); @@ -609,10 +599,6 @@ void BookmarkView::bookmarkSelection(BookmarkEntry *bmSel) { void BookmarkView::recentSelection(BookmarkEntry *bmSel) { - recentSel = bmSel; - activeSel = nullptr; - bookmarkSel = nullptr; - groupSel = ""; m_frequencyVal->SetLabelText(frequencyToStr(bmSel->frequency)); m_bandwidthVal->SetLabelText(frequencyToStr(bmSel->bandwidth)); @@ -644,10 +630,6 @@ void BookmarkView::recentSelection(BookmarkEntry *bmSel) { } void BookmarkView::groupSelection(std::string groupName) { - recentSel = nullptr; - activeSel = nullptr; - bookmarkSel = nullptr; - groupSel = groupName; clearButtons(); @@ -669,10 +651,6 @@ void BookmarkView::groupSelection(std::string groupName) { void BookmarkView::bookmarkBranchSelection() { - recentSel = nullptr; - activeSel = nullptr; - bookmarkSel = nullptr; - groupSel = ""; clearButtons(); hideProps(); @@ -741,20 +719,24 @@ void BookmarkView::onTreeSelectChanging( wxTreeEvent& event ) { void BookmarkView::onLabelText( wxCommandEvent& event ) { std::wstring newLabel = m_labelText->GetValue().ToStdWstring(); + TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); - if (activeSel) { - activeSel->setDemodulatorUserLabel(newLabel); - wxGetApp().getBookmarkMgr().updateActiveList(); - } else if (bookmarkSel) { - bookmarkSel->label = m_labelText->GetValue().ToStdWstring(); - bookmarkSel->node->child("user_label")->element()->set(newLabel); - wxGetApp().getBookmarkMgr().updateBookmarks(); - } else if (recentSel) { - recentSel->label = m_labelText->GetValue().ToStdWstring(); - recentSel->node->child("user_label")->element()->set(newLabel); - wxGetApp().getBookmarkMgr().updateActiveList(); + if (curSel != nullptr) { + if (curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { + curSel->demod->setDemodulatorUserLabel(newLabel); + wxGetApp().getBookmarkMgr().updateActiveList(); + } else if (curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { + curSel->bookmarkEnt->label = m_labelText->GetValue().ToStdWstring(); + curSel->bookmarkEnt->node->child("user_label")->element()->set(newLabel); + wxGetApp().getBookmarkMgr().updateBookmarks(); + } else if (curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { + curSel->bookmarkEnt->label = m_labelText->GetValue().ToStdWstring(); + curSel->bookmarkEnt->node->child("user_label")->element()->set(newLabel); + wxGetApp().getBookmarkMgr().updateActiveList(); + } } -// else if (groupSel != "") { + + // else if (groupSel != "") { // std::string newGroupName = m_labelText->GetValue().ToStdString(); // wxGetApp().getBookmarkMgr().renameGroup(groupSel, newGroupName); // groupSel = newGroupName; @@ -764,30 +746,36 @@ void BookmarkView::onLabelText( wxCommandEvent& event ) { void BookmarkView::onDoubleClickFreq( wxMouseEvent& event ) { - if (activeSel) { - wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); + TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); + + if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { + wxGetApp().getDemodMgr().setActiveDemodulator(curSel->demod, false); wxGetApp().showFrequencyInput(FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_DEFAULT); } } void BookmarkView::onDoubleClickBandwidth( wxMouseEvent& event ) { - if (activeSel) { - wxGetApp().getDemodMgr().setActiveDemodulator(activeSel, false); + TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); + + if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { + wxGetApp().getDemodMgr().setActiveDemodulator(curSel->demod, false); wxGetApp().showFrequencyInput(FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_BANDWIDTH); } } void BookmarkView::onRemoveActive( wxCommandEvent& event ) { - if (activeSel != nullptr) { + TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); + + if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { if (editingLabel) { return; } wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, false); - wxGetApp().removeDemodulator(activeSel); - wxGetApp().getDemodMgr().deleteThread(activeSel); - activeSel = nullptr; + wxGetApp().removeDemodulator(curSel->demod); + wxGetApp().getDemodMgr().deleteThread(curSel->demod); + m_treeView->Delete(m_treeView->GetSelection()); } } @@ -796,27 +784,34 @@ void BookmarkView::onRemoveBookmark( wxCommandEvent& event ) { if (editingLabel) { return; } - if (bookmarkSel) { - wxGetApp().getBookmarkMgr().removeBookmark(bookmarkSel); - bookmarkSel = nullptr; + + TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); + + if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { + wxGetApp().getBookmarkMgr().removeBookmark(curSel->bookmarkEnt); + m_treeView->Delete(m_treeView->GetSelection()); wxGetApp().getBookmarkMgr().updateBookmarks(); } } void BookmarkView::onActivateBookmark( wxCommandEvent& event ) { - if (bookmarkSel) { - activateBookmark(bookmarkSel); + TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); + + if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { + activateBookmark(curSel->bookmarkEnt); } } void BookmarkView::onActivateRecent( wxCommandEvent& event ) { - if (recentSel) { - wxGetApp().getBookmarkMgr().removeRecent(recentSel); - activateBookmark(recentSel); + TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); + + if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { + wxGetApp().getBookmarkMgr().removeRecent(curSel->bookmarkEnt); + activateBookmark(curSel->bookmarkEnt); + m_treeView->Delete(m_treeView->GetSelection()); wxGetApp().getBookmarkMgr().updateActiveList(); - recentSel = nullptr; } } @@ -826,7 +821,6 @@ void BookmarkView::onAddGroup( wxCommandEvent& event ) { if (stringVal.ToStdString() != "") { wxGetApp().getBookmarkMgr().addGroup(stringVal.ToStdString()); wxGetApp().getBookmarkMgr().updateBookmarks(); - groupSel = stringVal; } } @@ -835,33 +829,33 @@ void BookmarkView::onRemoveGroup( wxCommandEvent& event ) { if (editingLabel) { return; } - if (groupSel == "") { - return; + + TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); + + if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { + wxGetApp().getBookmarkMgr().removeGroup(curSel->groupName); + m_treeView->Delete(m_treeView->GetSelection()); + wxGetApp().getBookmarkMgr().updateBookmarks(); } - - wxGetApp().getBookmarkMgr().removeGroup(groupSel); - - groupSel = ""; - - wxGetApp().getBookmarkMgr().updateBookmarks(); } void BookmarkView::onRenameGroup( wxCommandEvent& event ) { - if (groupSel == "") { + TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); + + if (!curSel || curSel->type != TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { return; } - wxString stringVal = ""; - stringVal = wxGetTextFromUser("Rename Group", "New Group Name", groupSel); + stringVal = wxGetTextFromUser("Rename Group", "New Group Name", curSel->groupName); std::string newGroupName = stringVal.ToStdString(); - wxGetApp().getBookmarkMgr().renameGroup(groupSel, newGroupName); - - groupSel = newGroupName; - + wxGetApp().getBookmarkMgr().renameGroup(curSel->groupName, newGroupName); + + m_treeView->Delete(m_treeView->GetSelection()); + wxGetApp().getBookmarkMgr().updateBookmarks(); } @@ -983,3 +977,15 @@ void BookmarkView::onEnterWindow( wxMouseEvent& event ) { void BookmarkView::onLeaveWindow( wxMouseEvent& event ) { mouseInView.store(false); } + +TreeViewItem *BookmarkView::itemToTVI(wxTreeItemId item) { + TreeViewItem* tvi = nullptr; + + if (item != nullptr) { + tvi = dynamic_cast(m_treeView->GetItemData(item)); + } + + return tvi; +} + + diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 714d725..0f0e710 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -99,6 +99,8 @@ protected: void onRemoveGroup( wxCommandEvent& event ); void onRenameGroup( wxCommandEvent& event ); + TreeViewItem *itemToTVI(wxTreeItemId item); + std::atomic_bool mouseInView; @@ -114,17 +116,11 @@ protected: // Bookmarks std::atomic_bool doUpdateBookmarks; std::set< std::string > doUpdateBookmarkGroup; - std::string groupSel; BookmarkNames groupNames; std::map groups; - BookmarkEntry *bookmarkSel; wxArrayString bookmarkChoices; wxChoice *bookmarkChoice; // Active std::atomic_bool doUpdateActive; - DemodulatorInstance *activeSel; - - // Recent - BookmarkEntry *recentSel; }; From fd928de3aac70dc441b356c30b9bd480d355114b Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 16 Dec 2016 22:05:25 -0500 Subject: [PATCH 34/51] Show drag item name in popup; follow mouse position. --- src/forms/Bookmark/BookmarkPanel.cpp | 4 ++ src/forms/Bookmark/BookmarkPanel.fbp | 4 +- src/forms/Bookmark/BookmarkPanel.h | 1 + src/forms/Bookmark/BookmarkView.cpp | 92 +++++++++++++++++++++------- src/forms/Bookmark/BookmarkView.h | 13 ++++ 5 files changed, 89 insertions(+), 25 deletions(-) diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index 5bace65..08ffeaf 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -79,6 +79,8 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po // Connect Events this->Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( BookmarkPanel::onEnterWindow ) ); this->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BookmarkPanel::onLeaveWindow ) ); + this->Connect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ) ); + m_treeView->Connect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeBeginDrag ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_DELETE_ITEM, wxTreeEventHandler( BookmarkPanel::onTreeDeleteItem ), NULL, this ); @@ -102,6 +104,8 @@ BookmarkPanel::~BookmarkPanel() // Disconnect Events this->Disconnect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( BookmarkPanel::onEnterWindow ) ); this->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BookmarkPanel::onLeaveWindow ) ); + this->Disconnect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ) ); + m_treeView->Disconnect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeBeginDrag ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_DELETE_ITEM, wxTreeEventHandler( BookmarkPanel::onTreeDeleteItem ), NULL, this ); diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index f3e9a21..1d1ba2c 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -68,7 +68,7 @@ - + onMotion @@ -152,7 +152,7 @@ - + onMotion diff --git a/src/forms/Bookmark/BookmarkPanel.h b/src/forms/Bookmark/BookmarkPanel.h index 99c78fd..abd0327 100644 --- a/src/forms/Bookmark/BookmarkPanel.h +++ b/src/forms/Bookmark/BookmarkPanel.h @@ -49,6 +49,7 @@ class BookmarkPanel : public wxPanel // Virtual event handlers, overide them in your derived class virtual void onEnterWindow( wxMouseEvent& event ) { event.Skip(); } virtual void onLeaveWindow( wxMouseEvent& event ) { event.Skip(); } + virtual void onMotion( wxMouseEvent& event ) { event.Skip(); } virtual void onTreeBeginDrag( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeBeginLabelEdit( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeDeleteItem( wxTreeEvent& event ) { event.Skip(); } diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index e1a3a52..a72a62c 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -15,6 +15,20 @@ #define BOOKMARK_VIEW_STR_ADD_GROUP_DESC "Enter Group Name" #define BOOKMARK_VIEW_STR_UNNAMED "Unnamed" + +BookmarkViewVisualDragItem::BookmarkViewVisualDragItem(wxString labelValue) : wxDialog(NULL, wxID_ANY, L"", wxPoint(20,20), wxSize(-1,-1), wxSTAY_ON_TOP | wxALL ) { + + wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); + wxStaticText *label = new wxStaticText( this, wxID_ANY, labelValue, wxDefaultPosition, wxDefaultSize, wxEXPAND ); + + sizer->Add(label, 1, wxALL | wxEXPAND, 5); + + SetSizerAndFit(sizer); + + Show(); +} + + BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { rootBranch = m_treeView->AddRoot("Root"); @@ -38,6 +52,7 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, m_updateTimer.Start(500); mouseInView.store(false); + visualDragItem = nullptr; } @@ -156,12 +171,7 @@ wxTreeItemId BookmarkView::refreshBookmarks() { tvi->bookmarkEnt = bmEnt; tvi->groupName = gn_i; - std::wstring labelVal = bmEnt->label; - - if (labelVal == "") { - std::string freqStr = frequencyToStr(bmEnt->frequency) + " " + bmEnt->type; - labelVal = wstring(freqStr.begin(),freqStr.end()); - } + std::wstring labelVal = getBookmarkEntryDisplayName(bmEnt); wxTreeItemId itm = m_treeView->AppendItem(groupItem, labelVal); m_treeView->SetItemData(itm, tvi); @@ -180,6 +190,29 @@ wxTreeItemId BookmarkView::refreshBookmarks() { } +std::wstring BookmarkView::getBookmarkEntryDisplayName(BookmarkEntry *bmEnt) { + std::wstring dispName = bmEnt->label; + + if (dispName == "") { + std::string freqStr = frequencyToStr(bmEnt->frequency) + " " + bmEnt->type; + dispName = wstring(freqStr.begin(),freqStr.end()); + } + + return dispName; +} + +std::wstring BookmarkView::getActiveDisplayName(DemodulatorInstance *demod) { + std::wstring activeName = demod->getDemodulatorUserLabel(); + + if (activeName == "") { + std::string wstr = frequencyToStr(demod->getFrequency()) + " " + demod->getDemodulatorType(); + activeName = std::wstring(wstr.begin(),wstr.end()); + } + + return activeName; +} + + void BookmarkView::doUpdateActiveList() { std::vector &demods = wxGetApp().getDemodMgr().getDemodulators(); @@ -199,11 +232,7 @@ void BookmarkView::doUpdateActiveList() { tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE; tvi->demod = demod_i; - wxString activeLabel = demod_i->getDemodulatorUserLabel(); - if (activeLabel == "") { - std::string wstr = frequencyToStr(demod_i->getFrequency()) + " " + demod_i->getDemodulatorType(); - activeLabel = std::wstring(wstr.begin(),wstr.end()); - } + wxString activeLabel = getActiveDisplayName(demod_i); wxTreeItemId itm = m_treeView->AppendItem(activeBranch,activeLabel); m_treeView->SetItemData(itm, tvi); @@ -865,7 +894,9 @@ void BookmarkView::onTreeBeginDrag( wxTreeEvent& event ) { dragItem = nullptr; dragItemId = nullptr; - + + SetCursor(wxCURSOR_CROSS); + if (!tvi) { event.Veto(); return; @@ -876,17 +907,10 @@ void BookmarkView::onTreeBeginDrag( wxTreeEvent& event ) { if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { bAllow = true; - dragItemName = tvi->demod->getDemodulatorUserLabel(); - if (dragItemName == "") { - std::string wstr = tvi->demod->getLabel(); - dragItemName = std::wstring(wstr.begin(),wstr.end()); - } - } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { + dragItemName = getActiveDisplayName(tvi->demod); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT || tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { bAllow = true; - dragItemName = tvi->bookmarkEnt->label; - } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { - bAllow = true; - dragItemName = tvi->bookmarkEnt->label; + dragItemName = getBookmarkEntryDisplayName(tvi->bookmarkEnt); } if (bAllow) { @@ -895,11 +919,13 @@ void BookmarkView::onTreeBeginDrag( wxTreeEvent& event ) { m_treeView->SetBackgroundColour(textColor); m_treeView->SetForegroundColour(bgColor); - m_treeView->SetToolTip("Dragging " + dragItemName); +// m_treeView->SetToolTip("Dragging " + dragItemName); dragItem = tvi; dragItemId = event.GetItem(); + visualDragItem = new BookmarkViewVisualDragItem(dragItemName); + event.Allow(); } else { event.Veto(); @@ -916,6 +942,14 @@ void BookmarkView::onTreeEndDrag( wxTreeEvent& event ) { m_treeView->SetForegroundColour(textColor); m_treeView->UnsetToolTip(); + SetCursor(wxCURSOR_ARROW); + + if (visualDragItem != nullptr) { + visualDragItem->Destroy(); + delete visualDragItem; + visualDragItem = nullptr; + } + if (!event.GetItem()) { event.Veto(); return; @@ -978,6 +1012,18 @@ void BookmarkView::onLeaveWindow( wxMouseEvent& event ) { mouseInView.store(false); } +void BookmarkView::onMotion( wxMouseEvent& event ) { + wxPoint pos = ClientToScreen(event.GetPosition()); + + pos += wxPoint(30,-10); + + if (visualDragItem != nullptr) { + visualDragItem->SetPosition(pos); + } + + event.Skip(); +} + TreeViewItem *BookmarkView::itemToTVI(wxTreeItemId item) { TreeViewItem* tvi = nullptr; diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 0f0e710..c8e36a8 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -3,6 +3,7 @@ #include "BookmarkPanel.h" #include "BookmarkMgr.h" #include "wx/choice.h" +#include "wx/dialog.h" class TreeViewItem : public wxTreeItemData { public: @@ -25,6 +26,13 @@ public: }; +class BookmarkViewVisualDragItem : public wxDialog { +public: + BookmarkViewVisualDragItem(wxString labelValue = L"Popup"); +}; + + + class BookmarkView : public BookmarkPanel { public: BookmarkView( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxTAB_TRAVERSAL ); @@ -53,6 +61,9 @@ protected: void showProps(); void onUpdateTimer( wxTimerEvent& event ); + + std::wstring getBookmarkEntryDisplayName(BookmarkEntry *bmEnt); + std::wstring getActiveDisplayName(DemodulatorInstance *demod); void doUpdateActiveList(); void onTreeBeginLabelEdit( wxTreeEvent& event ); @@ -72,6 +83,7 @@ protected: void onTreeItemGetTooltip( wxTreeEvent& event ); void onEnterWindow( wxMouseEvent& event ); void onLeaveWindow( wxMouseEvent& event ); + void onMotion( wxMouseEvent& event ); void clearButtons(); @@ -110,6 +122,7 @@ protected: TreeViewItem *dragItem; wxTreeItemId dragItemId; + BookmarkViewVisualDragItem *visualDragItem; bool editingLabel; From 870f61cdce99c1807bb29605a3229c4f1de1dafd Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sat, 17 Dec 2016 20:47:32 -0500 Subject: [PATCH 35/51] Re-implement tree selection behavior tweaks --- src/forms/Bookmark/BookmarkPanel.cpp | 2 - src/forms/Bookmark/BookmarkPanel.fbp | 2 +- src/forms/Bookmark/BookmarkPanel.h | 1 - src/forms/Bookmark/BookmarkView.cpp | 69 ++++++++++++++++++---------- src/forms/Bookmark/BookmarkView.h | 6 ++- 5 files changed, 51 insertions(+), 29 deletions(-) diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index 08ffeaf..b5b79f7 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -83,7 +83,6 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_treeView->Connect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeBeginDrag ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this ); - m_treeView->Connect( wxEVT_COMMAND_TREE_DELETE_ITEM, wxTreeEventHandler( BookmarkPanel::onTreeDeleteItem ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_END_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeEndDrag ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_END_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeEndLabelEdit ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this ); @@ -108,7 +107,6 @@ BookmarkPanel::~BookmarkPanel() m_treeView->Disconnect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeBeginDrag ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this ); - m_treeView->Disconnect( wxEVT_COMMAND_TREE_DELETE_ITEM, wxTreeEventHandler( BookmarkPanel::onTreeDeleteItem ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_END_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeEndDrag ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_END_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeEndLabelEdit ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this ); diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index 1d1ba2c..d7d6657 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -164,7 +164,7 @@ onTreeBeginDrag onTreeBeginLabelEdit - onTreeDeleteItem + onTreeEndDrag onTreeEndLabelEdit diff --git a/src/forms/Bookmark/BookmarkPanel.h b/src/forms/Bookmark/BookmarkPanel.h index abd0327..946faac 100644 --- a/src/forms/Bookmark/BookmarkPanel.h +++ b/src/forms/Bookmark/BookmarkPanel.h @@ -52,7 +52,6 @@ class BookmarkPanel : public wxPanel virtual void onMotion( wxMouseEvent& event ) { event.Skip(); } virtual void onTreeBeginDrag( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeBeginLabelEdit( wxTreeEvent& event ) { event.Skip(); } - virtual void onTreeDeleteItem( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeEndDrag( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeEndLabelEdit( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeActivate( wxTreeEvent& event ) { event.Skip(); } diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index a72a62c..c15dd50 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -53,6 +53,8 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, mouseInView.store(false); visualDragItem = nullptr; + nextEnt = nullptr; + nextDemod = nullptr; } @@ -165,7 +167,7 @@ wxTreeItemId BookmarkView::refreshBookmarks() { } BookmarkList bmList = wxGetApp().getBookmarkMgr().getBookmarks(gn_i); - for (auto bmEnt : bmList) { + for (auto &bmEnt : bmList) { TreeViewItem* tvi = new TreeViewItem(); tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK; tvi->bookmarkEnt = bmEnt; @@ -178,6 +180,10 @@ wxTreeItemId BookmarkView::refreshBookmarks() { if (prevSel != nullptr && prevSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK && prevSel->bookmarkEnt == bmEnt && groupExpanded) { bmSelFound = itm; } + if (nextEnt == bmEnt) { + bmSelFound = itm; + nextEnt = nullptr; + } } if (groupExpanded) { @@ -216,8 +222,8 @@ std::wstring BookmarkView::getActiveDisplayName(DemodulatorInstance *demod) { void BookmarkView::doUpdateActiveList() { std::vector &demods = wxGetApp().getDemodMgr().getDemodulators(); - DemodulatorInstance *activeDemodulator = wxGetApp().getDemodMgr().getActiveDemodulator(); -// DemodulatorInstance *lastActiveDemodulator = wxGetApp().getDemodMgr().getLastActiveDemodulator(); +// DemodulatorInstance *activeDemodulator = wxGetApp().getDemodMgr().getActiveDemodulator(); + DemodulatorInstance *lastActiveDemodulator = wxGetApp().getDemodMgr().getLastActiveDemodulator(); TreeViewItem *prevSel = itemToTVI(m_treeView->GetSelection()); @@ -237,12 +243,10 @@ void BookmarkView::doUpdateActiveList() { wxTreeItemId itm = m_treeView->AppendItem(activeBranch,activeLabel); m_treeView->SetItemData(itm, tvi); - if (activeDemodulator) { - if (activeDemodulator == demod_i && activeExpandState) { - selItem = itm; - } - } - else if (prevSel != nullptr && prevSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE && prevSel->demod == demod_i && activeExpandState) { + if (nextDemod != nullptr && nextDemod == demod_i) { + selItem = itm; + nextDemod = nullptr; + } else if (!selItem && activeExpandState && lastActiveDemodulator && lastActiveDemodulator == demod_i) { selItem = itm; } } @@ -253,13 +257,14 @@ void BookmarkView::doUpdateActiveList() { BookmarkList bmRecents = wxGetApp().getBookmarkMgr().getRecents(); m_treeView->DeleteChildren(recentBranch); - for (auto bmr_i: bmRecents) { + for (auto &bmr_i: bmRecents) { TreeViewItem* tvi = new TreeViewItem(); tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT; tvi->bookmarkEnt = bmr_i; std::wstring labelVal; bmr_i->node->child("user_label")->element()->get(labelVal); + if (labelVal == "") { std::string wstr = frequencyToStr(bmr_i->frequency) + " " + bmr_i->type; labelVal = std::wstring(wstr.begin(),wstr.end()); @@ -267,7 +272,11 @@ void BookmarkView::doUpdateActiveList() { wxTreeItemId itm = m_treeView->AppendItem(recentBranch, labelVal); m_treeView->SetItemData(itm, tvi); - if (prevSel && prevSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT && prevSel->bookmarkEnt == bmr_i && recentExpandState) { + + if (nextEnt == bmr_i) { + selItem = itm; + nextEnt = nullptr; + } else if (!selItem && recentExpandState && prevSel && prevSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT && prevSel->bookmarkEnt == bmr_i) { selItem = itm; } } @@ -344,11 +353,14 @@ void BookmarkView::onTreeActivate( wxTreeEvent& event ) { if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { if (!tvi->demod->isActive()) { wxGetApp().setFrequency(tvi->demod->getFrequency()); + wxGetApp().getDemodMgr().setActiveDemodulator(nullptr,true); wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod,false); + nextDemod = tvi->demod; } } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { wxGetApp().getBookmarkMgr().removeRecent(tvi->bookmarkEnt); activateBookmark(tvi->bookmarkEnt); + nextEnt = tvi->bookmarkEnt; wxGetApp().getBookmarkMgr().updateActiveList(); } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { activateBookmark(tvi->bookmarkEnt); @@ -465,27 +477,34 @@ wxButton *BookmarkView::addButton(wxWindow *parent, std::string labelVal, wxObje void BookmarkView::doBookmarkActive(std::string group, DemodulatorInstance *demod) { wxGetApp().getBookmarkMgr().addBookmark(group, demod); wxGetApp().getBookmarkMgr().updateBookmarks(); - activeSelection(demod); } void BookmarkView::doBookmarkRecent(std::string group, BookmarkEntry *be) { wxGetApp().getBookmarkMgr().removeRecent(be); wxGetApp().getBookmarkMgr().addBookmark(group, be); + nextEnt = be; wxGetApp().getBookmarkMgr().updateBookmarks(); - wxGetApp().getBookmarkMgr().updateActiveList(); bookmarkSelection(be); - } void BookmarkView::doMoveBookmark(BookmarkEntry *be, std::string group) { wxGetApp().getBookmarkMgr().moveBookmark(be, group); + nextEnt = be; wxGetApp().getBookmarkMgr().updateBookmarks(); bookmarkSelection(be); } +void BookmarkView::doRemoveActive(DemodulatorInstance *demod) { + wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, true); + wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, false); + wxGetApp().removeDemodulator(demod); + wxGetApp().getDemodMgr().deleteThread(demod); +} + + void BookmarkView::updateBookmarkChoices() { if (!bookmarkChoices.empty()) { bookmarkChoices.erase(bookmarkChoices.begin(),bookmarkChoices.end()); @@ -577,7 +596,12 @@ void BookmarkView::activeSelection(DemodulatorInstance *dsel) { void BookmarkView::activateBookmark(BookmarkEntry *bmEnt) { DemodulatorInstance *newDemod = wxGetApp().getDemodMgr().loadInstance(bmEnt->node); - TreeViewItem *sel = itemToTVI(m_treeView->GetSelection()); + nextDemod = newDemod; + + wxTreeItemId selItem = m_treeView->GetSelection(); + if (selItem) { + m_treeView->SelectItem(selItem, false); + } long long freq = newDemod->getFrequency(); long long currentFreq = wxGetApp().getFrequency(); @@ -590,6 +614,7 @@ void BookmarkView::activateBookmark(BookmarkEntry *bmEnt) { newDemod->run(); newDemod->setActive(true); wxGetApp().bindDemodulator(newDemod); + doUpdateActiveList(); } @@ -724,8 +749,9 @@ void BookmarkView::onTreeSelect( wxTreeEvent& event ) { } if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { + activeSelection(tvi->demod); if (tvi->demod->isActive()) { - activeSelection(tvi->demod); + wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, true); wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod, false); } } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { @@ -778,6 +804,7 @@ void BookmarkView::onDoubleClickFreq( wxMouseEvent& event ) { TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { + wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, true); wxGetApp().getDemodMgr().setActiveDemodulator(curSel->demod, false); wxGetApp().showFrequencyInput(FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_DEFAULT); } @@ -788,6 +815,7 @@ void BookmarkView::onDoubleClickBandwidth( wxMouseEvent& event ) { TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { + wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, true); wxGetApp().getDemodMgr().setActiveDemodulator(curSel->demod, false); wxGetApp().showFrequencyInput(FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_BANDWIDTH); } @@ -801,9 +829,7 @@ void BookmarkView::onRemoveActive( wxCommandEvent& event ) { if (editingLabel) { return; } - wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, false); - wxGetApp().removeDemodulator(curSel->demod); - wxGetApp().getDemodMgr().deleteThread(curSel->demod); + doRemoveActive(curSel->demod); m_treeView->Delete(m_treeView->GetSelection()); } } @@ -992,11 +1018,6 @@ void BookmarkView::onTreeEndDrag( wxTreeEvent& event ) { } -void BookmarkView::onTreeDeleteItem( wxTreeEvent& event ) { - event.Skip(); -} - - void BookmarkView::onTreeItemGetTooltip( wxTreeEvent& event ) { event.Skip(); diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index c8e36a8..78db1fc 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -79,7 +79,6 @@ protected: void onDoubleClickBandwidth( wxMouseEvent& event ); void onTreeBeginDrag( wxTreeEvent& event ); void onTreeEndDrag( wxTreeEvent& event ); - void onTreeDeleteItem( wxTreeEvent& event ); void onTreeItemGetTooltip( wxTreeEvent& event ); void onEnterWindow( wxMouseEvent& event ); void onLeaveWindow( wxMouseEvent& event ); @@ -96,6 +95,7 @@ protected: void doBookmarkActive(std::string group, DemodulatorInstance *demod); void doBookmarkRecent(std::string group, BookmarkEntry *be); void doMoveBookmark(BookmarkEntry *be, std::string group); + void doRemoveActive(DemodulatorInstance *demod); void updateBookmarkChoices(); void addBookmarkChoice(wxWindow *parent); @@ -136,4 +136,8 @@ protected: // Active std::atomic_bool doUpdateActive; + + // Focus + BookmarkEntry *nextEnt; + DemodulatorInstance *nextDemod; }; From 5870c7f7a201fce804eac49fbbbe624d88a38cf0 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sat, 17 Dec 2016 21:14:13 -0500 Subject: [PATCH 36/51] Remove / clear recent entries --- src/BookmarkMgr.cpp | 6 ++++ src/BookmarkMgr.h | 1 + src/forms/Bookmark/BookmarkView.cpp | 48 +++++++++++++++++++++++++++-- src/forms/Bookmark/BookmarkView.h | 7 +++-- 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 42d722a..e9d6036 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -294,6 +294,12 @@ BookmarkList BookmarkMgr::getRecents() { } +void BookmarkMgr::clearRecents() { + std::lock_guard < std::mutex > lock(busy_lock); + + recents.erase(recents.begin(),recents.end()); +} + void BookmarkMgr::trimRecents() { if (recents.size() > BOOKMARK_RECENTS_MAX) { diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 58cdecc..c49ceea 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -62,6 +62,7 @@ public: void addRecent(BookmarkEntry *be); void removeRecent(BookmarkEntry *be); BookmarkList getRecents(); + void clearRecents(); protected: diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index c15dd50..cb175aa 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -14,7 +14,8 @@ #define BOOKMARK_VIEW_STR_ADD_GROUP "Add Group" #define BOOKMARK_VIEW_STR_ADD_GROUP_DESC "Enter Group Name" #define BOOKMARK_VIEW_STR_UNNAMED "Unnamed" - +#define BOOKMARK_VIEW_STR_CLEAR_RECENT "Clear Recents" +#define BOOKMARK_VIEW_STR_RENAME_GROUP "Rename Group" BookmarkViewVisualDragItem::BookmarkViewVisualDragItem(wxString labelValue) : wxDialog(NULL, wxID_ANY, L"", wxPoint(20,20), wxSize(-1,-1), wxSTAY_ON_TOP | wxALL ) { @@ -505,6 +506,17 @@ void BookmarkView::doRemoveActive(DemodulatorInstance *demod) { } +void BookmarkView::doRemoveRecent(BookmarkEntry *be) { + wxGetApp().getBookmarkMgr().removeRecent(be); + wxGetApp().getBookmarkMgr().updateActiveList(); +} + +void BookmarkView::doClearRecents() { + wxGetApp().getBookmarkMgr().clearRecents(); + wxGetApp().getBookmarkMgr().updateActiveList(); +} + + void BookmarkView::updateBookmarkChoices() { if (!bookmarkChoices.empty()) { bookmarkChoices.erase(bookmarkChoices.begin(),bookmarkChoices.end()); @@ -677,6 +689,7 @@ void BookmarkView::recentSelection(BookmarkEntry *bmSel) { addBookmarkChoice(m_buttonPanel); addButton(m_buttonPanel, "Activate Recent", wxCommandEventHandler( BookmarkView::onActivateRecent )); + addButton(m_buttonPanel, "Remove Recent", wxCommandEventHandler( BookmarkView::onRemoveRecent )); showProps(); showButtons(); @@ -695,7 +708,7 @@ void BookmarkView::groupSelection(std::string groupName) { // m_labelLabel->Show(); addButton(m_buttonPanel, "Remove Group", wxCommandEventHandler( BookmarkView::onRemoveGroup )); - addButton(m_buttonPanel, "Rename Group", wxCommandEventHandler( BookmarkView::onRenameGroup )); + addButton(m_buttonPanel, BOOKMARK_VIEW_STR_RENAME_GROUP, wxCommandEventHandler( BookmarkView::onRenameGroup )); // showProps(); @@ -717,7 +730,14 @@ void BookmarkView::bookmarkBranchSelection() { void BookmarkView::recentBranchSelection() { + clearButtons(); hideProps(); + + addButton(m_buttonPanel, BOOKMARK_VIEW_STR_CLEAR_RECENT, wxCommandEventHandler( BookmarkView::onClearRecents )); + + showButtons(); + refreshLayout(); + this->Layout(); } @@ -871,6 +891,28 @@ void BookmarkView::onActivateRecent( wxCommandEvent& event ) { } +void BookmarkView::onRemoveRecent ( wxCommandEvent& event ) { + if (editingLabel) { + return; + } + + TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); + + if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { + wxGetApp().getBookmarkMgr().removeRecent(curSel->bookmarkEnt); + m_treeView->Delete(m_treeView->GetSelection()); + wxGetApp().getBookmarkMgr().updateActiveList(); + } +} + +void BookmarkView::onClearRecents ( wxCommandEvent& event ) { + if (editingLabel) { + return; + } + doClearRecents(); +} + + void BookmarkView::onAddGroup( wxCommandEvent& event ) { wxString stringVal = wxGetTextFromUser(BOOKMARK_VIEW_STR_ADD_GROUP_DESC, BOOKMARK_VIEW_STR_ADD_GROUP, ""); if (stringVal.ToStdString() != "") { @@ -903,7 +945,7 @@ void BookmarkView::onRenameGroup( wxCommandEvent& event ) { } wxString stringVal = ""; - stringVal = wxGetTextFromUser("Rename Group", "New Group Name", curSel->groupName); + stringVal = wxGetTextFromUser(BOOKMARK_VIEW_STR_RENAME_GROUP, "New Group Name", curSel->groupName); std::string newGroupName = stringVal.ToStdString(); diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 78db1fc..c31d29c 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -96,7 +96,9 @@ protected: void doBookmarkRecent(std::string group, BookmarkEntry *be); void doMoveBookmark(BookmarkEntry *be, std::string group); void doRemoveActive(DemodulatorInstance *demod); - + void doRemoveRecent(BookmarkEntry *be); + void doClearRecents(); + void updateBookmarkChoices(); void addBookmarkChoice(wxWindow *parent); void onBookmarkChoice( wxCommandEvent &event ); @@ -106,13 +108,14 @@ protected: void onActivateBookmark( wxCommandEvent& event ); void onActivateRecent( wxCommandEvent& event ); + void onRemoveRecent ( wxCommandEvent& event ); + void onClearRecents ( wxCommandEvent& event ); void onAddGroup( wxCommandEvent& event ); void onRemoveGroup( wxCommandEvent& event ); void onRenameGroup( wxCommandEvent& event ); TreeViewItem *itemToTVI(wxTreeItemId item); - std::atomic_bool mouseInView; From 2085d0f2c96d699e326c80d37cfc9ccd67e2a280 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sun, 18 Dec 2016 12:00:53 -0500 Subject: [PATCH 37/51] Save and load splitter sash positions --- src/AppConfig.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++ src/AppConfig.h | 12 ++++++++++- src/AppFrame.cpp | 29 +++++++++++++++++++++------ src/AppFrame.h | 1 + 4 files changed, 86 insertions(+), 7 deletions(-) diff --git a/src/AppConfig.cpp b/src/AppConfig.cpp index 2772ddb..a15441a 100644 --- a/src/AppConfig.cpp +++ b/src/AppConfig.cpp @@ -290,6 +290,10 @@ AppConfig::AppConfig() : configName("") { spectrumAvgSpeed.store(0.65f); dbOffset.store(0); modemPropsCollapsed.store(false); + mainSplit = -1; + visSplit = -1; + bookmarkSplit = -1; + #ifdef USE_HAMLIB rigEnabled.store(false); rigModel.store(1); @@ -441,6 +445,31 @@ std::vector AppConfig::getManualDevices() { return manualDevices; } +void AppConfig::setMainSplit(float value) { + mainSplit.store(value); +} + +float AppConfig::getMainSplit() { + return mainSplit.load(); +} + +void AppConfig::setVisSplit(float value) { + visSplit.store(value); +} + +float AppConfig::getVisSplit() { + return visSplit.load(); +} + +void AppConfig::setBookmarkSplit(float value) { + bookmarkSplit.store(value); +} + +float AppConfig::getBookmarkSplit() { + return bookmarkSplit.load(); +} + + void AppConfig::setConfigName(std::string configName) { this->configName = configName; } @@ -487,6 +516,10 @@ bool AppConfig::save() { *window_node->newChild("spectrum_avg") = spectrumAvgSpeed.load(); *window_node->newChild("modemprops_collapsed") = modemPropsCollapsed.load();; *window_node->newChild("db_offset") = dbOffset.load(); + + *window_node->newChild("main_split") = mainSplit.load(); + *window_node->newChild("vis_split") = visSplit.load(); + *window_node->newChild("bookmark_split") = bookmarkSplit.load(); } DataNode *devices_node = cfg.rootNode()->newChild("devices"); @@ -644,6 +677,24 @@ bool AppConfig::load() { offset_node->element()->get(offsetValue); setDBOffset(offsetValue); } + + if (win_node->hasAnother("main_split")) { + float gVal; + win_node->getNext("main_split")->element()->get(gVal); + mainSplit.store(gVal); + } + + if (win_node->hasAnother("vis_split")) { + float gVal; + win_node->getNext("vis_split")->element()->get(gVal); + visSplit.store(gVal); + } + + if (win_node->hasAnother("bookmark_split")) { + float gVal; + win_node->getNext("bookmark_split")->element()->get(gVal); + bookmarkSplit.store(gVal); + } } if (cfg.rootNode()->hasAnother("devices")) { diff --git a/src/AppConfig.h b/src/AppConfig.h index f8d31e3..cedff38 100644 --- a/src/AppConfig.h +++ b/src/AppConfig.h @@ -118,6 +118,16 @@ public: void setManualDevices(std::vector manuals); std::vector getManualDevices(); + void setMainSplit(float value); + float getMainSplit(); + + void setVisSplit(float value); + float getVisSplit(); + + void setBookmarkSplit(float value); + float getBookmarkSplit(); + + #if USE_HAMLIB int getRigModel(); void setRigModel(int rigModel); @@ -160,7 +170,7 @@ private: std::atomic_llong snap; std::atomic_llong centerFreq; std::atomic_int waterfallLinesPerSec; - std::atomic spectrumAvgSpeed; + std::atomic spectrumAvgSpeed, mainSplit, visSplit, bookmarkSplit; std::atomic_int dbOffset; std::vector manualDevices; #if USE_HAMLIB diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 0ddb5ea..3d9337d 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -69,8 +69,9 @@ AppFrame::AppFrame() : //attribList.PlatformDefaults().MinRGBA(8, 8, 8, 8).DoubleBuffer().Depth(16).EndList(); mainSplitter = new wxSplitterWindow( this, wxID_MAIN_SPLITTER, wxDefaultPosition, wxDefaultSize, wxSP_3DSASH | wxSP_LIVE_UPDATE ); - mainSplitter->SetSashGravity(10.0/37.0); + mainSplitter->SetSashGravity(10.0f / 37.0f); mainSplitter->SetMinimumPaneSize(1); + wxPanel *demodPanel = new wxPanel(mainSplitter, wxID_ANY); @@ -277,13 +278,13 @@ AppFrame::AppFrame() : // vbox->Add(demodTray, 12, wxEXPAND | wxALL, 0); // vbox->AddSpacer(1); - bookmarkSplitter = new wxSplitterWindow( mainSplitter, wxID_VIS_SPLITTER, wxDefaultPosition, wxDefaultSize, wxSP_3DSASH | wxSP_LIVE_UPDATE ); + bookmarkSplitter = new wxSplitterWindow( mainSplitter, wxID_BM_SPLITTER, wxDefaultPosition, wxDefaultSize, wxSP_3DSASH | wxSP_LIVE_UPDATE ); bookmarkSplitter->SetMinimumPaneSize(1); - bookmarkSplitter->SetSashGravity(1.0/20.0); + bookmarkSplitter->SetSashGravity(1.0f / 20.0f); mainVisSplitter = new wxSplitterWindow( bookmarkSplitter, wxID_VIS_SPLITTER, wxDefaultPosition, wxDefaultSize, wxSP_3DSASH | wxSP_LIVE_UPDATE ); mainVisSplitter->SetMinimumPaneSize(1); - mainVisSplitter->SetSashGravity(6.0/25.0); + mainVisSplitter->SetSashGravity(6.0f / 25.0f); // mainVisSplitter->Connect( wxEVT_IDLE, wxIdleEventHandler( AppFrame::mainVisSplitterIdle ), NULL, this ); @@ -365,7 +366,7 @@ AppFrame::AppFrame() : mainSplitter->SplitHorizontally( demodPanel, bookmarkSplitter ); vbox->Add(mainSplitter, 1, wxEXPAND | wxALL, 0); - + // TODO: refactor these.. waterfallCanvas->attachSpectrumCanvas(spectrumCanvas); spectrumCanvas->attachWaterfallCanvas(waterfallCanvas); @@ -647,7 +648,20 @@ AppFrame::AppFrame() : if (mpc) { modemProps->setCollapsed(true); } - + + int msPos = wxGetApp().getConfig()->getMainSplit(); + if (msPos != -1) { + mainSplitter->SetSashPosition(msPos); + } + int bsPos = wxGetApp().getConfig()->getBookmarkSplit(); + if (bsPos != -1) { + bookmarkSplitter->SetSashPosition(bsPos); + } + int vsPos = wxGetApp().getConfig()->getVisSplit(); + if (vsPos != -1) { + mainVisSplitter->SetSashPosition(vsPos); + } + Show(); #ifdef _WIN32 @@ -1289,6 +1303,9 @@ void AppFrame::OnClose(wxCloseEvent& event) { wxGetApp().getConfig()->setWaterfallLinesPerSec(waterfallDataThread->getLinesPerSecond()); wxGetApp().getConfig()->setManualDevices(SDREnumerator::getManuals()); wxGetApp().getConfig()->setModemPropsCollapsed(modemProps->isCollapsed()); + wxGetApp().getConfig()->setMainSplit(mainSplitter->GetSashPosition()); + wxGetApp().getConfig()->setVisSplit(mainVisSplitter->GetSashPosition()); + wxGetApp().getConfig()->setBookmarkSplit(bookmarkSplitter->GetSashPosition()); #ifdef USE_HAMLIB wxGetApp().getConfig()->setRigEnabled(rigEnableMenuItem->IsChecked()); wxGetApp().getConfig()->setRigModel(rigModel); diff --git a/src/AppFrame.h b/src/AppFrame.h index b778597..7d973c7 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -39,6 +39,7 @@ #define wxID_MAIN_SPLITTER 2050 #define wxID_VIS_SPLITTER 2051 +#define wxID_BM_SPLITTER 2052 #define wxID_THEME_DEFAULT 2100 #define wxID_THEME_SHARP 2101 From 02a876272f84ce944173b2e86cff2df504361389 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 23 Dec 2016 18:45:25 -0500 Subject: [PATCH 38/51] Resolve CMakeLists tab/spaces; add non-blocking action dialog for common user requests. --- CMakeLists.txt | 650 +++++++++++++------------- src/BookmarkMgr.cpp | 23 + src/BookmarkMgr.h | 4 +- src/forms/Bookmark/BookmarkView.cpp | 85 ++-- src/forms/Bookmark/BookmarkView.h | 2 - src/forms/Dialog/ActionDialog.cpp | 59 +++ src/forms/Dialog/ActionDialog.h | 21 + src/forms/Dialog/ActionDialogBase.cpp | 53 +++ src/forms/Dialog/ActionDialogBase.fbp | 369 +++++++++++++++ src/forms/Dialog/ActionDialogBase.h | 50 ++ 10 files changed, 952 insertions(+), 364 deletions(-) create mode 100644 src/forms/Dialog/ActionDialog.cpp create mode 100644 src/forms/Dialog/ActionDialog.h create mode 100644 src/forms/Dialog/ActionDialogBase.cpp create mode 100644 src/forms/Dialog/ActionDialogBase.fbp create mode 100644 src/forms/Dialog/ActionDialogBase.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 883ad5a..924ccb4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -77,9 +77,9 @@ ADD_DEFINITIONS( -DENABLE_DIGITAL_LAB=1 ) IF(MSVC) - SET (ENABLE_LIQUID_EXPERIMENTAL OFF CACHE BOOL "Enable experimental liquid-dsp features (requires latest liquid-dsp installed)") + SET (ENABLE_LIQUID_EXPERIMENTAL OFF CACHE BOOL "Enable experimental liquid-dsp features (requires latest liquid-dsp installed)") ELSE() - SET (ENABLE_LIQUID_EXPERIMENTAL ON CACHE BOOL "Enable experimental liquid-dsp features (requires latest liquid-dsp installed)") + SET (ENABLE_LIQUID_EXPERIMENTAL ON CACHE BOOL "Enable experimental liquid-dsp features (requires latest liquid-dsp installed)") ENDIF() IF(ENABLE_LIQUID_EXPERIMENTAL) ADD_DEFINITIONS( @@ -100,7 +100,7 @@ if (USE_HAMLIB) include_directories(${HAMLIB_INCLUDE_DIR}) link_libraries(${HAMLIB_LIBRARY}) - ADD_DEFINITIONS(-DUSE_HAMLIB) + ADD_DEFINITIONS(-DUSE_HAMLIB) endif () macro(configure_files srcDir destDir globStr) @@ -153,16 +153,16 @@ SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/${EX_PLATFORM_NA SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/${EX_PLATFORM_NAME}) IF (MSVC) - include_directories ("${PROJECT_SOURCE_DIR}/external/wglext") - SET(LIQUID_INCLUDES "${PROJECT_SOURCE_DIR}/external/liquid-dsp/include/" CACHE STRING "Liquid-DSP include directory") - SET(LIQUID_LIBRARIES "${PROJECT_SOURCE_DIR}/external/liquid-dsp/msvc/${EX_PLATFORM}/libliquid.lib" CACHE STRING "Liquid-DSP Library") - SET(LIQUID_DLL "${PROJECT_SOURCE_DIR}/external/liquid-dsp/msvc/${EX_PLATFORM}/libliquid.dll" CACHE STRING "Liquid-DSP DLL") - SET(HAMLIB_DLLS "${PROJECT_SOURCE_DIR}/external/hamlib/${EX_PLATFORM}/libhamlib-2.dll;${PROJECT_SOURCE_DIR}/external/hamlib/${EX_PLATFORM}/libwinpthread-1.dll" CACHE STRING "HAMLIB DLLS") + include_directories ("${PROJECT_SOURCE_DIR}/external/wglext") + SET(LIQUID_INCLUDES "${PROJECT_SOURCE_DIR}/external/liquid-dsp/include/" CACHE STRING "Liquid-DSP include directory") + SET(LIQUID_LIBRARIES "${PROJECT_SOURCE_DIR}/external/liquid-dsp/msvc/${EX_PLATFORM}/libliquid.lib" CACHE STRING "Liquid-DSP Library") + SET(LIQUID_DLL "${PROJECT_SOURCE_DIR}/external/liquid-dsp/msvc/${EX_PLATFORM}/libliquid.dll" CACHE STRING "Liquid-DSP DLL") + SET(HAMLIB_DLLS "${PROJECT_SOURCE_DIR}/external/hamlib/${EX_PLATFORM}/libhamlib-2.dll;${PROJECT_SOURCE_DIR}/external/hamlib/${EX_PLATFORM}/libwinpthread-1.dll" CACHE STRING "HAMLIB DLLS") ELSE (MSVC) - ADD_DEFINITIONS( - -std=c++0x - -pthread - ) + ADD_DEFINITIONS( + -std=c++0x + -pthread + ) ENDIF(MSVC) find_package(OpenGL REQUIRED) @@ -178,50 +178,50 @@ find_package(SoapySDR "0.4.0" NO_MODULE REQUIRED) include_directories(${SOAPY_SDR_INCLUDE_DIR}) SET(OTHER_LIBRARIES ${SOAPY_SDR_LIBRARY} ${OTHER_LIBRARIES}) ADD_DEFINITIONS( - -DUSE_SOAPY_SDR=1 + -DUSE_SOAPY_SDR=1 ) IF (WIN32) - set(wxWidgets_USE_STATIC ON) + set(wxWidgets_USE_STATIC ON) - set(BUILD_INSTALLER OFF CACHE BOOL "Build Installer") - - # Audio device selection is not mandatory, dummy audio device is used if none are compiled in. - # Can also compile support for more than one simultaneously. - set(USE_AUDIO_DS ON CACHE BOOL "Include support for DirectSound") - set(USE_AUDIO_WASAPI OFF CACHE BOOL "Include support for WASAPI Audio") - # TODO: - # set(USE_AUDIO_ASIO OFF CACHE BOOL "Include support for ASIO Audio") + set(BUILD_INSTALLER OFF CACHE BOOL "Build Installer") + + # Audio device selection is not mandatory, dummy audio device is used if none are compiled in. + # Can also compile support for more than one simultaneously. + set(USE_AUDIO_DS ON CACHE BOOL "Include support for DirectSound") + set(USE_AUDIO_WASAPI OFF CACHE BOOL "Include support for WASAPI Audio") + # TODO: + # set(USE_AUDIO_ASIO OFF CACHE BOOL "Include support for ASIO Audio") - # WASAPI - IF(USE_AUDIO_WASAPI) - ADD_DEFINITIONS(-D__WINDOWS_WASAPI__) - IF (NOT MSVC) - SET(OTHER_LIBRARIES ${OTHER_LIBRARIES} -luuid -lksuser) - ENDIF(NOT MSVC) - ENDIF(USE_AUDIO_WASAPI) + # WASAPI + IF(USE_AUDIO_WASAPI) + ADD_DEFINITIONS(-D__WINDOWS_WASAPI__) + IF (NOT MSVC) + SET(OTHER_LIBRARIES ${OTHER_LIBRARIES} -luuid -lksuser) + ENDIF(NOT MSVC) + ENDIF(USE_AUDIO_WASAPI) - # DirectSound - IF (USE_AUDIO_DS) - ADD_DEFINITIONS(-D__WINDOWS_DS__) - IF (MSVC) - SET(OTHER_LIBRARIES ${OTHER_LIBRARIES} dsound.lib) - ELSE (MSVC) - SET(OTHER_LIBRARIES ${OTHER_LIBRARIES} -ldsound) - ENDIF (MSVC) - ENDIF(USE_AUDIO_DS) + # DirectSound + IF (USE_AUDIO_DS) + ADD_DEFINITIONS(-D__WINDOWS_DS__) + IF (MSVC) + SET(OTHER_LIBRARIES ${OTHER_LIBRARIES} dsound.lib) + ELSE (MSVC) + SET(OTHER_LIBRARIES ${OTHER_LIBRARIES} -ldsound) + ENDIF (MSVC) + ENDIF(USE_AUDIO_DS) - SET(USE_MINGW_PATCH OFF CACHE BOOL "Add some missing functions when compiling against mingw liquid-dsp.") - IF (USE_MINGW_PATCH) - SET(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} legacy_stdio_definitions.lib libgcc.a") - ADD_DEFINITIONS( - -DMINGW_PATCH=1 - ) - SET (GCC_LINKDIR "" CACHE STRING "") - IF (GCC_LINKDIR) - link_directories("${GCC_LINKDIR}") - ENDIF() - ENDIF() + SET(USE_MINGW_PATCH OFF CACHE BOOL "Add some missing functions when compiling against mingw liquid-dsp.") + IF (USE_MINGW_PATCH) + SET(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} legacy_stdio_definitions.lib libgcc.a") + ADD_DEFINITIONS( + -DMINGW_PATCH=1 + ) + SET (GCC_LINKDIR "" CACHE STRING "") + IF (GCC_LINKDIR) + link_directories("${GCC_LINKDIR}") + ENDIF() + ENDIF() ENDIF (WIN32) IF (UNIX AND NOT APPLE) @@ -290,23 +290,23 @@ ENDIF (APPLE) SET (cubicsdr_sources - src/CubicSDR.cpp - src/AppFrame.cpp - src/AppConfig.cpp - src/FrequencyDialog.cpp + src/CubicSDR.cpp + src/AppFrame.cpp + src/AppConfig.cpp + src/FrequencyDialog.cpp src/DemodLabelDialog.cpp src/IOThread.cpp src/ModemProperties.cpp src/BookmarkMgr.cpp - src/sdr/SDRDeviceInfo.cpp - src/sdr/SDRPostThread.cpp - src/sdr/SDREnumerator.cpp - src/sdr/SoapySDRThread.h - src/demod/DemodulatorPreThread.cpp - src/demod/DemodulatorThread.cpp - src/demod/DemodulatorWorkerThread.cpp - src/demod/DemodulatorInstance.cpp - src/demod/DemodulatorMgr.cpp + src/sdr/SDRDeviceInfo.cpp + src/sdr/SDRPostThread.cpp + src/sdr/SDREnumerator.cpp + src/sdr/SoapySDRThread.h + src/demod/DemodulatorPreThread.cpp + src/demod/DemodulatorThread.cpp + src/demod/DemodulatorWorkerThread.cpp + src/demod/DemodulatorInstance.cpp + src/demod/DemodulatorMgr.cpp src/modules/modem/Modem.cpp src/modules/modem/ModemAnalog.cpp src/modules/modem/ModemDigital.cpp @@ -318,53 +318,55 @@ SET (cubicsdr_sources src/modules/modem/analog/ModemIQ.cpp src/modules/modem/analog/ModemLSB.cpp src/modules/modem/analog/ModemUSB.cpp - src/audio/AudioThread.cpp - src/util/Gradient.cpp - src/util/Timer.cpp - src/util/MouseTracker.cpp - src/util/GLExt.cpp - src/util/GLFont.cpp - src/util/DataTree.cpp + src/audio/AudioThread.cpp + src/util/Gradient.cpp + src/util/Timer.cpp + src/util/MouseTracker.cpp + src/util/GLExt.cpp + src/util/GLFont.cpp + src/util/DataTree.cpp src/panel/ScopePanel.cpp src/panel/SpectrumPanel.cpp src/panel/WaterfallPanel.cpp src/panel/MeterPanel.cpp src/panel/MeterPanel.h - src/visual/ColorTheme.cpp - src/visual/PrimaryGLContext.cpp - src/visual/InteractiveCanvas.cpp - src/visual/MeterCanvas.cpp - src/visual/MeterContext.cpp - src/visual/TuningCanvas.cpp - src/visual/TuningContext.cpp - src/visual/ModeSelectorCanvas.cpp - src/visual/ModeSelectorContext.cpp - src/visual/ScopeCanvas.cpp - src/visual/ScopeContext.cpp - src/visual/SpectrumCanvas.cpp - src/visual/WaterfallCanvas.cpp + src/visual/ColorTheme.cpp + src/visual/PrimaryGLContext.cpp + src/visual/InteractiveCanvas.cpp + src/visual/MeterCanvas.cpp + src/visual/MeterContext.cpp + src/visual/TuningCanvas.cpp + src/visual/TuningContext.cpp + src/visual/ModeSelectorCanvas.cpp + src/visual/ModeSelectorContext.cpp + src/visual/ScopeCanvas.cpp + src/visual/ScopeContext.cpp + src/visual/SpectrumCanvas.cpp + src/visual/WaterfallCanvas.cpp src/visual/GainCanvas.cpp - src/visual/ImagePanel.cpp - src/process/VisualProcessor.cpp - src/process/ScopeVisualProcessor.cpp - src/process/SpectrumVisualProcessor.cpp - src/process/FFTVisualDataThread.cpp - src/process/FFTDataDistributor.cpp + src/visual/ImagePanel.cpp + src/process/VisualProcessor.cpp + src/process/ScopeVisualProcessor.cpp + src/process/SpectrumVisualProcessor.cpp + src/process/FFTVisualDataThread.cpp + src/process/FFTDataDistributor.cpp src/process/SpectrumVisualDataThread.cpp - src/ui/GLPanel.cpp + src/ui/GLPanel.cpp src/forms/SDRDevices/SDRDevices.cpp src/forms/SDRDevices/SDRDevicesForm.cpp src/forms/SDRDevices/SDRDeviceAdd.cpp src/forms/SDRDevices/SDRDeviceAddForm.cpp src/forms/Bookmark/BookmarkPanel.cpp src/forms/Bookmark/BookmarkView.cpp - external/rtaudio/RtAudio.cpp - external/lodepng/lodepng.cpp - external/tinyxml/tinyxml.cpp - external/tinyxml/tinystr.cpp - external/tinyxml/tinyxmlparser.cpp - external/tinyxml/tinyxmlerror.cpp - external/cubicvr2/math/cubic_math.cpp + src/forms/Dialog/ActionDialogBase.cpp + src/forms/Dialog/ActionDialog.cpp + external/rtaudio/RtAudio.cpp + external/lodepng/lodepng.cpp + external/tinyxml/tinyxml.cpp + external/tinyxml/tinystr.cpp + external/tinyxml/tinyxmlparser.cpp + external/tinyxml/tinyxmlerror.cpp + external/cubicvr2/math/cubic_math.cpp ) IF(ENABLE_DIGITAL_LAB) @@ -384,34 +386,34 @@ IF(ENABLE_DIGITAL_LAB) src/modules/modem/digital/ModemQAM.cpp src/modules/modem/digital/ModemQPSK.cpp ) - IF(ENABLE_LIQUID_EXPERIMENTAL) + IF(ENABLE_LIQUID_EXPERIMENTAL) SET (cubicsdr_sources ${cubicsdr_sources} src/modules/modem/digital/ModemFSK.cpp ) - ENDIF() + ENDIF() ENDIF() SET (cubicsdr_headers - src/CubicSDRDefs.h - src/CubicSDR.h - src/AppFrame.h - src/AppConfig.h - src/FrequencyDialog.h + src/CubicSDRDefs.h + src/CubicSDR.h + src/AppFrame.h + src/AppConfig.h + src/FrequencyDialog.h src/DemodLabelDialog.h src/IOThread.h src/ModemProperties.h src/BookmarkMgr.h - src/sdr/SDRDeviceInfo.h - src/sdr/SDRPostThread.h - src/sdr/SDREnumerator.h - src/sdr/SoapySDRThread.cpp - src/demod/DemodulatorPreThread.h - src/demod/DemodulatorThread.h - src/demod/DemodulatorWorkerThread.h - src/demod/DemodulatorInstance.h - src/demod/DemodulatorMgr.h - src/demod/DemodDefs.h + src/sdr/SDRDeviceInfo.h + src/sdr/SDRPostThread.h + src/sdr/SDREnumerator.h + src/sdr/SoapySDRThread.cpp + src/demod/DemodulatorPreThread.h + src/demod/DemodulatorThread.h + src/demod/DemodulatorWorkerThread.h + src/demod/DemodulatorInstance.h + src/demod/DemodulatorMgr.h + src/demod/DemodDefs.h src/modules/modem/Modem.h src/modules/modem/ModemAnalog.h src/modules/modem/ModemDigital.h @@ -423,67 +425,69 @@ SET (cubicsdr_headers src/modules/modem/analog/ModemIQ.h src/modules/modem/analog/ModemLSB.h src/modules/modem/analog/ModemUSB.h - src/audio/AudioThread.h - src/util/Gradient.h - src/util/Timer.h - src/util/ThreadQueue.h - src/util/MouseTracker.h - src/util/GLExt.h - src/util/GLFont.h - src/util/DataTree.h + src/audio/AudioThread.h + src/util/Gradient.h + src/util/Timer.h + src/util/ThreadQueue.h + src/util/MouseTracker.h + src/util/GLExt.h + src/util/GLFont.h + src/util/DataTree.h src/panel/ScopePanel.h src/panel/SpectrumPanel.h src/panel/WaterfallPanel.h - src/visual/ColorTheme.h - src/visual/PrimaryGLContext.h - src/visual/InteractiveCanvas.h - src/visual/MeterCanvas.h - src/visual/MeterContext.h - src/visual/TuningCanvas.h - src/visual/TuningContext.h - src/visual/ModeSelectorCanvas.h - src/visual/ModeSelectorContext.h - src/visual/ScopeCanvas.h - src/visual/ScopeContext.h - src/visual/SpectrumCanvas.h - src/visual/WaterfallCanvas.h + src/visual/ColorTheme.h + src/visual/PrimaryGLContext.h + src/visual/InteractiveCanvas.h + src/visual/MeterCanvas.h + src/visual/MeterContext.h + src/visual/TuningCanvas.h + src/visual/TuningContext.h + src/visual/ModeSelectorCanvas.h + src/visual/ModeSelectorContext.h + src/visual/ScopeCanvas.h + src/visual/ScopeContext.h + src/visual/SpectrumCanvas.h + src/visual/WaterfallCanvas.h src/visual/GainCanvas.h - src/visual/ImagePanel.h - src/process/VisualProcessor.h - src/process/ScopeVisualProcessor.h - src/process/SpectrumVisualProcessor.h - src/process/FFTVisualDataThread.h - src/process/FFTDataDistributor.h + src/visual/ImagePanel.h + src/process/VisualProcessor.h + src/process/ScopeVisualProcessor.h + src/process/SpectrumVisualProcessor.h + src/process/FFTVisualDataThread.h + src/process/FFTDataDistributor.h src/process/SpectrumVisualDataThread.h - src/ui/GLPanel.h - src/ui/UITestCanvas.cpp - src/ui/UITestCanvas.h - src/ui/UITestContext.cpp - src/ui/UITestContext.h + src/ui/GLPanel.h + src/ui/UITestCanvas.cpp + src/ui/UITestCanvas.h + src/ui/UITestContext.cpp + src/ui/UITestContext.h src/forms/SDRDevices/SDRDevices.h src/forms/SDRDevices/SDRDevicesForm.h src/forms/SDRDevices/SDRDeviceAdd.h src/forms/SDRDevices/SDRDeviceAddForm.h src/forms/Bookmark/BookmarkPanel.h src/forms/Bookmark/BookmarkView.h - external/rtaudio/RtAudio.h - external/lodepng/lodepng.h - external/tinyxml/tinyxml.h - external/tinyxml/tinystr.h - external/cubicvr2/math/aabb.h - external/cubicvr2/math/cubic_math.h - external/cubicvr2/math/cubic_types.h - external/cubicvr2/math/frustum.h - external/cubicvr2/math/mat3.h - external/cubicvr2/math/mat4.h - external/cubicvr2/math/plane.h - external/cubicvr2/math/quaternion.h - external/cubicvr2/math/sphere.h - external/cubicvr2/math/transform.h - external/cubicvr2/math/triangle.h - external/cubicvr2/math/vec2.h - external/cubicvr2/math/vec3.h - external/cubicvr2/math/vec4.h + src/forms/Dialog/ActionDialogBase.h + src/forms/Dialog/ActionDialog.h + external/rtaudio/RtAudio.h + external/lodepng/lodepng.h + external/tinyxml/tinyxml.h + external/tinyxml/tinystr.h + external/cubicvr2/math/aabb.h + external/cubicvr2/math/cubic_math.h + external/cubicvr2/math/cubic_types.h + external/cubicvr2/math/frustum.h + external/cubicvr2/math/mat3.h + external/cubicvr2/math/mat4.h + external/cubicvr2/math/plane.h + external/cubicvr2/math/quaternion.h + external/cubicvr2/math/sphere.h + external/cubicvr2/math/transform.h + external/cubicvr2/math/triangle.h + external/cubicvr2/math/vec2.h + external/cubicvr2/math/vec3.h + external/cubicvr2/math/vec4.h ) IF(ENABLE_DIGITAL_LAB) @@ -554,6 +558,7 @@ set(REG_EXT "[^/]*([.]cpp|[.]c|[.]h|[.]hpp)$") SOURCE_GROUP("Base" REGULAR_EXPRESSION "src/${REG_EXT}") SOURCE_GROUP("Forms\\SDRDevices" REGULAR_EXPRESSION "src/forms/SDRDevices/${REG_EXT}") SOURCE_GROUP("Forms\\Bookmark" REGULAR_EXPRESSION "src/forms/Bookmark/${REG_EXT}") +SOURCE_GROUP("Forms\\Dialog" REGULAR_EXPRESSION "src/forms/Dialog/${REG_EXT}") SOURCE_GROUP("SDR" REGULAR_EXPRESSION "src/sdr/${REG_EXT}") IF(USE_HAMLIB) SOURCE_GROUP("Rig" REGULAR_EXPRESSION "src/rig/${REG_EXT}") @@ -577,27 +582,28 @@ SOURCE_GROUP("_ext-TinyXML" REGULAR_EXPRESSION "external/tinyxml/.*${REG_EXT}") SOURCE_GROUP("_ext-CubicVR2" REGULAR_EXPRESSION "external/cubicvr2/.*${REG_EXT}") include_directories ( - ${PROJECT_SOURCE_DIR}/src/forms/SDRDevices - ${PROJECT_SOURCE_DIR}/src/forms/DigitalConsole - ${PROJECT_SOURCE_DIR}/src/forms/Bookmark - ${PROJECT_SOURCE_DIR}/src/sdr - ${PROJECT_SOURCE_DIR}/src/demod - ${PROJECT_SOURCE_DIR}/src/modules - ${PROJECT_SOURCE_DIR}/src/modules/modem - ${PROJECT_SOURCE_DIR}/src/modules/modem/digital - ${PROJECT_SOURCE_DIR}/src/modules/modem/analog - ${PROJECT_SOURCE_DIR}/src/audio - ${PROJECT_SOURCE_DIR}/src/util - ${PROJECT_SOURCE_DIR}/src/panel - ${PROJECT_SOURCE_DIR}/src/visual - ${PROJECT_SOURCE_DIR}/src/process - ${PROJECT_SOURCE_DIR}/src/ui - ${PROJECT_SOURCE_DIR}/src/rig - ${PROJECT_SOURCE_DIR}/src - ${PROJECT_SOURCE_DIR}/external/rtaudio - ${PROJECT_SOURCE_DIR}/external/lodepng - ${PROJECT_SOURCE_DIR}/external/tinyxml - ${PROJECT_SOURCE_DIR}/external/cubicvr2/math + ${PROJECT_SOURCE_DIR}/src/forms/SDRDevices + ${PROJECT_SOURCE_DIR}/src/forms/DigitalConsole + ${PROJECT_SOURCE_DIR}/src/forms/Bookmark + ${PROJECT_SOURCE_DIR}/src/forms/Dialog + ${PROJECT_SOURCE_DIR}/src/sdr + ${PROJECT_SOURCE_DIR}/src/demod + ${PROJECT_SOURCE_DIR}/src/modules + ${PROJECT_SOURCE_DIR}/src/modules/modem + ${PROJECT_SOURCE_DIR}/src/modules/modem/digital + ${PROJECT_SOURCE_DIR}/src/modules/modem/analog + ${PROJECT_SOURCE_DIR}/src/audio + ${PROJECT_SOURCE_DIR}/src/util + ${PROJECT_SOURCE_DIR}/src/panel + ${PROJECT_SOURCE_DIR}/src/visual + ${PROJECT_SOURCE_DIR}/src/process + ${PROJECT_SOURCE_DIR}/src/ui + ${PROJECT_SOURCE_DIR}/src/rig + ${PROJECT_SOURCE_DIR}/src + ${PROJECT_SOURCE_DIR}/external/rtaudio + ${PROJECT_SOURCE_DIR}/external/lodepng + ${PROJECT_SOURCE_DIR}/external/tinyxml + ${PROJECT_SOURCE_DIR}/external/cubicvr2/math ) set(RES_FILES "") @@ -606,11 +612,11 @@ if(MINGW OR MSVC) set(CMAKE_RC_COMPILER_INIT windres) ENABLE_LANGUAGE(RC) IF(EX_PLATFORM EQUAL 64) - SET(RC_TARGET "pe-x86-64") + SET(RC_TARGET "pe-x86-64") ELSE(EX_PLATFORM EQUAL 64) - SET(RC_TARGET "pe-i386") + SET(RC_TARGET "pe-i386") ENDIF(EX_PLATFORM EQUAL 64) - + SET(CMAKE_RC_COMPILE_OBJECT " -O coff -i -o ") endif(MINGW OR MSVC) @@ -618,9 +624,9 @@ IF (NOT BUNDLE_APP) configure_files(${PROJECT_SOURCE_DIR}/font ${CMAKE_BINARY_DIR}/${EX_PLATFORM_NAME}/fonts "*.fnt") configure_files(${PROJECT_SOURCE_DIR}/font ${CMAKE_BINARY_DIR}/${EX_PLATFORM_NAME}/fonts "*.png") configure_files(${PROJECT_SOURCE_DIR}/icon ${CMAKE_BINARY_DIR}/${EX_PLATFORM_NAME} CubicSDR.ico) - IF(MSVC) - configure_files(${PROJECT_SOURCE_DIR}/external/liquid-dsp/msvc/${EX_PLATFORM}/ ${CMAKE_BINARY_DIR}/${EX_PLATFORM_NAME} "*.dll") - ENDIF() + IF(MSVC) + configure_files(${PROJECT_SOURCE_DIR}/external/liquid-dsp/msvc/${EX_PLATFORM}/ ${CMAKE_BINARY_DIR}/${EX_PLATFORM_NAME} "*.dll") + ENDIF() IF (CUBICSDR_HAS_HEADER_IMAGE) configure_files(${CUBICSDR_HEADER_IMAGE_DIR} ${CMAKE_BINARY_DIR}/${EX_PLATFORM_NAME} ${CUBICSDR_HEADER_IMAGE_FILE}) ENDIF() @@ -661,20 +667,20 @@ IF (APPLE AND BUNDLE_APP) set(BUNDLE_MIR_SDR OFF CACHE BOOL "Bundle mir_sdr for personal use only -- do not distribute.") IF (BUNDLE_SOAPY_MODS) - ADD_DEFINITIONS( - -DBUNDLE_SOAPY_MODS=1 - ) - set(BUNDLED_MODS_ONLY OFF CACHE BOOL "Use bundled mods only") - IF (BUNDLED_MODS_ONLY) - ADD_DEFINITIONS( - -DBUNDLED_MODS_ONLY=1 - ) - ENDIF() + ADD_DEFINITIONS( + -DBUNDLE_SOAPY_MODS=1 + ) + set(BUNDLED_MODS_ONLY OFF CACHE BOOL "Use bundled mods only") + IF (BUNDLED_MODS_ONLY) + ADD_DEFINITIONS( + -DBUNDLED_MODS_ONLY=1 + ) + ENDIF() ENDIF() ADD_DEFINITIONS( - -std=c++0x - -pthread + -std=c++0x + -pthread -D_OSX_APP_ ) @@ -804,21 +810,21 @@ IF(APPLE AND NOT BUNDLE_APP) IF (NOT CMAKE_INSTALL_PREFIX) SET(CMAKE_INSTALL_PREFIX "/usr/") ENDIF() - ADD_DEFINITIONS( - -DRES_FOLDER="${CMAKE_INSTALL_PREFIX}/share/cubicsdr/" - ) + ADD_DEFINITIONS( + -DRES_FOLDER="${CMAKE_INSTALL_PREFIX}/share/cubicsdr/" + ) set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro") - INSTALL(TARGETS CubicSDR DESTINATION bin) + INSTALL(TARGETS CubicSDR DESTINATION bin) install(FILES ${PROJECT_SOURCE_DIR}/src/CubicSDR.png - DESTINATION share/cubicsdr) + DESTINATION share/cubicsdr) install(FILES ${CUBICSDR_FONTS} - DESTINATION share/cubicsdr/fonts) + DESTINATION share/cubicsdr/fonts) CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" @@ -834,33 +840,33 @@ IF (WIN32 AND NOT BUILD_INSTALLER) ADD_DEFINITIONS( -DRES_FOLDER="../share/cubicsdr/" ) - + INSTALL(TARGETS CubicSDR DESTINATION bin) - INSTALL(FILES - ${LIQUID_DLL} - DESTINATION bin) + INSTALL(FILES + ${LIQUID_DLL} + DESTINATION bin) - IF(USE_HAMLIB) - FOREACH(HAMLIB_DLL ${HAMLIB_DLLS}) - message(STATUS "Copying Hamlib DLL: ${HAMLIB_DLL}") + IF(USE_HAMLIB) + FOREACH(HAMLIB_DLL ${HAMLIB_DLLS}) + message(STATUS "Copying Hamlib DLL: ${HAMLIB_DLL}") INSTALL( FILES "${HAMLIB_DLL}" DESTINATION bin ) - ENDFOREACH() - ENDIF() + ENDFOREACH() + ENDIF() INSTALL(FILES - ${PROJECT_SOURCE_DIR}/src/CubicSDR.png - DESTINATION share/cubicsdr) + ${PROJECT_SOURCE_DIR}/src/CubicSDR.png + DESTINATION share/cubicsdr) INSTALL(FILES - ${CUBICSDR_FONTS} - DESTINATION share/cubicsdr/fonts) + ${CUBICSDR_FONTS} + DESTINATION share/cubicsdr/fonts) IF (CUBICSDR_HAS_HEADER_IMAGE) INSTALL(FILES - ${CUBICSDR_HEADER_IMAGE} - DESTINATION share/cubicsdr/) + ${CUBICSDR_HEADER_IMAGE} + DESTINATION share/cubicsdr/) ENDIF() ENDIF() @@ -868,167 +874,167 @@ ENDIF() IF (WIN32 AND BUILD_INSTALLER) set(BUNDLE_SOAPY_MODS OFF CACHE BOOL "Bundle local SoapySDR modules") - set(CPACK_GENERATOR NSIS) - set(CPACK_PACKAGE_NAME "${CUBICSDR_INSTALL_NAME}") - set(CPACK_NSIS_DISPLAY_NAME "${CUBICSDR_INSTALL_TITLE}") - set(CPACK_PACKAGE_VENDOR "cubicsdr.com") - set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CUBICSDR_INSTALL_NAME}") - SET(CPACK_NSIS_INSTALLED_ICON_NAME "CubicSDR.ico") - SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE") - set(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/icon\\\\NSIS_Header.bmp") - IF(EX_PLATFORM EQUAL 64) - SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") - SET(CPACK_NSIS_PACKAGE_NAME "${CUBICSDR_INSTALL_NAME}") - SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CUBICSDR_INSTALL_NAME} ${CPACK_PACKAGE_VERSION}") - set(CMAKE_CL_64 TRUE) # This gets around a bug in the CPack installer name generation for MinGW 64-bit since 2.8 - ELSE(EX_PLATFORM EQUAL 64) - SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES") - SET(CPACK_NSIS_PACKAGE_NAME "${CUBICSDR_INSTALL_NAME} (x86)") - SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CUBICSDR_INSTALL_NAME} ${CPACK_PACKAGE_VERSION} (x86)") - set(CMAKE_CL_64 FALSE) - ENDIF(EX_PLATFORM EQUAL 64) - - set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") - install(TARGETS CubicSDR RUNTIME DESTINATION .) + set(CPACK_GENERATOR NSIS) + set(CPACK_PACKAGE_NAME "${CUBICSDR_INSTALL_NAME}") + set(CPACK_NSIS_DISPLAY_NAME "${CUBICSDR_INSTALL_TITLE}") + set(CPACK_PACKAGE_VENDOR "cubicsdr.com") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CUBICSDR_INSTALL_NAME}") + SET(CPACK_NSIS_INSTALLED_ICON_NAME "CubicSDR.ico") + SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE") + set(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/icon\\\\NSIS_Header.bmp") + IF(EX_PLATFORM EQUAL 64) + SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") + SET(CPACK_NSIS_PACKAGE_NAME "${CUBICSDR_INSTALL_NAME}") + SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CUBICSDR_INSTALL_NAME} ${CPACK_PACKAGE_VERSION}") + set(CMAKE_CL_64 TRUE) # This gets around a bug in the CPack installer name generation for MinGW 64-bit since 2.8 + ELSE(EX_PLATFORM EQUAL 64) + SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES") + SET(CPACK_NSIS_PACKAGE_NAME "${CUBICSDR_INSTALL_NAME} (x86)") + SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CUBICSDR_INSTALL_NAME} ${CPACK_PACKAGE_VERSION} (x86)") + set(CMAKE_CL_64 FALSE) + ENDIF(EX_PLATFORM EQUAL 64) + + set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") + install(TARGETS CubicSDR RUNTIME DESTINATION .) - install(FILES + install(FILES ${PROJECT_SOURCE_DIR}/icon/CubicSDR.ico - ${LIQUID_DLL} - DESTINATION .) + ${LIQUID_DLL} + DESTINATION .) - install(FILES + install(FILES ${CUBICSDR_FONTS} - DESTINATION fonts) + DESTINATION fonts) IF (CUBICSDR_HAS_HEADER_IMAGE) INSTALL(FILES - ${CUBICSDR_HEADER_IMAGE} - DESTINATION .) + ${CUBICSDR_HEADER_IMAGE} + DESTINATION .) ENDIF() - - IF(USE_HAMLIB) - FOREACH(HAMLIB_DLL ${HAMLIB_DLLS}) - message(STATUS "Copying Hamlib DLL: ${HAMLIB_DLL}") + + IF(USE_HAMLIB) + FOREACH(HAMLIB_DLL ${HAMLIB_DLLS}) + message(STATUS "Copying Hamlib DLL: ${HAMLIB_DLL}") INSTALL( FILES - ${HAMLIB_DLL} - DESTINATION .) - ENDFOREACH() - ENDIF() + ${HAMLIB_DLL} + DESTINATION .) + ENDFOREACH() + ENDIF() - IF (BUNDLE_SOAPY_MODS) - ADD_DEFINITIONS( - -DBUNDLE_SOAPY_MODS=1 - ) - set(BUNDLED_MODS_ONLY OFF CACHE BOOL "Use bundled mods only") - IF (BUNDLED_MODS_ONLY) - ADD_DEFINITIONS( - -DBUNDLED_MODS_ONLY=1 - ) - ENDIF() - - file(GLOB SOAPY_BINS ${SOAPY_SDR_ROOT}/bin/*.dll) - file(GLOB SOAPY_MODS ${SOAPY_SDR_ROOT}/lib/SoapySDR/modules/*.dll) - message(STATUS "SOAPY_BINS: ${SOAPY_BINS}") - message(STATUS "SOAPY_MODS: ${SOAPY_MODS}") - install(FILES ${SOAPY_BINS} DESTINATION .) - install(FILES ${SOAPY_MODS} DESTINATION modules) - ENDIF(BUNDLE_SOAPY_MODS) - - IF(MSVC AND EX_PLATFORM EQUAL 32) - install(FILES - ${PROJECT_SOURCE_DIR}/external/msvc/${EX_PLATFORM_NAME}/libgcc_s_dw2-1.dll - DESTINATION .) - ENDIF(MSVC AND EX_PLATFORM EQUAL 32) + IF (BUNDLE_SOAPY_MODS) + ADD_DEFINITIONS( + -DBUNDLE_SOAPY_MODS=1 + ) + set(BUNDLED_MODS_ONLY OFF CACHE BOOL "Use bundled mods only") + IF (BUNDLED_MODS_ONLY) + ADD_DEFINITIONS( + -DBUNDLED_MODS_ONLY=1 + ) + ENDIF() + + file(GLOB SOAPY_BINS ${SOAPY_SDR_ROOT}/bin/*.dll) + file(GLOB SOAPY_MODS ${SOAPY_SDR_ROOT}/lib/SoapySDR/modules/*.dll) + message(STATUS "SOAPY_BINS: ${SOAPY_BINS}") + message(STATUS "SOAPY_MODS: ${SOAPY_MODS}") + install(FILES ${SOAPY_BINS} DESTINATION .) + install(FILES ${SOAPY_MODS} DESTINATION modules) + ENDIF(BUNDLE_SOAPY_MODS) + + IF(MSVC AND EX_PLATFORM EQUAL 32) + install(FILES + ${PROJECT_SOURCE_DIR}/external/msvc/${EX_PLATFORM_NAME}/libgcc_s_dw2-1.dll + DESTINATION .) + ENDIF(MSVC AND EX_PLATFORM EQUAL 32) - set(CPACK_PACKAGE_EXECUTABLES CubicSDR "CubicSDR") + set(CPACK_PACKAGE_EXECUTABLES CubicSDR "CubicSDR") - IF (MSVC) - install(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/external/msvc/${EX_PLATFORM_NAME}/vc_redist.${EX_PLATFORM_NAME}.exe DESTINATION vc_redist) - set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "ExecWait '\\\"$INSTDIR\\\\vc_redist\\\\vc_redist.${EX_PLATFORM_NAME}.exe\\\" /q:a'") - ENDIF (MSVC) - - - INCLUDE(CPack) + IF (MSVC) + install(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/external/msvc/${EX_PLATFORM_NAME}/vc_redist.${EX_PLATFORM_NAME}.exe DESTINATION vc_redist) + set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "ExecWait '\\\"$INSTDIR\\\\vc_redist\\\\vc_redist.${EX_PLATFORM_NAME}.exe\\\" /q:a'") + ENDIF (MSVC) + + + INCLUDE(CPack) ENDIF (WIN32 AND BUILD_INSTALLER) IF (UNIX AND NOT APPLE AND BUILD_DEB) set(CPACK_GENERATOR DEB) - set(CPACK_PACKAGE_NAME "CubicSDR") - SET(CPACK_DEBIAN_PACKAGE_DEPENDS " libwxgtk3.0-0, libpulse0") - SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Charles J. Cliffe ") - SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION "CubicSDR Software Defined Radio application v${CUBICSDR_VERSION}") - SET(CPACK_DEBIAN_PACKAGE_SECTION "comm") + set(CPACK_PACKAGE_NAME "CubicSDR") + SET(CPACK_DEBIAN_PACKAGE_DEPENDS " libwxgtk3.0-0, libpulse0") + SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Charles J. Cliffe ") + SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION "CubicSDR Software Defined Radio application v${CUBICSDR_VERSION}") + SET(CPACK_DEBIAN_PACKAGE_SECTION "comm") SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") - SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${EX_PLATFORM_NAME}") + SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${EX_PLATFORM_NAME}") IF (NOT CMAKE_INSTALL_PREFIX) SET(CMAKE_INSTALL_PREFIX "/usr/") ENDIF() - ADD_DEFINITIONS( - -DRES_FOLDER="${CMAKE_INSTALL_PREFIX}/share/cubicsdr/" - -D_FORTIFY_SOURCE=2 - ) - + ADD_DEFINITIONS( + -DRES_FOLDER="${CMAKE_INSTALL_PREFIX}/share/cubicsdr/" + -D_FORTIFY_SOURCE=2 + ) + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro") - CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/external/deb/deb_post.sh.in" - "${CMAKE_CURRENT_BINARY_DIR}/deb_post.sh" @ONLY IMMEDIATE) + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/external/deb/deb_post.sh.in" + "${CMAKE_CURRENT_BINARY_DIR}/deb_post.sh" @ONLY IMMEDIATE) - CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/cmake/CubicSDR.desktop.in" - "${CMAKE_CURRENT_BINARY_DIR}/CubicSDR.desktop" @ONLY IMMEDIATE) + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/cmake/CubicSDR.desktop.in" + "${CMAKE_CURRENT_BINARY_DIR}/CubicSDR.desktop" @ONLY IMMEDIATE) - INSTALL(TARGETS CubicSDR DESTINATION bin) + INSTALL(TARGETS CubicSDR DESTINATION bin) install(FILES ${PROJECT_SOURCE_DIR}/src/CubicSDR.png - DESTINATION share/cubicsdr) + DESTINATION share/cubicsdr) install(FILES ${CUBICSDR_FONTS} - DESTINATION share/cubicsdr/fonts) + DESTINATION share/cubicsdr/fonts) INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/CubicSDR.desktop" DESTINATION share/applications) - INCLUDE(CPack) + INCLUDE(CPack) ENDIF() IF(UNIX AND NOT APPLE AND NOT BUILD_DEB) IF (NOT CMAKE_INSTALL_PREFIX) SET(CMAKE_INSTALL_PREFIX "/usr/") ENDIF() - ADD_DEFINITIONS( - -DRES_FOLDER="${CMAKE_INSTALL_PREFIX}/share/cubicsdr/" - ) + ADD_DEFINITIONS( + -DRES_FOLDER="${CMAKE_INSTALL_PREFIX}/share/cubicsdr/" + ) set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro") - CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/cmake/CubicSDR.desktop.in" - "${CMAKE_CURRENT_BINARY_DIR}/CubicSDR.desktop" @ONLY IMMEDIATE) + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/cmake/CubicSDR.desktop.in" + "${CMAKE_CURRENT_BINARY_DIR}/CubicSDR.desktop" @ONLY IMMEDIATE) - INSTALL(TARGETS CubicSDR DESTINATION bin) + INSTALL(TARGETS CubicSDR DESTINATION bin) INSTALL(FILES ${PROJECT_SOURCE_DIR}/src/CubicSDR.png - DESTINATION share/cubicsdr) + DESTINATION share/cubicsdr) INSTALL(FILES ${CUBICSDR_FONTS} - DESTINATION share/cubicsdr/fonts) + DESTINATION share/cubicsdr/fonts) IF (CUBICSDR_HAS_HEADER_IMAGE) INSTALL(FILES - ${CUBICSDR_HEADER_IMAGE} - DESTINATION share/cubicsdr) + ${CUBICSDR_HEADER_IMAGE} + DESTINATION share/cubicsdr) ENDIF() INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/CubicSDR.desktop" - DESTINATION share/applications) + DESTINATION share/applications) CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/external/deb/deb_post.sh.in" - "${CMAKE_CURRENT_BINARY_DIR}/deb_post.sh" @ONLY IMMEDIATE) + "${CMAKE_CURRENT_BINARY_DIR}/deb_post.sh" @ONLY IMMEDIATE) CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index e9d6036..986afe6 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -341,3 +341,26 @@ BookmarkEntry *BookmarkMgr::nodeToBookmark(const char *name_in, DataNode *node) return be; } + +std::wstring BookmarkMgr::getBookmarkEntryDisplayName(BookmarkEntry *bmEnt) { + std::wstring dispName = bmEnt->label; + + if (dispName == "") { + std::string freqStr = frequencyToStr(bmEnt->frequency) + " " + bmEnt->type; + dispName = wstring(freqStr.begin(),freqStr.end()); + } + + return dispName; +} + +std::wstring BookmarkMgr::getActiveDisplayName(DemodulatorInstance *demod) { + std::wstring activeName = demod->getDemodulatorUserLabel(); + + if (activeName == "") { + std::string wstr = frequencyToStr(demod->getFrequency()) + " " + demod->getDemodulatorType(); + activeName = std::wstring(wstr.begin(),wstr.end()); + } + + return activeName; +} + diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index c49ceea..910af0e 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -64,7 +64,9 @@ public: BookmarkList getRecents(); void clearRecents(); - + static std::wstring getBookmarkEntryDisplayName(BookmarkEntry *bmEnt); + static std::wstring getActiveDisplayName(DemodulatorInstance *demod); + protected: void trimRecents(); diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index cb175aa..b3a5a98 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -1,5 +1,6 @@ #include "BookmarkView.h" #include "CubicSDR.h" +#include "ActionDialog.h" #include #include @@ -29,6 +30,40 @@ BookmarkViewVisualDragItem::BookmarkViewVisualDragItem(wxString labelValue) : wx Show(); } +class ActionDialogRemoveBookmark : public ActionDialog { +public: + ActionDialogRemoveBookmark( BookmarkEntry *be ) : ActionDialog(wxGetApp().getAppFrame(), wxID_ANY, wxT("Remove Bookmark?")) { + subject = be; + m_questionText->SetLabelText(wxT("Are you sure you want to remove the bookmark\n '" + BookmarkMgr::getBookmarkEntryDisplayName(subject) + "'?")); + } + + void doClickOK() { + wxGetApp().getBookmarkMgr().removeBookmark(subject); + wxGetApp().getBookmarkMgr().updateBookmarks(); + } + +private: + BookmarkEntry *subject; +}; + +class ActionDialogRemoveGroup : public ActionDialog { +public: + ActionDialogRemoveGroup( std::string groupName ) : ActionDialog(wxGetApp().getAppFrame(), wxID_ANY, wxT("Remove Group?")) { + subject = groupName; + m_questionText->SetLabelText(wxT("Warning: Are you sure you want to remove the group\n '" + subject + "' AND ALL BOOKMARKS WITHIN IT?")); + } + + void doClickOK() { + wxGetApp().getBookmarkMgr().removeGroup(subject); + wxGetApp().getBookmarkMgr().updateBookmarks(); + } + +private: + std::string subject; +}; + + + BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { @@ -174,7 +209,7 @@ wxTreeItemId BookmarkView::refreshBookmarks() { tvi->bookmarkEnt = bmEnt; tvi->groupName = gn_i; - std::wstring labelVal = getBookmarkEntryDisplayName(bmEnt); + std::wstring labelVal = BookmarkMgr::getBookmarkEntryDisplayName(bmEnt); wxTreeItemId itm = m_treeView->AppendItem(groupItem, labelVal); m_treeView->SetItemData(itm, tvi); @@ -197,29 +232,6 @@ wxTreeItemId BookmarkView::refreshBookmarks() { } -std::wstring BookmarkView::getBookmarkEntryDisplayName(BookmarkEntry *bmEnt) { - std::wstring dispName = bmEnt->label; - - if (dispName == "") { - std::string freqStr = frequencyToStr(bmEnt->frequency) + " " + bmEnt->type; - dispName = wstring(freqStr.begin(),freqStr.end()); - } - - return dispName; -} - -std::wstring BookmarkView::getActiveDisplayName(DemodulatorInstance *demod) { - std::wstring activeName = demod->getDemodulatorUserLabel(); - - if (activeName == "") { - std::string wstr = frequencyToStr(demod->getFrequency()) + " " + demod->getDemodulatorType(); - activeName = std::wstring(wstr.begin(),wstr.end()); - } - - return activeName; -} - - void BookmarkView::doUpdateActiveList() { std::vector &demods = wxGetApp().getDemodMgr().getDemodulators(); @@ -239,7 +251,7 @@ void BookmarkView::doUpdateActiveList() { tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE; tvi->demod = demod_i; - wxString activeLabel = getActiveDisplayName(demod_i); + wxString activeLabel = BookmarkMgr::getActiveDisplayName(demod_i); wxTreeItemId itm = m_treeView->AppendItem(activeBranch,activeLabel); m_treeView->SetItemData(itm, tvi); @@ -863,9 +875,7 @@ void BookmarkView::onRemoveBookmark( wxCommandEvent& event ) { TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { - wxGetApp().getBookmarkMgr().removeBookmark(curSel->bookmarkEnt); - m_treeView->Delete(m_treeView->GetSelection()); - wxGetApp().getBookmarkMgr().updateBookmarks(); + ActionDialog::showDialog(new ActionDialogRemoveBookmark(curSel->bookmarkEnt)); } } @@ -930,9 +940,7 @@ void BookmarkView::onRemoveGroup( wxCommandEvent& event ) { TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { - wxGetApp().getBookmarkMgr().removeGroup(curSel->groupName); - m_treeView->Delete(m_treeView->GetSelection()); - wxGetApp().getBookmarkMgr().updateBookmarks(); + ActionDialog::showDialog(new ActionDialogRemoveGroup(curSel->groupName)); } } @@ -947,13 +955,12 @@ void BookmarkView::onRenameGroup( wxCommandEvent& event ) { wxString stringVal = ""; stringVal = wxGetTextFromUser(BOOKMARK_VIEW_STR_RENAME_GROUP, "New Group Name", curSel->groupName); - std::string newGroupName = stringVal.ToStdString(); + std::string newGroupName = stringVal.Trim().ToStdString(); - wxGetApp().getBookmarkMgr().renameGroup(curSel->groupName, newGroupName); - - m_treeView->Delete(m_treeView->GetSelection()); - - wxGetApp().getBookmarkMgr().updateBookmarks(); + if (newGroupName != "") { + wxGetApp().getBookmarkMgr().renameGroup(curSel->groupName, newGroupName); + wxGetApp().getBookmarkMgr().updateBookmarks(); + } } @@ -975,10 +982,10 @@ void BookmarkView::onTreeBeginDrag( wxTreeEvent& event ) { if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { bAllow = true; - dragItemName = getActiveDisplayName(tvi->demod); + dragItemName = BookmarkMgr::getActiveDisplayName(tvi->demod); } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT || tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { bAllow = true; - dragItemName = getBookmarkEntryDisplayName(tvi->bookmarkEnt); + dragItemName = BookmarkMgr::getBookmarkEntryDisplayName(tvi->bookmarkEnt); } if (bAllow) { diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index c31d29c..3e3e912 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -62,8 +62,6 @@ protected: void onUpdateTimer( wxTimerEvent& event ); - std::wstring getBookmarkEntryDisplayName(BookmarkEntry *bmEnt); - std::wstring getActiveDisplayName(DemodulatorInstance *demod); void doUpdateActiveList(); void onTreeBeginLabelEdit( wxTreeEvent& event ); diff --git a/src/forms/Dialog/ActionDialog.cpp b/src/forms/Dialog/ActionDialog.cpp new file mode 100644 index 0000000..6cb6341 --- /dev/null +++ b/src/forms/Dialog/ActionDialog.cpp @@ -0,0 +1,59 @@ +#include "ActionDialog.h" + + +ActionDialog *ActionDialog::activeDialog = nullptr; + +ActionDialog::ActionDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) + : ActionDialogBase(parent, id, title, pos, size, style) { +} + + +ActionDialog::~ActionDialog() { + +} + +void ActionDialog::showDialog(ActionDialog *dlg) { + if (activeDialog) { // rejected + delete dlg; + return; + } + activeDialog = dlg; + dlg->Layout(); + dlg->Fit(); + dlg->ShowModal(); +} + +ActionDialog *ActionDialog::getActiveDialog() { + return activeDialog; +} + + +void ActionDialog::setActiveDialog(ActionDialog *dlg) { + activeDialog = dlg; +} + + +void ActionDialog::onClickCancel( wxCommandEvent& event ) { + doClickCancel(); + activeDialog->EndModal(0); + ActionDialog::setActiveDialog(nullptr); + delete activeDialog; +} + + +void ActionDialog::onClickOK( wxCommandEvent& event ) { + doClickOK(); + activeDialog->EndModal(0); + ActionDialog::setActiveDialog(nullptr); + delete activeDialog; +} + + +void ActionDialog::doClickCancel() { + +} + + +void ActionDialog::doClickOK() { + +} diff --git a/src/forms/Dialog/ActionDialog.h b/src/forms/Dialog/ActionDialog.h new file mode 100644 index 0000000..698479f --- /dev/null +++ b/src/forms/Dialog/ActionDialog.h @@ -0,0 +1,21 @@ +#include "ActionDialogBase.h" +#include + +class ActionDialog : public ActionDialogBase { +public: + ActionDialog( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("QuestionTitle"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~ActionDialog(); + + void onClickCancel( wxCommandEvent& event ); + void onClickOK( wxCommandEvent& event ); + + virtual void doClickCancel(); + virtual void doClickOK(); + + static ActionDialog *getActiveDialog(); + static void setActiveDialog(ActionDialog *dlg); + static void showDialog(ActionDialog *dlg); + +private: + static ActionDialog *activeDialog; +}; diff --git a/src/forms/Dialog/ActionDialogBase.cpp b/src/forms/Dialog/ActionDialogBase.cpp new file mode 100644 index 0000000..aaf21d3 --- /dev/null +++ b/src/forms/Dialog/ActionDialogBase.cpp @@ -0,0 +1,53 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Aug 23 2015) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "ActionDialogBase.h" + +/////////////////////////////////////////////////////////////////////////// + +ActionDialogBase::ActionDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* mainSizer; + mainSizer = new wxBoxSizer( wxVERTICAL ); + + m_questionText = new wxStaticText( this, wxID_ANY, wxT("Question"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); + m_questionText->Wrap( -1 ); + mainSizer->Add( m_questionText, 1, wxALL|wxEXPAND, 5 ); + + wxBoxSizer* buttonSizer; + buttonSizer = new wxBoxSizer( wxHORIZONTAL ); + + m_cancelButton = new wxButton( this, wxID_ANY, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); + buttonSizer->Add( m_cancelButton, 1, wxALL|wxEXPAND, 5 ); + + m_okButton = new wxButton( this, wxID_ANY, wxT("OK"), wxDefaultPosition, wxDefaultSize, 0 ); + buttonSizer->Add( m_okButton, 1, wxALL|wxEXPAND, 5 ); + + + mainSizer->Add( buttonSizer, 1, wxEXPAND, 5 ); + + + this->SetSizer( mainSizer ); + this->Layout(); + mainSizer->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + m_cancelButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ActionDialogBase::onClickCancel ), NULL, this ); + m_okButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ActionDialogBase::onClickOK ), NULL, this ); +} + +ActionDialogBase::~ActionDialogBase() +{ + // Disconnect Events + m_cancelButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ActionDialogBase::onClickCancel ), NULL, this ); + m_okButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ActionDialogBase::onClickOK ), NULL, this ); + +} diff --git a/src/forms/Dialog/ActionDialogBase.fbp b/src/forms/Dialog/ActionDialogBase.fbp new file mode 100644 index 0000000..8dc234d --- /dev/null +++ b/src/forms/Dialog/ActionDialogBase.fbp @@ -0,0 +1,369 @@ + + + + + + C++ + 1 + source_name + 0 + 0 + res + UTF-8 + connect + ActionDialogBase + 1000 + none + 0 + ActionDialogBase + + . + + 1 + 1 + 1 + 1 + UI + 0 + 0 + + 0 + wxAUI_MGR_DEFAULT + + wxBOTH + + 1 + 1 + impl_virtual + + + + 0 + wxID_ANY + + + ActionDialogBase + + + wxDEFAULT_DIALOG_STYLE + + QuestionTitle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mainSizer + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Question + + 0 + + + 0 + + 1 + m_questionText + 1 + + + protected + 1 + + Resizable + 1 + + wxALIGN_CENTRE + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + buttonSizer + wxHORIZONTAL + none + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Cancel + + 0 + + + 0 + + 1 + m_cancelButton + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + onClickCancel + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + OK + + 0 + + + 0 + + 1 + m_okButton + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + onClickOK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/forms/Dialog/ActionDialogBase.h b/src/forms/Dialog/ActionDialogBase.h new file mode 100644 index 0000000..72b0b85 --- /dev/null +++ b/src/forms/Dialog/ActionDialogBase.h @@ -0,0 +1,50 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Aug 23 2015) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __ACTIONDIALOGBASE_H__ +#define __ACTIONDIALOGBASE_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +/// Class ActionDialogBase +/////////////////////////////////////////////////////////////////////////////// +class ActionDialogBase : public wxDialog +{ + private: + + protected: + wxStaticText* m_questionText; + wxButton* m_cancelButton; + wxButton* m_okButton; + + // Virtual event handlers, overide them in your derived class + virtual void onClickCancel( wxCommandEvent& event ) { event.Skip(); } + virtual void onClickOK( wxCommandEvent& event ) { event.Skip(); } + + + public: + + ActionDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("QuestionTitle"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~ActionDialogBase(); + +}; + +#endif //__ACTIONDIALOGBASE_H__ From a02dbae7d3f2bcbf04097ec808ce462f605a6330 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 23 Dec 2016 20:07:49 -0500 Subject: [PATCH 39/51] Prevent active switch from changing mode --- src/forms/Bookmark/BookmarkView.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index b3a5a98..933b9b6 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -365,9 +365,10 @@ void BookmarkView::onTreeActivate( wxTreeEvent& event ) { if (tvi) { if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) { if (!tvi->demod->isActive()) { - wxGetApp().setFrequency(tvi->demod->getFrequency()); - wxGetApp().getDemodMgr().setActiveDemodulator(nullptr,true); + + wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod,true); wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod,false); + wxGetApp().setFrequency(tvi->demod->getFrequency()); nextDemod = tvi->demod; } } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) { From d816dc220a7c2d4928ffac9ed83a818fe626ee46 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 26 Dec 2016 21:56:19 -0500 Subject: [PATCH 40/51] Basic search, mostly functional --- src/BookmarkMgr.cpp | 13 ++ src/BookmarkMgr.h | 8 +- src/forms/Bookmark/BookmarkPanel.cpp | 12 ++ src/forms/Bookmark/BookmarkPanel.fbp | 179 +++++++++++++++++++++++++++ src/forms/Bookmark/BookmarkPanel.h | 12 +- src/forms/Bookmark/BookmarkView.cpp | 162 +++++++++++++++++++++--- src/forms/Bookmark/BookmarkView.h | 7 ++ 7 files changed, 369 insertions(+), 24 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 986afe6..3e77818 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -236,6 +236,19 @@ void BookmarkMgr::getGroups(wxArrayString &arr) { } +void BookmarkMgr::setExpandState(std::string groupName, bool state) { + expandState[groupName] = state; +} + + +bool BookmarkMgr::getExpandState(std::string groupName) { + if (expandState.find(groupName) == expandState.end()) { + return true; + } + return expandState[groupName]; +} + + void BookmarkMgr::updateActiveList() { BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView(); diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 910af0e..64fbae8 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -35,6 +35,7 @@ typedef std::vector BookmarkList; typedef std::map BookmarkMap; typedef std::map BookmarkMapSorted; typedef std::vector BookmarkNames; +typedef std::map BookmarkExpandState; class BookmarkMgr { public: @@ -53,7 +54,10 @@ public: BookmarkList getBookmarks(std::string group); void getGroups(BookmarkNames &arr); void getGroups(wxArrayString &arr); - + + void setExpandState(std::string groupName, bool state); + bool getExpandState(std::string groupName); + void updateActiveList(); void updateBookmarks(); void updateBookmarks(std::string group); @@ -78,4 +82,6 @@ protected: BookmarkMapSorted bmDataSorted; BookmarkList recents; std::mutex busy_lock; + + BookmarkExpandState expandState; }; diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index b5b79f7..8e0d6f1 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -14,6 +14,12 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po wxBoxSizer* bSizer1; bSizer1 = new wxBoxSizer( wxVERTICAL ); + m_searchText = new wxTextCtrl( this, wxID_ANY, wxT("Search.."), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); + bSizer1->Add( m_searchText, 0, wxALL|wxEXPAND, 5 ); + + m_clearSearchButton = new wxButton( this, wxID_ANY, wxT("Clear Search"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer1->Add( m_clearSearchButton, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 ); + m_treeView = new wxTreeCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_EDIT_LABELS|wxTR_HAS_VARIABLE_ROW_HEIGHT|wxTR_HIDE_ROOT|wxTR_SINGLE ); bSizer1->Add( m_treeView, 1, wxEXPAND, 5 ); @@ -80,6 +86,9 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po this->Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( BookmarkPanel::onEnterWindow ) ); this->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BookmarkPanel::onLeaveWindow ) ); this->Connect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ) ); + m_searchText->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( BookmarkPanel::onSearchTextFocus ), NULL, this ); + m_searchText->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onSearchText ), NULL, this ); + m_clearSearchButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onClearSearch ), NULL, this ); m_treeView->Connect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeBeginDrag ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this ); @@ -104,6 +113,9 @@ BookmarkPanel::~BookmarkPanel() this->Disconnect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( BookmarkPanel::onEnterWindow ) ); this->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BookmarkPanel::onLeaveWindow ) ); this->Disconnect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ) ); + m_searchText->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( BookmarkPanel::onSearchTextFocus ), NULL, this ); + m_searchText->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onSearchText ), NULL, this ); + m_clearSearchButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onClearSearch ), NULL, this ); m_treeView->Disconnect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeBeginDrag ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this ); diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index d7d6657..8214f9d 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -83,6 +83,185 @@ bSizer1 wxVERTICAL none + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_searchText + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + Search.. + + + + + + + + + + + + onSearchTextFocus + + + + + + + + + + + + + + onSearchText + + + + + + + + 5 + wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Clear Search + + 0 + + + 0 + + 1 + m_clearSearchButton + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + onClearSearch + + + + + + + + + + + + + + + + + + + + + + + + + 5 wxEXPAND diff --git a/src/forms/Bookmark/BookmarkPanel.h b/src/forms/Bookmark/BookmarkPanel.h index 946faac..ecb09cb 100644 --- a/src/forms/Bookmark/BookmarkPanel.h +++ b/src/forms/Bookmark/BookmarkPanel.h @@ -10,14 +10,15 @@ #include #include -#include +#include +#include #include #include #include #include -#include +#include +#include #include -#include #include #include #include @@ -33,6 +34,8 @@ class BookmarkPanel : public wxPanel private: protected: + wxTextCtrl* m_searchText; + wxButton* m_clearSearchButton; wxTreeCtrl* m_treeView; wxPanel* m_propPanel; wxStaticText* m_labelLabel; @@ -50,6 +53,9 @@ class BookmarkPanel : public wxPanel virtual void onEnterWindow( wxMouseEvent& event ) { event.Skip(); } virtual void onLeaveWindow( wxMouseEvent& event ) { event.Skip(); } virtual void onMotion( wxMouseEvent& event ) { event.Skip(); } + virtual void onSearchTextFocus( wxMouseEvent& event ) { event.Skip(); } + virtual void onSearchText( wxCommandEvent& event ) { event.Skip(); } + virtual void onClearSearch( wxCommandEvent& event ) { event.Skip(); } virtual void onTreeBeginDrag( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeBeginLabelEdit( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeEndDrag( wxTreeEvent& event ) { event.Skip(); } diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 933b9b6..9814e09 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #define wxCONTEXT_ADD_GROUP_ID 1000 @@ -83,6 +84,7 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, dragItemId = nullptr; editingLabel = false; + m_clearSearchButton->Hide(); hideProps(); m_updateTimer.Start(500); @@ -151,6 +153,19 @@ void BookmarkView::updateBookmarks(std::string group) { doUpdateBookmarks.store(true); } +bool BookmarkView::isKeywordMatch(std::wstring search_str, std::vector &keywords) { + wstring str = search_str; + std::transform(str.begin(), str.end(), str.begin(), towlower); + + for (auto k : keywords) { + if (str.find(k) != wstring::npos) { + return true; + } + } + + return false; +} + wxTreeItemId BookmarkView::refreshBookmarks() { TreeViewItem *prevSel = itemToTVI(m_treeView->GetSelection()); @@ -165,10 +180,7 @@ wxTreeItemId BookmarkView::refreshBookmarks() { wxTreeItemId bmSelFound = nullptr; std::map groupExpandState; - - for (auto g_i : groups) { - groupExpandState[g_i.first] = m_treeView->IsExpanded(g_i.second); - } + bool searchState = (searchKeywords.size() != 0); groups.erase(groups.begin(),groups.end()); m_treeView->DeleteChildren(bookmarkBranch); @@ -187,29 +199,41 @@ wxTreeItemId BookmarkView::refreshBookmarks() { } } - if (bmExpandState) { + if (searchState || bmExpandState) { m_treeView->Expand(bookmarkBranch); } for (auto gn_i : groupNames) { wxTreeItemId groupItem = groups[gn_i]; - bool groupExpanded = false; - - if (groupExpandState.find(gn_i) != groupExpandState.end()) { - groupExpanded = groupExpandState[gn_i]; - } else { // New - groupExpanded = true; - } + bool groupExpanded = searchState || wxGetApp().getBookmarkMgr().getExpandState(gn_i); BookmarkList bmList = wxGetApp().getBookmarkMgr().getBookmarks(gn_i); for (auto &bmEnt : bmList) { + std::wstring labelVal = BookmarkMgr::getBookmarkEntryDisplayName(bmEnt); + + if (searchState) { + + bool match = isKeywordMatch(labelVal, searchKeywords); + + std::string freqStr = frequencyToStr(bmEnt->frequency); + std::string bwStr = frequencyToStr(bmEnt->bandwidth); + + match = match || isKeywordMatch(bmEnt->userLabel, searchKeywords); + match = match || isKeywordMatch(std::to_wstring(bmEnt->frequency), searchKeywords); + match = match || isKeywordMatch(std::wstring(freqStr.begin(),freqStr.end()), searchKeywords); + match = match || isKeywordMatch(std::wstring(bwStr.begin(),bwStr.end()), searchKeywords); + match = match || isKeywordMatch(std::wstring(bmEnt->type.begin(),bmEnt->type.end()), searchKeywords); + + if (!match) { + continue; + } + } + TreeViewItem* tvi = new TreeViewItem(); tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK; tvi->bookmarkEnt = bmEnt; tvi->groupName = gn_i; - - std::wstring labelVal = BookmarkMgr::getBookmarkEntryDisplayName(bmEnt); wxTreeItemId itm = m_treeView->AppendItem(groupItem, labelVal); m_treeView->SetItemData(itm, tvi); @@ -244,6 +268,7 @@ void BookmarkView::doUpdateActiveList() { m_treeView->DeleteChildren(activeBranch); bool activeExpandState = expandState["active"]; + bool searchState = (searchKeywords.size() != 0); wxTreeItemId selItem = nullptr; for (auto demod_i : demods) { @@ -264,7 +289,7 @@ void BookmarkView::doUpdateActiveList() { } } - bool recentExpandState = expandState["recent"]; + bool recentExpandState = searchState || expandState["recent"]; // Recents BookmarkList bmRecents = wxGetApp().getBookmarkMgr().getRecents(); @@ -277,12 +302,29 @@ void BookmarkView::doUpdateActiveList() { std::wstring labelVal; bmr_i->node->child("user_label")->element()->get(labelVal); - + if (labelVal == "") { std::string wstr = frequencyToStr(bmr_i->frequency) + " " + bmr_i->type; labelVal = std::wstring(wstr.begin(),wstr.end()); } + if (searchKeywords.size()) { + + std::string freqStr = frequencyToStr(bmr_i->frequency); + std::string bwStr = frequencyToStr(bmr_i->bandwidth); + + bool match = isKeywordMatch(labelVal, searchKeywords); + match = match || isKeywordMatch(bmr_i->userLabel, searchKeywords); + match = match || isKeywordMatch(std::to_wstring(bmr_i->frequency), searchKeywords); + match = match || isKeywordMatch(std::wstring(freqStr.begin(),freqStr.end()), searchKeywords); + match = match || isKeywordMatch(std::wstring(bwStr.begin(),bwStr.end()), searchKeywords); + match = match || isKeywordMatch(std::wstring(bmr_i->type.begin(),tvi->bookmarkEnt->type.end()), searchKeywords); + + if (!match) { + continue; + } + } + wxTreeItemId itm = m_treeView->AppendItem(recentBranch, labelVal); m_treeView->SetItemData(itm, tvi); @@ -384,19 +426,39 @@ void BookmarkView::onTreeActivate( wxTreeEvent& event ) { void BookmarkView::onTreeCollapse( wxTreeEvent& event ) { + bool searchState = (searchKeywords.size() != 0); + + if (searchState) { + event.Skip(); + return; + } + if (event.GetItem() == activeBranch) { expandState["active"] = false; } else if (event.GetItem() == bookmarkBranch) { expandState["bookmark"] = false; } else if (event.GetItem() == recentBranch) { expandState["recent"] = false; - } + } else { + TreeViewItem *tvi = itemToTVI(event.GetItem()); + + if (tvi != nullptr) { + if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { + wxGetApp().getBookmarkMgr().setExpandState(tvi->groupName,false); + } + } - event.Skip(); + } } void BookmarkView::onTreeExpanded( wxTreeEvent& event ) { + bool searchState = (searchKeywords.size() != 0); + + if (searchState) { + event.Skip(); + return; + } if (event.GetItem() == activeBranch) { expandState["active"] = true; @@ -404,9 +466,16 @@ void BookmarkView::onTreeExpanded( wxTreeEvent& event ) { expandState["bookmark"] = true; } else if (event.GetItem() == recentBranch) { expandState["recent"] = true; + } else { + TreeViewItem *tvi = itemToTVI(event.GetItem()); + + if (tvi != nullptr) { + if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { + wxGetApp().getBookmarkMgr().setExpandState(tvi->groupName,true); + } + } + } - - event.Skip(); } @@ -1105,4 +1174,57 @@ TreeViewItem *BookmarkView::itemToTVI(wxTreeItemId item) { return tvi; } +void BookmarkView::onSearchTextFocus( wxMouseEvent& event ) { + if (!m_searchText->IsEmpty()) { + if (m_searchText->GetValue() == L"Search..") { + m_searchText->SetValue(L""); + } + } +} + + +void BookmarkView::onSearchText( wxCommandEvent& event ) { + wstring searchText = m_searchText->GetValue().Trim().Lower().ToStdWstring(); + + if (!searchKeywords.empty()) { + searchKeywords.erase(searchKeywords.begin(),searchKeywords.end()); + } + + if (searchText.length() != 0) { + std::wstringstream searchTextLo(searchText); + wstring tmp; + + while(std::getline(searchTextLo, tmp, L';')) { + if (tmp.length() != 0 && tmp.find(L"search.") == wstring::npos) { + searchKeywords.push_back(tmp); + std::wcout << L"Keyword: " << tmp << '\n'; + } + + } + } + + if (searchKeywords.size() != 0 && !m_clearSearchButton->IsShown()) { + m_clearSearchButton->Show(); + refreshLayout(); + } else if (searchKeywords.size() == 0 && m_clearSearchButton->IsShown()) { + m_clearSearchButton->Hide(); + refreshLayout(); + } + + wxGetApp().getBookmarkMgr().updateActiveList(); + wxGetApp().getBookmarkMgr().updateBookmarks(); +} + + +void BookmarkView::onClearSearch( wxCommandEvent& event ) { + m_searchText->SetValue(L"Search.."); + m_treeView->SetFocus(); + if (!searchKeywords.empty()) { + searchKeywords.erase(searchKeywords.begin(),searchKeywords.end()); + } + wxGetApp().getBookmarkMgr().updateActiveList(); + wxGetApp().getBookmarkMgr().updateBookmarks(); + m_clearSearchButton->Hide(); + refreshLayout(); +} diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 3e3e912..b6264b7 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -39,6 +39,7 @@ public: void updateActiveList(); void updateBookmarks(); + bool isKeywordMatch(std::wstring str, std::vector &keywords); void updateBookmarks(std::string group); void activeSelection(DemodulatorInstance *dsel); void bookmarkSelection(BookmarkEntry *bmSel); @@ -82,6 +83,9 @@ protected: void onLeaveWindow( wxMouseEvent& event ); void onMotion( wxMouseEvent& event ); + void onSearchTextFocus( wxMouseEvent& event ); + void onSearchText( wxCommandEvent& event ); + void onClearSearch( wxCommandEvent& event ); void clearButtons(); void showButtons(); @@ -141,4 +145,7 @@ protected: // Focus BookmarkEntry *nextEnt; DemodulatorInstance *nextDemod; + + // Search + std::vector searchKeywords; }; From 9eee45bb9d525e84d4f7ab7452109a1e4c4b7391 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 27 Dec 2016 00:06:25 -0500 Subject: [PATCH 41/51] Improve keyword searching method; add view range bookmarking support --- src/AppFrame.cpp | 11 ++ src/AppFrame.h | 4 +- src/BookmarkMgr.cpp | 43 +++++ src/BookmarkMgr.h | 31 ++++ src/forms/Bookmark/BookmarkView.cpp | 249 ++++++++++++++++++++++++---- src/forms/Bookmark/BookmarkView.h | 34 ++-- 6 files changed, 329 insertions(+), 43 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 3d9337d..8aa5446 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -2219,6 +2219,17 @@ void AppFrame::setViewState(long long center_freq) { } +long long AppFrame::getViewCenterFreq() { + return waterfallCanvas->getCenterFrequency(); + +} + + +int AppFrame::getViewBandwidth() { + return waterfallCanvas->getBandwidth(); +} + + /* split a string by 'seperator' into a vector of string */ std::vector str_explode(const std::string &seperator, const std::string &in_str) { diff --git a/src/AppFrame.h b/src/AppFrame.h index 7d973c7..cbb0d2c 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -106,7 +106,9 @@ public: void refreshGainUI(); void setViewState(long long center_freq, int bandwidth); void setViewState(long long center_freq); - + + long long getViewCenterFreq(); + int getViewBandwidth(); bool isUserDemodBusy(); BookmarkView *getBookmarkView(); diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 3e77818..f606b7d 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -4,6 +4,9 @@ #define BOOKMARK_RECENTS_MAX 25 +BookmarkMgr::BookmarkMgr() { + rangesSorted = false; +} void BookmarkMgr::saveToFile(std::string bookmarkFn) { DataTree s("cubicsdr_bookmarks"); @@ -321,6 +324,46 @@ void BookmarkMgr::trimRecents() { } } + +void BookmarkMgr::addRange(BookmarkRangeEntry *re) { + std::lock_guard < std::mutex > lock(busy_lock); + + ranges.push_back(re); + rangesSorted = false; +} + + + +void BookmarkMgr::removeRange(BookmarkRangeEntry *re) { + std::lock_guard < std::mutex > lock(busy_lock); + + BookmarkRangeList::iterator re_i = std::find(ranges.begin(), ranges.end(), re); + + if (re_i != ranges.end()) { + ranges.erase(re_i); + } +} + + +BookmarkRangeList BookmarkMgr::getRanges() { + std::lock_guard < std::mutex > lock(busy_lock); + + if (!rangesSorted) { + std::sort(ranges.begin(), ranges.end(), BookmarkRangeEntryCompare()); + rangesSorted = true; + } + + return ranges; +} + + +void BookmarkMgr::clearRanges() { + std::lock_guard < std::mutex > lock(busy_lock); + + ranges.erase(ranges.begin(),ranges.end()); +} + + BookmarkEntry *BookmarkMgr::demodToBookmarkEntry(DemodulatorInstance *demod) { BookmarkEntry *be = new BookmarkEntry; diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 64fbae8..1663694 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -22,6 +22,18 @@ public: DataNode *node; }; + +class BookmarkRangeEntry { +public: + std::mutex busy_lock; + + std::wstring label; + + long long startFreq; + long long endFreq; +}; + + struct BookmarkEntryCompare : public std::binary_function { bool operator()(const BookmarkEntry *a, BookmarkEntry *b) const @@ -31,7 +43,16 @@ struct BookmarkEntryCompare : public std::binary_function +{ + bool operator()(const BookmarkRangeEntry *a, BookmarkRangeEntry *b) const + { + return a->startFreq < b->startFreq; + } +}; + typedef std::vector BookmarkList; +typedef std::vector BookmarkRangeList; typedef std::map BookmarkMap; typedef std::map BookmarkMapSorted; typedef std::vector BookmarkNames; @@ -39,6 +60,8 @@ typedef std::map BookmarkExpandState; class BookmarkMgr { public: + BookmarkMgr(); + void saveToFile(std::string bookmarkFn); void loadFromFile(std::string bookmarkFn); @@ -68,6 +91,12 @@ public: BookmarkList getRecents(); void clearRecents(); + void addRange(BookmarkRangeEntry *re); + void removeRange(BookmarkRangeEntry *re); + BookmarkRangeList getRanges(); + void clearRanges(); + + static std::wstring getBookmarkEntryDisplayName(BookmarkEntry *bmEnt); static std::wstring getActiveDisplayName(DemodulatorInstance *demod); @@ -81,6 +110,8 @@ protected: BookmarkMap bmData; BookmarkMapSorted bmDataSorted; BookmarkList recents; + BookmarkRangeList ranges; + bool rangesSorted; std::mutex busy_lock; BookmarkExpandState expandState; diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 9814e09..0a15126 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -19,6 +19,7 @@ #define BOOKMARK_VIEW_STR_CLEAR_RECENT "Clear Recents" #define BOOKMARK_VIEW_STR_RENAME_GROUP "Rename Group" + BookmarkViewVisualDragItem::BookmarkViewVisualDragItem(wxString labelValue) : wxDialog(NULL, wxID_ANY, L"", wxPoint(20,20), wxSize(-1,-1), wxSTAY_ON_TOP | wxALL ) { wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); @@ -64,16 +65,44 @@ private: }; +class ActionDialogRemoveRange : public ActionDialog { +public: + ActionDialogRemoveRange( BookmarkRangeEntry *rangeEnt ) : ActionDialog(wxGetApp().getAppFrame(), wxID_ANY, wxT("Remove Range?")) { + subject = rangeEnt; + + std::wstring name = rangeEnt->label; + + if (name.length() == 0) { + std::string wstr = frequencyToStr(rangeEnt->startFreq) + " - " + frequencyToStr(rangeEnt->endFreq); + name = std::wstring(wstr.begin(),wstr.end()); + } + + m_questionText->SetLabelText(L"Are you sure you want to remove the range\n '" + name + L"'?"); + } + + void doClickOK() { + wxGetApp().getBookmarkMgr().removeRange(subject); + wxGetApp().getBookmarkMgr().updateActiveList(); + } + +private: + BookmarkRangeEntry *subject; +}; + + + BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { rootBranch = m_treeView->AddRoot("Root"); activeBranch = m_treeView->AppendItem(rootBranch, "Active"); + rangeBranch = m_treeView->AppendItem(rootBranch, "View Ranges"); bookmarkBranch = m_treeView->AppendItem(rootBranch, "Bookmarks"); recentBranch = m_treeView->AppendItem(rootBranch, "Recents"); expandState["active"] = true; + expandState["range"] = true; expandState["bookmark"] = true; expandState["recent"] = true; @@ -158,12 +187,12 @@ bool BookmarkView::isKeywordMatch(std::wstring search_str, std::vectorfrequency); std::string bwStr = frequencyToStr(bmEnt->bandwidth); - - match = match || isKeywordMatch(bmEnt->userLabel, searchKeywords); - match = match || isKeywordMatch(std::to_wstring(bmEnt->frequency), searchKeywords); - match = match || isKeywordMatch(std::wstring(freqStr.begin(),freqStr.end()), searchKeywords); - match = match || isKeywordMatch(std::wstring(bwStr.begin(),bwStr.end()), searchKeywords); - match = match || isKeywordMatch(std::wstring(bmEnt->type.begin(),bmEnt->type.end()), searchKeywords); - if (!match) { + std::wstring fullText = labelVal + + L" " + bmEnt->userLabel + + L" " + std::to_wstring(bmEnt->frequency) + + L" " + std::wstring(freqStr.begin(),freqStr.end()) + + L" " + std::wstring(bwStr.begin(),bwStr.end()) + + L" " + std::wstring(bmEnt->type.begin(),bmEnt->type.end()); + + if (!isKeywordMatch(fullText, searchKeywords)) { continue; } } @@ -289,6 +316,35 @@ void BookmarkView::doUpdateActiveList() { } } + bool rangeExpandState = expandState["range"]; + + BookmarkRangeList bmRanges = wxGetApp().getBookmarkMgr().getRanges(); + m_treeView->DeleteChildren(rangeBranch); + + for (auto &re_i: bmRanges) { + TreeViewItem* tvi = new TreeViewItem(); + tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE; + tvi->rangeEnt = re_i; + + std::wstring labelVal = re_i->label; + + if (labelVal == "") { + std::string wstr = frequencyToStr(re_i->startFreq) + " - " + frequencyToStr(re_i->endFreq); + labelVal = std::wstring(wstr.begin(),wstr.end()); + } + + wxTreeItemId itm = m_treeView->AppendItem(rangeBranch, labelVal); + m_treeView->SetItemData(itm, tvi); + + if (nextRange == re_i) { + selItem = itm; + nextRange = nullptr; + } else if (!selItem && rangeExpandState && prevSel && prevSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE && prevSel->rangeEnt == re_i) { + selItem = itm; + } + } + + bool recentExpandState = searchState || expandState["recent"]; // Recents @@ -313,14 +369,14 @@ void BookmarkView::doUpdateActiveList() { std::string freqStr = frequencyToStr(bmr_i->frequency); std::string bwStr = frequencyToStr(bmr_i->bandwidth); - bool match = isKeywordMatch(labelVal, searchKeywords); - match = match || isKeywordMatch(bmr_i->userLabel, searchKeywords); - match = match || isKeywordMatch(std::to_wstring(bmr_i->frequency), searchKeywords); - match = match || isKeywordMatch(std::wstring(freqStr.begin(),freqStr.end()), searchKeywords); - match = match || isKeywordMatch(std::wstring(bwStr.begin(),bwStr.end()), searchKeywords); - match = match || isKeywordMatch(std::wstring(bmr_i->type.begin(),tvi->bookmarkEnt->type.end()), searchKeywords); + std::wstring fullText = labelVal + + L" " + bmr_i->userLabel + + L" " + std::to_wstring(bmr_i->frequency) + + L" " + std::wstring(freqStr.begin(),freqStr.end()) + + L" " + std::wstring(bwStr.begin(),bwStr.end()) + + L" " + std::wstring(bmr_i->type.begin(),tvi->bookmarkEnt->type.end()); - if (!match) { + if (!isKeywordMatch(fullText, searchKeywords)) { continue; } } @@ -342,6 +398,9 @@ void BookmarkView::doUpdateActiveList() { if (recentExpandState) { m_treeView->Expand(recentBranch); } + if (rangeExpandState) { + m_treeView->Expand(rangeBranch); + } if (selItem != nullptr) { m_treeView->SelectItem(selItem); } @@ -359,7 +418,8 @@ void BookmarkView::onTreeBeginLabelEdit( wxTreeEvent& event ) { if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE || tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT || tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK || - tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) + tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP || + tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE) { event.Allow(); editingLabel = true; @@ -396,6 +456,12 @@ void BookmarkView::onTreeEndLabelEdit( wxTreeEvent& event ) { std::string newGroup = m_treeView->GetEditControl()->GetValue().ToStdString(); wxGetApp().getBookmarkMgr().renameGroup(tvi->groupName, newGroup); wxGetApp().getBookmarkMgr().updateBookmarks(); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE) { + std::wstring newName = m_treeView->GetEditControl()->GetValue().ToStdWstring(); + if (newName.length() != 0) { + tvi->rangeEnt->label = newName; + wxGetApp().getBookmarkMgr().updateActiveList(); + } } } @@ -420,6 +486,8 @@ void BookmarkView::onTreeActivate( wxTreeEvent& event ) { wxGetApp().getBookmarkMgr().updateActiveList(); } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) { activateBookmark(tvi->bookmarkEnt); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE) { + activateRange(tvi->rangeEnt); } } } @@ -439,6 +507,8 @@ void BookmarkView::onTreeCollapse( wxTreeEvent& event ) { expandState["bookmark"] = false; } else if (event.GetItem() == recentBranch) { expandState["recent"] = false; + } else if (event.GetItem() == rangeBranch) { + expandState["range"] = false; } else { TreeViewItem *tvi = itemToTVI(event.GetItem()); @@ -466,6 +536,8 @@ void BookmarkView::onTreeExpanded( wxTreeEvent& event ) { expandState["bookmark"] = true; } else if (event.GetItem() == recentBranch) { expandState["recent"] = true; + } else if (event.GetItem() == rangeBranch) { + expandState["range"] = true; } else { TreeViewItem *tvi = itemToTVI(event.GetItem()); @@ -497,6 +569,12 @@ void BookmarkView::onMenuItem(wxCommandEvent& event) { bool BookmarkView::isMouseInView() { + if (editingLabel) { + return true; + } + if (m_labelText->HasFocus()) { + return true; + } return mouseInView.load(); } @@ -691,12 +769,12 @@ void BookmarkView::activateBookmark(BookmarkEntry *bmEnt) { DemodulatorInstance *newDemod = wxGetApp().getDemodMgr().loadInstance(bmEnt->node); nextDemod = newDemod; - + wxTreeItemId selItem = m_treeView->GetSelection(); if (selItem) { m_treeView->SelectItem(selItem, false); } - + long long freq = newDemod->getFrequency(); long long currentFreq = wxGetApp().getFrequency(); long long currentRate = wxGetApp().getSampleRate(); @@ -713,6 +791,11 @@ void BookmarkView::activateBookmark(BookmarkEntry *bmEnt) { } +void BookmarkView::activateRange(BookmarkRangeEntry *rangeEnt) { + wxGetApp().getAppFrame()->setViewState(rangeEnt->startFreq + (rangeEnt->endFreq - rangeEnt->startFreq) / 2, rangeEnt->endFreq - rangeEnt->startFreq); +} + + void BookmarkView::bookmarkSelection(BookmarkEntry *bmSel) { m_frequencyVal->SetLabelText(frequencyToStr(bmSel->frequency)); @@ -779,21 +862,49 @@ void BookmarkView::recentSelection(BookmarkEntry *bmSel) { } void BookmarkView::groupSelection(std::string groupName) { - + clearButtons(); hideProps(); - -// m_labelText->SetValue(groupSel); - -// m_labelText->Show(); -// m_labelLabel->Show(); + + // m_labelText->SetValue(groupSel); + + // m_labelText->Show(); + // m_labelLabel->Show(); addButton(m_buttonPanel, "Remove Group", wxCommandEventHandler( BookmarkView::onRemoveGroup )); addButton(m_buttonPanel, BOOKMARK_VIEW_STR_RENAME_GROUP, wxCommandEventHandler( BookmarkView::onRenameGroup )); -// showProps(); + // showProps(); + + showButtons(); + refreshLayout(); +} + +void BookmarkView::rangeSelection(BookmarkRangeEntry *re) { + + clearButtons(); + + hideProps(); + + m_labelText->SetValue(re->label); + + m_labelText->Show(); + m_labelLabel->Show(); + + m_frequencyVal->Show(); + m_frequencyLabel->Show(); + + std::string strFreq = frequencyToStr(re->startFreq) + "-" + frequencyToStr(re->endFreq); + + m_frequencyVal->SetLabelText(std::wstring(strFreq.begin(),strFreq.end())); + + showProps(); + + addButton(m_buttonPanel, "Go to Range", wxCommandEventHandler( BookmarkView::onActivateRange )); + addButton(m_buttonPanel, "Remove Range", wxCommandEventHandler( BookmarkView::onRemoveRange )); + showButtons(); refreshLayout(); } @@ -824,6 +935,25 @@ void BookmarkView::recentBranchSelection() { } +void BookmarkView::rangeBranchSelection() { + clearButtons(); + hideProps(); + + m_labelText->Clear(); + m_labelText->Show(); + m_labelLabel->Show(); + + showProps(); + + addButton(m_buttonPanel, "Add Active Range", wxCommandEventHandler( BookmarkView::onAddRange )); + + showButtons(); + refreshLayout(); + + this->Layout(); +} + + void BookmarkView::activeBranchSelection() { hideProps(); this->Layout(); @@ -842,6 +972,8 @@ void BookmarkView::onTreeSelect( wxTreeEvent& event ) { activeBranchSelection(); } else if (itm == recentBranch) { recentBranchSelection(); + } else if (itm == rangeBranch) { + rangeBranchSelection(); } else { hideProps(); this->Layout(); @@ -862,6 +994,8 @@ void BookmarkView::onTreeSelect( wxTreeEvent& event ) { bookmarkSelection(tvi->bookmarkEnt); } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { groupSelection(tvi->groupName); + } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE) { + rangeSelection(tvi->rangeEnt); } else { hideProps(); this->Layout(); @@ -890,6 +1024,9 @@ void BookmarkView::onLabelText( wxCommandEvent& event ) { curSel->bookmarkEnt->label = m_labelText->GetValue().ToStdWstring(); curSel->bookmarkEnt->node->child("user_label")->element()->set(newLabel); wxGetApp().getBookmarkMgr().updateActiveList(); + } else if (curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE) { + curSel->rangeEnt->label = m_labelText->GetValue().ToStdWstring(); + wxGetApp().getBookmarkMgr().updateActiveList(); } } @@ -1034,6 +1171,56 @@ void BookmarkView::onRenameGroup( wxCommandEvent& event ) { } +void BookmarkView::onAddRange( wxCommandEvent& event ) { + BookmarkRangeEntry *re = new BookmarkRangeEntry; + re->startFreq = wxGetApp().getAppFrame()->getViewCenterFreq() - (wxGetApp().getAppFrame()->getViewBandwidth()/2); + re->endFreq = wxGetApp().getAppFrame()->getViewCenterFreq() + (wxGetApp().getAppFrame()->getViewBandwidth()/2); + re->label = m_labelText->GetValue(); + wxGetApp().getBookmarkMgr().addRange(re); + wxGetApp().getBookmarkMgr().updateActiveList(); +} + + +void BookmarkView::onRemoveRange( wxCommandEvent& event ) { + if (editingLabel) { + return; + } + + TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); + + if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE) { + ActionDialog::showDialog(new ActionDialogRemoveRange(curSel->rangeEnt)); + } +} + + +void BookmarkView::onRenameRange( wxCommandEvent& event ) { + TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); + + if (!curSel || curSel->type != TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) { + return; + } + + wxString stringVal = ""; + stringVal = wxGetTextFromUser(BOOKMARK_VIEW_STR_RENAME_GROUP, "New Group Name", curSel->groupName); + + std::string newGroupName = stringVal.Trim().ToStdString(); + + if (newGroupName != "") { + wxGetApp().getBookmarkMgr().renameGroup(curSel->groupName, newGroupName); + wxGetApp().getBookmarkMgr().updateBookmarks(); + } +} + +void BookmarkView::onActivateRange( wxCommandEvent& event ) { + TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection()); + + if (curSel && curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE) { + activateRange(curSel->rangeEnt); + } +} + + void BookmarkView::onTreeBeginDrag( wxTreeEvent& event ) { TreeViewItem* tvi = dynamic_cast(m_treeView->GetItemData(event.GetItem())); @@ -1194,7 +1381,7 @@ void BookmarkView::onSearchText( wxCommandEvent& event ) { std::wstringstream searchTextLo(searchText); wstring tmp; - while(std::getline(searchTextLo, tmp, L';')) { + while(std::getline(searchTextLo, tmp, L' ')) { if (tmp.length() != 0 && tmp.find(L"search.") == wstring::npos) { searchKeywords.push_back(tmp); std::wcout << L"Keyword: " << tmp << '\n'; diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index b6264b7..bdbb4d3 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -11,16 +11,19 @@ public: TREEVIEW_ITEM_TYPE_GROUP, TREEVIEW_ITEM_TYPE_ACTIVE, TREEVIEW_ITEM_TYPE_RECENT, - TREEVIEW_ITEM_TYPE_BOOKMARK + TREEVIEW_ITEM_TYPE_BOOKMARK, + TREEVIEW_ITEM_TYPE_RANGE }; TreeViewItem() { bookmarkEnt = nullptr; demod = nullptr; + rangeEnt = nullptr; }; TreeViewItemType type; BookmarkEntry *bookmarkEnt; + BookmarkRangeEntry *rangeEnt; DemodulatorInstance *demod; std::string groupName; }; @@ -41,14 +44,6 @@ public: void updateBookmarks(); bool isKeywordMatch(std::wstring str, std::vector &keywords); void updateBookmarks(std::string group); - void activeSelection(DemodulatorInstance *dsel); - void bookmarkSelection(BookmarkEntry *bmSel); - void activateBookmark(BookmarkEntry *bmEnt); - void recentSelection(BookmarkEntry *bmSel); - void groupSelection(std::string groupName); - void bookmarkBranchSelection(); - void recentBranchSelection(); - void activeBranchSelection(); wxTreeItemId refreshBookmarks(); void updateTheme(); @@ -57,6 +52,17 @@ public: protected: + void activeSelection(DemodulatorInstance *dsel); + void bookmarkSelection(BookmarkEntry *bmSel); + void rangeSelection(BookmarkRangeEntry *re); + void activateBookmark(BookmarkEntry *bmEnt); + void activateRange(BookmarkRangeEntry *rangeEnt); + void recentSelection(BookmarkEntry *bmSel); + void groupSelection(std::string groupName); + void bookmarkBranchSelection(); + void recentBranchSelection(); + void rangeBranchSelection(); + void activeBranchSelection(); void hideProps(); void showProps(); @@ -116,12 +122,17 @@ protected: void onAddGroup( wxCommandEvent& event ); void onRemoveGroup( wxCommandEvent& event ); void onRenameGroup( wxCommandEvent& event ); - + + void onAddRange( wxCommandEvent& event ); + void onRemoveRange( wxCommandEvent& event ); + void onRenameRange( wxCommandEvent& event ); + void onActivateRange( wxCommandEvent& event ); + TreeViewItem *itemToTVI(wxTreeItemId item); std::atomic_bool mouseInView; - wxTreeItemId rootBranch, activeBranch, bookmarkBranch, recentBranch; + wxTreeItemId rootBranch, activeBranch, bookmarkBranch, recentBranch, rangeBranch; std::map expandState; @@ -144,6 +155,7 @@ protected: // Focus BookmarkEntry *nextEnt; + BookmarkRangeEntry *nextRange; DemodulatorInstance *nextDemod; // Search From cf056acfe644c67b11ff4d2df552b3f87051a365 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 27 Dec 2016 00:46:12 -0500 Subject: [PATCH 42/51] Load/Save view ranges --- src/BookmarkMgr.cpp | 32 ++++++++++++++++++++++++----- src/BookmarkMgr.h | 3 ++- src/forms/Bookmark/BookmarkView.cpp | 2 ++ src/util/DataTree.h | 1 + 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index f606b7d..b0efa06 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -12,17 +12,24 @@ void BookmarkMgr::saveToFile(std::string bookmarkFn) { DataTree s("cubicsdr_bookmarks"); DataNode *header = s.rootNode()->newChild("header"); header->newChild("version")->element()->set(wxString(CUBICSDR_VERSION).ToStdWstring()); - + + DataNode *view_ranges = s.rootNode()->newChild("ranges"); + + for (auto re_i : ranges) { + DataNode *range = view_ranges->newChild("range"); + *range->newChild("label") = re_i->label; + *range->newChild("freq") = re_i->freq; + *range->newChild("start") = re_i->startFreq; + *range->newChild("end") = re_i->endFreq; + } + DataNode *modems = s.rootNode()->newChild("modems"); - std::lock_guard < std::mutex > lockData(busy_lock); - for (auto &bmd_i : bmData) { DataNode *group = modems->newChild("group"); *group->newChild("@name") = bmd_i.first; for (auto &bm_i : bmd_i.second ) { - std::lock_guard < std::mutex > lockEnt(bm_i->busy_lock); group->newChildCloneFrom("modem", bm_i->node); } } @@ -34,7 +41,6 @@ void BookmarkMgr::saveToFile(std::string bookmarkFn) { } for (auto &r_i : this->recents) { - std::lock_guard < std::mutex > lockEnt(r_i->busy_lock); recent_modems->newChildCloneFrom("modem", r_i->node); } @@ -64,6 +70,22 @@ void BookmarkMgr::loadFromFile(std::string bookmarkFn) { // TODO: if exists; inform user & optionally load backup return; } + + if (s.rootNode()->hasAnother("ranges")) { + DataNode *view_ranges = s.rootNode()->getNext("ranges"); + while (view_ranges->hasAnother("range")) { + DataNode *range = view_ranges->getNext("range"); + + BookmarkRangeEntry *re = new BookmarkRangeEntry; + + range->getNext("label")->element()->get(re->label); + range->getNext("freq")->element()->get(re->freq); + range->getNext("start")->element()->get(re->startFreq); + range->getNext("end")->element()->get(re->endFreq); + + addRange(re); + } + } if (s.rootNode()->hasAnother("modems")) { DataNode *modems = s.rootNode()->getNext("modems"); diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 1663694..524b1b1 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -29,6 +29,7 @@ public: std::wstring label; + long long freq; long long startFreq; long long endFreq; }; @@ -47,7 +48,7 @@ struct BookmarkRangeEntryCompare : public std::binary_functionstartFreq < b->startFreq; + return a->freq < b->freq; } }; diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 0a15126..3834965 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -792,6 +792,7 @@ void BookmarkView::activateBookmark(BookmarkEntry *bmEnt) { void BookmarkView::activateRange(BookmarkRangeEntry *rangeEnt) { + wxGetApp().setFrequency(rangeEnt->freq); wxGetApp().getAppFrame()->setViewState(rangeEnt->startFreq + (rangeEnt->endFreq - rangeEnt->startFreq) / 2, rangeEnt->endFreq - rangeEnt->startFreq); } @@ -1173,6 +1174,7 @@ void BookmarkView::onRenameGroup( wxCommandEvent& event ) { void BookmarkView::onAddRange( wxCommandEvent& event ) { BookmarkRangeEntry *re = new BookmarkRangeEntry; + re->freq = wxGetApp().getFrequency(); re->startFreq = wxGetApp().getAppFrame()->getViewCenterFreq() - (wxGetApp().getAppFrame()->getViewBandwidth()/2); re->endFreq = wxGetApp().getAppFrame()->getViewCenterFreq() + (wxGetApp().getAppFrame()->getViewBandwidth()/2); re->label = m_labelText->GetValue(); diff --git a/src/util/DataTree.h b/src/util/DataTree.h index 5aee690..f2f3d28 100755 --- a/src/util/DataTree.h +++ b/src/util/DataTree.h @@ -293,6 +293,7 @@ public: operator vector () { vector v; element()->get(v); return v; } const string &operator= (const string &s) { element()->set(s); return s; } + const wstring &operator= (const wstring &s) { element()->set(s); return s; } char operator= (char i) { element()->set(i); return i; } unsigned char operator= (unsigned char i) { element()->set(i); return i; } From 69e23fd13af5f0603be25ab4fe29038dd2273e72 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 27 Dec 2016 00:59:51 -0500 Subject: [PATCH 43/51] Save expanded group states --- src/BookmarkMgr.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index b0efa06..5ae4c0d 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -28,6 +28,7 @@ void BookmarkMgr::saveToFile(std::string bookmarkFn) { for (auto &bmd_i : bmData) { DataNode *group = modems->newChild("group"); *group->newChild("@name") = bmd_i.first; + *group->newChild("@expanded") = (getExpandState(bmd_i.first)?std::string("true"):std::string("false")); for (auto &bm_i : bmd_i.second ) { group->newChildCloneFrom("modem", bm_i->node); @@ -91,10 +92,15 @@ void BookmarkMgr::loadFromFile(std::string bookmarkFn) { DataNode *modems = s.rootNode()->getNext("modems"); while (modems->hasAnother("group")) { DataNode *group = modems->getNext("group"); + std::string expandState = "true"; std::string groupName = "Unnamed"; if (group->hasAnother("@name")) { groupName = group->getNext("@name")->element()->toString(); } + if (group->hasAnother("@expanded")) { + expandState = group->getNext("@expanded")->element()->toString(); + } + setExpandState(groupName, (expandState == "true")); while (group->hasAnother("modem")) { DataNode *modem = group->getNext("modem"); BookmarkEntry *be = nodeToBookmark("modem", modem); From 68495b4d902671b464ddc654bc23bef6dcdbc861 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 27 Dec 2016 13:01:19 -0500 Subject: [PATCH 44/51] Dual bookmark backup files with user notification, auto-recovery and bail; save top level branch expand states --- src/AppFrame.cpp | 10 +++ src/AppFrame.h | 2 + src/BookmarkMgr.cpp | 96 +++++++++++++++++++++++++---- src/BookmarkMgr.h | 13 +++- src/CubicSDR.cpp | 78 ++++++++++++++++++++++- src/forms/Bookmark/BookmarkView.cpp | 31 ++++++++-- src/forms/Bookmark/BookmarkView.h | 4 ++ src/forms/Dialog/ActionDialog.cpp | 14 +++-- src/util/DataTree.cpp | 2 + 9 files changed, 222 insertions(+), 28 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 8aa5446..96c2882 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -678,6 +678,7 @@ AppFrame::AppFrame() : deviceChanged.store(false); devInfo = NULL; wxGetApp().deviceSelector(); + saveDisabled = false; // static const int attribs[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER, 0 }; // wxLogStatus("Double-buffered display %s supported", wxGLCanvas::IsDisplaySupported(attribs) ? "is" : "not"); @@ -1293,6 +1294,11 @@ void AppFrame::OnClose(wxCloseEvent& event) { } wxGetApp().getSpectrumProcessor()->removeOutput(spectrumCanvas->getVisualDataQueue()); + if (saveDisabled) { + event.Skip(); + return; + } + wxGetApp().getConfig()->setWindow(this->GetPosition(), this->GetClientSize()); wxGetApp().getConfig()->setWindowMaximized(this->IsMaximized()); wxGetApp().getConfig()->setTheme(ThemeMgr::mgr.getTheme()); @@ -1926,6 +1932,10 @@ BookmarkView *AppFrame::getBookmarkView() { return bookmarkView; } +void AppFrame::disableSave(bool state) { + saveDisabled = state; +} + #ifdef _WIN32 bool AppFrame::canFocus() { diff --git a/src/AppFrame.h b/src/AppFrame.h index cbb0d2c..fca2a7e 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -112,6 +112,7 @@ public: bool isUserDemodBusy(); BookmarkView *getBookmarkView(); + void disableSave(bool state); #ifdef _WIN32 bool canFocus(); @@ -204,6 +205,7 @@ private: std::string rigPort; int numRigs; bool rigInit; + bool saveDisabled; #endif wxDECLARE_EVENT_TABLE(); diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index 5ae4c0d..ad69746 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -8,11 +8,18 @@ BookmarkMgr::BookmarkMgr() { rangesSorted = false; } -void BookmarkMgr::saveToFile(std::string bookmarkFn) { +void BookmarkMgr::saveToFile(std::string bookmarkFn, bool backup) { DataTree s("cubicsdr_bookmarks"); DataNode *header = s.rootNode()->newChild("header"); header->newChild("version")->element()->set(wxString(CUBICSDR_VERSION).ToStdWstring()); + DataNode *branches = s.rootNode()->newChild("branches"); + + *branches->newChild("active") = wxGetApp().getAppFrame()->getBookmarkView()->getExpandState("active")?1:0; + *branches->newChild("range") = wxGetApp().getAppFrame()->getBookmarkView()->getExpandState("range")?1:0; + *branches->newChild("bookmark") = wxGetApp().getAppFrame()->getBookmarkView()->getExpandState("bookmark")?1:0; + *branches->newChild("recent") = wxGetApp().getAppFrame()->getBookmarkView()->getExpandState("recent")?1:0; + DataNode *view_ranges = s.rootNode()->newChild("ranges"); for (auto re_i : ranges) { @@ -50,7 +57,7 @@ void BookmarkMgr::saveToFile(std::string bookmarkFn) { if (saveFile.IsDirWritable()) { // Hopefully leave at least a readable backup in case of failure.. - if (saveFile.FileExists() && (!saveFileBackup.FileExists() || saveFileBackup.IsFileWritable())) { + if (backup && saveFile.FileExists() && (!saveFileBackup.FileExists() || saveFileBackup.IsFileWritable())) { wxCopyFile(saveFile.GetFullPath(wxPATH_NATIVE).ToStdString(), saveFileBackup.GetFullPath(wxPATH_NATIVE).ToStdString()); } s.SaveToFileXML(saveFile.GetFullPath(wxPATH_NATIVE).ToStdString()); @@ -58,20 +65,50 @@ void BookmarkMgr::saveToFile(std::string bookmarkFn) { } -void BookmarkMgr::loadFromFile(std::string bookmarkFn) { +bool BookmarkMgr::loadFromFile(std::string bookmarkFn, bool backup) { wxFileName loadFile(wxGetApp().getConfig()->getConfigDir(), bookmarkFn); + wxFileName failFile(wxGetApp().getConfig()->getConfigDir(), bookmarkFn + ".failedload"); + wxFileName lastLoaded(wxGetApp().getConfig()->getConfigDir(), bookmarkFn + ".lastloaded"); + wxFileName backupFile(wxGetApp().getConfig()->getConfigDir(), bookmarkFn + ".backup"); DataTree s; + bool loadStatusOk = true; - if (!loadFile.IsFileReadable()) { - return; + // Clear any active data + bmData.erase(bmData.begin(),bmData.end()); + recents.erase(recents.begin(),recents.end()); + ranges.erase(ranges.begin(),ranges.end()); + bmDataSorted.erase(bmDataSorted.begin(),bmDataSorted.end()); + + // File exists but is not readable + if (loadFile.FileExists() && !loadFile.IsFileReadable()) { + return false; } + // New instance of bookmark savefiles + if (backup && !loadFile.FileExists() && !lastLoaded.FileExists() && !backupFile.FileExists()) { + wxGetApp().getAppFrame()->getBookmarkView()->loadDefaultRanges(); + return true; + } + + // Attempt to load file if (!s.LoadFromFileXML(loadFile.GetFullPath(wxPATH_NATIVE).ToStdString())) { - // TODO: if exists; inform user & optionally load backup - return; + return false; } - + + if (s.rootNode()->hasAnother("branches")) { + DataNode *branches = s.rootNode()->getNext("branches"); + int bActive = 1, bRange = 0, bBookmark = 1, bRecent = 1; + if (branches->hasAnother("active")) branches->getNext("active")->element()->get(bActive); + if (branches->hasAnother("range")) branches->getNext("range")->element()->get(bRange); + if (branches->hasAnother("bookmark")) branches->getNext("bookmark")->element()->get(bBookmark); + if (branches->hasAnother("recent")) branches->getNext("recent")->element()->get(bRecent); + wxGetApp().getAppFrame()->getBookmarkView()->setExpandState("active", bActive?true:false); + wxGetApp().getAppFrame()->getBookmarkView()->setExpandState("range", bRange?true:false); + wxGetApp().getAppFrame()->getBookmarkView()->setExpandState("bookmark", bBookmark?true:false); + wxGetApp().getAppFrame()->getBookmarkView()->setExpandState("recent", bRecent?true:false); + } + if (s.rootNode()->hasAnother("ranges")) { DataNode *view_ranges = s.rootNode()->getNext("ranges"); while (view_ranges->hasAnother("range")) { @@ -79,10 +116,10 @@ void BookmarkMgr::loadFromFile(std::string bookmarkFn) { BookmarkRangeEntry *re = new BookmarkRangeEntry; - range->getNext("label")->element()->get(re->label); - range->getNext("freq")->element()->get(re->freq); - range->getNext("start")->element()->get(re->startFreq); - range->getNext("end")->element()->get(re->endFreq); + if (range->hasAnother("label")) range->getNext("label")->element()->get(re->label); + if (range->hasAnother("freq")) range->getNext("freq")->element()->get(re->freq); + if (range->hasAnother("start")) range->getNext("start")->element()->get(re->startFreq); + if (range->hasAnother("end")) range->getNext("end")->element()->get(re->endFreq); addRange(re); } @@ -108,6 +145,7 @@ void BookmarkMgr::loadFromFile(std::string bookmarkFn) { addBookmark(groupName.c_str(), be); } else { std::cout << "error loading bookmarked modem.." << std::endl; + loadStatusOk = false; } } } @@ -123,9 +161,39 @@ void BookmarkMgr::loadFromFile(std::string bookmarkFn) { addRecent(be); } else { std::cout << "error loading recent modem.." << std::endl; + loadStatusOk = false; } } } + + if (backup) { + if (loadStatusOk) { // Loaded OK; keep a copy + if (loadFile.IsDirWritable()) { + if (loadFile.FileExists() && (!lastLoaded.FileExists() || lastLoaded.IsFileWritable())) { + wxCopyFile(loadFile.GetFullPath(wxPATH_NATIVE).ToStdString(), lastLoaded.GetFullPath(wxPATH_NATIVE).ToStdString()); + } + } + } else if (!loadStatusOk) { + if (loadFile.IsDirWritable()) { // Load failed; keep a copy of the failed bookmark file for analysis? + if (loadFile.FileExists() && (!failFile.FileExists() || failFile.IsFileWritable())) { + wxCopyFile(loadFile.GetFullPath(wxPATH_NATIVE).ToStdString(), failFile.GetFullPath(wxPATH_NATIVE).ToStdString()); + } + } + } + } + + return loadStatusOk; +} + + +bool BookmarkMgr::hasLastLoad(std::string bookmarkFn) { + wxFileName lastLoaded(wxGetApp().getConfig()->getConfigDir(), bookmarkFn + ".lastloaded"); + return lastLoaded.FileExists() && lastLoaded.IsFileReadable(); +} + +bool BookmarkMgr::hasBackup(std::string bookmarkFn) { + wxFileName backupFile(wxGetApp().getConfig()->getConfigDir(), bookmarkFn + ".backup"); + return backupFile.FileExists() && backupFile.IsFileReadable(); } void BookmarkMgr::addBookmark(std::string group, DemodulatorInstance *demod) { @@ -419,7 +487,9 @@ BookmarkEntry *BookmarkMgr::nodeToBookmark(const char *name_in, DataNode *node) if (node->hasAnother("user_label")) { node->getNext("user_label")->element()->get(be->label); } - + + node->rewindAll(); + be->node = new DataNode("node",*node); return be; diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 524b1b1..34feaee 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -25,6 +25,12 @@ public: class BookmarkRangeEntry { public: + BookmarkRangeEntry() : label(L""), freq(0), startFreq(0), endFreq(0) { + + } + BookmarkRangeEntry(std::wstring label, long long freq, long long startFreq, long long endFreq) : label(label), freq(freq), startFreq(startFreq), endFreq(endFreq) { + } + std::mutex busy_lock; std::wstring label; @@ -63,8 +69,11 @@ class BookmarkMgr { public: BookmarkMgr(); - void saveToFile(std::string bookmarkFn); - void loadFromFile(std::string bookmarkFn); + void saveToFile(std::string bookmarkFn, bool backup = true); + bool loadFromFile(std::string bookmarkFn, bool backup = true); + + bool hasLastLoad(std::string bookmarkFn); + bool hasBackup(std::string bookmarkFn); void addBookmark(std::string group, DemodulatorInstance *demod); void addBookmark(std::string group, BookmarkEntry *be); diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index e8a7bf3..f5bebed 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -27,6 +27,9 @@ IMPLEMENT_APP(CubicSDR) #include #include +#include "ActionDialog.h" + + //#ifdef ENABLE_DIGITAL_LAB //// console output buffer for windows //#ifdef _WINDOWS @@ -133,8 +136,65 @@ long long strToFrequency(std::string freqStr) { } -CubicSDR::CubicSDR() : frequency(0), offset(0), ppm(0), snap(1), sampleRate(DEFAULT_SAMPLE_RATE),agcMode(false) - { + +class ActionDialogBookmarkCatastophe : public ActionDialog { +public: + ActionDialogBookmarkCatastophe() : ActionDialog(wxGetApp().getAppFrame(), wxID_ANY, wxT("Bookmark Last-Loaded Backup Failure :( :( :(")) { + m_questionText->SetLabelText(wxT("All attempts to recover bookmarks have failed. \nWould you like to exit without touching any more save files?\nClick OK to exit without saving; or Cancel to continue anyways.")); + } + + void doClickOK() { + wxGetApp().getAppFrame()->disableSave(true); + wxGetApp().getAppFrame()->Close(false); + } +}; + + + +class ActionDialogBookmarkBackupLoadFailed : public ActionDialog { +public: + ActionDialogBookmarkBackupLoadFailed() : ActionDialog(wxGetApp().getAppFrame(), wxID_ANY, wxT("Bookmark Backup Load Failure :( :(")) { + m_questionText->SetLabelText(wxT("Sorry; unable to load your bookmarks backup file. \nWould you like to attempt to load the last succssfully loaded bookmarks file?")); + } + + void doClickOK() { + if (wxGetApp().getBookmarkMgr().hasLastLoad("bookmarks.xml")) { + if (wxGetApp().getBookmarkMgr().loadFromFile("bookmarks.xml.lastloaded",false)) { + wxGetApp().getBookmarkMgr().updateBookmarks(); + wxGetApp().getBookmarkMgr().updateActiveList(); + } else { + ActionDialog::showDialog(new ActionDialogBookmarkCatastophe()); + } + } + } +}; + + +class ActionDialogBookmarkLoadFailed : public ActionDialog { +public: + ActionDialogBookmarkLoadFailed() : ActionDialog(wxGetApp().getAppFrame(), wxID_ANY, wxT("Bookmark Load Failure :(")) { + m_questionText->SetLabelText(wxT("Sorry; unable to load your bookmarks file. \nWould you like to attempt to load the backup file?")); + } + + void doClickOK() { + bool loadOk = false; + if (wxGetApp().getBookmarkMgr().hasBackup("bookmarks.xml")) { + loadOk = wxGetApp().getBookmarkMgr().loadFromFile("bookmarks.xml.backup",false); + } + if (loadOk) { + wxGetApp().getBookmarkMgr().updateBookmarks(); + wxGetApp().getBookmarkMgr().updateActiveList(); + } else if (wxGetApp().getBookmarkMgr().hasLastLoad("bookmarks.xml")) { + ActionDialog::showDialog(new ActionDialogBookmarkBackupLoadFailed()); + } else { + ActionDialog::showDialog(new ActionDialogBookmarkCatastophe()); + } + } +}; + + +CubicSDR::CubicSDR() : frequency(0), offset(0), ppm(0), snap(1), sampleRate(DEFAULT_SAMPLE_RATE), agcMode(false) +{ sampleRateInitialized.store(false); agcMode.store(true); soloMode.store(false); @@ -294,6 +354,19 @@ bool CubicSDR::OnInit() { // pthread_setschedparam(pthread_self(), main_policy, &main_param); //#endif + if (!wxGetApp().getBookmarkMgr().loadFromFile("bookmarks.xml")) { + if (wxGetApp().getBookmarkMgr().hasBackup("bookmarks.xml")) { + ActionDialog::showDialog(new ActionDialogBookmarkLoadFailed()); + } else if (wxGetApp().getBookmarkMgr().hasLastLoad("bookmarks.xml")) { + ActionDialog::showDialog(new ActionDialogBookmarkBackupLoadFailed()); + } else { + ActionDialog::showDialog(new ActionDialogBookmarkCatastophe()); + } + } else { + getBookmarkMgr().updateActiveList(); + getBookmarkMgr().updateBookmarks(); + } + return true; } @@ -405,7 +478,6 @@ bool CubicSDR::OnCmdLineParsed(wxCmdLineParser& parser) { } config.load(); - wxGetApp().getBookmarkMgr().loadFromFile("bookmarks.xml"); #ifdef BUNDLE_SOAPY_MODS if (parser.Found("b")) { diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 3834965..aecd3be 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -102,7 +102,7 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, recentBranch = m_treeView->AppendItem(rootBranch, "Recents"); expandState["active"] = true; - expandState["range"] = true; + expandState["range"] = false; expandState["bookmark"] = true; expandState["recent"] = true; @@ -579,6 +579,16 @@ bool BookmarkView::isMouseInView() { } +bool BookmarkView::getExpandState(std::string branchName) { + return expandState[branchName]; +} + + +void BookmarkView::setExpandState(std::string branchName, bool state) { + expandState[branchName] = state; +} + + void BookmarkView::hideProps() { m_frequencyLabel->Hide(); m_frequencyVal->Hide(); @@ -940,7 +950,7 @@ void BookmarkView::rangeBranchSelection() { clearButtons(); hideProps(); - m_labelText->Clear(); + m_labelText->SetValue(wxT("")); m_labelText->Show(); m_labelLabel->Show(); @@ -1386,7 +1396,7 @@ void BookmarkView::onSearchText( wxCommandEvent& event ) { while(std::getline(searchTextLo, tmp, L' ')) { if (tmp.length() != 0 && tmp.find(L"search.") == wstring::npos) { searchKeywords.push_back(tmp); - std::wcout << L"Keyword: " << tmp << '\n'; +// std::wcout << L"Keyword: " << tmp << '\n'; } } @@ -1406,6 +1416,7 @@ void BookmarkView::onSearchText( wxCommandEvent& event ) { void BookmarkView::onClearSearch( wxCommandEvent& event ) { + m_clearSearchButton->Hide(); m_searchText->SetValue(L"Search.."); m_treeView->SetFocus(); if (!searchKeywords.empty()) { @@ -1413,7 +1424,19 @@ void BookmarkView::onClearSearch( wxCommandEvent& event ) { } wxGetApp().getBookmarkMgr().updateActiveList(); wxGetApp().getBookmarkMgr().updateBookmarks(); - m_clearSearchButton->Hide(); refreshLayout(); } +void BookmarkView::loadDefaultRanges() { + wxGetApp().getBookmarkMgr().addRange(new BookmarkRangeEntry(L"160 Meters",1900000,1800000,2000000)); + wxGetApp().getBookmarkMgr().addRange(new BookmarkRangeEntry(L"80 Meters",3750000,3500000,4000000)); + wxGetApp().getBookmarkMgr().addRange(new BookmarkRangeEntry(L"60 Meters",5368500,5332000,5405000)); + wxGetApp().getBookmarkMgr().addRange(new BookmarkRangeEntry(L"40 Meters",7150000,7000000,7300000)); + wxGetApp().getBookmarkMgr().addRange(new BookmarkRangeEntry(L"30 Meters",10125000,10100000,10150000)); + wxGetApp().getBookmarkMgr().addRange(new BookmarkRangeEntry(L"20 Meters",14175000,14000000,14350000)); + wxGetApp().getBookmarkMgr().addRange(new BookmarkRangeEntry(L"17 Meters",18068180,17044180,19092180)); + wxGetApp().getBookmarkMgr().addRange(new BookmarkRangeEntry(L"15 Meters",21225000,21000000,21450000)); + wxGetApp().getBookmarkMgr().addRange(new BookmarkRangeEntry(L"12 Meters",24940000,24890000,24990000)); + wxGetApp().getBookmarkMgr().addRange(new BookmarkRangeEntry(L"10 Meters",28850000,28000000,29700000)); +} + diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index bdbb4d3..4ab2965 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -50,6 +50,10 @@ public: void onMenuItem(wxCommandEvent& event); bool isMouseInView(); + bool getExpandState(std::string branchName); + void setExpandState(std::string branchName, bool state); + + void loadDefaultRanges(); protected: void activeSelection(DemodulatorInstance *dsel); diff --git a/src/forms/Dialog/ActionDialog.cpp b/src/forms/Dialog/ActionDialog.cpp index 6cb6341..acb4b43 100644 --- a/src/forms/Dialog/ActionDialog.cpp +++ b/src/forms/Dialog/ActionDialog.cpp @@ -34,18 +34,20 @@ void ActionDialog::setActiveDialog(ActionDialog *dlg) { void ActionDialog::onClickCancel( wxCommandEvent& event ) { - doClickCancel(); - activeDialog->EndModal(0); + ActionDialog *dlg = activeDialog; ActionDialog::setActiveDialog(nullptr); - delete activeDialog; + dlg->EndModal(0); + doClickCancel(); + delete dlg; } void ActionDialog::onClickOK( wxCommandEvent& event ) { - doClickOK(); - activeDialog->EndModal(0); + ActionDialog *dlg = activeDialog; ActionDialog::setActiveDialog(nullptr); - delete activeDialog; + dlg->EndModal(0); + doClickOK(); + delete dlg; } diff --git a/src/util/DataTree.cpp b/src/util/DataTree.cpp index 293a8b8..850e257 100755 --- a/src/util/DataTree.cpp +++ b/src/util/DataTree.cpp @@ -561,6 +561,8 @@ DataNode *DataNode::newChildCloneFrom(const char *name_in, DataNode *cloneFrom) cloneNode->newChildCloneFrom(cNode->getName().c_str(), cNode); } + cloneFrom->rewind(); + return children.back(); } From 83cb2659fff813db681e039c2d06481622cd252b Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 27 Dec 2016 13:49:47 -0500 Subject: [PATCH 45/51] Search actives, return proper expansion states after search --- src/forms/Bookmark/BookmarkView.cpp | 34 +++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index aecd3be..d6f1386 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -230,6 +230,8 @@ wxTreeItemId BookmarkView::refreshBookmarks() { if (searchState || bmExpandState) { m_treeView->Expand(bookmarkBranch); + } else { + m_treeView->Collapse(bookmarkBranch); } for (auto gn_i : groupNames) { @@ -299,12 +301,29 @@ void BookmarkView::doUpdateActiveList() { wxTreeItemId selItem = nullptr; for (auto demod_i : demods) { + wxString activeLabel = BookmarkMgr::getActiveDisplayName(demod_i); + + if (searchState) { + std::string freqStr = frequencyToStr(demod_i->getFrequency()); + std::string bwStr = frequencyToStr(demod_i->getBandwidth()); + std::string mtype = demod_i->getDemodulatorType(); + + std::wstring fullText = activeLabel.ToStdWstring() + + L" " + demod_i->getDemodulatorUserLabel() + + L" " + std::to_wstring(demod_i->getFrequency()) + + L" " + std::wstring(freqStr.begin(),freqStr.end()) + + L" " + std::wstring(bwStr.begin(),bwStr.end()) + + L" " + std::wstring(mtype.begin(),mtype.end()); + + if (!isKeywordMatch(fullText, searchKeywords)) { + continue; + } + } + TreeViewItem* tvi = new TreeViewItem(); tvi->type = TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE; tvi->demod = demod_i; - - wxString activeLabel = BookmarkMgr::getActiveDisplayName(demod_i); - + wxTreeItemId itm = m_treeView->AppendItem(activeBranch,activeLabel); m_treeView->SetItemData(itm, tvi); @@ -316,7 +335,7 @@ void BookmarkView::doUpdateActiveList() { } } - bool rangeExpandState = expandState["range"]; + bool rangeExpandState = searchState?false:expandState["range"]; BookmarkRangeList bmRanges = wxGetApp().getBookmarkMgr().getRanges(); m_treeView->DeleteChildren(rangeBranch); @@ -394,13 +413,20 @@ void BookmarkView::doUpdateActiveList() { if (activeExpandState) { m_treeView->Expand(activeBranch); + } else { + m_treeView->Collapse(activeBranch); } if (recentExpandState) { m_treeView->Expand(recentBranch); + } else { + m_treeView->Collapse(recentBranch); } if (rangeExpandState) { m_treeView->Expand(rangeBranch); + } else { + m_treeView->Collapse(rangeBranch); } + if (selItem != nullptr) { m_treeView->SelectItem(selItem); } From 1ec92e0d9e54c521b4e027035e4bbd38f7708eab Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 27 Dec 2016 14:46:50 -0500 Subject: [PATCH 46/51] Update theme needs repaint; limit wxColour conversion --- src/forms/Bookmark/BookmarkView.cpp | 5 ++++- src/visual/ColorTheme.h | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index d6f1386..06f902f 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -153,6 +153,8 @@ void BookmarkView::updateTheme() { m_treeView->SetForegroundColour(textColor); m_propPanel->SetBackgroundColour(bgColor); + m_buttonPanel->SetBackgroundColour(bgColor); + m_propPanel->SetForegroundColour(textColor); m_labelLabel->SetForegroundColour(textColor); @@ -163,7 +165,7 @@ void BookmarkView::updateTheme() { m_modulationVal->SetForegroundColour(textColor); m_modulationLabel->SetForegroundColour(textColor); - m_buttonPanel->SetBackgroundColour(bgColor); + refreshLayout(); } @@ -653,6 +655,7 @@ void BookmarkView::showButtons() { void BookmarkView::refreshLayout() { GetSizer()->Layout(); Update(); + Refresh(); } diff --git a/src/visual/ColorTheme.h b/src/visual/ColorTheme.h index b4289d4..3e61d5b 100644 --- a/src/visual/ColorTheme.h +++ b/src/visual/ColorTheme.h @@ -42,9 +42,9 @@ public: operator wxColour() { return wxColour( - (unsigned char) (r * 255.0), - (unsigned char) (g * 255.0), - (unsigned char) (b * 255.0)); + (unsigned char) std::min((r * 255.0), 255.0), + (unsigned char) std::min((g * 255.0), 255.0), + (unsigned char) std::min((b * 255.0), 255.0)); } From 79c8c415e28bc8286a9449e15db4fa6fde586c92 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 27 Dec 2016 15:36:33 -0500 Subject: [PATCH 47/51] Show/Hide bookmarks option in display menu --- src/AppConfig.cpp | 16 ++++++++++++++++ src/AppConfig.h | 5 ++++- src/AppFrame.cpp | 22 +++++++++++++++++++++- src/AppFrame.h | 3 +++ src/forms/Bookmark/BookmarkView.cpp | 3 +++ 5 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/AppConfig.cpp b/src/AppConfig.cpp index a15441a..7f376e0 100644 --- a/src/AppConfig.cpp +++ b/src/AppConfig.cpp @@ -293,6 +293,7 @@ AppConfig::AppConfig() : configName("") { mainSplit = -1; visSplit = -1; bookmarkSplit = -1; + bookmarksVisible.store(true); #ifdef USE_HAMLIB rigEnabled.store(false); @@ -469,6 +470,14 @@ float AppConfig::getBookmarkSplit() { return bookmarkSplit.load(); } +void AppConfig::setBookmarksVisible(bool state) { + bookmarksVisible.store(state); +} + +bool AppConfig::getBookmarksVisible() { + return bookmarksVisible.load(); +} + void AppConfig::setConfigName(std::string configName) { this->configName = configName; @@ -520,6 +529,7 @@ bool AppConfig::save() { *window_node->newChild("main_split") = mainSplit.load(); *window_node->newChild("vis_split") = visSplit.load(); *window_node->newChild("bookmark_split") = bookmarkSplit.load(); + *window_node->newChild("bookmark_visible") = bookmarksVisible.load(); } DataNode *devices_node = cfg.rootNode()->newChild("devices"); @@ -695,6 +705,12 @@ bool AppConfig::load() { win_node->getNext("bookmark_split")->element()->get(gVal); bookmarkSplit.store(gVal); } + + if (win_node->hasAnother("bookmark_visible")) { + int bVal; + win_node->getNext("bookmark_visible")->element()->get(bVal); + bookmarksVisible.store(bVal); + } } if (cfg.rootNode()->hasAnother("devices")) { diff --git a/src/AppConfig.h b/src/AppConfig.h index cedff38..0eb8f3f 100644 --- a/src/AppConfig.h +++ b/src/AppConfig.h @@ -127,6 +127,9 @@ public: void setBookmarkSplit(float value); float getBookmarkSplit(); + void setBookmarksVisible(bool state); + bool getBookmarksVisible(); + #if USE_HAMLIB int getRigModel(); @@ -176,6 +179,6 @@ private: #if USE_HAMLIB std::atomic_int rigModel, rigRate; std::string rigPort; - std::atomic_bool rigEnabled, rigFollowMode, rigControlMode, rigCenterLock, rigFollowModem; + std::atomic_bool rigEnabled, rigFollowMode, rigControlMode, rigCenterLock, rigFollowModem, bookmarksVisible; #endif }; diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 96c2882..cb6407a 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -364,6 +364,11 @@ AppFrame::AppFrame() : bookmarkSplitter->SplitVertically( bookmarkView, mainVisSplitter ); mainSplitter->SplitHorizontally( demodPanel, bookmarkSplitter ); + + if (!wxGetApp().getConfig()->getBookmarksVisible()) { + bookmarkSplitter->Unsplit(bookmarkView); + bookmarkSplitter->Layout(); + } vbox->Add(mainSplitter, 1, wxEXPAND | wxALL, 0); @@ -523,6 +528,9 @@ AppFrame::AppFrame() : themeMenu->AppendRadioItem(wxID_THEME_HD, "HD")->Check(themeId==COLOR_THEME_HD); displayMenu->AppendSubMenu(themeMenu, wxT("&Color Scheme")); + + hideBookmarksItem = displayMenu->AppendCheckItem(wxID_DISPLAY_BOOKMARKS, wxT("Hide Bookmarks")); + hideBookmarksItem->Check(!wxGetApp().getConfig()->getBookmarksVisible()); GLFont::setScale((GLFont::GLFontScale)fontScale); @@ -1012,6 +1020,9 @@ void AppFrame::OnMenu(wxCommandEvent& event) { demodTuner->Refresh(); SetTitle(CUBICSDR_TITLE); currentSessionFile = ""; + bookmarkSplitter->Unsplit(bookmarkView); + bookmarkSplitter->SplitVertically( bookmarkView, mainVisSplitter, wxGetApp().getConfig()->getBookmarkSplit() ); + hideBookmarksItem->Check(false); } else if (event.GetId() == wxID_CLOSE || event.GetId() == wxID_EXIT) { Close(false); } else if (event.GetId() == wxID_THEME_DEFAULT) { @@ -1044,6 +1055,14 @@ void AppFrame::OnMenu(wxCommandEvent& event) { GLFont::setScale(GLFont::GLFONT_SCALE_LARGE); //force all windows refresh Refresh(); + } else if (event.GetId() == wxID_DISPLAY_BOOKMARKS) { + if (hideBookmarksItem->IsChecked()) { + bookmarkSplitter->Unsplit(bookmarkView); + bookmarkSplitter->Layout(); + } else { + bookmarkSplitter->SplitVertically( bookmarkView, mainVisSplitter, wxGetApp().getConfig()->getBookmarkSplit() ); + bookmarkSplitter->Layout(); + } } if (event.GetId() >= wxID_SETTINGS_BASE && event.GetId() < settingsIdMax) { @@ -1311,7 +1330,8 @@ void AppFrame::OnClose(wxCloseEvent& event) { wxGetApp().getConfig()->setModemPropsCollapsed(modemProps->isCollapsed()); wxGetApp().getConfig()->setMainSplit(mainSplitter->GetSashPosition()); wxGetApp().getConfig()->setVisSplit(mainVisSplitter->GetSashPosition()); - wxGetApp().getConfig()->setBookmarkSplit(bookmarkSplitter->GetSashPosition()); + if (!hideBookmarksItem->IsChecked()) wxGetApp().getConfig()->setBookmarkSplit(bookmarkSplitter->GetSashPosition()); + wxGetApp().getConfig()->setBookmarksVisible(!hideBookmarksItem->IsChecked()); #ifdef USE_HAMLIB wxGetApp().getConfig()->setRigEnabled(rigEnableMenuItem->IsChecked()); wxGetApp().getConfig()->setRigModel(rigModel); diff --git a/src/AppFrame.h b/src/AppFrame.h index fca2a7e..bb6f8b0 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -49,6 +49,8 @@ #define wxID_THEME_HD 2105 #define wxID_THEME_RADAR 2106 +#define wxID_DISPLAY_BOOKMARKS 2107 + #define wxID_BANDWIDTH_BASE 2150 #define wxID_BANDWIDTH_MANUAL 2200 @@ -196,6 +198,7 @@ private: wxMenuItem *rigCenterLockMenuItem; wxMenuItem *rigFollowModemMenuItem; wxMenuItem *sdrIFMenuItem; + wxMenuItem *hideBookmarksItem; std::map rigSerialMenuItems; std::map rigModelMenuItems; int rigModel; diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index 06f902f..e77523d 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -126,6 +126,9 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, void BookmarkView::onUpdateTimer( wxTimerEvent& event ) { + if (!this->IsShown()) { + return; + } if (doUpdateActive.load()) { doUpdateActiveList(); From 5c89a0783d552e791b6a2c931321516dbee6537d Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sun, 1 Jan 2017 23:51:37 -0500 Subject: [PATCH 48/51] Flip recent list; bundle mod path update; version bump --- CMakeLists.txt | 9 +++++---- src/BookmarkMgr.cpp | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 924ccb4..2237b54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,8 +6,8 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/") SET(CUBICSDR_VERSION_MAJOR "0") SET(CUBICSDR_VERSION_MINOR "2") -SET(CUBICSDR_VERSION_PATCH "0") -SET(CUBICSDR_VERSION_SUFFIX "") +SET(CUBICSDR_VERSION_PATCH "1") +SET(CUBICSDR_VERSION_SUFFIX "-alpha-bookmark1") SET(CUBICSDR_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}${CUBICSDR_VERSION_SUFFIX}") SET(CPACK_PACKAGE_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}") @@ -722,9 +722,10 @@ IF (APPLE AND BUNDLE_APP) # SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) IF (BUNDLE_SOAPY_MODS) - message(STATUS "SOAPY_ROOT: ${SOAPY_SDR_ROOT}") - file(GLOB SOAPY_MODS ${SOAPY_SDR_ROOT}/lib/SoapySDR/modules/*.so) + SET(SOAPY_SDR_MOD_PATH "${SOAPY_SDR_ROOT}/lib/SoapySDR/modules/${SOAPY_SDR_ABI_VERSION}") + + file(GLOB SOAPY_MODS ${SOAPY_MOD_PATH}/*.so) FOREACH(SOAPY_MOD_FILE ${SOAPY_MODS}) INSTALL( FILES "${SOAPY_MOD_FILE}" diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index ad69746..22e34c7 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -402,7 +402,8 @@ void BookmarkMgr::removeRecent(BookmarkEntry *be) { BookmarkList BookmarkMgr::getRecents() { - return recents; + + return BookmarkList(recents.rbegin(), recents.rend()); } From e971f551adeb6e61e9e741a37a733153468be8bc Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 2 Jan 2017 00:00:31 -0500 Subject: [PATCH 49/51] Set default bookmark sash pos --- src/AppConfig.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AppConfig.cpp b/src/AppConfig.cpp index 7f376e0..cc5ce84 100644 --- a/src/AppConfig.cpp +++ b/src/AppConfig.cpp @@ -292,7 +292,7 @@ AppConfig::AppConfig() : configName("") { modemPropsCollapsed.store(false); mainSplit = -1; visSplit = -1; - bookmarkSplit = -1; + bookmarkSplit = 200; bookmarksVisible.store(true); #ifdef USE_HAMLIB From 3cfb0154afa0675eb3261e61ebccdebf3c00f282 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 2 Jan 2017 01:29:27 -0500 Subject: [PATCH 50/51] Fix some header orders to make MSVC happy --- src/BookmarkMgr.h | 3 ++- src/forms/Bookmark/BookmarkView.cpp | 10 ++++++---- src/forms/Bookmark/BookmarkView.h | 6 ++++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h index 34feaee..101490c 100644 --- a/src/BookmarkMgr.h +++ b/src/BookmarkMgr.h @@ -1,8 +1,9 @@ #pragma once +#include + #include #include -#include #include "DemodulatorInstance.h" diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index e77523d..6ce6571 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -1,11 +1,13 @@ +#include +#include + +#include +#include + #include "BookmarkView.h" #include "CubicSDR.h" #include "ActionDialog.h" -#include -#include -#include -#include #define wxCONTEXT_ADD_GROUP_ID 1000 diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index 4ab2965..1307633 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -1,9 +1,11 @@ #pragma once +#include "wx/choice.h" +#include "wx/dialog.h" + #include "BookmarkPanel.h" #include "BookmarkMgr.h" -#include "wx/choice.h" -#include "wx/dialog.h" + class TreeViewItem : public wxTreeItemData { public: From 591610062adaf100c13f1b833cb4fb2e0f9af54e Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 2 Jan 2017 01:37:22 -0500 Subject: [PATCH 51/51] Bundle mod folder update --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2237b54..d54217f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -934,7 +934,7 @@ IF (WIN32 AND BUILD_INSTALLER) ENDIF() file(GLOB SOAPY_BINS ${SOAPY_SDR_ROOT}/bin/*.dll) - file(GLOB SOAPY_MODS ${SOAPY_SDR_ROOT}/lib/SoapySDR/modules/*.dll) + file(GLOB SOAPY_MODS ${SOAPY_SDR_ROOT}/lib/SoapySDR/modules${SOAPY_SDR_ABI_VERSION}/*.dll) message(STATUS "SOAPY_BINS: ${SOAPY_BINS}") message(STATUS "SOAPY_MODS: ${SOAPY_MODS}") install(FILES ${SOAPY_BINS} DESTINATION .)