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

Sub-view objects report their complete type, not just an enum value

This commit is contained in:
Paul Licameli 2020-01-18 17:45:52 -05:00
parent 36aad4d1c6
commit 7cff170cf7
9 changed files with 40 additions and 29 deletions

View File

@ -551,9 +551,10 @@ bool NyquistEffect::Init()
for ( auto t : for ( auto t :
TrackList::Get( *project ).Selected< const WaveTrack >() ) { TrackList::Get( *project ).Selected< const WaveTrack >() ) {
const auto displays = WaveTrackView::Get(*t).GetDisplays(); const auto displays = WaveTrackView::Get(*t).GetDisplays();
bool hasSpectral = bool hasSpectral = (displays.end() != std::find(
make_iterator_range( displays.begin(), displays.end()) displays.begin(), displays.end(),
.contains( WaveTrackViewConstants::Spectrum ); WaveTrackSubView::Type{ WaveTrackViewConstants::Spectrum, {} }
) );
if ( !hasSpectral || if ( !hasSpectral ||
!(t->GetSpectrogramSettings().SpectralSelectionEnabled())) { !(t->GetSpectrogramSettings().SpectralSelectionEnabled())) {
bAllowSpectralEditing = false; bAllowSpectralEditing = false;
@ -1097,7 +1098,7 @@ bool NyquistEffect::ProcessOne()
spectralEditp = mCurTrack[0]->GetSpectrogramSettings().SpectralSelectionEnabled()? wxT("T") : wxT("NIL"); spectralEditp = mCurTrack[0]->GetSpectrogramSettings().SpectralSelectionEnabled()? wxT("T") : wxT("NIL");
auto displays = WaveTrackView::Get( *wt ).GetDisplays(); auto displays = WaveTrackView::Get( *wt ).GetDisplays();
auto format = [&]( decltype(displays[0]) display ){ auto format = [&]( decltype(displays[0]) display ){
switch ( display ) switch ( display.id )
{ {
case Waveform: case Waveform:
return wxT("\"Waveform\""); return wxT("\"Waveform\"");

View File

@ -36,8 +36,11 @@ void DoNextPeakFrequency(AudacityProject &project, bool up)
const WaveTrack *pTrack {}; const WaveTrack *pTrack {};
for ( auto wt : tracks.Selected< const WaveTrack >() ) { for ( auto wt : tracks.Selected< const WaveTrack >() ) {
const auto displays = WaveTrackView::Get( *wt ).GetDisplays(); const auto displays = WaveTrackView::Get( *wt ).GetDisplays();
if ( make_iterator_range( displays.begin(), displays.end() ) bool hasSpectrum = (displays.end() != std::find(
.contains( WaveTrackViewConstants::Spectrum) ) { displays.begin(), displays.end(),
WaveTrackSubView::Type{ WaveTrackViewConstants::Spectrum, {} }
) );
if ( hasSpectrum ) {
pTrack = wt; pTrack = wt;
break; break;
} }

View File

@ -30,10 +30,12 @@ Paul Licameli split from WaveTrackView.cpp
#include <wx/dcmemory.h> #include <wx/dcmemory.h>
#include <wx/graphics.h> #include <wx/graphics.h>
static WaveTrackSubView::RegisteredType reg{ { static WaveTrackSubView::Type sType{
WaveTrackViewConstants::Spectrum, WaveTrackViewConstants::Spectrum,
{ wxT("Spectrogram"), XO("&Spectrogram") } { wxT("Spectrogram"), XO("&Spectrogram") }
} }; };
static WaveTrackSubView::RegisteredType reg{ sType };
SpectrumView::~SpectrumView() = default; SpectrumView::~SpectrumView() = default;
@ -78,9 +80,9 @@ void SpectrumView::DoSetMinimized( bool minimized )
TrackView::DoSetMinimized( minimized ); TrackView::DoSetMinimized( minimized );
} }
auto SpectrumView::SubViewType() const -> Display auto SpectrumView::SubViewType() const -> const Type &
{ {
return WaveTrackViewConstants::Spectrum; return sType;
} }
std::shared_ptr<TrackVRulerControls> SpectrumView::DoGetVRulerControls() std::shared_ptr<TrackVRulerControls> SpectrumView::DoGetVRulerControls()

View File

@ -24,7 +24,7 @@ public:
using WaveTrackSubView::WaveTrackSubView; using WaveTrackSubView::WaveTrackSubView;
~SpectrumView() override; ~SpectrumView() override;
virtual Display SubViewType() const override; const Type &SubViewType() const override;
std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override; std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override;

View File

@ -659,7 +659,7 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu)
int displayId = OnSetDisplayId; int displayId = OnSetDisplayId;
int nDisplays = 0; int nDisplays = 0;
for ( const auto &type : AllTypes() ) { for ( const auto &type : AllTypes() ) {
if ( iter != end && *iter == type.id ) { if ( iter != end && iter->id == type.id ) {
checkedIds.push_back( displayId ); checkedIds.push_back( displayId );
uniqueDisplay = displayId; uniqueDisplay = displayId;
++iter; ++iter;
@ -796,9 +796,10 @@ BEGIN_POPUP_MENU(WaveTrackMenuTable)
if ( pTrack ) { if ( pTrack ) {
const auto displays = view.GetDisplays(); const auto displays = view.GetDisplays();
bool hasWaveform = bool hasWaveform = (displays.end() != std::find(
make_iterator_range( displays.begin(), displays.end() ) displays.begin(), displays.end(),
.contains( WaveTrackViewConstants::Waveform ); WaveTrackSubView::Type{ WaveTrackViewConstants::Waveform, {} }
) );
if( hasWaveform ){ if( hasWaveform ){
POPUP_MENU_SEPARATOR() POPUP_MENU_SEPARATOR()
POPUP_MENU_SUB_MENU(OnWaveColorID, XO("&Wave Color"), WaveColorMenuTable) POPUP_MENU_SUB_MENU(OnWaveColorID, XO("&Wave Color"), WaveColorMenuTable)
@ -819,7 +820,7 @@ void WaveTrackMenuTable::OnMultiView(wxCommandEvent & event)
bool multi = !view.GetMultiView(); bool multi = !view.GetMultiView();
const auto &displays = view.GetDisplays(); const auto &displays = view.GetDisplays();
const auto display = displays.empty() const auto display = displays.empty()
? WaveTrackViewConstants::Waveform : *displays.begin(); ? WaveTrackViewConstants::Waveform : displays.begin()->id;
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 );
@ -856,7 +857,8 @@ void WaveTrackMenuTable::OnSetDisplay(wxCommandEvent & event)
} }
else { else {
const auto displays = view.GetDisplays(); const auto displays = view.GetDisplays();
const bool wrongType = !(displays.size() == 1 && displays[0] == id); const bool wrongType =
!(displays.size() == 1 && displays[0].id == id);
if (wrongType) { if (wrongType) {
for (auto channel : TrackList::Channels(pTrack)) { for (auto channel : TrackList::Channels(pTrack)) {
channel->SetLastScaleType(); channel->SetLastScaleType();

View File

@ -889,12 +889,13 @@ WaveTrackView::DoDetailedHitTest
return { false, results }; return { false, results };
} }
auto WaveTrackView::GetDisplays() const -> std::vector<Display> auto WaveTrackView::GetDisplays() const
-> std::vector< WaveTrackSubView::Type >
{ {
BuildSubViews(); BuildSubViews();
// Collect the display types of visible views and sort them by position // Collect the display types of visible views and sort them by position
using Pair = std::pair< int, Display >; using Pair = std::pair< int, WaveTrackSubView::Type >;
std::vector< Pair > pairs; std::vector< Pair > pairs;
size_t ii = 0; size_t ii = 0;
WaveTrackSubViews::ForEach( [&]( const WaveTrackSubView &subView ){ WaveTrackSubViews::ForEach( [&]( const WaveTrackSubView &subView ){
@ -904,7 +905,7 @@ auto WaveTrackView::GetDisplays() const -> std::vector<Display>
++ii; ++ii;
} ); } );
std::sort( pairs.begin(), pairs.end() ); std::sort( pairs.begin(), pairs.end() );
std::vector<Display> results; std::vector< WaveTrackSubView::Type > results;
for ( const auto &pair : pairs ) for ( const auto &pair : pairs )
results.push_back( pair.second ); results.push_back( pair.second );
return results; return results;
@ -921,7 +922,7 @@ bool WaveTrackView::ToggleSubView(Display display)
size_t ii = 0; size_t ii = 0;
size_t found = 0; size_t found = 0;
if ( WaveTrackSubViews::FindIf( [&]( const WaveTrackSubView &subView ) { if ( WaveTrackSubViews::FindIf( [&]( const WaveTrackSubView &subView ) {
if ( subView.SubViewType() == display ) { if ( subView.SubViewType().id == display ) {
found = ii; found = ii;
return true; return true;
} }
@ -982,7 +983,7 @@ void WaveTrackView::DoSetDisplay(Display display, bool exclusive)
size_t ii = 0; size_t ii = 0;
std::vector< std::pair< WaveTrackViewConstants::Display, size_t > > pairs; std::vector< std::pair< WaveTrackViewConstants::Display, size_t > > pairs;
WaveTrackSubViews::ForEach( [&pairs, &ii]( WaveTrackSubView &subView ){ WaveTrackSubViews::ForEach( [&pairs, &ii]( WaveTrackSubView &subView ){
pairs.push_back( { subView.SubViewType(), ii++ } ); pairs.push_back( { subView.SubViewType().id, ii++ } );
} ); } );
std::sort( pairs.begin(), pairs.end() ); std::sort( pairs.begin(), pairs.end() );

View File

@ -50,7 +50,7 @@ public:
explicit explicit
WaveTrackSubView( WaveTrackView &waveTrackView ); WaveTrackSubView( WaveTrackView &waveTrackView );
virtual Display SubViewType() const = 0; virtual const Type &SubViewType() const = 0;
std::pair< std::pair<
bool, // if true, hit-testing is finished bool, // if true, hit-testing is finished
@ -118,7 +118,7 @@ public:
const std::shared_ptr<WaveTrack> &wt, const std::shared_ptr<WaveTrack> &wt,
CommonTrackView &view); CommonTrackView &view);
std::vector<Display> GetDisplays() const; std::vector< WaveTrackSubView::Type > GetDisplays() const;
void SetDisplay(Display display, bool exclusive = true); void SetDisplay(Display display, bool exclusive = true);
const WaveTrackSubViewPlacements &SavePlacements() const const WaveTrackSubViewPlacements &SavePlacements() const

View File

@ -36,10 +36,12 @@ Paul Licameli split from WaveTrackView.cpp
#include <wx/graphics.h> #include <wx/graphics.h>
#include <wx/dc.h> #include <wx/dc.h>
static WaveTrackSubView::RegisteredType reg{ { static WaveTrackSubView::Type sType{
WaveTrackViewConstants::Waveform, WaveTrackViewConstants::Waveform,
{ wxT("Waveform"), XO("Wa&veform") } { wxT("Waveform"), XO("Wa&veform") }
} }; };
static WaveTrackSubView::RegisteredType reg{ sType };
WaveformView::~WaveformView() = default; WaveformView::~WaveformView() = default;
@ -124,9 +126,9 @@ void WaveformView::DoSetMinimized( bool minimized )
TrackView::DoSetMinimized( minimized ); TrackView::DoSetMinimized( minimized );
} }
auto WaveformView::SubViewType() const -> Display auto WaveformView::SubViewType() const -> const Type &
{ {
return WaveTrackViewConstants::Waveform; return sType;
} }
std::shared_ptr<TrackVRulerControls> WaveformView::DoGetVRulerControls() std::shared_ptr<TrackVRulerControls> WaveformView::DoGetVRulerControls()

View File

@ -26,7 +26,7 @@ public:
using WaveTrackSubView::WaveTrackSubView; using WaveTrackSubView::WaveTrackSubView;
~WaveformView() override; ~WaveformView() override;
virtual Display SubViewType() const override; const Type &SubViewType() const override;
std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override; std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override;