1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-24 08:28:04 +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 :
TrackList::Get( *project ).Selected< const WaveTrack >() ) {
const auto displays = WaveTrackView::Get(*t).GetDisplays();
bool hasSpectral =
make_iterator_range( displays.begin(), displays.end())
.contains( WaveTrackViewConstants::Spectrum );
bool hasSpectral = (displays.end() != std::find(
displays.begin(), displays.end(),
WaveTrackSubView::Type{ WaveTrackViewConstants::Spectrum, {} }
) );
if ( !hasSpectral ||
!(t->GetSpectrogramSettings().SpectralSelectionEnabled())) {
bAllowSpectralEditing = false;
@ -1097,7 +1098,7 @@ bool NyquistEffect::ProcessOne()
spectralEditp = mCurTrack[0]->GetSpectrogramSettings().SpectralSelectionEnabled()? wxT("T") : wxT("NIL");
auto displays = WaveTrackView::Get( *wt ).GetDisplays();
auto format = [&]( decltype(displays[0]) display ){
switch ( display )
switch ( display.id )
{
case Waveform:
return wxT("\"Waveform\"");

View File

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

View File

@ -30,10 +30,12 @@ Paul Licameli split from WaveTrackView.cpp
#include <wx/dcmemory.h>
#include <wx/graphics.h>
static WaveTrackSubView::RegisteredType reg{ {
static WaveTrackSubView::Type sType{
WaveTrackViewConstants::Spectrum,
{ wxT("Spectrogram"), XO("&Spectrogram") }
} };
};
static WaveTrackSubView::RegisteredType reg{ sType };
SpectrumView::~SpectrumView() = default;
@ -78,9 +80,9 @@ void SpectrumView::DoSetMinimized( bool 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()

View File

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

View File

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

View File

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

View File

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

View File

@ -36,10 +36,12 @@ Paul Licameli split from WaveTrackView.cpp
#include <wx/graphics.h>
#include <wx/dc.h>
static WaveTrackSubView::RegisteredType reg{ {
static WaveTrackSubView::Type sType{
WaveTrackViewConstants::Waveform,
{ wxT("Waveform"), XO("Wa&veform") }
} };
};
static WaveTrackSubView::RegisteredType reg{ sType };
WaveformView::~WaveformView() = default;
@ -124,9 +126,9 @@ void WaveformView::DoSetMinimized( bool 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()

View File

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