diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 9b800caa4..404b92a05 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -916,15 +916,29 @@ void TrackPanel::UpdateTrackVRuler(Track *t) return; wxRect rect(mViewInfo->GetVRulerOffset(), - kTopMargin, + 0, mViewInfo->GetVRulerWidth(), 0); for (auto channel : TrackList::Channels(t)) { auto &view = TrackView::Get( *channel ); - rect.height = view.GetHeight() - (kTopMargin + kBottomMargin); - TrackVRulerControls::Get( *channel ).UpdateRuler( rect ); + const auto height = view.GetHeight() - (kTopMargin + kBottomMargin); + const auto subViews = view.GetSubViews( rect ); + if (subViews.empty()) + continue; + + auto iter = subViews.begin(), end = subViews.end(), next = iter; + auto yy = iter->first; + for ( ; iter != end; iter = next ) { + ++next; + auto nextY = ( next == end ) + ? height + : next->first; + rect.SetHeight( nextY - yy ); + TrackVRulerControls::Get( *iter->second ).UpdateRuler( rect ); + yy = nextY; + } } } @@ -1093,39 +1107,48 @@ struct EmptyCell final : CommonTrackPanelCell { // A vertical ruler left of a channel struct VRulerAndChannel final : TrackPanelGroup { VRulerAndChannel( - const std::shared_ptr< Track > &pChannel, wxCoord leftOffset ) - : mpChannel{ pChannel }, mLeftOffset{ leftOffset } {} + const std::shared_ptr< TrackView > &pView, wxCoord leftOffset ) + : mpView{ pView }, mLeftOffset{ leftOffset } {} Subdivision Children( const wxRect &rect ) override { return { Axis::X, Refinement{ { rect.GetLeft(), - TrackVRulerControls::Get( *mpChannel ).shared_from_this() }, - { mLeftOffset, - TrackView::Get( *mpChannel ).shared_from_this() } + TrackVRulerControls::Get( *mpView ).shared_from_this() }, + { mLeftOffset, mpView } } }; } - std::shared_ptr< Track > mpChannel; + std::shared_ptr< TrackView > mpView; wxCoord mLeftOffset; }; -// n channels with vertical rulers, alternating with n - 1 resizers +// n channels with vertical rulers, alternating with n - 1 resizers; +// each channel-ruler pair might be divided into multiple views struct ChannelGroup final : TrackPanelGroup { ChannelGroup( const std::shared_ptr< Track > &pTrack, wxCoord leftOffset ) : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {} - Subdivision Children( const wxRect &rect ) override + Subdivision Children( const wxRect &rect_ ) override { + auto rect = rect_; Refinement refinement; const auto channels = TrackList::Channels( mpTrack.get() ); const auto pLast = *channels.rbegin(); wxCoord yy = rect.GetTop(); for ( auto channel : channels ) { - refinement.emplace_back( yy, - std::make_shared< VRulerAndChannel >( - channel->SharedPointer(), mLeftOffset ) ); + auto &view = TrackView::Get( *channel ); + auto height = view.GetHeight(); + rect.SetTop( yy ); + rect.SetHeight( height ); + const auto subViews = TrackView::Get( *channel ).GetSubViews( rect ); + auto y1 = yy; + for ( const auto &subView : subViews ) { + y1 = std::max( y1, subView.first ); + refinement.emplace_back( y1, + std::make_shared< VRulerAndChannel >( + subView.second, mLeftOffset ) ); + } if ( channel != pLast ) { - auto &view = TrackView::Get( *channel ); - yy += view.GetHeight(); + yy += height; refinement.emplace_back( yy - kSeparatorThickness, TrackView::Get( *channel ).GetResizer() ); diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp index e37cdd914..d4e33a99e 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp @@ -85,6 +85,19 @@ WaveTrackView::DoDetailedHitTest return { false, results }; } +auto WaveTrackView::GetSubViews( const wxRect &rect ) -> Refinement +{ + auto wt = static_cast( FindTrack().get() ); + return { + { + rect.GetTop(), + wt->GetDisplay() == WaveTrackViewConstants::Waveform + ? mWaveformView + : mSpectrumView + } + }; +} + void WaveTrackView::DoSetMinimized( bool minimized ) { auto wt = static_cast( FindTrack().get() ); diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h index 96d6af8e1..c88b02ce5 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h @@ -50,6 +50,9 @@ private: const std::shared_ptr &wt, CommonTrackView &view); + // TrackView implementation + Refinement GetSubViews( const wxRect &rect ) override; + protected: void DoSetMinimized( bool minimized ) override; diff --git a/src/tracks/ui/TrackVRulerControls.cpp b/src/tracks/ui/TrackVRulerControls.cpp index 9e10d3c4c..bbeffd536 100644 --- a/src/tracks/ui/TrackVRulerControls.cpp +++ b/src/tracks/ui/TrackVRulerControls.cpp @@ -33,16 +33,6 @@ TrackVRulerControls::~TrackVRulerControls() { } -TrackVRulerControls &TrackVRulerControls::Get( Track &track ) -{ - return *TrackView::Get( track ).GetVRulerControls(); -} - -const TrackVRulerControls &TrackVRulerControls::Get( const Track &track ) -{ - return *TrackView::Get( track ).GetVRulerControls(); -} - TrackVRulerControls &TrackVRulerControls::Get( TrackView &trackView ) { return *trackView.GetVRulerControls(); diff --git a/src/tracks/ui/TrackVRulerControls.h b/src/tracks/ui/TrackVRulerControls.h index 52a421193..9d0385dce 100644 --- a/src/tracks/ui/TrackVRulerControls.h +++ b/src/tracks/ui/TrackVRulerControls.h @@ -28,9 +28,6 @@ public: virtual ~TrackVRulerControls() = 0; - static TrackVRulerControls &Get( Track& ); - static const TrackVRulerControls &Get( const Track& ); - static TrackVRulerControls &Get( TrackView& ); static const TrackVRulerControls &Get( const TrackView& ); diff --git a/src/tracks/ui/TrackView.cpp b/src/tracks/ui/TrackView.cpp index 07a4b0491..0bd73482f 100644 --- a/src/tracks/ui/TrackView.cpp +++ b/src/tracks/ui/TrackView.cpp @@ -106,6 +106,11 @@ bool TrackView::HandleXMLAttribute( const wxChar *attr, const wxChar *value ) return false; } +auto TrackView::GetSubViews( const wxRect &rect ) -> Refinement +{ + return { { rect.GetTop(), shared_from_this() } }; +} + void TrackView::DoSetMinimized(bool isMinimized) { mMinimized = isMinimized; diff --git a/src/tracks/ui/TrackView.h b/src/tracks/ui/TrackView.h index 1af0dbf2d..30d45512a 100644 --- a/src/tracks/ui/TrackView.h +++ b/src/tracks/ui/TrackView.h @@ -72,6 +72,13 @@ public: void WriteXMLAttributes( XMLWriter & ) const override; bool HandleXMLAttribute( const wxChar *attr, const wxChar *value ) override; + // New virtual function. The default just returns a one-element array + // containing this. Overrides might refine the Y axis. + using Refinement = std::vector< std::pair< + wxCoord, std::shared_ptr< TrackView > + > >; + virtual Refinement GetSubViews( const wxRect &rect ); + protected: virtual void DoSetMinimized( bool isMinimized );