From d7a0fa72dbcea42db9b6e734cdd32592d0732ed9 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Tue, 9 Jul 2019 10:18:43 -0400 Subject: [PATCH] WaveTrackView does not depend on SpectrumView, WaveformView --- .../wavetrack/ui/SpectrumView.cpp | 11 +++++++ .../playabletrack/wavetrack/ui/SpectrumView.h | 8 +++-- .../wavetrack/ui/WaveTrackView.cpp | 32 +++++++++---------- .../wavetrack/ui/WaveTrackView.h | 20 ++++++++++-- .../wavetrack/ui/WaveformView.cpp | 11 +++++++ .../playabletrack/wavetrack/ui/WaveformView.h | 8 +++-- 6 files changed, 65 insertions(+), 25 deletions(-) diff --git a/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp b/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp index e2516422c..6447255df 100644 --- a/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp @@ -67,6 +67,11 @@ void SpectrumView::DoSetMinimized( bool minimized ) TrackView::DoSetMinimized( minimized ); } +WaveTrackViewConstants::Display SpectrumView::SubViewType() const +{ + return WaveTrackViewConstants::Spectrum; +} + std::shared_ptr SpectrumView::DoGetVRulerControls() { return std::make_shared( shared_from_this() ); @@ -635,3 +640,9 @@ void SpectrumView::Draw( } CommonTrackView::Draw( context, rect, iPass ); } + +static const WaveTrackSubViews::RegisteredFactory key{ + []( WaveTrackView &view ){ + return std::make_shared< SpectrumView >( view.FindTrack() ); + } +}; diff --git a/src/tracks/playabletrack/wavetrack/ui/SpectrumView.h b/src/tracks/playabletrack/wavetrack/ui/SpectrumView.h index d36176725..06f98131b 100644 --- a/src/tracks/playabletrack/wavetrack/ui/SpectrumView.h +++ b/src/tracks/playabletrack/wavetrack/ui/SpectrumView.h @@ -11,19 +11,21 @@ Paul Licameli split from WaveTrackView.h #ifndef __AUDACITY_SPECTRUM_VIEW__ #define __AUDACITY_SPECTRUM_VIEW__ -#include "../../../ui/CommonTrackView.h" // to inherit +#include "WaveTrackView.h" // to inherit class WaveTrack; -class SpectrumView final : public CommonTrackView +class SpectrumView final : public WaveTrackSubView { SpectrumView( const SpectrumView& ) = delete; SpectrumView &operator=( const SpectrumView& ) = delete; public: - using CommonTrackView::CommonTrackView; + using WaveTrackSubView::WaveTrackSubView; ~SpectrumView() override; + virtual WaveTrackViewConstants::Display SubViewType() const override; + std::shared_ptr DoGetVRulerControls() override; diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp index 5664b2bd2..8c47bcb34 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp @@ -17,9 +17,6 @@ Paul Licameli split from TrackPanel.cpp #include "../../../../WaveClip.h" #include "../../../../WaveTrack.h" -#include "SpectrumView.h" -#include "WaveformView.h" - #include "../../../../TrackArtist.h" #include "../../../../TrackPanelDrawingContext.h" #include "../../../../TrackPanelMouseEvent.h" @@ -30,9 +27,8 @@ Paul Licameli split from TrackPanel.cpp WaveTrackView::WaveTrackView( const std::shared_ptr &pTrack ) : CommonTrackView{ pTrack } - , mWaveformView{ std::make_shared< WaveformView >( pTrack ) } - , mSpectrumView{ std::make_shared< SpectrumView >( pTrack ) } { + WaveTrackSubViews::BuildAll(); } WaveTrackView::~WaveTrackView() @@ -82,12 +78,18 @@ WaveTrackView::DoDetailedHitTest auto WaveTrackView::GetSubViews( const wxRect &rect ) -> Refinement { auto wt = static_cast( FindTrack().get() ); + auto display = wt->GetDisplay(); + std::shared_ptr pSubView; + WaveTrackSubViews::ForEach( [&,display]( WaveTrackSubView &subView ){ + if ( subView.SubViewType() == display ) + pSubView = subView.shared_from_this(); + } ); + if ( !pSubView ) + return {}; return { { rect.GetTop(), - wt->GetDisplay() == WaveTrackViewConstants::Waveform - ? mWaveformView - : mSpectrumView + pSubView } }; } @@ -95,11 +97,10 @@ auto WaveTrackView::GetSubViews( const wxRect &rect ) -> Refinement void WaveTrackView::DoSetMinimized( bool minimized ) { // May come here. Invoke also on sub-views. - if ( mWaveformView ) - mWaveformView->DoSetMinimized( minimized ); - if ( mSpectrumView ) - mSpectrumView->DoSetMinimized( minimized ); TrackView::DoSetMinimized( minimized ); + WaveTrackSubViews::ForEach( [minimized](WaveTrackSubView &subView){ + subView.DoSetMinimized( minimized ); + } ); } using DoGetWaveTrackView = DoGetView::Override< WaveTrack >; @@ -305,10 +306,9 @@ ClipParameters::ClipParameters void WaveTrackView::Reparent( const std::shared_ptr &parent ) { CommonTrackView::Reparent( parent ); - if ( mWaveformView ) - mWaveformView->Reparent( parent ); - if ( mSpectrumView ) - mSpectrumView->Reparent( parent ); + WaveTrackSubViews::ForEach( [&parent](WaveTrackSubView &subView){ + subView.Reparent( parent ); + } ); } void WaveTrackView::Draw( diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h index e0bd4ab69..ce25fb991 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h @@ -12,10 +12,26 @@ Paul Licameli split from class WaveTrack #define __AUDACITY_WAVE_TRACK_VIEW__ #include "../../../ui/CommonTrackView.h" +#include "../../../../ClientData.h" +namespace WaveTrackViewConstants{ enum Display : int; } class WaveTrack; +class WaveTrackSubView : public CommonTrackView +{ +public: + using CommonTrackView::CommonTrackView; + + virtual WaveTrackViewConstants::Display SubViewType() const = 0; +}; -class WaveTrackView final : public CommonTrackView +class WaveTrackView; +using WaveTrackSubViews = ClientData::Site< + WaveTrackView, WaveTrackSubView, ClientData::SkipCopying, std::shared_ptr +>; + +class WaveTrackView final + : public CommonTrackView + , public WaveTrackSubViews { WaveTrackView( const WaveTrackView& ) = delete; WaveTrackView &operator=( const WaveTrackView& ) = delete; @@ -55,8 +71,6 @@ private: protected: void DoSetMinimized( bool minimized ) override; - - std::shared_ptr< CommonTrackView > mWaveformView, mSpectrumView; }; // Helper for drawing routines diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveformView.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveformView.cpp index 3fa20cebd..115593418 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveformView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveformView.cpp @@ -125,6 +125,11 @@ void WaveformView::DoSetMinimized( bool minimized ) TrackView::DoSetMinimized( minimized ); } +WaveTrackViewConstants::Display WaveformView::SubViewType() const +{ + return WaveTrackViewConstants::Waveform; +} + std::shared_ptr WaveformView::DoGetVRulerControls() { return std::make_shared( shared_from_this() ); @@ -1074,3 +1079,9 @@ void WaveformView::Draw( } CommonTrackView::Draw( context, rect, iPass ); } + +static const WaveTrackSubViews::RegisteredFactory key{ + []( WaveTrackView &view ){ + return std::make_shared< WaveformView >( view.FindTrack() ); + } +}; diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveformView.h b/src/tracks/playabletrack/wavetrack/ui/WaveformView.h index 7457d69c6..58a1a673a 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveformView.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveformView.h @@ -11,22 +11,24 @@ Paul Licameli split from WaveTrackView.h #ifndef __AUDACITY_WAVEFORM_VIEW__ #define __AUDACITY_WAVEFORM_VIEW__ -#include "../../../ui/CommonTrackView.h" // to inherit +#include "WaveTrackView.h" // to inherit class WaveTrack; class CutlineHandle; class SampleHandle; class EnvelopeHandle; -class WaveformView final : public CommonTrackView +class WaveformView final : public WaveTrackSubView { WaveformView( const WaveformView& ) = delete; WaveformView &operator=( const WaveformView& ) = delete; public: - using CommonTrackView::CommonTrackView; + using WaveTrackSubView::WaveTrackSubView; ~WaveformView() override; + virtual WaveTrackViewConstants::Display SubViewType() const override; + std::shared_ptr DoGetVRulerControls() override;