From c9cde48f212b3f7019b2e455a893c40bb7e52683 Mon Sep 17 00:00:00 2001 From: lllucius Date: Sat, 3 Jan 2015 09:29:42 +0000 Subject: [PATCH] Open popup menu under icon when using context menu key --- src/widgets/Meter.cpp | 43 +++++++++++++++++++++++++++++++++++++------ src/widgets/Meter.h | 5 +++-- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/widgets/Meter.cpp b/src/widgets/Meter.cpp index 264c34636..a16f00149 100644 --- a/src/widgets/Meter.cpp +++ b/src/widgets/Meter.cpp @@ -190,6 +190,7 @@ enum { BEGIN_EVENT_TABLE(Meter, wxPanel) EVT_TIMER(OnMeterUpdateID, Meter::OnMeterUpdate) EVT_MOUSE_EVENTS(Meter::OnMouse) + EVT_KEY_DOWN(Meter::OnKeyDown) EVT_ERASE_BACKGROUND(Meter::OnErase) EVT_PAINT(Meter::OnPaint) EVT_SIZE(Meter::OnSize) @@ -665,10 +666,12 @@ void Meter::OnMouse(wxMouseEvent &evt) menu->Append(OnPreferencesID, _("Preferences...")); - if (evt.RightDown()) - PopupMenu(menu, evt.m_x, evt.m_y); - else - PopupMenu(menu, mIconRect.x + 1, mIconRect.y + mIconRect.height + 1); + if (evt.RightDown()) { + ShowMenu(evt.GetPosition()); + } + else { + ShowMenu(wxPoint(mIconRect.x + 1, mIconRect.y + mIconRect.height + 1)); + } delete menu; } @@ -687,7 +690,15 @@ void Meter::OnMouse(wxMouseEvent &evt) } } -void Meter::SetStyle(Meter::Style newStyle) +void Meter::OnKeyDown(wxKeyEvent &evt) +{ + if (evt.GetKeyCode() == WXK_WINDOWS_MENU) + { + ShowMenu(wxPoint(mIconRect.x + 1, mIconRect.y + mIconRect.height + 1)); + } +} + +void Meter::SetStyle(Style newStyle) { if (mStyle != newStyle && mDesiredStyle == AutomaticStereo) { @@ -1775,9 +1786,29 @@ void Meter::RestoreState(void *state) } // -// Pop-up menu handlers +// Pop-up menu // +void Meter::ShowMenu(const wxPoint & pos) +{ + wxMenu *menu = new wxMenu(); + // Note: these should be kept in the same order as the enum + if (mIsInput) { + wxMenuItem *mi; + if (mMonitoring) + mi = menu->Append(OnMonitorID, _("Stop Monitoring")); + else + mi = menu->Append(OnMonitorID, _("Start Monitoring")); + mi->Enable(!mActive || mMonitoring); + } + + menu->Append(OnPreferencesID, _("Preferences...")); + + PopupMenu(menu, pos); + + delete menu; +} + void Meter::OnMonitor(wxCommandEvent & WXUNUSED(event)) { StartMonitoring(); diff --git a/src/widgets/Meter.h b/src/widgets/Meter.h index fd2026a44..6be882a62 100644 --- a/src/widgets/Meter.h +++ b/src/widgets/Meter.h @@ -183,6 +183,7 @@ class Meter : public wxPanel void OnPaint(wxPaintEvent &evt); void OnSize(wxSizeEvent &evt); void OnMouse(wxMouseEvent &evt); + void OnKeyDown(wxKeyEvent &evt); void OnAudioIOStatus(wxCommandEvent &evt); @@ -197,9 +198,9 @@ class Meter : public wxPanel wxFont GetFont() const; // - // Pop-up menu handlers + // Pop-up menu // - + void ShowMenu(const wxPoint & pos); void OnMonitor(wxCommandEvent &evt); void OnPreferences(wxCommandEvent &evt); void OnMeterPrefsUpdated(wxCommandEvent &evt);