From 03c8619c5a203afc04c018d10b73411e10b0951e Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 19 Aug 2015 17:06:06 -0400 Subject: [PATCH] Carry / preset mute state; mute button visual tweaks --- src/AppFrame.cpp | 15 +++++++++++++++ src/demod/DemodulatorMgr.cpp | 9 +++++++++ src/demod/DemodulatorMgr.h | 5 ++++- src/visual/ModeSelectorCanvas.cpp | 28 ++++++++++++++++++++++------ src/visual/ModeSelectorCanvas.h | 6 ++++++ src/visual/ModeSelectorContext.cpp | 12 +++++++++--- src/visual/ModeSelectorContext.h | 2 +- src/visual/WaterfallCanvas.cpp | 1 + 8 files changed, 67 insertions(+), 11 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index d4ac828..e843109 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -115,6 +115,8 @@ AppFrame::AppFrame() : demodMuteButton = new ModeSelectorCanvas(this, attribList); demodMuteButton->addChoice(1, "M"); + demodMuteButton->setPadding(-1,-1); + demodMuteButton->setHighlightColor(RGBA4f(0.8,0.2,0.2)); demodMuteButton->setHelpTip("Demodulator Mute Toggle"); demodMuteButton->setToggleMode(true); @@ -492,6 +494,7 @@ void AppFrame::OnMenu(wxCommandEvent& event) { wxGetApp().setFrequency(100000000); wxGetApp().getDemodMgr().setLastDemodulatorType(DEMOD_TYPE_FM); demodModeSelector->setSelection(1); + wxGetApp().getDemodMgr().setLastMuted(false); wxGetApp().getDemodMgr().setLastStereo(false); wxGetApp().getDemodMgr().setLastBandwidth(DEFAULT_DEMOD_BW); wxGetApp().getDemodMgr().setLastGain(1.0); @@ -716,12 +719,15 @@ void AppFrame::OnIdle(wxIdleEvent& event) { } else if (!demod->isMuted() && muteMode == 1) { demod->setMuted(true); } + wxGetApp().getDemodMgr().setLastMuted(demod->isMuted()); demodMuteButton->clearModeChanged(); } else { if (demod->isMuted() && muteMode == -1) { demodMuteButton->setSelection(1); + wxGetApp().getDemodMgr().setLastMuted(demod->isMuted()); } else if (!demod->isMuted() && muteMode == 1) { demodMuteButton->setSelection(-1); + wxGetApp().getDemodMgr().setLastMuted(demod->isMuted()); } } @@ -762,6 +768,15 @@ void AppFrame::OnIdle(wxIdleEvent& event) { spectrumCanvas->setCenterFrequency(wxGetApp().getFrequency()); waterfallCanvas->setCenterFrequency(wxGetApp().getFrequency()); } + if (demodMuteButton->modeChanged()) { + int muteMode = demodMuteButton->getSelection(); + if (muteMode == -1) { + wxGetApp().getDemodMgr().setLastMuted(false); + } else if (muteMode == 1) { + wxGetApp().getDemodMgr().setLastMuted(true); + } + demodMuteButton->clearModeChanged(); + } } if (demodTuner->getMouseTracker()->mouseInView()) { diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp index 4a9a11d..4d0671e 100644 --- a/src/demod/DemodulatorMgr.cpp +++ b/src/demod/DemodulatorMgr.cpp @@ -223,3 +223,12 @@ void DemodulatorMgr::setLastStereo(bool lastStereo) { this->lastStereo = lastStereo; } + +bool DemodulatorMgr::isLastMuted() const { + return lastMuted; +} + +void DemodulatorMgr::setLastMuted(bool lastMuted) { + this->lastMuted = lastMuted; +} + diff --git a/src/demod/DemodulatorMgr.h b/src/demod/DemodulatorMgr.h index 24baeb1..56f752f 100644 --- a/src/demod/DemodulatorMgr.h +++ b/src/demod/DemodulatorMgr.h @@ -40,6 +40,9 @@ public: bool isLastStereo() const; void setLastStereo(bool lastStereo); + bool isLastMuted() const; + void setLastMuted(bool lastMuted); + private: void garbageCollect(); void updateLastState(); @@ -55,5 +58,5 @@ private: bool lastSquelchEnabled; float lastSquelch; float lastGain; - bool lastStereo; + bool lastStereo, lastMuted; }; diff --git a/src/visual/ModeSelectorCanvas.cpp b/src/visual/ModeSelectorCanvas.cpp index c26de45..425fad6 100644 --- a/src/visual/ModeSelectorCanvas.cpp +++ b/src/visual/ModeSelectorCanvas.cpp @@ -25,9 +25,11 @@ EVT_ENTER_WINDOW(ModeSelectorCanvas::OnMouseEnterWindow) wxEND_EVENT_TABLE() ModeSelectorCanvas::ModeSelectorCanvas(wxWindow *parent, int *attribList) : -InteractiveCanvas(parent, attribList), numChoices(0), currentSelection(-1), toggleMode(false), inputChanged(false) { +InteractiveCanvas(parent, attribList), numChoices(0), currentSelection(-1), toggleMode(false), inputChanged(false), padX(4.0), padY(4.0), highlightOverride(false) { glContext = new ModeSelectorContext(this, &wxGetApp().GetContext(this)); + + highlightColor = RGBA4f(1.0,1.0,1.0,1.0); } ModeSelectorCanvas::~ModeSelectorCanvas() { @@ -59,10 +61,15 @@ void ModeSelectorCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { int yval = getHoveredSelection(); for (int i = 0; i < numChoices; i++) { - if (yval == i) { - glContext->DrawSelector(selections[i].label, i, numChoices, true, ThemeMgr::mgr.currentTheme->buttonHighlight.r, ThemeMgr::mgr.currentTheme->buttonHighlight.g, ThemeMgr::mgr.currentTheme->buttonHighlight.b, 1.0); + if (yval == i && !highlightOverride) { + RGBA4f hc = ThemeMgr::mgr.currentTheme->buttonHighlight; + glContext->DrawSelector(selections[i].label, i, numChoices, true, hc.r, hc.g, hc.b, 1.0, padX, padY); } else { - glContext->DrawSelector(selections[i].label, i, numChoices, i == currentSelection, ThemeMgr::mgr.currentTheme->button.r, ThemeMgr::mgr.currentTheme->button.g, ThemeMgr::mgr.currentTheme->button.b, 1.0); + RGBA4f hc = ThemeMgr::mgr.currentTheme->button; + if (highlightOverride) { + hc = highlightColor; + } + glContext->DrawSelector(selections[i].label, i, numChoices, i == currentSelection, hc.r, hc.g, hc.b, 1.0, padX, padY); } } @@ -112,7 +119,7 @@ void ModeSelectorCanvas::OnMouseReleased(wxMouseEvent& event) { currentSelection = selectedButton; - SetCursor (wxCURSOR_ARROW); + SetCursor (wxCURSOR_HAND); } void ModeSelectorCanvas::OnMouseLeftWindow(wxMouseEvent& event) { @@ -123,7 +130,7 @@ void ModeSelectorCanvas::OnMouseLeftWindow(wxMouseEvent& event) { void ModeSelectorCanvas::OnMouseEnterWindow(wxMouseEvent& event) { InteractiveCanvas::mouseTracker.OnMouseEnterWindow(event); - SetCursor (wxCURSOR_ARROW); + SetCursor (wxCURSOR_HAND); if (!helpTip.empty()) { setStatusText(helpTip); } @@ -171,3 +178,12 @@ void ModeSelectorCanvas::clearModeChanged() { inputChanged = false; } +void ModeSelectorCanvas::setPadding(float padX, float padY) { + this->padX = padX; + this->padY = padY; +} + +void ModeSelectorCanvas::setHighlightColor(RGBA4f hc) { + this->highlightColor = hc; + this->highlightOverride = true; +} diff --git a/src/visual/ModeSelectorCanvas.h b/src/visual/ModeSelectorCanvas.h index 68de86e..2c76294 100644 --- a/src/visual/ModeSelectorCanvas.h +++ b/src/visual/ModeSelectorCanvas.h @@ -40,6 +40,9 @@ public: bool modeChanged(); void clearModeChanged(); + void setPadding(float padX, float padY); + void setHighlightColor(RGBA4f hc); + private: void setNumChoices(int numChoices_in); @@ -61,6 +64,9 @@ private: bool toggleMode; bool inputChanged; std::vector selections; + float padX, padY; + RGBA4f highlightColor; + bool highlightOverride; // wxDECLARE_EVENT_TABLE(); }; diff --git a/src/visual/ModeSelectorContext.cpp b/src/visual/ModeSelectorContext.cpp index 2e0f2eb..d92b06b 100644 --- a/src/visual/ModeSelectorContext.cpp +++ b/src/visual/ModeSelectorContext.cpp @@ -22,7 +22,7 @@ void ModeSelectorContext::DrawBegin() { glDisable(GL_TEXTURE_2D); } -void ModeSelectorContext::DrawSelector(std::string label, int c, int cMax, bool on, float r, float g, float b, float a) { +void ModeSelectorContext::DrawSelector(std::string label, int c, int cMax, bool on, float r, float g, float b, float a, float px, float py) { GLint vp[4]; glGetIntegerv( GL_VIEWPORT, vp); @@ -42,15 +42,21 @@ void ModeSelectorContext::DrawSelector(std::string label, int c, int cMax, bool float y = 1.0 - ((float) (c+1) / (float) cMax * 2.0); float height = (2.0 / (float) cMax); - float padX = (4.0 / viewWidth); - float padY = (4.0 / viewHeight); + float padX = (px / viewWidth); + float padY = (py / viewHeight); + if (a < 1.0) { + glEnable(GL_BLEND); + } glBegin(on?GL_QUADS:GL_LINE_LOOP); glVertex2f(-1.0 + padX, y + padY); glVertex2f(1.0 - padX, y + padY); glVertex2f(1.0 - padX, y + height - padY); glVertex2f(-1.0 + padX, y + height - padY); glEnd(); + if (a < 1.0) { + glDisable(GL_BLEND); + } if (on) { glColor4f(0, 0, 0, a); diff --git a/src/visual/ModeSelectorContext.h b/src/visual/ModeSelectorContext.h index 0e66e44..2d84fa3 100644 --- a/src/visual/ModeSelectorContext.h +++ b/src/visual/ModeSelectorContext.h @@ -12,6 +12,6 @@ public: ModeSelectorContext(ModeSelectorCanvas *canvas, wxGLContext *sharedContext); void DrawBegin(); - void DrawSelector(std::string label, int c, int cMax, bool on, float r, float g, float b, float a); + void DrawSelector(std::string label, int c, int cMax, bool on, float r, float g, float b, float a, float padx, float pady); void DrawEnd(); }; diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index bc3140f..108a1e2 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -612,6 +612,7 @@ void WaterfallCanvas::OnMouseReleased(wxMouseEvent& event) { demod->setSquelchEnabled(mgr->isLastSquelchEnabled()); demod->setStereo(mgr->isLastStereo()); demod->setGain(mgr->getLastGain()); + demod->setMuted(mgr->isLastMuted()); demod->run();