diff --git a/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp b/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp index 43449dda8..56491c76e 100644 --- a/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp @@ -649,6 +649,6 @@ void SpectrumView::Draw( static const WaveTrackSubViews::RegisteredFactory key{ []( WaveTrackView &view ){ - return std::make_shared< SpectrumView >( view.FindTrack() ); + return std::make_shared< SpectrumView >( view ); } }; diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp index dd88a5887..f3250ab82 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp @@ -53,22 +53,13 @@ const WaveTrackView &WaveTrackView::Get( const WaveTrack &track ) WaveTrackView::WaveTrackView( const std::shared_ptr &pTrack ) : CommonTrackView{ pTrack } { - WaveTrackSubViews::BuildAll(); +} - auto display = TracksPrefs::ViewModeChoice(); - - // Force creation always: - WaveformSettings &settings = static_cast< WaveTrack* >( pTrack.get() ) - ->GetIndependentWaveformSettings(); - - if (display == WaveTrackViewConstants::obsoleteWaveformDBDisplay) { - display = WaveTrackViewConstants::Waveform; - settings.scaleType = WaveformSettings::stLogarithmic; - } - - mPlacements.resize( WaveTrackSubViews::size() ); - - SetDisplay( display ); +WaveTrackSubView::WaveTrackSubView( WaveTrackView &waveTrackView ) + : CommonTrackView( waveTrackView.FindTrack() ) +{ + mwWaveTrackView = std::static_pointer_cast( + waveTrackView.shared_from_this() ); } WaveTrackView::~WaveTrackView() @@ -128,6 +119,8 @@ WaveTrackView::DoDetailedHitTest auto WaveTrackView::GetDisplays() const -> std::vector { + BuildSubViews(); + // Collect the display types of visible views and sort them by position using Pair = std::pair< int, WaveTrackDisplay >; std::vector< Pair > pairs; @@ -146,6 +139,12 @@ auto WaveTrackView::GetDisplays() const -> std::vector } void WaveTrackView::SetDisplay(WaveTrackDisplay display) +{ + BuildSubViews(); + DoSetDisplay( display ); +} + +void WaveTrackView::DoSetDisplay(WaveTrackDisplay display) { size_t ii = 0; WaveTrackSubViews::ForEach( [&,display]( WaveTrackSubView &subView ){ @@ -159,6 +158,8 @@ void WaveTrackView::SetDisplay(WaveTrackDisplay display) auto WaveTrackView::GetSubViews( const wxRect &rect ) -> Refinement { + BuildSubViews(); + Refinement results; // Collect the visible views in the right sequence @@ -209,6 +210,8 @@ auto WaveTrackView::GetSubViews( const wxRect &rect ) -> Refinement std::vector< std::shared_ptr< WaveTrackSubView > > WaveTrackView::GetAllSubViews() { + BuildSubViews(); + std::vector< std::shared_ptr< WaveTrackSubView > > results; WaveTrackSubViews::ForEach( [&]( WaveTrackSubView &subView ){ results.push_back( std::static_pointer_cast( @@ -219,6 +222,8 @@ WaveTrackView::GetAllSubViews() void WaveTrackView::DoSetMinimized( bool minimized ) { + BuildSubViews(); + // May come here. Invoke also on sub-views. TrackView::DoSetMinimized( minimized ); WaveTrackSubViews::ForEach( [minimized](WaveTrackSubView &subView){ @@ -428,12 +433,41 @@ ClipParameters::ClipParameters void WaveTrackView::Reparent( const std::shared_ptr &parent ) { + // BuildSubViews(); // not really needed CommonTrackView::Reparent( parent ); WaveTrackSubViews::ForEach( [&parent](WaveTrackSubView &subView){ subView.Reparent( parent ); } ); } +void WaveTrackView::BuildSubViews() const +{ + if ( WaveTrackSubViews::size() == 0) { + // On-demand steps that can't happen in the constructor + auto pThis = const_cast( this ); + pThis->BuildAll(); + pThis->mPlacements.resize( WaveTrackSubViews::size() ); + bool minimized = GetMinimized(); + pThis->WaveTrackSubViews::ForEach( [&]( WaveTrackSubView &subView ){ + subView.DoSetMinimized( minimized ); + } ); + + auto pTrack = pThis->FindTrack(); + auto display = TracksPrefs::ViewModeChoice(); + + // Force creation always: + WaveformSettings &settings = static_cast< WaveTrack* >( pTrack.get() ) + ->GetIndependentWaveformSettings(); + + if (display == WaveTrackViewConstants::obsoleteWaveformDBDisplay) { + display = WaveTrackViewConstants::Waveform; + settings.scaleType = WaveformSettings::stLogarithmic; + } + + pThis->DoSetDisplay( display ); + } +} + void WaveTrackView::Draw( TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass ) diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h index 00dd86c45..65b0bbf42 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h @@ -16,10 +16,13 @@ Paul Licameli split from class WaveTrack namespace WaveTrackViewConstants{ enum Display : int; } class WaveTrack; +class WaveTrackView; + class WaveTrackSubView : public CommonTrackView { public: - using CommonTrackView::CommonTrackView; + explicit + WaveTrackSubView( WaveTrackView &waveTrackView ); virtual WaveTrackViewConstants::Display SubViewType() const = 0; @@ -31,7 +34,9 @@ public: const AudacityProject *pProject, int currentTool, bool bMultiTool, const std::shared_ptr &wt, CommonTrackView &view); -}; +private: + std::weak_ptr mwWaveTrackView; + }; struct WaveTrackSubViewPlacement { int index; @@ -91,6 +96,9 @@ public: std::vector< std::shared_ptr< WaveTrackSubView > > GetAllSubViews(); private: + void BuildSubViews() const; + void DoSetDisplay(WaveTrackDisplay display); + // TrackPanelDrawable implementation void Draw( TrackPanelDrawingContext &context, diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveformView.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveformView.cpp index 0d02853ce..45eb16792 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveformView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveformView.cpp @@ -1084,6 +1084,6 @@ void WaveformView::Draw( static const WaveTrackSubViews::RegisteredFactory key{ []( WaveTrackView &view ){ - return std::make_shared< WaveformView >( view.FindTrack() ); + return std::make_shared< WaveformView >( view ); } };