diff --git a/mac/Audacity.xcodeproj/project.pbxproj b/mac/Audacity.xcodeproj/project.pbxproj index adc7838bd..5b1d2586d 100644 --- a/mac/Audacity.xcodeproj/project.pbxproj +++ b/mac/Audacity.xcodeproj/project.pbxproj @@ -1229,6 +1229,7 @@ 5E73964A1DAFD91D00BA0A4D /* CutlineHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E7396481DAFD91D00BA0A4D /* CutlineHandle.cpp */; }; 5E73964D1DAFD95B00BA0A4D /* ButtonHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E73964B1DAFD95B00BA0A4D /* ButtonHandle.cpp */; }; 5E7396501DAFD98400BA0A4D /* SliderHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E73964E1DAFD98400BA0A4D /* SliderHandle.cpp */; }; + 5E7396561DAFDA0000BA0A4D /* WaveTrackSliderHandles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E7396541DAFDA0000BA0A4D /* WaveTrackSliderHandles.cpp */; }; 5E74D2E31CC4429700D88B0B /* EditCursorOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E74D2DD1CC4429700D88B0B /* EditCursorOverlay.cpp */; }; 5E74D2E41CC4429700D88B0B /* PlayIndicatorOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E74D2DF1CC4429700D88B0B /* PlayIndicatorOverlay.cpp */; }; 5E74D2E51CC4429700D88B0B /* Scrubbing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E74D2E11CC4429700D88B0B /* Scrubbing.cpp */; }; @@ -3058,6 +3059,8 @@ 5E73964C1DAFD95B00BA0A4D /* ButtonHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ButtonHandle.h; sourceTree = ""; }; 5E73964E1DAFD98400BA0A4D /* SliderHandle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SliderHandle.cpp; sourceTree = ""; }; 5E73964F1DAFD98400BA0A4D /* SliderHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SliderHandle.h; sourceTree = ""; }; + 5E7396541DAFDA0000BA0A4D /* WaveTrackSliderHandles.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WaveTrackSliderHandles.cpp; sourceTree = ""; }; + 5E7396551DAFDA0000BA0A4D /* WaveTrackSliderHandles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WaveTrackSliderHandles.h; sourceTree = ""; }; 5E74D2D91CC4427B00D88B0B /* TrackPanelCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelCell.h; sourceTree = ""; }; 5E74D2DA1CC4427B00D88B0B /* TrackPanelCellIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelCellIterator.h; sourceTree = ""; }; 5E74D2DD1CC4429700D88B0B /* EditCursorOverlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EditCursorOverlay.cpp; sourceTree = ""; }; @@ -5826,11 +5829,13 @@ 5E7396481DAFD91D00BA0A4D /* CutlineHandle.cpp */, 5E000A1F1EC7B5D500E8FD93 /* SampleHandle.cpp */, 5EA018231EC7B226001F2996 /* WaveTrackControls.cpp */, + 5E7396541DAFDA0000BA0A4D /* WaveTrackSliderHandles.cpp */, 5EA018251EC7B226001F2996 /* WaveTrackUI.cpp */, 5EA018261EC7B226001F2996 /* WaveTrackVRulerControls.cpp */, 5E7396491DAFD91D00BA0A4D /* CutlineHandle.h */, 5E000A201EC7B5D500E8FD93 /* SampleHandle.h */, 5EA018241EC7B226001F2996 /* WaveTrackControls.h */, + 5E7396551DAFDA0000BA0A4D /* WaveTrackSliderHandles.h */, 5EA018271EC7B226001F2996 /* WaveTrackVRulerControls.h */, ); path = ui; @@ -7749,6 +7754,7 @@ 28501EAA0CEED0670029ABAA /* LoadVamp.cpp in Sources */, 5ED1D0AD1CDE55BD00471E3C /* Overlay.cpp in Sources */, 28501EAB0CEED0680029ABAA /* VampEffect.cpp in Sources */, + 5E7396561DAFDA0000BA0A4D /* WaveTrackSliderHandles.cpp in Sources */, 288052C20DEA73F500671EA4 /* NonGuiThread.cpp in Sources */, 28530C4C0DF2105200555C94 /* HtmlWindow.cpp in Sources */, 28530C4D0DF2105200555C94 /* ProgressDialog.cpp in Sources */, diff --git a/src/Makefile.am b/src/Makefile.am index 98f1e7038..a04f14a2f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -567,6 +567,8 @@ audacity_SOURCES = \ tracks/playabletrack/wavetrack/ui/SampleHandle.h \ tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp \ tracks/playabletrack/wavetrack/ui/WaveTrackControls.h \ + tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.cpp \ + tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.h \ tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.cpp \ tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.h \ tracks/playabletrack/wavetrack/ui/WaveTrackUI.cpp \ diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 032afeb96..a77fb2e68 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -1147,8 +1147,6 @@ void TrackPanel::HandleInterruptedDrag() IsClosing, IsAdjustingLabel, IsRearranging, - IsGainSliding, - IsPanSliding, IsStretching, IsVelocitySliding */ @@ -3576,77 +3574,6 @@ void TrackPanel::HandleMinimizing(wxMouseEvent & event) } } -void TrackPanel::HandleSliders(wxMouseEvent &event, bool pan) -{ - LWSlider *slider; -#ifdef EXPERIMENTAL_OUTPUT_DISPLAY - bool panZero = false; -#endif - wxASSERT(mCapturedTrack->GetKind() == Track::Wave); - - // On the Mac, we'll lose track capture if the slider dialog - // is displayed, but it doesn't hurt to do this for all plats. - WaveTrack *capturedTrack = (WaveTrack *) mCapturedTrack; - - auto rect = FindTrackRect( capturedTrack, true ); - if (pan) { - wxRect sliderRect; - TrackInfo::GetPanRect(rect.GetTopLeft(), sliderRect); - slider = mTrackInfo.PanSlider(sliderRect, capturedTrack, true, this); - } - else { - wxRect sliderRect; - TrackInfo::GetGainRect(rect.GetTopLeft(), sliderRect); - slider = mTrackInfo.GainSlider(sliderRect, capturedTrack, true, this); - } - - slider->OnMouseEvent(event); - - //If we have a double-click, do this... - if (event.LeftDClick()) - mMouseCapture = IsUncaptured; - - float newValue = slider->Get(); - MixerBoard* pMixerBoard = this->GetMixerBoard(); // Update mixer board, too. - - // Assume linked track is wave or null - const auto link = static_cast(capturedTrack->GetLink()); - - if (pan) { -#ifdef EXPERIMENTAL_OUTPUT_DISPLAY - panZero = capturedTrack->SetPan(newValue); -#else - capturedTrack->SetPan(newValue); -#endif - if (link) - link->SetPan(newValue); - -#ifdef EXPERIMENTAL_OUTPUT_DISPLAY - if(panZero) MakeParentRedrawScrollbars(); -#endif - - if (pMixerBoard) - pMixerBoard->UpdatePan(capturedTrack); - } - else { - capturedTrack->SetGain(newValue); - if (link) - link->SetGain(newValue); - - if (pMixerBoard) - pMixerBoard->UpdateGain(capturedTrack); - } - - RefreshTrack(capturedTrack); - - if (event.ButtonUp()) { - MakeParentPushState(pan ? _("Moved pan slider") : _("Moved gain slider"), - pan ? _("Pan") : _("Gain"), - UndoPush::CONSOLIDATE); - SetCapturedTrack( NULL ); - } -} - #ifdef EXPERIMENTAL_MIDI_OUT void TrackPanel::HandleVelocitySlider(wxMouseEvent &event) { @@ -3950,14 +3877,6 @@ void TrackPanel::HandleLabelClick(wxMouseEvent & event) if (isleft && MinimizeFunc(t, rect, event.m_x, event.m_y)) return; - if (isleft && t->GetKind() == Track::Wave) - { - if (GainFunc(t, rect, event, event.m_x, event.m_y)) - return; - - if (PanFunc(t, rect, event, event.m_x, event.m_y)) - return; - } #ifdef USE_MIDI // DM: If it's a NoteTrack, it has special controls else if (t->GetKind() == Track::Note) @@ -4076,40 +3995,6 @@ void TrackPanel::CalculateRearrangingThresholds(wxMouseEvent & event) mMoveDownThreshold = INT_MAX; } -bool TrackPanel::GainFunc(Track * t, wxRect rect, wxMouseEvent &event, - int x, int y) -{ - wxRect sliderRect; - mTrackInfo.GetGainRect(rect.GetTopLeft(), sliderRect); - if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) ) - return false; - if (!sliderRect.Contains(x, y)) - return false; - - SetCapturedTrack( t, IsGainSliding); - mCapturedRect = rect; - HandleSliders(event, false); - - return true; -} - -bool TrackPanel::PanFunc(Track * t, wxRect rect, wxMouseEvent &event, - int x, int y) -{ - wxRect sliderRect; - mTrackInfo.GetPanRect(rect.GetTopLeft(), sliderRect); - if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) ) - return false; - if (!sliderRect.Contains(x, y)) - return false; - - SetCapturedTrack( t, IsPanSliding); - mCapturedRect = rect; - HandleSliders(event, true); - - return true; -} - #ifdef EXPERIMENTAL_MIDI_OUT bool TrackPanel::VelocityFunc(Track * t, wxRect rect, wxMouseEvent &event, int x, int y) @@ -4969,13 +4854,6 @@ try if (event.Leaving()) { - - // PRL: was this test really needed? It interfered with my refactoring - // that tried to eliminate those enum values. - // I think it was never true, that mouse capture was pan or gain sliding, - // but no mouse button was down. - // if (mMouseCapture != IsPanSliding && mMouseCapture != IsGainSliding) - auto buttons = // Bug 1325: button state in Leaving events is unreliable on Mac. // Poll the global state instead. @@ -5058,12 +4936,6 @@ try case IsRearranging: HandleRearrange(event); break; - case IsGainSliding: - HandleSliders(event, false); - break; - case IsPanSliding: - HandleSliders(event, true); - break; #ifdef EXPERIMENTAL_MIDI_OUT case IsVelocitySliding: HandleVelocitySlider(event); diff --git a/src/TrackPanel.h b/src/TrackPanel.h index fb97ca8ba..1ed5bcc2f 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -494,7 +494,6 @@ protected: virtual void HandleClosing(wxMouseEvent & event); virtual void HandlePopping(wxMouseEvent & event); virtual void HandleMinimizing(wxMouseEvent & event); - virtual void HandleSliders(wxMouseEvent &event, bool pan); #ifdef EXPERIMENTAL_MIDI_OUT virtual void HandleVelocitySlider(wxMouseEvent &event); #endif @@ -507,10 +506,6 @@ protected: virtual bool PopupFunc(Track * t, wxRect rect, int x, int y); virtual bool MinimizeFunc(Track *t, wxRect rect, int x, int f); - virtual bool GainFunc(Track * t, wxRect rect, wxMouseEvent &event, - int x, int y); - virtual bool PanFunc(Track * t, wxRect rect, wxMouseEvent &event, - int x, int y); #ifdef EXPERIMENTAL_MIDI_OUT virtual bool VelocityFunc(Track * t, wxRect rect, wxMouseEvent &event, int x, int y); @@ -806,8 +801,6 @@ public: IsRearranging, IsMuting, IsSoloing, - IsGainSliding, - IsPanSliding, IsMinimizing, IsPopping, #ifdef EXPERIMENTAL_MIDI_OUT diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp index 9283c58ed..192896fd5 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp @@ -11,6 +11,7 @@ Paul Licameli split from TrackPanel.cpp #include "../../../../Audacity.h" #include "WaveTrackControls.h" #include "../../ui/PlayableTrackButtonHandles.h" +#include "WaveTrackSliderHandles.h" #include "../../../../HitTestResult.h" #include "../../../../Track.h" @@ -51,6 +52,14 @@ HitTestResult WaveTrackControls::HitTest (result = SoloButtonHandle::HitTest (event, rect, pProject, track)).handle) return result; + + if (NULL != (result = + GainSliderHandle::HitTest(event, rect, pProject, mpTrack)).handle) + return result; + + if (NULL != (result = + PanSliderHandle::HitTest(event, rect, pProject, mpTrack)).handle) + return result; } } diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.cpp new file mode 100644 index 000000000..59a96ef9e --- /dev/null +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.cpp @@ -0,0 +1,190 @@ +#include "WaveTrackSliderHandles.h" + +/********************************************************************** + +Audacity: A Digital Audio Editor + +WaveTrackSliderHandles.cpp + +Paul Licameli split from TrackPanel.cpp + +**********************************************************************/ + +#include "../../../../Audacity.h" +#include "WaveTrackSliderHandles.h" + +#include "../../../../HitTestResult.h" +#include "../../../../MixerBoard.h" +#include "../../../../Project.h" +#include "../../../../RefreshCode.h" +#include "../../../../TrackPanel.h" +#include "../../../../UndoManager.h" +#include "../../../../WaveTrack.h" + +GainSliderHandle::GainSliderHandle() + : SliderHandle() +{ +} + +GainSliderHandle::~GainSliderHandle() +{ +} + +GainSliderHandle &GainSliderHandle::Instance() +{ + static GainSliderHandle instance; + return instance; +} + +WaveTrack *GainSliderHandle::GetTrack() +{ + return static_cast(mpTrack); +} + +float GainSliderHandle::GetValue() +{ + return static_cast(mpTrack)->GetGain(); +} + +UIHandle::Result GainSliderHandle::SetValue +(AudacityProject *pProject, float newValue) +{ + GetTrack()->SetGain(newValue); + + // Assume linked track is wave or null + const auto link = static_cast(mpTrack->GetLink()); + if (link) + link->SetGain(newValue); + + MixerBoard *const pMixerBoard = pProject->GetMixerBoard(); + if (pMixerBoard) + pMixerBoard->UpdateGain(GetTrack()); + + return RefreshCode::RefreshNone; +} + +UIHandle::Result GainSliderHandle::CommitChanges +(const wxMouseEvent &, AudacityProject *pProject) +{ + pProject->PushState(_("Moved gain slider"), _("Gain"), UndoPush::CONSOLIDATE); + return RefreshCode::RefreshCell; +} + +HitTestResult GainSliderHandle::HitTest +(const wxMouseEvent &event, const wxRect &rect, + const AudacityProject *pProject, Track *pTrack) +{ + if (!event.Button(wxMOUSE_BTN_LEFT)) + return {}; + + wxRect sliderRect; + TrackInfo::GetGainRect(rect.GetTopLeft(), sliderRect); + if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) ) + return {}; + if (sliderRect.Contains(event.m_x, event.m_y)) { + WaveTrack *const wavetrack = static_cast(pTrack); + wxRect sliderRect; + TrackInfo::GetGainRect(rect.GetTopLeft(), sliderRect); + auto slider = TrackInfo::GainSlider + (sliderRect, wavetrack, true, + const_cast(pProject->GetTrackPanel())); + Instance().mpSlider = slider; + Instance().mpTrack = wavetrack; + return { + HitPreview(), + &Instance() + }; + } + else + return {}; +} + +//////////////////////////////////////////////////////////////////////////////// + +PanSliderHandle::PanSliderHandle() + : SliderHandle() +{ +} + +PanSliderHandle::~PanSliderHandle() +{ +} + +PanSliderHandle &PanSliderHandle::Instance() +{ + static PanSliderHandle instance; + return instance; +} + +WaveTrack *PanSliderHandle::GetTrack() +{ + return static_cast(mpTrack); +} + +float PanSliderHandle::GetValue() +{ + return GetTrack()->GetPan(); +} + +UIHandle::Result PanSliderHandle::SetValue(AudacityProject *pProject, float newValue) +{ +#ifdef EXPERIMENTAL_OUTPUT_DISPLAY + bool panZero = false; + panZero = static_cast(mpTrack)->SetPan(newValue); +#else + mpTrack->SetPan(newValue); +#endif + + // Assume linked track is wave or null + const auto link = static_cast(mpTrack->GetLink()); + if (link) + link->SetPan(newValue); + + MixerBoard *const pMixerBoard = pProject->GetMixerBoard(); + if (pMixerBoard) + pMixerBoard->UpdatePan(GetTrack()); + + using namespace RefreshCode; + Result result = RefreshNone; + +#ifdef EXPERIMENTAL_OUTPUT_DISPLAY + if(panZero) + result |= FixScrollbars; +#endif + + return result; +} + +UIHandle::Result PanSliderHandle::CommitChanges +(const wxMouseEvent &, AudacityProject *pProject) +{ + pProject->PushState(_("Moved pan slider"), _("Pan"), UndoPush::CONSOLIDATE); + return RefreshCode::RefreshCell; +} + +HitTestResult PanSliderHandle::HitTest +(const wxMouseEvent &event, const wxRect &rect, + const AudacityProject *pProject, Track *pTrack) +{ + if (!event.Button(wxMOUSE_BTN_LEFT)) + return {}; + + wxRect sliderRect; + TrackInfo::GetPanRect(rect.GetTopLeft(), sliderRect); + if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) ) + return {}; + if (sliderRect.Contains(event.m_x, event.m_y)) { + WaveTrack *const wavetrack = static_cast(pTrack); + auto slider = TrackInfo::PanSlider + (sliderRect, wavetrack, true, + const_cast(pProject->GetTrackPanel())); + Instance().mpSlider = slider; + Instance().mpTrack = wavetrack; + return { + HitPreview(), + &Instance() + }; + } + else + return {}; +} diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.h b/src/tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.h new file mode 100644 index 000000000..66d4a10fe --- /dev/null +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.h @@ -0,0 +1,73 @@ +/********************************************************************** + +Audacity: A Digital Audio Editor + +WavelTrackSliderHandles.h + +Paul Licameli split from TrackPanel.cpp + +**********************************************************************/ + +#ifndef __AUDACITY_WAVE_TRACK_SLIDER_HANDLES__ +#define __AUDACITY_WAVE_TRACK_SLIDER_HANDLES__ + +#include "../../../ui/SliderHandle.h" + +class WaveTrack; + +struct HitTestResult; + +class GainSliderHandle final : public SliderHandle +{ + GainSliderHandle(const GainSliderHandle&) = delete; + GainSliderHandle &operator=(const GainSliderHandle&) = delete; + + GainSliderHandle(); + virtual ~GainSliderHandle(); + static GainSliderHandle& Instance(); + + WaveTrack *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); +}; + +//////////////////////////////////////////////////////////////////////////////// + +class PanSliderHandle final : public SliderHandle +{ + PanSliderHandle(const PanSliderHandle&) = delete; + PanSliderHandle &operator=(const PanSliderHandle&) = delete; + + PanSliderHandle(); + virtual ~PanSliderHandle(); + static PanSliderHandle& Instance(); + + WaveTrack *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 diff --git a/win/Projects/Audacity/Audacity.vcxproj b/win/Projects/Audacity/Audacity.vcxproj index 00f4647d6..6cfa59b3d 100755 --- a/win/Projects/Audacity/Audacity.vcxproj +++ b/win/Projects/Audacity/Audacity.vcxproj @@ -234,6 +234,7 @@ + @@ -501,6 +502,7 @@ + diff --git a/win/Projects/Audacity/Audacity.vcxproj.filters b/win/Projects/Audacity/Audacity.vcxproj.filters index 05a066081..cca3f3f8c 100755 --- a/win/Projects/Audacity/Audacity.vcxproj.filters +++ b/win/Projects/Audacity/Audacity.vcxproj.filters @@ -1016,6 +1016,9 @@ src\tracks\playabletrack\ui + + src\tracks\playabletrack\wavetrack\ui + @@ -2023,6 +2026,9 @@ src\tracks\playabletrack\ui + + src\tracks\playabletrack\wavetrack\ui +