1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 16:10:06 +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{
[]( 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 )
: 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>(
waveTrackView.shared_from_this() );
}
WaveTrackView::~WaveTrackView()
@ -128,6 +119,8 @@ WaveTrackView::DoDetailedHitTest
auto WaveTrackView::GetDisplays() const -> std::vector<WaveTrackDisplay>
{
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<WaveTrackDisplay>
}
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<WaveTrackSubView>(
@ -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<Track> &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<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(
TrackPanelDrawingContext &context,
const wxRect &rect, unsigned iPass )

View File

@ -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<WaveTrack> &wt,
CommonTrackView &view);
};
private:
std::weak_ptr<WaveTrackView> 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,

View File

@ -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 );
}
};