1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-10-21 22:12:58 +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

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

View File

@@ -113,18 +113,23 @@ WaveTrackView::DoDetailedHitTest
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
// last sub-view that is visible.
WaveTrackDisplay display{ WaveTrackViewConstants::NoDisplay };
// Collect the display types of visible views and sort them by position
using Pair = std::pair< int, WaveTrackDisplay >;
std::vector< Pair > pairs;
size_t ii = 0;
WaveTrackSubViews::ForEach( [&]( const WaveTrackSubView &subView ){
if ( mPlacements[ii].fraction > 0 )
display = subView.SubViewType();
auto &placement = mPlacements[ii];
if ( placement.fraction > 0 )
pairs.emplace_back( placement.index, subView.SubViewType() );
++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)

View File

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