1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-02 08:59:28 +02:00

WaveTrackSubView has a back-pointer to the WaveTrackView

This commit is contained in:
Paul Licameli 2019-07-09 18:19:47 -04:00
parent e3d9fd95ab
commit d26b55ee3c
4 changed files with 61 additions and 19 deletions

View File

@ -649,6 +649,6 @@ void SpectrumView::Draw(
static const WaveTrackSubViews::RegisteredFactory key{ static const WaveTrackSubViews::RegisteredFactory key{
[]( WaveTrackView &view ){ []( WaveTrackView &view ){
return std::make_shared< SpectrumView >( view.FindTrack() ); return std::make_shared< SpectrumView >( view );
} }
}; };

View File

@ -53,22 +53,13 @@ const WaveTrackView &WaveTrackView::Get( const WaveTrack &track )
WaveTrackView::WaveTrackView( const std::shared_ptr<Track> &pTrack ) WaveTrackView::WaveTrackView( const std::shared_ptr<Track> &pTrack )
: CommonTrackView{ pTrack } : CommonTrackView{ pTrack }
{ {
WaveTrackSubViews::BuildAll(); }
auto display = TracksPrefs::ViewModeChoice(); WaveTrackSubView::WaveTrackSubView( WaveTrackView &waveTrackView )
: CommonTrackView( waveTrackView.FindTrack() )
// Force creation always: {
WaveformSettings &settings = static_cast< WaveTrack* >( pTrack.get() ) mwWaveTrackView = std::static_pointer_cast<WaveTrackView>(
->GetIndependentWaveformSettings(); waveTrackView.shared_from_this() );
if (display == WaveTrackViewConstants::obsoleteWaveformDBDisplay) {
display = WaveTrackViewConstants::Waveform;
settings.scaleType = WaveformSettings::stLogarithmic;
}
mPlacements.resize( WaveTrackSubViews::size() );
SetDisplay( display );
} }
WaveTrackView::~WaveTrackView() WaveTrackView::~WaveTrackView()
@ -128,6 +119,8 @@ WaveTrackView::DoDetailedHitTest
auto WaveTrackView::GetDisplays() const -> std::vector<WaveTrackDisplay> auto WaveTrackView::GetDisplays() const -> std::vector<WaveTrackDisplay>
{ {
BuildSubViews();
// Collect the display types of visible views and sort them by position // Collect the display types of visible views and sort them by position
using Pair = std::pair< int, WaveTrackDisplay >; using Pair = std::pair< int, WaveTrackDisplay >;
std::vector< Pair > pairs; std::vector< Pair > pairs;
@ -146,6 +139,12 @@ auto WaveTrackView::GetDisplays() const -> std::vector<WaveTrackDisplay>
} }
void WaveTrackView::SetDisplay(WaveTrackDisplay display) void WaveTrackView::SetDisplay(WaveTrackDisplay display)
{
BuildSubViews();
DoSetDisplay( display );
}
void WaveTrackView::DoSetDisplay(WaveTrackDisplay display)
{ {
size_t ii = 0; size_t ii = 0;
WaveTrackSubViews::ForEach( [&,display]( WaveTrackSubView &subView ){ WaveTrackSubViews::ForEach( [&,display]( WaveTrackSubView &subView ){
@ -159,6 +158,8 @@ void WaveTrackView::SetDisplay(WaveTrackDisplay display)
auto WaveTrackView::GetSubViews( const wxRect &rect ) -> Refinement auto WaveTrackView::GetSubViews( const wxRect &rect ) -> Refinement
{ {
BuildSubViews();
Refinement results; Refinement results;
// Collect the visible views in the right sequence // 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 > > std::vector< std::shared_ptr< WaveTrackSubView > >
WaveTrackView::GetAllSubViews() WaveTrackView::GetAllSubViews()
{ {
BuildSubViews();
std::vector< std::shared_ptr< WaveTrackSubView > > results; std::vector< std::shared_ptr< WaveTrackSubView > > results;
WaveTrackSubViews::ForEach( [&]( WaveTrackSubView &subView ){ WaveTrackSubViews::ForEach( [&]( WaveTrackSubView &subView ){
results.push_back( std::static_pointer_cast<WaveTrackSubView>( results.push_back( std::static_pointer_cast<WaveTrackSubView>(
@ -219,6 +222,8 @@ WaveTrackView::GetAllSubViews()
void WaveTrackView::DoSetMinimized( bool minimized ) void WaveTrackView::DoSetMinimized( bool minimized )
{ {
BuildSubViews();
// May come here. Invoke also on sub-views. // May come here. Invoke also on sub-views.
TrackView::DoSetMinimized( minimized ); TrackView::DoSetMinimized( minimized );
WaveTrackSubViews::ForEach( [minimized](WaveTrackSubView &subView){ WaveTrackSubViews::ForEach( [minimized](WaveTrackSubView &subView){
@ -428,12 +433,41 @@ ClipParameters::ClipParameters
void WaveTrackView::Reparent( const std::shared_ptr<Track> &parent ) void WaveTrackView::Reparent( const std::shared_ptr<Track> &parent )
{ {
// BuildSubViews(); // not really needed
CommonTrackView::Reparent( parent ); CommonTrackView::Reparent( parent );
WaveTrackSubViews::ForEach( [&parent](WaveTrackSubView &subView){ WaveTrackSubViews::ForEach( [&parent](WaveTrackSubView &subView){
subView.Reparent( parent ); 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<WaveTrackView*>( 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( void WaveTrackView::Draw(
TrackPanelDrawingContext &context, TrackPanelDrawingContext &context,
const wxRect &rect, unsigned iPass ) const wxRect &rect, unsigned iPass )

View File

@ -16,10 +16,13 @@ Paul Licameli split from class WaveTrack
namespace WaveTrackViewConstants{ enum Display : int; } namespace WaveTrackViewConstants{ enum Display : int; }
class WaveTrack; class WaveTrack;
class WaveTrackView;
class WaveTrackSubView : public CommonTrackView class WaveTrackSubView : public CommonTrackView
{ {
public: public:
using CommonTrackView::CommonTrackView; explicit
WaveTrackSubView( WaveTrackView &waveTrackView );
virtual WaveTrackViewConstants::Display SubViewType() const = 0; virtual WaveTrackViewConstants::Display SubViewType() const = 0;
@ -31,7 +34,9 @@ public:
const AudacityProject *pProject, int currentTool, bool bMultiTool, const AudacityProject *pProject, int currentTool, bool bMultiTool,
const std::shared_ptr<WaveTrack> &wt, const std::shared_ptr<WaveTrack> &wt,
CommonTrackView &view); CommonTrackView &view);
}; private:
std::weak_ptr<WaveTrackView> mwWaveTrackView;
};
struct WaveTrackSubViewPlacement { struct WaveTrackSubViewPlacement {
int index; int index;
@ -91,6 +96,9 @@ public:
std::vector< std::shared_ptr< WaveTrackSubView > > GetAllSubViews(); std::vector< std::shared_ptr< WaveTrackSubView > > GetAllSubViews();
private: private:
void BuildSubViews() const;
void DoSetDisplay(WaveTrackDisplay display);
// TrackPanelDrawable implementation // TrackPanelDrawable implementation
void Draw( void Draw(
TrackPanelDrawingContext &context, TrackPanelDrawingContext &context,

View File

@ -1084,6 +1084,6 @@ void WaveformView::Draw(
static const WaveTrackSubViews::RegisteredFactory key{ static const WaveTrackSubViews::RegisteredFactory key{
[]( WaveTrackView &view ){ []( WaveTrackView &view ){
return std::make_shared< WaveformView >( view.FindTrack() ); return std::make_shared< WaveformView >( view );
} }
}; };