1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 16:10:06 +02:00

Generalize WaveTrackView::GetDisplay to return multiple values...

... something better might be done in Nyquist Lisp, where we still pass a
single value
This commit is contained in:
Paul Licameli 2019-07-09 17:16:16 -04:00
parent 2f544bda7a
commit fa6b5dea88
5 changed files with 53 additions and 30 deletions

View File

@ -544,8 +544,11 @@ bool NyquistEffect::Init()
for ( auto t : for ( auto t :
TrackList::Get( *project ).Selected< const WaveTrack >() ) { TrackList::Get( *project ).Selected< const WaveTrack >() ) {
if (WaveTrackView::Get(*t).GetDisplay() const auto displays = WaveTrackView::Get(*t).GetDisplays();
!= WaveTrackViewConstants::Spectrum || bool hasSpectral =
make_iterator_range( displays.begin(), displays.end())
.contains( WaveTrackViewConstants::Spectrum );
if ( !hasSpectral ||
!(t->GetSpectrogramSettings().SpectralSelectionEnabled())) { !(t->GetSpectrogramSettings().SpectralSelectionEnabled())) {
bAllowSpectralEditing = false; bAllowSpectralEditing = false;
break; break;
@ -1069,7 +1072,12 @@ bool NyquistEffect::ProcessOne()
[&](const WaveTrack *wt) { [&](const WaveTrack *wt) {
type = wxT("wave"); type = wxT("wave");
spectralEditp = mCurTrack[0]->GetSpectrogramSettings().SpectralSelectionEnabled()? wxT("T") : wxT("NIL"); spectralEditp = mCurTrack[0]->GetSpectrogramSettings().SpectralSelectionEnabled()? wxT("T") : wxT("NIL");
switch ( WaveTrackView::Get( *wt ).GetDisplay() ) // To do: accommodate split views
auto viewType = WaveTrackViewConstants::NoDisplay;
auto displays = WaveTrackView::Get( *wt ).GetDisplays();
if (!displays.empty())
viewType = displays[0];
switch ( viewType )
{ {
case Waveform: case Waveform:
view = (mCurTrack[0]->GetWaveformSettings().scaleType == 0) ? wxT("\"Waveform\"") : wxT("\"Waveform (dB)\""); view = (mCurTrack[0]->GetWaveformSettings().scaleType == 0) ? wxT("\"Waveform\"") : wxT("\"Waveform (dB)\"");

View File

@ -35,8 +35,9 @@ void DoNextPeakFrequency(AudacityProject &project, bool up)
// Find the first selected wave track that is in a spectrogram view. // Find the first selected wave track that is in a spectrogram view.
const WaveTrack *pTrack {}; const WaveTrack *pTrack {};
for ( auto wt : tracks.Selected< const WaveTrack >() ) { for ( auto wt : tracks.Selected< const WaveTrack >() ) {
const auto display = WaveTrackView::Get( *wt ).GetDisplay(); const auto displays = WaveTrackView::Get( *wt ).GetDisplays();
if (display == WaveTrackViewConstants::Spectrum) { if ( make_iterator_range( displays.begin(), displays.end() )
.contains( WaveTrackViewConstants::Spectrum) ) {
pTrack = wt; pTrack = wt;
break; break;
} }

View File

@ -599,19 +599,23 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData)
std::vector<int> checkedIds; std::vector<int> checkedIds;
const auto display = WaveTrackView::Get( *pTrack ).GetDisplay(); const auto displays = WaveTrackView::Get( *pTrack ).GetDisplays();
checkedIds.push_back( for ( auto display : displays ) {
display == WaveTrackViewConstants::Waveform checkedIds.push_back(
? (pTrack->GetWaveformSettings().isLinear() display == WaveTrackViewConstants::Waveform
? OnWaveformID : OnWaveformDBID) ? (pTrack->GetWaveformSettings().isLinear()
: OnSpectrumID); ? OnWaveformID : OnWaveformDBID)
: OnSpectrumID);
}
// Bug 1253. Shouldn't open preferences if audio is busy. // Bug 1253. Shouldn't open preferences if audio is busy.
// We can't change them on the fly yet anyway. // We can't change them on the fly yet anyway.
auto gAudioIO = AudioIOBase::Get(); auto gAudioIO = AudioIOBase::Get();
const bool bAudioBusy = gAudioIO->IsBusy(); const bool bAudioBusy = gAudioIO->IsBusy();
pMenu->Enable(OnSpectrogramSettingsID, bool hasSpectrum =
(display == WaveTrackViewConstants::Spectrum) && !bAudioBusy); make_iterator_range( displays.begin(), displays.end() )
.contains( WaveTrackViewConstants::Spectrum );
pMenu->Enable(OnSpectrogramSettingsID, hasSpectrum && !bAudioBusy);
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = ::GetActiveProject();
auto &tracks = TrackList::Get( *project ); auto &tracks = TrackList::Get( *project );
@ -683,9 +687,9 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData)
BEGIN_POPUP_MENU(WaveTrackMenuTable) BEGIN_POPUP_MENU(WaveTrackMenuTable)
POPUP_MENU_SEPARATOR() POPUP_MENU_SEPARATOR()
POPUP_MENU_RADIO_ITEM(OnWaveformID, _("Wa&veform"), OnSetDisplay) POPUP_MENU_CHECK_ITEM(OnWaveformID, _("Wa&veform"), OnSetDisplay)
POPUP_MENU_RADIO_ITEM(OnWaveformDBID, _("&Waveform (dB)"), OnSetDisplay) POPUP_MENU_CHECK_ITEM(OnWaveformDBID, _("&Waveform (dB)"), OnSetDisplay)
POPUP_MENU_RADIO_ITEM(OnSpectrumID, _("&Spectrogram"), OnSetDisplay) POPUP_MENU_CHECK_ITEM(OnSpectrumID, _("&Spectrogram"), OnSetDisplay)
POPUP_MENU_ITEM(OnSpectrogramSettingsID, _("S&pectrogram Settings..."), OnSpectrogramSettings) POPUP_MENU_ITEM(OnSpectrogramSettingsID, _("S&pectrogram Settings..."), OnSpectrogramSettings)
POPUP_MENU_SEPARATOR() POPUP_MENU_SEPARATOR()
@ -702,11 +706,15 @@ BEGIN_POPUP_MENU(WaveTrackMenuTable)
#endif #endif
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpTrack);
if( pTrack && if ( pTrack ) {
WaveTrackView::Get( *pTrack ).GetDisplay() const auto displays = WaveTrackView::Get( *pTrack ).GetDisplays();
!= WaveTrackViewConstants::Spectrum ){ bool hasWaveform =
POPUP_MENU_SEPARATOR() make_iterator_range( displays.begin(), displays.end() )
POPUP_MENU_SUB_MENU(OnWaveColorID, _("&Wave Color"), WaveColorMenuTable) .contains( WaveTrackViewConstants::Waveform );
if( hasWaveform ){
POPUP_MENU_SEPARATOR()
POPUP_MENU_SUB_MENU(OnWaveColorID, _("&Wave Color"), WaveColorMenuTable)
}
} }
POPUP_MENU_SEPARATOR() POPUP_MENU_SEPARATOR()
@ -736,7 +744,8 @@ void WaveTrackMenuTable::OnSetDisplay(wxCommandEvent & event)
id = Spectrum; break; id = Spectrum; break;
} }
const bool wrongType = WaveTrackView::Get( *pTrack ).GetDisplay() != id; const auto displays = WaveTrackView::Get( *pTrack ).GetDisplays();
const bool wrongType = !(displays.size() == 1 && displays[0] == id);
const bool wrongScale = const bool wrongScale =
(id == Waveform && (id == Waveform &&
pTrack->GetWaveformSettings().isLinear() != linear); pTrack->GetWaveformSettings().isLinear() != linear);

View File

@ -113,18 +113,23 @@ WaveTrackView::DoDetailedHitTest
return { false, results }; return { false, results };
} }
auto WaveTrackView::GetDisplay() const -> WaveTrackDisplay auto WaveTrackView::GetDisplays() const -> std::vector<WaveTrackDisplay>
{ {
// To do: make the return a vector of values. For now, just report the // Collect the display types of visible views and sort them by position
// last sub-view that is visible. using Pair = std::pair< int, WaveTrackDisplay >;
WaveTrackDisplay display{ WaveTrackViewConstants::NoDisplay }; std::vector< Pair > pairs;
size_t ii = 0; size_t ii = 0;
WaveTrackSubViews::ForEach( [&]( const WaveTrackSubView &subView ){ WaveTrackSubViews::ForEach( [&]( const WaveTrackSubView &subView ){
if ( mPlacements[ii].fraction > 0 ) auto &placement = mPlacements[ii];
display = subView.SubViewType(); if ( placement.fraction > 0 )
pairs.emplace_back( placement.index, subView.SubViewType() );
++ii; ++ii;
} ); } );
return display; std::sort( pairs.begin(), pairs.end() );
std::vector<WaveTrackDisplay> results;
for ( const auto &pair : pairs )
results.push_back( pair.second );
return results;
} }
void WaveTrackView::SetDisplay(WaveTrackDisplay display) void WaveTrackView::SetDisplay(WaveTrackDisplay display)

View File

@ -69,7 +69,7 @@ public:
using WaveTrackDisplay = WaveTrackViewConstants::Display; using WaveTrackDisplay = WaveTrackViewConstants::Display;
WaveTrackDisplay GetDisplay() const; std::vector<WaveTrackDisplay> GetDisplays() const;
void SetDisplay(WaveTrackDisplay display); void SetDisplay(WaveTrackDisplay display);
const WaveTrackSubViewPlacements &SavePlacements() const const WaveTrackSubViewPlacements &SavePlacements() const