diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 205f6d6..212e9f8 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -1582,6 +1582,8 @@ int AppFrame::OnGlobalKeyDown(wxKeyEvent &event) { return -1; } + DemodulatorInstance *demod = nullptr, *lastDemod = wxGetApp().getDemodMgr().getLastActiveDemodulator(); + switch (event.GetKeyCode()) { case WXK_UP: case WXK_NUMPAD_UP: @@ -1611,6 +1613,21 @@ int AppFrame::OnGlobalKeyDown(wxKeyEvent &event) { wxGetApp().showFrequencyInput(getFrequencyDialogTarget(), std::to_string(event.GetKeyCode() - '0')); return 1; break; + case WXK_TAB: + lastDemod = wxGetApp().getDemodMgr().getLastActiveDemodulator(); + if (!lastDemod) { + break; + } + if (event.ShiftDown()) { + demod = wxGetApp().getDemodMgr().getPreviousDemodulator(lastDemod); + } else { + demod = wxGetApp().getDemodMgr().getNextDemodulator(lastDemod); + } + if (demod) { + wxGetApp().getDemodMgr().setActiveDemodulator(nullptr); + wxGetApp().getDemodMgr().setActiveDemodulator(demod, false); + } + break; default: break; } diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp index 8ee7262..932b72d 100644 --- a/src/demod/DemodulatorMgr.cpp +++ b/src/demod/DemodulatorMgr.cpp @@ -4,6 +4,10 @@ #include "CubicSDR.h" #include #include +#include + +bool demodFreqCompare (DemodulatorInstance *i, DemodulatorInstance *j) { return (i->getFrequency()getFrequency()); } +bool inactiveCompare (DemodulatorInstance *i, DemodulatorInstance *j) { return (i->isActive()isActive()); } DemodulatorMgr::DemodulatorMgr() : activeDemodulator(NULL), lastActiveDemodulator(NULL), activeVisualDemodulator(NULL), lastBandwidth(DEFAULT_DEMOD_BW), lastDemodType( @@ -38,6 +42,69 @@ std::vector &DemodulatorMgr::getDemodulators() { return demods; } +std::vector DemodulatorMgr::getOrderedDemodulators(bool actives) { + std::vector demods_ordered = demods; + if (actives) { + std::sort(demods_ordered.begin(), demods_ordered.end(), inactiveCompare); + std::vector::iterator i; + for (i = demods_ordered.begin(); i != demods_ordered.end(); i++) { + if ((*i)->isActive()) { + break; + } + } + if (i == demods_ordered.end()) { + demods_ordered.erase(demods_ordered.begin(), demods_ordered.end()); + } else if ((*i) != demods_ordered.front()) { + demods_ordered.erase(demods_ordered.begin(), i); + } + } + std::sort(demods_ordered.begin(), demods_ordered.end(), demodFreqCompare); + return demods_ordered; +} + +DemodulatorInstance *DemodulatorMgr::getPreviousDemodulator(DemodulatorInstance *demod, bool actives) { + if (!getLastActiveDemodulator()) { + return nullptr; + } + std::vector demods_ordered = getOrderedDemodulators(actives); + std::vector::iterator p = std::find(demods_ordered.begin(), demods_ordered.end(), demod); + if (p == demods_ordered.end()) { + return nullptr; + } + if (*p == demods_ordered.front()) { + return demods_ordered.back(); + } + return *(--p); +} + +DemodulatorInstance *DemodulatorMgr::getNextDemodulator(DemodulatorInstance *demod, bool actives) { + if (!getLastActiveDemodulator()) { + return nullptr; + } + std::vector demods_ordered = getOrderedDemodulators(actives); + std::vector::iterator p = std::find(demods_ordered.begin(), demods_ordered.end(), demod); + if (actives) { + + } + if (p == demods_ordered.end()) { + return nullptr; + } + if (*p == demods_ordered.back()) { + return demods_ordered.front(); + } + return *(++p); +} + +DemodulatorInstance *DemodulatorMgr::getLastDemodulator() { + std::vector demods_ordered = getOrderedDemodulators(); + return *(demods_ordered.end()); +} + +DemodulatorInstance *DemodulatorMgr::getFirstDemodulator() { + std::vector demods_ordered = getOrderedDemodulators(); + return *(demods_ordered.begin()); +} + void DemodulatorMgr::deleteThread(DemodulatorInstance *demod) { std::vector::iterator i; diff --git a/src/demod/DemodulatorMgr.h b/src/demod/DemodulatorMgr.h index aac1b4f..780d7d3 100644 --- a/src/demod/DemodulatorMgr.h +++ b/src/demod/DemodulatorMgr.h @@ -13,7 +13,12 @@ public: DemodulatorInstance *newThread(); std::vector &getDemodulators(); + std::vector getOrderedDemodulators(bool actives = true); std::vector *getDemodulatorsAt(long long freq, int bandwidth); + DemodulatorInstance *getPreviousDemodulator(DemodulatorInstance *demod, bool actives = true); + DemodulatorInstance *getNextDemodulator(DemodulatorInstance *demod, bool actives = true); + DemodulatorInstance *getLastDemodulator(); + DemodulatorInstance *getFirstDemodulator(); bool anyDemodulatorsAt(long long freq, int bandwidth); void deleteThread(DemodulatorInstance *);