From 141d93bbc0bffc179c49d1619fba56ecce777d49 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sun, 16 Aug 2015 12:18:17 -0400 Subject: [PATCH] Ctrl-mousewheel in vertical ruler of waveform dB view varies bottom of scale... ... provided the bottom is visible --- src/TrackPanel.cpp | 27 +++++++++++++++++++++++---- src/prefs/WaveformSettings.cpp | 17 ++++++++++++++++- src/prefs/WaveformSettings.h | 2 ++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index d05039711..e27d8bc34 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -6126,10 +6126,29 @@ void TrackPanel::HandleWheelRotation(wxMouseEvent & event) Track *const pTrack = FindTrack(event.m_x, event.m_y, true, false, &rect); if (pTrack && event.m_x >= GetVRulerOffset()) { if (pTrack->GetKind() == Track::Wave) { - HandleWaveTrackVZoom( - mTracks, rect, event.m_y, event.m_y, - static_cast(pTrack), false, (event.m_wheelRotation < 0), - true); + WaveTrack *const wt = static_cast(pTrack); + if (event.CmdDown() && + wt->GetWaveformSettings().scaleType == WaveformSettings::stLogarithmic) { + // Vary the bottom of the dB scale, but only if the midline is visible + float min, max; + wt->GetDisplayBounds(&min, &max); + if (min < 0.0 && max > 0.0) { + WaveformSettings &settings = wt->GetIndependentWaveformSettings(); + if (event.m_wheelRotation < 0) + // Zoom out + settings.NextLowerDBRange(); + else + settings.NextHigherDBRange(); + } + else + return; + } + else { + HandleWaveTrackVZoom( + mTracks, rect, event.m_y, event.m_y, + wt, false, (event.m_wheelRotation < 0), + true); + } UpdateVRuler(pTrack); Refresh(false); MakeParentModifyState(true); diff --git a/src/prefs/WaveformSettings.cpp b/src/prefs/WaveformSettings.cpp index ce94d4196..9872bc909 100644 --- a/src/prefs/WaveformSettings.cpp +++ b/src/prefs/WaveformSettings.cpp @@ -126,10 +126,25 @@ void WaveformSettings::ConvertToActualDBRange() wxArrayString codes; GUIPrefs::GetRangeChoices(NULL, &codes); long value = 0; - codes[dBRange].ToLong(&value); + codes[std::max(0, std::min(int(codes.size()) - 1, dBRange))] + .ToLong(&value); dBRange = int(value); } +void WaveformSettings::NextLowerDBRange() +{ + ConvertToEnumeratedDBRange(); + ++dBRange; + ConvertToActualDBRange(); +} + +void WaveformSettings::NextHigherDBRange() +{ + ConvertToEnumeratedDBRange(); + --dBRange; + ConvertToActualDBRange(); +} + namespace { wxArrayString &scaleNamesArray() diff --git a/src/prefs/WaveformSettings.h b/src/prefs/WaveformSettings.h index 8be81b8d7..6765b9e48 100644 --- a/src/prefs/WaveformSettings.h +++ b/src/prefs/WaveformSettings.h @@ -47,6 +47,8 @@ public: void ConvertToEnumeratedDBRange(); void ConvertToActualDBRange(); + void NextLowerDBRange(); + void NextHigherDBRange(); enum ScaleType { stLinear,