1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-17 00:57:40 +02:00

Bug 2279 - Multi-view: turning it on does not cause a split Multi-view to be displayed

This commit is contained in:
James Crook 2020-01-09 14:04:31 +00:00
parent 05e24ec760
commit 596fd7c02f
3 changed files with 32 additions and 14 deletions

View File

@ -770,16 +770,18 @@ void WaveTrackMenuTable::OnMultiView(wxCommandEvent & event)
{ {
const auto pTrack = static_cast<WaveTrack*>(mpData->pTrack); const auto pTrack = static_cast<WaveTrack*>(mpData->pTrack);
const auto &view = WaveTrackView::Get( *pTrack ); const auto &view = WaveTrackView::Get( *pTrack );
const int nViewTypes = 2;
bool multi = !view.GetMultiView(); bool multi = !view.GetMultiView();
WaveTrackView::WaveTrackDisplay display; WaveTrackView::WaveTrackDisplay display;
if ( !multi ) display = *view.GetDisplays().begin();
display = *view.GetDisplays().begin();
for (const auto channel : TrackList::Channels(pTrack)) { for (const auto channel : TrackList::Channels(pTrack)) {
auto &channelView = WaveTrackView::Get( *channel ); auto &channelView = WaveTrackView::Get( *channel );
channelView.SetMultiView( multi ); channelView.SetMultiView( multi );
if ( !multi )
// Whichever sub-view was on top will take up all // Whichever sub-view was on top stays on top
channelView.SetDisplay( display ); // 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);
} }
} }

View File

@ -540,10 +540,10 @@ auto WaveTrackView::GetDisplays() const -> std::vector<WaveTrackDisplay>
return results; return results;
} }
void WaveTrackView::SetDisplay(WaveTrackDisplay display) void WaveTrackView::SetDisplay(WaveTrackDisplay display, float frac)
{ {
BuildSubViews(); BuildSubViews();
DoSetDisplay( display ); DoSetDisplay( display, frac );
} }
void WaveTrackView::ToggleSubView(WaveTrackDisplay display) 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 ii = 0;
size_t jj = 1;
const int nViewTypes = 2;
WaveTrackSubViews::ForEach( [&,display]( WaveTrackSubView &subView ){ WaveTrackSubViews::ForEach( [&,display]( WaveTrackSubView &subView ){
if ( subView.SubViewType() == display ) auto viewType = subView.SubViewType();
mPlacements[ii] = { 0, 1.0 }; if (viewType == display) {
else // 0 for first view
mPlacements[ii] = { 0, frac };
--jj;
}
else if( frac > 0.999)
// -1 for not displayed
mPlacements[ii] = { -1, 0.0 }; mPlacements[ii] = { -1, 0.0 };
else
// jj for positions excluding the first.
mPlacements[ii] = { (int)jj, (1.0f-frac)/(nViewTypes-1) };
++ii; ++ii;
++jj;
} ); } );
} }
@ -904,7 +920,7 @@ void WaveTrackView::BuildSubViews() const
settings.scaleType = WaveformSettings::stLogarithmic; settings.scaleType = WaveformSettings::stLogarithmic;
} }
pThis->DoSetDisplay( display ); pThis->DoSetDisplay( display, 1.0 );
} }
} }
} }

View File

@ -84,7 +84,7 @@ public:
using WaveTrackDisplay = WaveTrackViewConstants::Display; using WaveTrackDisplay = WaveTrackViewConstants::Display;
std::vector<WaveTrackDisplay> GetDisplays() const; std::vector<WaveTrackDisplay> GetDisplays() const;
void SetDisplay(WaveTrackDisplay display); void SetDisplay(WaveTrackDisplay display, float frac=1.0);
const WaveTrackSubViewPlacements &SavePlacements() const const WaveTrackSubViewPlacements &SavePlacements() const
{ return mPlacements; } { return mPlacements; }
@ -105,7 +105,7 @@ public:
private: private:
void BuildSubViews() const; void BuildSubViews() const;
void DoSetDisplay(WaveTrackDisplay display); void DoSetDisplay(WaveTrackDisplay display, float frac);
// TrackPanelDrawable implementation // TrackPanelDrawable implementation
void Draw( void Draw(