From 596fd7c02f487aac65046c0ec46d680d69ee21e8 Mon Sep 17 00:00:00 2001 From: James Crook Date: Thu, 9 Jan 2020 14:04:31 +0000 Subject: [PATCH] Bug 2279 - Multi-view: turning it on does not cause a split Multi-view to be displayed --- .../wavetrack/ui/WaveTrackControls.cpp | 12 ++++---- .../wavetrack/ui/WaveTrackView.cpp | 30 ++++++++++++++----- .../wavetrack/ui/WaveTrackView.h | 4 +-- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp index ff76f4326..c10fb2eb8 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp @@ -770,16 +770,18 @@ void WaveTrackMenuTable::OnMultiView(wxCommandEvent & event) { const auto pTrack = static_cast(mpData->pTrack); const auto &view = WaveTrackView::Get( *pTrack ); + const int nViewTypes = 2; bool multi = !view.GetMultiView(); WaveTrackView::WaveTrackDisplay display; - if ( !multi ) - display = *view.GetDisplays().begin(); + display = *view.GetDisplays().begin(); for (const auto channel : TrackList::Channels(pTrack)) { auto &channelView = WaveTrackView::Get( *channel ); channelView.SetMultiView( multi ); - if ( !multi ) - // Whichever sub-view was on top will take up all - channelView.SetDisplay( display ); + + // Whichever sub-view was on top stays on top + // If going into Multi-view, it will be 1/nth the height. + // If exiting multi-view, it will be full height. + channelView.SetDisplay(display, multi ? 1.0/nViewTypes :1.0); } } diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp index f8a58130c..b0b94af16 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp @@ -540,10 +540,10 @@ auto WaveTrackView::GetDisplays() const -> std::vector return results; } -void WaveTrackView::SetDisplay(WaveTrackDisplay display) +void WaveTrackView::SetDisplay(WaveTrackDisplay display, float frac) { BuildSubViews(); - DoSetDisplay( display ); + DoSetDisplay( display, frac ); } void WaveTrackView::ToggleSubView(WaveTrackDisplay display) @@ -587,15 +587,31 @@ void WaveTrackView::ToggleSubView(WaveTrackDisplay display) } } -void WaveTrackView::DoSetDisplay(WaveTrackDisplay display) +// frac sets proportion/height of the chosen display, which will be first. +// use 1.0 to take up entire space +// use some fraction to take up that proportion, leaving the rest for +// one each of the other types. +// use 1.0/number-of-types for equal spacing. +void WaveTrackView::DoSetDisplay(WaveTrackDisplay display,float frac) { size_t ii = 0; + size_t jj = 1; + const int nViewTypes = 2; WaveTrackSubViews::ForEach( [&,display]( WaveTrackSubView &subView ){ - if ( subView.SubViewType() == display ) - mPlacements[ii] = { 0, 1.0 }; - else + auto viewType = subView.SubViewType(); + if (viewType == display) { + // 0 for first view + mPlacements[ii] = { 0, frac }; + --jj; + } + else if( frac > 0.999) + // -1 for not displayed mPlacements[ii] = { -1, 0.0 }; + else + // jj for positions excluding the first. + mPlacements[ii] = { (int)jj, (1.0f-frac)/(nViewTypes-1) }; ++ii; + ++jj; } ); } @@ -904,7 +920,7 @@ void WaveTrackView::BuildSubViews() const settings.scaleType = WaveformSettings::stLogarithmic; } - pThis->DoSetDisplay( display ); + pThis->DoSetDisplay( display, 1.0 ); } } } diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h index df8282b76..4359a690e 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h @@ -84,7 +84,7 @@ public: using WaveTrackDisplay = WaveTrackViewConstants::Display; std::vector GetDisplays() const; - void SetDisplay(WaveTrackDisplay display); + void SetDisplay(WaveTrackDisplay display, float frac=1.0); const WaveTrackSubViewPlacements &SavePlacements() const { return mPlacements; } @@ -105,7 +105,7 @@ public: private: void BuildSubViews() const; - void DoSetDisplay(WaveTrackDisplay display); + void DoSetDisplay(WaveTrackDisplay display, float frac); // TrackPanelDrawable implementation void Draw(