From 7cab3801921917c7733120510f62f722bbabecff Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sun, 14 May 2017 17:26:17 -0400 Subject: [PATCH] TrackPanel still draws Velocity, but no longer handles clicks on it... ... also implemented ESC key for that drag --- mac/Audacity.xcodeproj/project.pbxproj | 6 ++ src/Makefile.am | 2 + src/TrackPanel.cpp | 62 +----------- src/TrackPanel.h | 12 --- .../notetrack/ui/NoteTrackControls.cpp | 6 ++ .../notetrack/ui/NoteTrackSliderHandles.cpp | 94 +++++++++++++++++++ .../notetrack/ui/NoteTrackSliderHandles.h | 52 ++++++++++ 7 files changed, 161 insertions(+), 73 deletions(-) create mode 100644 src/tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.cpp create mode 100644 src/tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.h diff --git a/mac/Audacity.xcodeproj/project.pbxproj b/mac/Audacity.xcodeproj/project.pbxproj index 5b1d2586d..0cd394037 100644 --- a/mac/Audacity.xcodeproj/project.pbxproj +++ b/mac/Audacity.xcodeproj/project.pbxproj @@ -1222,6 +1222,7 @@ 5E15126E1DB0010C00702E29 /* TrackControls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E1512681DB0010C00702E29 /* TrackControls.cpp */; }; 5E15126F1DB0010C00702E29 /* TrackUI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E15126A1DB0010C00702E29 /* TrackUI.cpp */; }; 5E1512701DB0010C00702E29 /* TrackVRulerControls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E15126B1DB0010C00702E29 /* TrackVRulerControls.cpp */; }; + 5E3FFE721EC9032B0020F7C9 /* NoteTrackSliderHandles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E3FFE701EC9032B0020F7C9 /* NoteTrackSliderHandles.cpp */; }; 5E73963B1DAFD82D00BA0A4D /* PopupMenuTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E7396391DAFD82D00BA0A4D /* PopupMenuTable.cpp */; }; 5E73963E1DAFD86000BA0A4D /* ZoomHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E73963C1DAFD86000BA0A4D /* ZoomHandle.cpp */; }; 5E7396441DAFD8C600BA0A4D /* TimeShiftHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E7396421DAFD8C600BA0A4D /* TimeShiftHandle.cpp */; }; @@ -3044,6 +3045,8 @@ 5E15126A1DB0010C00702E29 /* TrackUI.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrackUI.cpp; sourceTree = ""; }; 5E15126B1DB0010C00702E29 /* TrackVRulerControls.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrackVRulerControls.cpp; sourceTree = ""; }; 5E15126C1DB0010C00702E29 /* TrackVRulerControls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackVRulerControls.h; sourceTree = ""; }; + 5E3FFE701EC9032B0020F7C9 /* NoteTrackSliderHandles.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NoteTrackSliderHandles.cpp; sourceTree = ""; }; + 5E3FFE711EC9032B0020F7C9 /* NoteTrackSliderHandles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoteTrackSliderHandles.h; sourceTree = ""; }; 5E4685F81CCA9D84008741F2 /* CommandFunctors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommandFunctors.h; sourceTree = ""; }; 5E61EE0C1CBAA6BB0009FCF1 /* MemoryX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryX.h; sourceTree = ""; }; 5E7396391DAFD82D00BA0A4D /* PopupMenuTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PopupMenuTable.cpp; sourceTree = ""; }; @@ -5806,6 +5809,8 @@ 5EA0181B1EC7B226001F2996 /* ui */ = { isa = PBXGroup; children = ( + 5E3FFE701EC9032B0020F7C9 /* NoteTrackSliderHandles.cpp */, + 5E3FFE711EC9032B0020F7C9 /* NoteTrackSliderHandles.h */, 5EA0181C1EC7B226001F2996 /* NoteTrackControls.cpp */, 5EA0181D1EC7B226001F2996 /* NoteTrackControls.h */, 5EA0181E1EC7B226001F2996 /* NoteTrackUI.cpp */, @@ -7662,6 +7667,7 @@ 2806EF7A1B32532A00D1AB9A /* FileDialogPrivate.mm in Sources */, 1790B18509883BFD008A330A /* MousePrefs.cpp in Sources */, 1790B18609883BFD008A330A /* PrefsDialog.cpp in Sources */, + 5E3FFE721EC9032B0020F7C9 /* NoteTrackSliderHandles.cpp in Sources */, 1790B18709883BFD008A330A /* QualityPrefs.cpp in Sources */, 1790B18809883BFD008A330A /* SpectrumPrefs.cpp in Sources */, 1790B18909883BFD008A330A /* Prefs.cpp in Sources */, diff --git a/src/Makefile.am b/src/Makefile.am index a04f14a2f..da13df0a7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -556,6 +556,8 @@ audacity_SOURCES = \ tracks/labeltrack/ui/LabelTrackVRulerControls.h \ tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp \ tracks/playabletrack/notetrack/ui/NoteTrackControls.h \ + tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.cpp \ + tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.h \ tracks/playabletrack/notetrack/ui/NoteTrackUI.cpp \ tracks/playabletrack/notetrack/ui/NoteTrackVRulerControls.cpp \ tracks/playabletrack/notetrack/ui/NoteTrackVRulerControls.h \ diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index a77fb2e68..3d766e4a1 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -1147,8 +1147,7 @@ void TrackPanel::HandleInterruptedDrag() IsClosing, IsAdjustingLabel, IsRearranging, - IsStretching, - IsVelocitySliding + IsStretching */ if (sendEvent) { @@ -3574,39 +3573,6 @@ void TrackPanel::HandleMinimizing(wxMouseEvent & event) } } -#ifdef EXPERIMENTAL_MIDI_OUT -void TrackPanel::HandleVelocitySlider(wxMouseEvent &event) -{ - wxASSERT(mCapturedTrack->GetKind() == Track::Note); - NoteTrack *capturedTrack = static_cast(mCapturedTrack); - - auto rect = FindTrackRect( capturedTrack, true ); - wxRect sliderRect; - TrackInfo::GetVelocityRect(rect.GetTopLeft(), sliderRect); - auto slider = mTrackInfo.VelocitySlider(sliderRect, capturedTrack, true, this); - - slider->OnMouseEvent(event); - - //If we have a double-click, do this... - if (event.LeftDClick()) - mMouseCapture = IsUncaptured; - - float newValue = slider->Get(); - capturedTrack->SetVelocity(newValue); - - MixerBoard* pMixerBoard = this->GetMixerBoard(); // Update mixer board, too. - - if (pMixerBoard) { - pMixerBoard->UpdateVelocity(capturedTrack); - } - RefreshTrack(capturedTrack); - if (event.ButtonUp()) { - MakeParentPushState(_("Moved velocity slider"), _("Velocity"), UndoPush::CONSOLIDATE); - SetCapturedTrack(NULL); - } -} -#endif - // The tracks positions within the list have changed, so update the vertical // ruler size for the track that triggered the event. void TrackPanel::OnTrackListResized(wxCommandEvent & e) @@ -3882,8 +3848,6 @@ void TrackPanel::HandleLabelClick(wxMouseEvent & event) else if (t->GetKind() == Track::Note) { #ifdef EXPERIMENTAL_MIDI_OUT - if (isleft && VelocityFunc(t, rect, event, event.m_x, event.m_y)) - return; wxRect midiRect; mTrackInfo.GetMidiControlsRect(rect, midiRect); @@ -3995,25 +3959,6 @@ void TrackPanel::CalculateRearrangingThresholds(wxMouseEvent & event) mMoveDownThreshold = INT_MAX; } -#ifdef EXPERIMENTAL_MIDI_OUT -bool TrackPanel::VelocityFunc(Track * t, wxRect rect, wxMouseEvent &event, - int x, int y) -{ - wxRect sliderRect; - mTrackInfo.GetVelocityRect(rect.GetTopLeft(), sliderRect); - if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) ) - return false; - if (!sliderRect.Contains(x, y)) - return false; - - SetCapturedTrack(t, IsVelocitySliding); - mCapturedRect = rect; - HandleVelocitySlider(event); - - return true; -} -#endif - bool TrackPanel::MinimizeFunc(Track * t, wxRect rect, int x, int y) { wxRect buttonRect; @@ -4936,11 +4881,6 @@ try case IsRearranging: HandleRearrange(event); break; -#ifdef EXPERIMENTAL_MIDI_OUT - case IsVelocitySliding: - HandleVelocitySlider(event); - break; -#endif case IsMinimizing: HandleMinimizing(event); break; diff --git a/src/TrackPanel.h b/src/TrackPanel.h index 1ed5bcc2f..440de1b02 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -494,9 +494,6 @@ protected: virtual void HandleClosing(wxMouseEvent & event); virtual void HandlePopping(wxMouseEvent & event); virtual void HandleMinimizing(wxMouseEvent & event); -#ifdef EXPERIMENTAL_MIDI_OUT - virtual void HandleVelocitySlider(wxMouseEvent &event); -#endif // These *Func methods are used in TrackPanel::HandleLabelClick to set up @@ -506,11 +503,6 @@ protected: virtual bool PopupFunc(Track * t, wxRect rect, int x, int y); virtual bool MinimizeFunc(Track *t, wxRect rect, int x, int f); -#ifdef EXPERIMENTAL_MIDI_OUT - virtual bool VelocityFunc(Track * t, wxRect rect, wxMouseEvent &event, - int x, int y); -#endif - public: virtual void MakeParentRedrawScrollbars(); @@ -803,10 +795,6 @@ public: IsSoloing, IsMinimizing, IsPopping, -#ifdef EXPERIMENTAL_MIDI_OUT - IsVelocitySliding, -#endif - }; protected: diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp index 94afac223..9d5fd5f1a 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp @@ -14,6 +14,7 @@ Paul Licameli split from TrackPanel.cpp #include "NoteTrackControls.h" #include "../../ui/PlayableTrackButtonHandles.h" +#include "NoteTrackSliderHandles.h" #include "../../../../HitTestResult.h" #include "../../../../Track.h" @@ -52,6 +53,11 @@ HitTestResult NoteTrackControls::HitTest (result = SoloButtonHandle::HitTest (event, rect, pProject, track)).handle) return result; +#ifdef EXPERIMENTAL_MIDI_OUT + if (NULL != (result = + VelocitySliderHandle::HitTest(event, rect, pProject, mpTrack)).handle) + return result; +#endif } } diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.cpp new file mode 100644 index 000000000..4b664c0fc --- /dev/null +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.cpp @@ -0,0 +1,94 @@ +/********************************************************************** + + Audacity: A Digital Audio Editor + + NoteTrackSliderHandles.cpp + + Paul Licameli split from TrackPanel.cpp + + **********************************************************************/ + +#include "../../../../Audacity.h" +#include "NoteTrackSliderHandles.h" + +#ifdef EXPERIMENTAL_MIDI_OUT + +#include "../../../../HitTestResult.h" +#include "../../../../MixerBoard.h" +#include "../../../../Project.h" +#include "../../../../RefreshCode.h" +#include "../../../../TrackPanel.h" // for TrackInfo +#include "../../../../UndoManager.h" +#include "../../../../NoteTrack.h" + +VelocitySliderHandle::VelocitySliderHandle() +: SliderHandle() +{ +} + +VelocitySliderHandle::~VelocitySliderHandle() +{ +} + +VelocitySliderHandle &VelocitySliderHandle::Instance() +{ + static VelocitySliderHandle instance; + return instance; +} + +NoteTrack *VelocitySliderHandle::GetTrack() +{ + return static_cast(mpTrack); +} + +float VelocitySliderHandle::GetValue() +{ + return GetTrack()->GetVelocity(); +} + +UIHandle::Result VelocitySliderHandle::SetValue +(AudacityProject *pProject, float newValue) +{ + GetTrack()->SetVelocity(newValue); + + MixerBoard *const pMixerBoard = pProject->GetMixerBoard(); + if (pMixerBoard) + pMixerBoard->UpdateVelocity(GetTrack()); + + return RefreshCode::RefreshCell; +} + +UIHandle::Result VelocitySliderHandle::CommitChanges +(const wxMouseEvent &, AudacityProject *pProject) +{ + pProject->PushState(_("Moved velocity slider"), _("Velocity"), UndoPush::CONSOLIDATE); + return RefreshCode::RefreshCell; +} + + + +HitTestResult VelocitySliderHandle::HitTest +(const wxMouseEvent &event, const wxRect &rect, + const AudacityProject *pProject, Track *pTrack) +{ + if (!event.Button(wxMOUSE_BTN_LEFT)) + return {}; + + wxRect sliderRect; + TrackInfo::GetVelocityRect(rect.GetTopLeft(), sliderRect); + if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) ) + return {}; + if (sliderRect.Contains(event.m_x, event.m_y)) { + NoteTrack *const notetrack = static_cast(pTrack); + auto slider = TrackInfo::VelocitySlider + (sliderRect, notetrack, true, + const_cast(pProject->GetTrackPanel())); + Instance().mpSlider = slider; + Instance().mpTrack = notetrack; + return { HitPreview(), &Instance() }; + } + else + return {}; +} + +#endif diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.h b/src/tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.h new file mode 100644 index 000000000..a1536a4c0 --- /dev/null +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.h @@ -0,0 +1,52 @@ +/********************************************************************** + + Audacity: A Digital Audio Editor + + NoteTrackSliderHandles.h + + Paul Licameli split from TrackPanel.cpp + + **********************************************************************/ + +#ifndef __AUDACITY_NOTE_TRACK_SLIDER_HANDLES__ +#define __AUDACITY_NOTE_TRACK_SLIDER_HANDLES__ + +#include "../../../../Experimental.h" + +#ifdef EXPERIMENTAL_MIDI_OUT + +#include "../../../ui/SliderHandle.h" + +class NoteTrack; + +struct HitTestResult; + +class VelocitySliderHandle final : public SliderHandle +{ + VelocitySliderHandle(const VelocitySliderHandle&) = delete; + VelocitySliderHandle &operator=(const VelocitySliderHandle&) = delete; + + VelocitySliderHandle(); + virtual ~VelocitySliderHandle(); + static VelocitySliderHandle& Instance(); + + NoteTrack *GetTrack(); + +protected: + float GetValue() override; + Result SetValue + (AudacityProject *pProject, float newValue) override; + Result CommitChanges + (const wxMouseEvent &event, AudacityProject *pProject) override; + + bool StopsOnKeystroke () override { return true; } + +public: + static HitTestResult HitTest + (const wxMouseEvent &event, const wxRect &rect, + const AudacityProject *pProject, Track *pTrack); +}; + +#endif + +#endif