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 :
TrackList::Get( *project ).Selected< const WaveTrack >() ) {
if (WaveTrackView::Get(*t).GetDisplay()
!= WaveTrackViewConstants::Spectrum ||
const auto displays = WaveTrackView::Get(*t).GetDisplays();
bool hasSpectral =
make_iterator_range( displays.begin(), displays.end())
.contains( WaveTrackViewConstants::Spectrum );
if ( !hasSpectral ||
!(t->GetSpectrogramSettings().SpectralSelectionEnabled())) {
bAllowSpectralEditing = false;
break;
@ -1069,7 +1072,12 @@ bool NyquistEffect::ProcessOne()
[&](const WaveTrack *wt) {
type = wxT("wave");
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:
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.
const WaveTrack *pTrack {};
for ( auto wt : tracks.Selected< const WaveTrack >() ) {
const auto display = WaveTrackView::Get( *wt ).GetDisplay();
if (display == WaveTrackViewConstants::Spectrum) {
const auto displays = WaveTrackView::Get( *wt ).GetDisplays();
if ( make_iterator_range( displays.begin(), displays.end() )
.contains( WaveTrackViewConstants::Spectrum) ) {
pTrack = wt;
break;
}

View File

@ -599,19 +599,23 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData)
std::vector<int> checkedIds;
const auto display = WaveTrackView::Get( *pTrack ).GetDisplay();
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,12 +706,16 @@ BEGIN_POPUP_MENU(WaveTrackMenuTable)
#endif
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpTrack);
if( pTrack &&
WaveTrackView::Get( *pTrack ).GetDisplay()
!= WaveTrackViewConstants::Spectrum ){
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()
POPUP_MENU_SUB_MENU(0, _("&Format"), FormatMenuTable)
@ -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