mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-16 16:10:06 +02:00
Reimplement WaveTrackView::SetDisplay, eliminating mDisplay...
... and much generality for the future in reporting the sub-view division to TrackPanel. SetDisplay will have the effect of making one of possibly multiple views take up all the height. Where we need to save and restore or otherwise copy the sub-views, there is more information now than just one enum value.
This commit is contained in:
parent
6ccca16a75
commit
2f544bda7a
@ -49,7 +49,7 @@ SpectrumPrefs::SpectrumPrefs(wxWindow * parent, wxWindowID winid, WaveTrack *wt)
|
||||
wt->GetSpectrumBounds(&mOrigMin, &mOrigMax);
|
||||
mTempSettings.maxFreq = mOrigMax;
|
||||
mTempSettings.minFreq = mOrigMin;
|
||||
mOrigDisplay = WaveTrackView::Get( *mWt ).GetDisplay();
|
||||
mOrigPlacements = WaveTrackView::Get( *mWt ).SavePlacements();
|
||||
}
|
||||
else {
|
||||
mTempSettings = mOrigSettings = SpectrogramSettings::defaults();
|
||||
@ -424,7 +424,7 @@ void SpectrumPrefs::Rollback()
|
||||
if (mWt && isOpenPage) {
|
||||
auto channels = TrackList::Channels(mWt);
|
||||
for (auto channel : channels)
|
||||
WaveTrackView::Get( *channel ).SetDisplay( mOrigDisplay );
|
||||
WaveTrackView::Get( *channel ).RestorePlacements( mOrigPlacements );
|
||||
}
|
||||
|
||||
if (isOpenPage) {
|
||||
|
@ -23,6 +23,7 @@
|
||||
|
||||
#include "../Experimental.h"
|
||||
|
||||
#include <vector>
|
||||
#include <wx/defs.h>
|
||||
|
||||
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackViewConstants.h"
|
||||
@ -38,6 +39,7 @@ struct FFTParam;
|
||||
class ShuttleGui;
|
||||
class SpectrogramSettings;
|
||||
class WaveTrack;
|
||||
struct WaveTrackSubViewPlacement;
|
||||
|
||||
#define SPECTRUM_PREFS_PLUGIN_SYMBOL ComponentInterfaceSymbol{ XO("Spectrum") }
|
||||
|
||||
@ -98,7 +100,7 @@ class SpectrumPrefs final : public PrefsPanel
|
||||
|
||||
SpectrogramSettings mTempSettings, mOrigSettings;
|
||||
|
||||
WaveTrackViewConstants::Display mOrigDisplay;
|
||||
std::vector<WaveTrackSubViewPlacement> mOrigPlacements;
|
||||
float mOrigMin, mOrigMax;
|
||||
|
||||
bool mPopulating;
|
||||
|
@ -889,7 +889,7 @@ void WaveTrackMenuTable::OnMergeStereo(wxCommandEvent &)
|
||||
view.SetMinimized(bBothMinimizedp);
|
||||
partnerView.SetMinimized(bBothMinimizedp);
|
||||
|
||||
partnerView.SetDisplay( view.GetDisplay() );
|
||||
partnerView.RestorePlacements( view.SavePlacements() );
|
||||
|
||||
//On Demand - join the queues together.
|
||||
if (ODManager::IsInstanceCreated())
|
||||
|
@ -42,16 +42,20 @@ WaveTrackView::WaveTrackView( const std::shared_ptr<Track> &pTrack )
|
||||
{
|
||||
WaveTrackSubViews::BuildAll();
|
||||
|
||||
mDisplay = TracksPrefs::ViewModeChoice();
|
||||
auto display = TracksPrefs::ViewModeChoice();
|
||||
|
||||
// Force creation always:
|
||||
WaveformSettings &settings = static_cast< WaveTrack* >( pTrack.get() )
|
||||
->GetIndependentWaveformSettings();
|
||||
|
||||
if (mDisplay == WaveTrackViewConstants::obsoleteWaveformDBDisplay) {
|
||||
mDisplay = WaveTrackViewConstants::Waveform;
|
||||
if (display == WaveTrackViewConstants::obsoleteWaveformDBDisplay) {
|
||||
display = WaveTrackViewConstants::Waveform;
|
||||
settings.scaleType = WaveformSettings::stLogarithmic;
|
||||
}
|
||||
|
||||
mPlacements.resize( WaveTrackSubViews::size() );
|
||||
|
||||
SetDisplay( display );
|
||||
}
|
||||
|
||||
WaveTrackView::~WaveTrackView()
|
||||
@ -65,7 +69,7 @@ void WaveTrackView::CopyTo( Track &track ) const
|
||||
|
||||
if ( const auto pOther = dynamic_cast< WaveTrackView* >( &other ) ) {
|
||||
// only one field is important to preserve in undo/redo history
|
||||
pOther->mDisplay = mDisplay;
|
||||
pOther->RestorePlacements( SavePlacements() );
|
||||
}
|
||||
}
|
||||
|
||||
@ -109,22 +113,67 @@ WaveTrackView::DoDetailedHitTest
|
||||
return { false, results };
|
||||
}
|
||||
|
||||
auto WaveTrackView::GetSubViews( const wxRect &rect ) -> Refinement
|
||||
auto WaveTrackView::GetDisplay() const -> WaveTrackDisplay
|
||||
{
|
||||
auto display = mDisplay;
|
||||
std::shared_ptr<TrackView> pSubView;
|
||||
// To do: make the return a vector of values. For now, just report the
|
||||
// last sub-view that is visible.
|
||||
WaveTrackDisplay display{ WaveTrackViewConstants::NoDisplay };
|
||||
size_t ii = 0;
|
||||
WaveTrackSubViews::ForEach( [&]( const WaveTrackSubView &subView ){
|
||||
if ( mPlacements[ii].fraction > 0 )
|
||||
display = subView.SubViewType();
|
||||
++ii;
|
||||
} );
|
||||
return display;
|
||||
}
|
||||
|
||||
void WaveTrackView::SetDisplay(WaveTrackDisplay display)
|
||||
{
|
||||
size_t ii = 0;
|
||||
WaveTrackSubViews::ForEach( [&,display]( WaveTrackSubView &subView ){
|
||||
if ( subView.SubViewType() == display )
|
||||
pSubView = subView.shared_from_this();
|
||||
mPlacements[ii] = { 0, 1.0 };
|
||||
else
|
||||
mPlacements[ii] = { -1, 0.0 };
|
||||
++ii;
|
||||
} );
|
||||
if ( !pSubView )
|
||||
return {};
|
||||
return {
|
||||
{
|
||||
rect.GetTop(),
|
||||
pSubView
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
auto WaveTrackView::GetSubViews( const wxRect &rect ) -> Refinement
|
||||
{
|
||||
// Collect the visible views
|
||||
using Pair = std::pair< float, std::shared_ptr< TrackView > >;
|
||||
std::vector< Pair > pairs( mPlacements.size() );
|
||||
size_t ii = 0;
|
||||
float total = 0;
|
||||
WaveTrackSubViews::ForEach( [&]( WaveTrackSubView &subView ){
|
||||
const auto &placement = mPlacements[ii];
|
||||
auto index = placement.index;
|
||||
auto fraction = placement.fraction;
|
||||
if ( index >= 0 && fraction > 0.0 )
|
||||
total += fraction,
|
||||
pairs[ index ] = { fraction, subView.shared_from_this() };
|
||||
++ii;
|
||||
} );
|
||||
|
||||
// Remove views we don't need
|
||||
auto begin = pairs.begin(), end = pairs.end(),
|
||||
newEnd = std::remove_if( begin, end,
|
||||
[]( const Pair &item ){ return !item.second; } );
|
||||
pairs.erase( newEnd, end );
|
||||
|
||||
// Assign coordinates
|
||||
Refinement results;
|
||||
results.reserve( pairs.size() );
|
||||
float partial = 0;
|
||||
const auto top = rect.GetTop();
|
||||
const auto height = rect.GetHeight();
|
||||
for ( const auto &pair : pairs ) {
|
||||
results.emplace_back( top + (partial / total) * height, pair.second );
|
||||
partial += pair.first;
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
void WaveTrackView::DoSetMinimized( bool minimized )
|
||||
|
@ -24,6 +24,12 @@ public:
|
||||
virtual WaveTrackViewConstants::Display SubViewType() const = 0;
|
||||
};
|
||||
|
||||
struct WaveTrackSubViewPlacement {
|
||||
int index;
|
||||
float fraction;
|
||||
};
|
||||
using WaveTrackSubViewPlacements = std::vector< WaveTrackSubViewPlacement >;
|
||||
|
||||
class WaveTrackView;
|
||||
using WaveTrackSubViews = ClientData::Site<
|
||||
WaveTrackView, WaveTrackSubView, ClientData::SkipCopying, std::shared_ptr
|
||||
@ -63,8 +69,13 @@ public:
|
||||
|
||||
using WaveTrackDisplay = WaveTrackViewConstants::Display;
|
||||
|
||||
WaveTrackDisplay GetDisplay() const { return mDisplay; }
|
||||
void SetDisplay(WaveTrackDisplay display) { mDisplay = display; }
|
||||
WaveTrackDisplay GetDisplay() const;
|
||||
void SetDisplay(WaveTrackDisplay display);
|
||||
|
||||
const WaveTrackSubViewPlacements &SavePlacements() const
|
||||
{ return mPlacements; }
|
||||
void RestorePlacements( const WaveTrackSubViewPlacements &placements )
|
||||
{ mPlacements = placements; }
|
||||
|
||||
private:
|
||||
// TrackPanelDrawable implementation
|
||||
@ -83,7 +94,7 @@ private:
|
||||
protected:
|
||||
void DoSetMinimized( bool minimized ) override;
|
||||
|
||||
WaveTrackDisplay mDisplay;
|
||||
WaveTrackSubViewPlacements mPlacements;
|
||||
};
|
||||
|
||||
// Helper for drawing routines
|
||||
|
Loading…
x
Reference in New Issue
Block a user