diff --git a/src/LabelTrack.h b/src/LabelTrack.h index bdd90d529..c91756a5e 100644 --- a/src/LabelTrack.h +++ b/src/LabelTrack.h @@ -319,8 +319,10 @@ private: std::weak_ptr mTextHandle; protected: + std::shared_ptr DoGetView() override; std::shared_ptr DoGetControls() override; std::shared_ptr DoGetVRulerControls() override; + friend class GetInfoCommand; // to get labels. friend class SetLabelCommand; // to set labels. }; diff --git a/src/NoteTrack.h b/src/NoteTrack.h index 3ea8d6c37..fd04b182a 100644 --- a/src/NoteTrack.h +++ b/src/NoteTrack.h @@ -226,6 +226,7 @@ class AUDACITY_DLL_API NoteTrack final std::weak_ptr mStretchHandle; protected: + std::shared_ptr DoGetView() override; std::shared_ptr DoGetControls() override; std::shared_ptr DoGetVRulerControls() override; }; diff --git a/src/TimeTrack.h b/src/TimeTrack.h index 85d40cccb..398746c95 100644 --- a/src/TimeTrack.h +++ b/src/TimeTrack.h @@ -123,6 +123,7 @@ class TimeTrack final : public Track { friend class TrackFactory; protected: + std::shared_ptr DoGetView() override; std::shared_ptr DoGetControls() override; std::shared_ptr DoGetVRulerControls() override; }; diff --git a/src/Track.h b/src/Track.h index 637ddc44c..e8e734e6b 100644 --- a/src/Track.h +++ b/src/Track.h @@ -37,6 +37,7 @@ class PlayableTrack; class LabelTrack; class TimeTrack; class TrackControls; +class TrackView; class TrackVRulerControls; class TrackPanelResizerCell; class WaveTrack; @@ -285,6 +286,11 @@ class AUDACITY_DLL_API Track /* not final */ mutable wxSize vrulerSize; + // Return another, associated TrackPanelCell object that implements + // click and drag and keystrokes in the track contents. + std::shared_ptr GetTrackView(); + std::shared_ptr GetTrackView() const; + // Return another, associated TrackPanelCell object that implements the // drop-down, close and minimize buttons, etc. std::shared_ptr GetTrackControls(); @@ -752,10 +758,12 @@ protected: std::shared_ptr DoFindTrack() override; // These are called to create controls on demand: + virtual std::shared_ptr DoGetView() = 0; virtual std::shared_ptr DoGetControls() = 0; virtual std::shared_ptr DoGetVRulerControls() = 0; // These hold the controls: + std::shared_ptr mpView; std::shared_ptr mpControls; std::shared_ptr mpVRulerContols; std::shared_ptr mpResizer; diff --git a/src/WaveTrack.h b/src/WaveTrack.h index c8939d13f..9aafd401e 100644 --- a/src/WaveTrack.h +++ b/src/WaveTrack.h @@ -699,6 +699,7 @@ private: std::weak_ptr mEnvelopeHandle; protected: + std::shared_ptr DoGetView() override; std::shared_ptr DoGetControls() override; std::shared_ptr DoGetVRulerControls() override; }; diff --git a/src/tracks/labeltrack/ui/LabelTrackView.cpp b/src/tracks/labeltrack/ui/LabelTrackView.cpp index a22c1f846..53009caae 100644 --- a/src/tracks/labeltrack/ui/LabelTrackView.cpp +++ b/src/tracks/labeltrack/ui/LabelTrackView.cpp @@ -8,6 +8,7 @@ Paul Licameli split from TrackPanel.cpp **********************************************************************/ +#include "LabelTrackView.h" #include "../../../LabelTrack.h" #include "LabelTrackControls.h" @@ -18,6 +19,10 @@ Paul Licameli split from TrackPanel.cpp #include "../../../HitTestResult.h" #include "../../../TrackPanelMouseEvent.h" +LabelTrackView::~LabelTrackView() +{ +} + std::vector LabelTrack::DetailedHitTest (const TrackPanelMouseState &st, const AudacityProject *WXUNUSED(pProject), int, bool) @@ -39,6 +44,11 @@ std::vector LabelTrack::DetailedHitTest return results; } +std::shared_ptr LabelTrack::DoGetView() +{ + return std::make_shared( SharedPointer() ); +} + std::shared_ptr LabelTrack::DoGetControls() { return std::make_shared( SharedPointer() ); diff --git a/src/tracks/labeltrack/ui/LabelTrackView.h b/src/tracks/labeltrack/ui/LabelTrackView.h index e69de29bb..a7b3b0cbb 100644 --- a/src/tracks/labeltrack/ui/LabelTrackView.h +++ b/src/tracks/labeltrack/ui/LabelTrackView.h @@ -0,0 +1,28 @@ +/********************************************************************** + +Audacity: A Digital Audio Editor + +LabelTrackView.h + +Paul Licameli split from class LabelTrack + +**********************************************************************/ + +#ifndef __AUDACITY_LABEL_TRACK_VIEW__ +#define __AUDACITY_LABEL_TRACK_VIEW__ + +#include "../../ui/TrackView.h" + +class LabelTrackView final : public TrackView +{ + LabelTrackView( const LabelTrackView& ) = delete; + LabelTrackView &operator=( const LabelTrackView& ) = delete; + +public: + explicit + LabelTrackView( const std::shared_ptr &pTrack ) + : TrackView{ pTrack } {} + ~LabelTrackView() override; +}; + +#endif diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackView.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackView.cpp index c1cb98e6e..5460f942a 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackView.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackView.cpp @@ -9,6 +9,8 @@ Paul Licameli split from TrackPanel.cpp **********************************************************************/ #include "../../../../Audacity.h" // for USE_* macros +#include "NoteTrackView.h" + #ifdef USE_MIDI #include "../../../../NoteTrack.h" @@ -22,6 +24,10 @@ Paul Licameli split from TrackPanel.cpp #include "../../../ui/SelectHandle.h" #include "StretchHandle.h" +NoteTrackView::~NoteTrackView() +{ +} + std::vector NoteTrack::DetailedHitTest (const TrackPanelMouseState &WXUNUSED(state), const AudacityProject *WXUNUSED(pProject), int, bool ) @@ -41,6 +47,11 @@ std::vector NoteTrack::DetailedHitTest return results; } +std::shared_ptr NoteTrack::DoGetView() +{ + return std::make_shared( SharedPointer() ); +} + std::shared_ptr NoteTrack::DoGetControls() { return std::make_shared( SharedPointer() ); diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackView.h b/src/tracks/playabletrack/notetrack/ui/NoteTrackView.h index e69de29bb..932df211a 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackView.h +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackView.h @@ -0,0 +1,28 @@ +/********************************************************************** + +Audacity: A Digital Audio Editor + +NoteTrackView.h + +Paul Licameli split from class NoteTrack + +**********************************************************************/ + +#ifndef __AUDACITY_NOTE_TRACK_VIEW__ +#define __AUDACITY_NOTE_TRACK_VIEW__ + +#include "../../../ui/TrackView.h" + +class NoteTrackView final : public TrackView +{ + NoteTrackView( const NoteTrackView& ) = delete; + NoteTrackView &operator=( const NoteTrackView& ) = delete; + +public: + explicit + NoteTrackView( const std::shared_ptr &pTrack ) + : TrackView{ pTrack } {} + ~NoteTrackView() override; +}; + +#endif diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp index 141a074c8..8c40d5054 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp @@ -8,6 +8,7 @@ Paul Licameli split from TrackPanel.cpp **********************************************************************/ +#include "WaveTrackView.h" #include "../../../../WaveTrack.h" #include "WaveTrackControls.h" @@ -23,6 +24,10 @@ Paul Licameli split from TrackPanel.cpp #include "../../../ui/TimeShiftHandle.h" #include "../../../../ProjectSettings.h" +WaveTrackView::~WaveTrackView() +{ +} + std::vector WaveTrack::DetailedHitTest (const TrackPanelMouseState &st, const AudacityProject *pProject, int currentTool, bool bMultiTool) @@ -101,6 +106,11 @@ std::vector WaveTrack::DetailedHitTest return results; } +std::shared_ptr WaveTrack::DoGetView() +{ + return std::make_shared( SharedPointer() ); +} + std::shared_ptr WaveTrack::DoGetControls() { return std::make_shared( SharedPointer() ); diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h index e69de29bb..1731d4426 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h @@ -0,0 +1,28 @@ +/********************************************************************** + +Audacity: A Digital Audio Editor + +WaveTrackView.h + +Paul Licameli split from class WaveTrack + +**********************************************************************/ + +#ifndef __AUDACITY_WAVE_TRACK_VIEW__ +#define __AUDACITY_WAVE_TRACK_VIEW__ + +#include "../../../ui/TrackView.h" + +class WaveTrackView final : public TrackView +{ + WaveTrackView( const WaveTrackView& ) = delete; + WaveTrackView &operator=( const WaveTrackView& ) = delete; + +public: + explicit + WaveTrackView( const std::shared_ptr &pTrack ) + : TrackView{ pTrack } {} + ~WaveTrackView() override; +}; + +#endif diff --git a/src/tracks/timetrack/ui/TimeTrackView.cpp b/src/tracks/timetrack/ui/TimeTrackView.cpp index 8f3dfbca0..0bd4f5df1 100644 --- a/src/tracks/timetrack/ui/TimeTrackView.cpp +++ b/src/tracks/timetrack/ui/TimeTrackView.cpp @@ -8,6 +8,7 @@ Paul Licameli split from TrackPanel.cpp **********************************************************************/ +#include "TimeTrackView.h" #include "../../../TimeTrack.h" #include "TimeTrackControls.h" @@ -18,6 +19,10 @@ Paul Licameli split from TrackPanel.cpp #include "../../ui/EnvelopeHandle.h" +TimeTrackView::~TimeTrackView() +{ +} + std::vector TimeTrack::DetailedHitTest (const TrackPanelMouseState &st, const AudacityProject *pProject, int, bool) @@ -30,6 +35,11 @@ std::vector TimeTrack::DetailedHitTest return results; } +std::shared_ptr TimeTrack::DoGetView() +{ + return std::make_shared( SharedPointer() ); +} + std::shared_ptr TimeTrack::DoGetControls() { return std::make_shared( SharedPointer() ); diff --git a/src/tracks/timetrack/ui/TimeTrackView.h b/src/tracks/timetrack/ui/TimeTrackView.h index e69de29bb..2eb489aac 100644 --- a/src/tracks/timetrack/ui/TimeTrackView.h +++ b/src/tracks/timetrack/ui/TimeTrackView.h @@ -0,0 +1,28 @@ +/********************************************************************** + +Audacity: A Digital Audio Editor + +TimeTrackView.h + +Paul Licameli split from class TimeTrack + +**********************************************************************/ + +#ifndef __AUDACITY_TIME_TRACK_VIEW__ +#define __AUDACITY_TIME_TRACK_VIEW__ + +#include "../../ui/TrackView.h" + +class TimeTrackView final : public TrackView +{ + TimeTrackView( const TimeTrackView& ) = delete; + TimeTrackView &operator=( const TimeTrackView& ) = delete; + +public: + explicit + TimeTrackView( const std::shared_ptr &pTrack ) + : TrackView{ pTrack } {} + ~TimeTrackView() override; +}; + +#endif diff --git a/src/tracks/ui/CommonTrackPanelCell.h b/src/tracks/ui/CommonTrackPanelCell.h index cd54f2a0b..c0ccfec9a 100644 --- a/src/tracks/ui/CommonTrackPanelCell.h +++ b/src/tracks/ui/CommonTrackPanelCell.h @@ -11,6 +11,7 @@ Paul Licameli split from TrackPanel.cpp #ifndef __AUDACITY_COMMON_TRACK_PANEL_CELL__ #define __AUDACITY_COMMON_TRACK_PANEL_CELL__ +#include "../../Audacity.h" #include "../../TrackPanelCell.h" #include diff --git a/src/tracks/ui/TrackView.cpp b/src/tracks/ui/TrackView.cpp index 6c07d7a25..226bc9c09 100644 --- a/src/tracks/ui/TrackView.cpp +++ b/src/tracks/ui/TrackView.cpp @@ -8,6 +8,7 @@ Paul Licameli split from TrackPanel.cpp **********************************************************************/ +#include "TrackView.h" #include "../../Track.h" #include "../../TrackPanelMouseEvent.h" @@ -19,6 +20,27 @@ Paul Licameli split from TrackPanel.cpp #include "BackgroundCell.h" #include "../../ProjectSettings.h" +TrackView::~TrackView() +{ +} + +TrackView &TrackView::Get( Track &track ) +{ + return *track.GetTrackView(); +} + +const TrackView &TrackView::Get( const Track &track ) +{ + return *track.GetTrackView(); +} + +std::vector TrackView::HitTest +(const TrackPanelMouseState &st, + const AudacityProject *pProject) +{ + return {}; +} + std::vector Track::HitTest (const TrackPanelMouseState &st, const AudacityProject *pProject) @@ -78,6 +100,24 @@ std::shared_ptr Track::ContextMenuDelegate() return TrackControls::Get( *this ).shared_from_this(); } +std::shared_ptr TrackView::ContextMenuDelegate() +{ + return TrackControls::Get( *FindTrack() ).shared_from_this(); +} + +std::shared_ptr Track::GetTrackView() +{ + if (!mpView) + // create on demand + mpView = DoGetView(); + return mpView; +} + +std::shared_ptr Track::GetTrackView() const +{ + return const_cast(this)->GetTrackView(); +} + std::shared_ptr Track::GetTrackControls() { if (!mpControls) diff --git a/src/tracks/ui/TrackView.h b/src/tracks/ui/TrackView.h index e69de29bb..c78c2c6c3 100644 --- a/src/tracks/ui/TrackView.h +++ b/src/tracks/ui/TrackView.h @@ -0,0 +1,44 @@ +/********************************************************************** + +Audacity: A Digital Audio Editor + +TrackView.h + +Paul Licameli split from class Track + +**********************************************************************/ + +#ifndef __AUDACITY_TRACK_VIEW__ +#define __AUDACITY_TRACK_VIEW__ + +#include +#include "CommonTrackPanelCell.h" // to inherit + +class Track; + +class TrackView /* not final */ : public CommonTrackCell +{ + TrackView( const TrackView& ) = delete; + TrackView &operator=( const TrackView& ) = delete; + +public: + explicit + TrackView( const std::shared_ptr &pTrack ) + : CommonTrackCell{ pTrack } {} + virtual ~TrackView() = 0; + + static TrackView &Get( Track & ); + static const TrackView &Get( const Track & ); + + std::vector HitTest + (const TrackPanelMouseState &, const AudacityProject *pProject) + final override; + + // Delegates the handling to the related TCP cell + std::shared_ptr ContextMenuDelegate() override; + +protected: + Track *GetTrack() const; +}; + +#endif