From 197700967ffbfceca46e43a48c673b2398736226 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Mon, 22 Jun 2015 23:56:36 -0400 Subject: [PATCH 1/2] pop-up menus for vertical ruler --- src/TrackPanel.cpp | 121 +++++++++++++++++++++++++++++++++++++++++++++ src/TrackPanel.h | 8 +++ 2 files changed, 129 insertions(+) diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index d9cb8d247..abc0cae26 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -344,6 +344,14 @@ enum { OnTimeTrackLinID, OnTimeTrackLogID, OnTimeTrackLogIntID, + + // Reserve an ample block of ids for waveform scale types + OnFirstWaveformScaleID, + OnLastWaveformScaleID = OnFirstWaveformScaleID + 9, + + // Reserve an ample block of ids for spectrum scale types + OnFirstSpectrumScaleID, + OnLastSpectrumScaleID = OnFirstSpectrumScaleID + 19, }; BEGIN_EVENT_TABLE(TrackPanel, wxWindow) @@ -385,6 +393,9 @@ BEGIN_EVENT_TABLE(TrackPanel, wxWindow) EVT_MENU(OnTimeTrackLinID, TrackPanel::OnTimeTrackLin) EVT_MENU(OnTimeTrackLogID, TrackPanel::OnTimeTrackLog) EVT_MENU(OnTimeTrackLogIntID, TrackPanel::OnTimeTrackLogInt) + + EVT_MENU_RANGE(OnFirstWaveformScaleID, OnLastWaveformScaleID, TrackPanel::OnWaveformScaleType) + EVT_MENU_RANGE(OnFirstSpectrumScaleID, OnLastSpectrumScaleID, TrackPanel::OnSpectrumScaleType) END_EVENT_TABLE() /// Makes a cursor from an XPM, uses CursorId as a fallback. @@ -552,6 +563,8 @@ TrackPanel::TrackPanel(wxWindow * parent, wxWindowID id, mLabelTrackInfoMenu = NULL; mTimeTrackMenu = NULL; + mRulerWaveformMenu = mRulerSpectrumMenu = NULL; + BuildMenus(); mTrackArtist = new TrackArtist(); @@ -764,6 +777,16 @@ void TrackPanel::BuildMenus(void) mLabelTrackInfoMenu->Append(OnCopySelectedTextID, _("&Copy")); mLabelTrackInfoMenu->Append(OnPasteSelectedTextID, _("&Paste")); mLabelTrackInfoMenu->Append(OnDeleteSelectedLabelID, _("&Delete Label")); + + mRulerWaveformMenu = new wxMenu(); + BuildVRulerMenuItems + (mRulerWaveformMenu, OnFirstWaveformScaleID, + WaveformSettings::GetScaleNames()); + + mRulerSpectrumMenu = new wxMenu(); + BuildVRulerMenuItems + (mRulerSpectrumMenu, OnFirstSpectrumScaleID, + SpectrogramSettings::GetScaleNames()); } void TrackPanel::BuildCommonDropMenuItems(wxMenu * menu) @@ -778,6 +801,15 @@ void TrackPanel::BuildCommonDropMenuItems(wxMenu * menu) } +// static +void TrackPanel::BuildVRulerMenuItems +(wxMenu * menu, int firstId, const wxArrayString &names) +{ + int id = firstId; + for (int ii = 0, nn = names.size(); ii < nn; ++ii) + menu->AppendRadioItem(id++, names[ii]); +} + void TrackPanel::DeleteMenus(void) { // Note that the submenus (mRateMenu, ...) @@ -806,6 +838,9 @@ void TrackPanel::DeleteMenus(void) delete mTimeTrackMenu; mTimeTrackMenu = NULL; } + + delete mRulerWaveformMenu; + delete mRulerSpectrumMenu; } #ifdef EXPERIMENTAL_OUTPUT_DISPLAY @@ -4610,10 +4645,17 @@ void TrackPanel::HandleVZoomButtonUp( wxMouseEvent & event ) } #endif + // don't do anything if track is not wave if (mCapturedTrack->GetKind() != Track::Wave) return; + if (event.RightUp() && + !(event.ShiftDown() || event.CmdDown())) { + OnVRulerMenu(mCapturedTrack, &event); + return; + } + WaveTrack *track = static_cast(mCapturedTrack); WaveTrack *partner = static_cast(mTracks->GetLink(track)); int height = track->GetHeight(); @@ -8482,6 +8524,51 @@ void TrackPanel::OnTrackMenu(Track *t) Refresh(false); } +void TrackPanel::OnVRulerMenu(Track *t, wxMouseEvent *pEvent) +{ + if (!t) { + t = GetFocusedTrack(); + if (!t) + return; + } + + if (t->GetKind() != Track::Wave) + return; + + WaveTrack *const wt = static_cast(t); + + const int display = wt->GetDisplay(); + wxMenu *theMenu; + if (display == WaveTrack::Waveform) { + theMenu = mRulerWaveformMenu; + const int id = + OnFirstWaveformScaleID + int(wt->GetWaveformSettings().scaleType); + theMenu->Check(id, true); + } + else { + theMenu = mRulerSpectrumMenu; + const int id = + OnFirstSpectrumScaleID + int(wt->GetSpectrogramSettings().scaleType); + theMenu->Check(id, true); + } + + int x, y; + if (pEvent) + x = pEvent->m_x, y = pEvent->m_y; + else { + // If no event given, pop up the menu at the same height + // as for the track control menu + const wxRect r = FindTrackRect(wt, true); + wxRect titleRect; + mTrackInfo.GetTitleBarRect(r, titleRect); + x = GetVRulerOffset(), y = titleRect.y + titleRect.height + 1; + } + + mPopupMenuTarget = wt; + PopupMenu(theMenu, x, y); + mPopupMenuTarget = NULL; +} + void TrackPanel::OnTrackMute(bool shiftDown, Track *t) { if (!t) { @@ -9266,6 +9353,40 @@ void TrackPanel::OnTimeTrackLogInt(wxCommandEvent & /*event*/) Refresh(false); } +void TrackPanel::OnWaveformScaleType(wxCommandEvent &evt) +{ + WaveTrack *const wt = static_cast(mPopupMenuTarget); + const WaveformSettings::ScaleType newScaleType = + WaveformSettings::ScaleType( + std::max(0, + std::min(int(WaveformSettings::stNumScaleTypes) - 1, + evt.GetId() - OnFirstWaveformScaleID + ))); + if (wt->GetWaveformSettings().scaleType != newScaleType) { + wt->GetIndependentWaveformSettings().scaleType = newScaleType; + UpdateVRuler(wt); // Is this really needed? + MakeParentModifyState(true); + Refresh(false); + } +} + +void TrackPanel::OnSpectrumScaleType(wxCommandEvent &evt) +{ + WaveTrack *const wt = static_cast(mPopupMenuTarget); + const SpectrogramSettings::ScaleType newScaleType = + SpectrogramSettings::ScaleType( + std::max(0, + std::min(int(SpectrogramSettings::stNumScaleTypes) - 1, + evt.GetId() - OnFirstSpectrumScaleID + ))); + if (wt->GetSpectrogramSettings().scaleType != newScaleType) { + wt->GetIndependentSpectrogramSettings().scaleType = newScaleType; + UpdateVRuler(wt); // Is this really needed? + MakeParentModifyState(true); + Refresh(false); + } +} + /// Move a track up, down, to top or to bottom. void TrackPanel::OnMoveTrack(wxCommandEvent &event) diff --git a/src/TrackPanel.h b/src/TrackPanel.h index d5cdc578c..873ddc3d2 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -210,6 +210,7 @@ class AUDACITY_DLL_API TrackPanel:public wxPanel { virtual void OnTrackGainDec(); virtual void OnTrackGainInc(); virtual void OnTrackMenu(Track *t = NULL); + virtual void OnVRulerMenu(Track *t, wxMouseEvent *pEvent = NULL); virtual void OnTrackMute(bool shiftdown, Track *t = NULL); virtual void OnTrackSolo(bool shiftdown, Track *t = NULL); virtual void OnTrackClose(); @@ -244,6 +245,7 @@ class AUDACITY_DLL_API TrackPanel:public wxPanel { * @param menu the menu to add the commands to. */ virtual void BuildCommonDropMenuItems(wxMenu * menu); + static void BuildVRulerMenuItems(wxMenu * menu, int firstId, const wxArrayString &names); virtual bool IsUnsafe(); virtual bool HandleLabelTrackMouseEvent(LabelTrack * lTrack, wxRect &r, wxMouseEvent & event); virtual bool HandleTrackLocationMouseEvent(WaveTrack * track, wxRect &r, wxMouseEvent &event); @@ -466,6 +468,9 @@ protected: virtual void OnTimeTrackLog(wxCommandEvent &event); virtual void OnTimeTrackLogInt(wxCommandEvent &event); + virtual void OnWaveformScaleType(wxCommandEvent &event); + virtual void OnSpectrumScaleType(wxCommandEvent &event); + virtual void SetMenuCheck( wxMenu & menu, int newId ); virtual void SetRate(Track *pTrack, double rate); virtual void OnRateChange(wxCommandEvent &event); @@ -825,6 +830,9 @@ protected: wxMenu *mFormatMenu; wxMenu *mLabelTrackInfoMenu; + wxMenu *mRulerWaveformMenu; + wxMenu *mRulerSpectrumMenu; + Track *mPopupMenuTarget; friend class TrackPanelAx; From 11f794d3fb6648f1aea793b091ec4a843a594fe9 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 1 Jul 2015 14:22:25 -0400 Subject: [PATCH 2/2] Menu items for zooming in vertical ruler popup for wave tracks... May be good for discoverability of the click actions. --- src/TrackPanel.cpp | 48 ++++++++++++++++++++++++++++++++++++++++------ src/TrackPanel.h | 5 +++++ 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index abc0cae26..861d58eef 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -352,6 +352,10 @@ enum { // Reserve an ample block of ids for spectrum scale types OnFirstSpectrumScaleID, OnLastSpectrumScaleID = OnFirstSpectrumScaleID + 19, + + OnZoomInVerticalID, + OnZoomOutVerticalID, + OnZoomFitVerticalID, }; BEGIN_EVENT_TABLE(TrackPanel, wxWindow) @@ -396,6 +400,10 @@ BEGIN_EVENT_TABLE(TrackPanel, wxWindow) EVT_MENU_RANGE(OnFirstWaveformScaleID, OnLastWaveformScaleID, TrackPanel::OnWaveformScaleType) EVT_MENU_RANGE(OnFirstSpectrumScaleID, OnLastSpectrumScaleID, TrackPanel::OnSpectrumScaleType) + + EVT_MENU(OnZoomInVerticalID, TrackPanel::OnZoomInVertical) + EVT_MENU(OnZoomOutVerticalID, TrackPanel::OnZoomOutVertical) + EVT_MENU(OnZoomFitVerticalID, TrackPanel::OnZoomFitVertical) END_EVENT_TABLE() /// Makes a cursor from an XPM, uses CursorId as a fallback. @@ -808,6 +816,10 @@ void TrackPanel::BuildVRulerMenuItems int id = firstId; for (int ii = 0, nn = names.size(); ii < nn; ++ii) menu->AppendRadioItem(id++, names[ii]); + menu->AppendSeparator(); + menu->Append(OnZoomInVerticalID, _("Zoom In\tLeft-Click/Left-Drag")); + menu->Append(OnZoomOutVerticalID, _("Zoom Out\tShift-Left-Click")); + menu->Append(OnZoomFitVerticalID, _("Zoom to Fit\tShift-Right-Click")); } void TrackPanel::DeleteMenus(void) @@ -4656,7 +4668,13 @@ void TrackPanel::HandleVZoomButtonUp( wxMouseEvent & event ) return; } - WaveTrack *track = static_cast(mCapturedTrack); + HandleWaveTrackVZoom(static_cast(mCapturedTrack), + event.ShiftDown(), event.RightUp()); + mCapturedTrack = NULL; +} + +void TrackPanel::HandleWaveTrackVZoom(WaveTrack *track, bool shiftDown, bool rightUp) +{ WaveTrack *partner = static_cast(mTracks->GetLink(track)); int height = track->GetHeight(); int ypos = mCapturedRect.y; @@ -4728,10 +4746,10 @@ void TrackPanel::HandleVZoomButtonUp( wxMouseEvent & event ) } } } - else if (event.ShiftDown() || event.RightUp()) { + else if (shiftDown || rightUp) { // Zoom OUT if (spectral) { - if (event.ShiftDown() && event.RightUp()) { + if (shiftDown && rightUp) { // Zoom out full min = spectrumLinear ? 0.0f : 1.0f; max = halfrate; @@ -4753,7 +4771,7 @@ void TrackPanel::HandleVZoomButtonUp( wxMouseEvent & event ) // Zoom out to -1.0...1.0 first, then, and only // then, if they click again, allow one more // zoom out. - if (event.ShiftDown() && event.RightUp()) { + if (shiftDown && rightUp) { // Zoom out full min = -1.0; max = 1.0; @@ -4844,9 +4862,8 @@ void TrackPanel::HandleVZoomButtonUp( wxMouseEvent & event ) } mZoomEnd = mZoomStart = 0; - UpdateVRuler(mCapturedTrack); + UpdateVRuler(track); Refresh(false); - mCapturedTrack = NULL; MakeParentModifyState(true); } @@ -8564,6 +8581,10 @@ void TrackPanel::OnVRulerMenu(Track *t, wxMouseEvent *pEvent) x = GetVRulerOffset(), y = titleRect.y + titleRect.height + 1; } + // So that IsDragZooming() returns false, and if we zoom in, we do so + // centered where the mouse is now: + mZoomStart = mZoomEnd = pEvent->m_y; + mPopupMenuTarget = wt; PopupMenu(theMenu, x, y); mPopupMenuTarget = NULL; @@ -9387,6 +9408,21 @@ void TrackPanel::OnSpectrumScaleType(wxCommandEvent &evt) } } +void TrackPanel::OnZoomInVertical(wxCommandEvent &) +{ + HandleWaveTrackVZoom(static_cast(mPopupMenuTarget), false, false); +} + +void TrackPanel::OnZoomOutVertical(wxCommandEvent &) +{ + HandleWaveTrackVZoom(static_cast(mPopupMenuTarget), true, false); +} + +void TrackPanel::OnZoomFitVertical(wxCommandEvent &) +{ + HandleWaveTrackVZoom(static_cast(mPopupMenuTarget), true, true); +} + /// Move a track up, down, to top or to bottom. void TrackPanel::OnMoveTrack(wxCommandEvent &event) diff --git a/src/TrackPanel.h b/src/TrackPanel.h index 873ddc3d2..ef156d127 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -397,6 +397,7 @@ protected: virtual void HandleVZoomClick(wxMouseEvent & event); virtual void HandleVZoomDrag(wxMouseEvent & event); virtual void HandleVZoomButtonUp(wxMouseEvent & event); + virtual void HandleWaveTrackVZoom(WaveTrack *track, bool shiftDown, bool rightUp); // Handle sample editing using the 'draw' tool. virtual bool IsSampleEditingPossible( wxMouseEvent & event, Track * t ); @@ -471,6 +472,10 @@ protected: virtual void OnWaveformScaleType(wxCommandEvent &event); virtual void OnSpectrumScaleType(wxCommandEvent &event); + virtual void OnZoomInVertical(wxCommandEvent &event); + virtual void OnZoomOutVertical(wxCommandEvent &event); + virtual void OnZoomFitVertical(wxCommandEvent &event); + virtual void SetMenuCheck( wxMenu & menu, int newId ); virtual void SetRate(Track *pTrack, double rate); virtual void OnRateChange(wxCommandEvent &event);