diff --git a/src/MixerBoard.cpp b/src/MixerBoard.cpp index 3ccfceb80..b61f1a1a5 100644 --- a/src/MixerBoard.cpp +++ b/src/MixerBoard.cpp @@ -940,6 +940,10 @@ MixerBoard::MixerBoard(AudacityProject* pProject, mProject->Bind(EVT_TRACK_PANEL_TIMER, &MixerBoard::OnTimer, this); + + mProject->GetTracks()->Bind(EVT_TRACKLIST_SELECTION_CHANGE, + &MixerBoard::OnTrackChanged, + this); } @@ -1164,14 +1168,6 @@ bool MixerBoard::HasSolo() return !(( mTracks->Any() + &PlayableTrack::GetSolo ).empty()); } -void MixerBoard::RefreshTrackCluster(const PlayableTrack* pTrack, bool bEraseBackground /*= true*/) -{ - MixerTrackCluster* pMixerTrackCluster; - this->FindMixerTrackCluster(pTrack, &pMixerTrackCluster); - if (pMixerTrackCluster) - pMixerTrackCluster->Refresh(bEraseBackground); -} - void MixerBoard::RefreshTrackClusters(bool bEraseBackground /*= true*/) { for (unsigned int i = 0; i < mMixerTrackClusters.size(); i++) @@ -1473,6 +1469,19 @@ void MixerBoard::OnTimer(wxCommandEvent &event) event.Skip(); } +void MixerBoard::OnTrackChanged(TrackListEvent &evt) +{ + evt.Skip(); + + auto pTrack = evt.mpTrack.lock(); + auto pPlayable = dynamic_cast( pTrack.get() ); + if ( pPlayable ) { + MixerTrackCluster *pMixerTrackCluster; + FindMixerTrackCluster( pPlayable, &pMixerTrackCluster ); + if ( pMixerTrackCluster ) + pMixerTrackCluster->Refresh(); + } +} // class MixerBoardFrame diff --git a/src/MixerBoard.h b/src/MixerBoard.h index 4a26c8cf4..78d18b18b 100644 --- a/src/MixerBoard.h +++ b/src/MixerBoard.h @@ -25,6 +25,8 @@ #include "widgets/ASlider.h" #include "widgets/wxPanelWrapper.h" +class TrackListEvent; + // containment hierarchy: // MixerBoardFrame -> MixerBoard -> MixerBoardScrolledWindow -> MixerTrackCluster(s) @@ -221,7 +223,6 @@ public: bool HasSolo(); - void RefreshTrackCluster(const PlayableTrack* pTrack, bool bEraseBackground = true); void RefreshTrackClusters(bool bEraseBackground = true); void ResizeTrackClusters(); @@ -251,6 +252,7 @@ private: // event handlers void OnSize(wxSizeEvent &evt); void OnTimer(wxCommandEvent &event); + void OnTrackChanged(TrackListEvent &event); public: diff --git a/src/Project.cpp b/src/Project.cpp index 10500c656..9d4673fd8 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -6144,8 +6144,6 @@ void AudacityProject::SelectNone() t->SetSelected(false); mTrackPanel->Refresh(false); - if (mMixerBoard) - mMixerBoard->Refresh(false); } void AudacityProject::ZoomInByFactor( double ZoomFactor ) diff --git a/src/SelectionState.cpp b/src/SelectionState.cpp index aca522b5e..33bc7bb83 100644 --- a/src/SelectionState.cpp +++ b/src/SelectionState.cpp @@ -8,7 +8,6 @@ #include "Audacity.h" #include "SelectionState.h" -#include "MixerBoard.h" #include "ViewInfo.h" #include "Track.h" @@ -34,10 +33,8 @@ void SelectionState::SelectTrackLength viewInfo.selectedRegion.setTimes(minOffset, maxEnd); } - -void SelectionState::SelectTrack -( Track &track, bool selected, bool updateLastPicked, - MixerBoard *pMixerBoard ) +void SelectionState::SelectTrack( + Track &track, bool selected, bool updateLastPicked ) { bool wasCorrect = (selected == track.GetSelected()); @@ -62,17 +59,10 @@ void SelectionState::SelectTrack mLastPickedTrack.reset(); } */ - - // Update mixer board, but only as needed so it does not flicker. - if (!wasCorrect) { - auto pt = dynamic_cast< PlayableTrack* >( &track ); - if (pMixerBoard && pt) - pMixerBoard->RefreshTrackCluster( pt ); - } } void SelectionState::SelectRangeOfTracks -( TrackList &tracks, Track &rsTrack, Track &reTrack, MixerBoard *pMixerBoard ) +( TrackList &tracks, Track &rsTrack, Track &reTrack ) { Track *sTrack = &rsTrack, *eTrack = &reTrack; // Swap the track pointers if needed @@ -81,17 +71,17 @@ void SelectionState::SelectRangeOfTracks for (auto track : tracks.Any().StartingWith(sTrack).EndingAfter(eTrack)) - SelectTrack(*track, true, false, pMixerBoard); + SelectTrack(*track, true, false); } -void SelectionState::SelectNone( TrackList &tracks, MixerBoard *pMixerBoard ) +void SelectionState::SelectNone( TrackList &tracks ) { for (auto t : tracks.Any()) - SelectTrack( *t, false, false, pMixerBoard ); + SelectTrack( *t, false, false ); } void SelectionState::ChangeSelectionOnShiftClick -( TrackList &tracks, Track &track, MixerBoard *pMixerBoard ) +( TrackList &tracks, Track &track ) { // We will either extend from the first or from the last. auto pExtendFrom = tracks.Lock(mLastPickedTrack); @@ -109,33 +99,30 @@ void SelectionState::ChangeSelectionOnShiftClick pExtendFrom = Track::Pointer( *trackRange.rbegin() ); } - SelectNone( tracks, pMixerBoard ); + SelectNone( tracks ); if( pExtendFrom ) - SelectRangeOfTracks( tracks, track, *pExtendFrom, pMixerBoard ); + SelectRangeOfTracks( tracks, track, *pExtendFrom ); else - SelectTrack( track, true, true, pMixerBoard ); + SelectTrack( track, true, true ); mLastPickedTrack = pExtendFrom; } void SelectionState::HandleListSelection ( TrackList &tracks, ViewInfo &viewInfo, - Track &track, bool shift, bool ctrl, bool syncLocked, MixerBoard *pMixerBoard ) + Track &track, bool shift, bool ctrl, bool syncLocked ) { // AS: If the shift button is being held down, invert // the selection on this track. if (ctrl) - SelectTrack( track, !track.GetSelected(), true, pMixerBoard ); + SelectTrack( track, !track.GetSelected(), true ); else { if (shift && mLastPickedTrack.lock()) - ChangeSelectionOnShiftClick( tracks, track, pMixerBoard ); + ChangeSelectionOnShiftClick( tracks, track ); else { - SelectNone( tracks, pMixerBoard ); - SelectTrack( track, true, true, pMixerBoard ); + SelectNone( tracks ); + SelectTrack( track, true, true ); SelectTrackLength( viewInfo, track, syncLocked ); } - - if (pMixerBoard) - pMixerBoard->RefreshTrackClusters(); } } diff --git a/src/SelectionState.h b/src/SelectionState.h index 9784ae8e5..800dbfc80 100644 --- a/src/SelectionState.h +++ b/src/SelectionState.h @@ -11,7 +11,6 @@ class Track; class TrackList; -class MixerBoard; class ViewInfo; #include "MemoryX.h" #include @@ -23,19 +22,17 @@ public: static void SelectTrackLength ( ViewInfo &viewInfo, Track &track, bool syncLocked ); - void SelectTrack - ( Track &track, - bool selected, bool updateLastPicked, MixerBoard *pMixerBoard ); + void SelectTrack( + Track &track, bool selected, bool updateLastPicked ); // Inclusive range of tracks, the limits specified in either order: void SelectRangeOfTracks - ( TrackList &tracks, Track &sTrack, Track &eTrack, - MixerBoard *pMixerBoard ); - void SelectNone( TrackList &tracks, MixerBoard *pMixerBoard ); + ( TrackList &tracks, Track &sTrack, Track &eTrack ); + void SelectNone( TrackList &tracks ); void ChangeSelectionOnShiftClick - ( TrackList &tracks, Track &track, MixerBoard *pMixerBoard ); + ( TrackList &tracks, Track &track ); void HandleListSelection ( TrackList &tracks, ViewInfo &viewInfo, Track &track, - bool shift, bool ctrl, bool syncLocked, MixerBoard *pMixerBoard ); + bool shift, bool ctrl, bool syncLocked ); private: friend class SelectionStateChanger; diff --git a/src/menus/NavigationMenus.cpp b/src/menus/NavigationMenus.cpp index 56fe7a8e6..9f2322772 100644 --- a/src/menus/NavigationMenus.cpp +++ b/src/menus/NavigationMenus.cpp @@ -84,7 +84,6 @@ void DoPrevTrack( auto trackPanel = project.GetTrackPanel(); auto tracks = project.GetTracks(); auto &selectionState = project.GetSelectionState(); - auto mixerBoard = project.GetMixerBoard(); Track* t = trackPanel->GetFocusedTrack(); if( t == NULL ) // if there isn't one, focus on last @@ -121,7 +120,7 @@ void DoPrevTrack( if( tSelected && pSelected ) { selectionState.SelectTrack - ( *t, false, false, mixerBoard ); + ( *t, false, false ); trackPanel->SetFocusedTrack( p ); // move focus to next track up trackPanel->EnsureVisible( p ); project.ModifyState(false); @@ -130,7 +129,7 @@ void DoPrevTrack( if( tSelected && !pSelected ) { selectionState.SelectTrack - ( *p, true, false, mixerBoard ); + ( *p, true, false ); trackPanel->SetFocusedTrack( p ); // move focus to next track up trackPanel->EnsureVisible( p ); project.ModifyState(false); @@ -139,7 +138,7 @@ void DoPrevTrack( if( !tSelected && pSelected ) { selectionState.SelectTrack - ( *p, false, false, mixerBoard ); + ( *p, false, false ); trackPanel->SetFocusedTrack( p ); // move focus to next track up trackPanel->EnsureVisible( p ); project.ModifyState(false); @@ -148,7 +147,7 @@ void DoPrevTrack( if( !tSelected && !pSelected ) { selectionState.SelectTrack - ( *t, true, false, mixerBoard ); + ( *t, true, false ); trackPanel->SetFocusedTrack( p ); // move focus to next track up trackPanel->EnsureVisible( p ); project.ModifyState(false); @@ -195,7 +194,6 @@ void DoNextTrack( auto trackPanel = project.GetTrackPanel(); auto tracks = project.GetTracks(); auto &selectionState = project.GetSelectionState(); - auto mixerBoard = project.GetMixerBoard(); auto t = trackPanel->GetFocusedTrack(); // Get currently focused track if( t == NULL ) // if there isn't one, focus on first @@ -226,7 +224,7 @@ void DoNextTrack( if( tSelected && nSelected ) { selectionState.SelectTrack - ( *t, false, false, mixerBoard ); + ( *t, false, false ); trackPanel->SetFocusedTrack( n ); // move focus to next track down trackPanel->EnsureVisible( n ); project.ModifyState(false); @@ -235,7 +233,7 @@ void DoNextTrack( if( tSelected && !nSelected ) { selectionState.SelectTrack - ( *n, true, false, mixerBoard ); + ( *n, true, false ); trackPanel->SetFocusedTrack( n ); // move focus to next track down trackPanel->EnsureVisible( n ); project.ModifyState(false); @@ -244,7 +242,7 @@ void DoNextTrack( if( !tSelected && nSelected ) { selectionState.SelectTrack - ( *n, false, false, mixerBoard ); + ( *n, false, false ); trackPanel->SetFocusedTrack( n ); // move focus to next track down trackPanel->EnsureVisible( n ); project.ModifyState(false); @@ -253,7 +251,7 @@ void DoNextTrack( if( !tSelected && !nSelected ) { selectionState.SelectTrack - ( *t, true, false, mixerBoard ); + ( *t, true, false ); trackPanel->SetFocusedTrack( n ); // move focus to next track down trackPanel->EnsureVisible( n ); project.ModifyState(false); @@ -506,7 +504,6 @@ void OnToggle(const CommandContext &context) auto &project = context.project; auto trackPanel = project.GetTrackPanel(); auto &selectionState = project.GetSelectionState(); - auto mixerBoard = project.GetMixerBoard(); Track *t; @@ -515,7 +512,7 @@ void OnToggle(const CommandContext &context) return; selectionState.SelectTrack - ( *t, !t->GetSelected(), true, mixerBoard ); + ( *t, !t->GetSelected(), true ); trackPanel->EnsureVisible( t ); project.ModifyState(false); diff --git a/src/menus/SelectMenus.cpp b/src/menus/SelectMenus.cpp index 99502a483..6d958f635 100644 --- a/src/menus/SelectMenus.cpp +++ b/src/menus/SelectMenus.cpp @@ -3,7 +3,6 @@ #include "../Experimental.h" #include "../FreqWindow.h" #include "../Menus.h" // for PrefsListener -#include "../MixerBoard.h" #include "../Prefs.h" #include "../Project.h" #include "../TimeDialog.h" @@ -23,7 +22,6 @@ void DoSelectTimeAndTracks auto tracks = project.GetTracks(); auto trackPanel = project.GetTrackPanel(); auto &selectedRegion = project.GetViewInfo().selectedRegion; - auto mixerBoard = project.GetMixerBoard(); if( bAllTime ) selectedRegion.setTimes( @@ -35,8 +33,6 @@ void DoSelectTimeAndTracks project.ModifyState(false); trackPanel->Refresh(false); - if (mixerBoard) - mixerBoard->Refresh(false); } } @@ -467,11 +463,10 @@ void DoListSelection auto &selectionState = project.GetSelectionState(); auto &viewInfo = project.GetViewInfo(); auto isSyncLocked = project.IsSyncLocked(); - auto mixerBoard = project.GetMixerBoard(); selectionState.HandleListSelection ( *tracks, viewInfo, *t, - shift, ctrl, isSyncLocked, mixerBoard ); + shift, ctrl, isSyncLocked ); if (! ctrl ) trackPanel->SetFocusedTrack(t); @@ -535,7 +530,6 @@ void OnSelectSyncLockSel(const CommandContext &context) auto &project = context.project; auto tracks = project.GetTracks(); auto trackPanel = project.GetTrackPanel(); - auto mixerBoard = project.GetMixerBoard(); bool selected = false; for (auto t : tracks->Any() @@ -548,8 +542,6 @@ void OnSelectSyncLockSel(const CommandContext &context) project.ModifyState(false); trackPanel->Refresh(false); - if (mixerBoard) - mixerBoard->Refresh(false); } //this pops up a dialog which allows the left selection to be set. diff --git a/src/tracks/labeltrack/ui/LabelTextHandle.cpp b/src/tracks/labeltrack/ui/LabelTextHandle.cpp index 41a5f0154..9f13bcede 100644 --- a/src/tracks/labeltrack/ui/LabelTextHandle.cpp +++ b/src/tracks/labeltrack/ui/LabelTextHandle.cpp @@ -95,15 +95,12 @@ UIHandle::Result LabelTextHandle::Click if (!done) { //otherwise, select all tracks for (auto t : tracks->Any()) - selectionState.SelectTrack - ( *t, true, true, pProject->GetMixerBoard() ); + selectionState.SelectTrack( *t, true, true ); } // Do this after, for its effect on TrackPanel's memory of last selected // track (which affects shift-click actions) - selectionState.SelectTrack - ( *pLT, true, true, - pProject->GetMixerBoard() ); + selectionState.SelectTrack( *pLT, true, true ); } // PRL: bug1659 -- make selection change undo correctly diff --git a/src/tracks/ui/BackgroundCell.cpp b/src/tracks/ui/BackgroundCell.cpp index e5d7aa364..da619be30 100644 --- a/src/tracks/ui/BackgroundCell.cpp +++ b/src/tracks/ui/BackgroundCell.cpp @@ -50,8 +50,7 @@ public: // AS: If the user clicked outside all tracks, make nothing // selected. if ((event.ButtonDown() || event.ButtonDClick())) { - pProject->GetSelectionState().SelectNone - ( *pProject->GetTracks(), pProject->GetMixerBoard() ); + pProject->GetSelectionState().SelectNone( *pProject->GetTracks() ); result |= RefreshAll; } diff --git a/src/tracks/ui/SelectHandle.cpp b/src/tracks/ui/SelectHandle.cpp index 49a7cd3f3..86d623166 100644 --- a/src/tracks/ui/SelectHandle.cpp +++ b/src/tracks/ui/SelectHandle.cpp @@ -18,7 +18,6 @@ Paul Licameli split from TrackPanel.cpp #include "../../FreqWindow.h" #include "../../HitTestResult.h" #include "../../Menus.h" -#include "../../MixerBoard.h" #include "../../NumberScale.h" #include "../../Project.h" #include "../../RefreshCode.h" @@ -561,10 +560,9 @@ UIHandle::Result SelectHandle::Click TrackList *const trackList = pProject->GetTracks(); // Deselect all other tracks and select this one. - selectionState.SelectNone( *trackList, pProject->GetMixerBoard() ); + selectionState.SelectNone( *trackList ); - selectionState.SelectTrack - ( *pTrack, true, true, pProject->GetMixerBoard() ); + selectionState.SelectTrack( *pTrack, true, true ); // Default behavior: select whole track SelectionState::SelectTrackLength @@ -599,8 +597,6 @@ UIHandle::Result SelectHandle::Click bool bShiftDown = event.ShiftDown(); bool bCtrlDown = event.ControlDown(); - auto pMixerBoard = pProject->GetMixerBoard(); - mSelStart = mUseSnap ? mSnapStart.outTime : mSnapStart.timeSnappedTime; auto xx = viewInfo.TimeToPosition(mSelStart, mRect.x); @@ -608,7 +604,7 @@ UIHandle::Result SelectHandle::Click if (bShiftDown || bCtrlDown) { if (bShiftDown) selectionState.ChangeSelectionOnShiftClick - ( *trackList, *pTrack, pMixerBoard ); + ( *trackList, *pTrack ); if( bCtrlDown ){ //Commented out bIsSelected toggles, as in Track Control Panel. //bool bIsSelected = pTrack->GetSelected(); @@ -616,8 +612,7 @@ UIHandle::Result SelectHandle::Click bool bIsSelected = false; // Don't toggle away the last selected track. if( !bIsSelected || trackPanel->GetSelectedTrackCount() > 1 ) - selectionState.SelectTrack - ( *pTrack, !bIsSelected, true, pMixerBoard ); + selectionState.SelectTrack( *pTrack, !bIsSelected, true ); } double value; @@ -767,13 +762,12 @@ UIHandle::Result SelectHandle::Click if (startNewSelection) { // If we didn't move a selection boundary, start a NEW selection - selectionState.SelectNone( *trackList, pMixerBoard ); + selectionState.SelectNone( *trackList ); #ifdef EXPERIMENTAL_SPECTRAL_EDITING StartFreqSelection (viewInfo, event.m_y, mRect.y, mRect.height, pTrack); #endif StartSelection(pProject); - selectionState.SelectTrack - ( *pTrack, true, true, pMixerBoard ); + selectionState.SelectTrack( *pTrack, true, true ); trackPanel->SetFocusedTrack(pTrack); //On-Demand: check to see if there is an OD thing associated with this track. pTrack->TypeSwitch( [&](WaveTrack *wt) { @@ -844,11 +838,9 @@ UIHandle::Result SelectHandle::Drag Track *sTrack = pTrack.get(); Track *eTrack = clickedTrack.get(); auto trackList = pProject->GetTracks(); - auto pMixerBoard = pProject->GetMixerBoard(); if ( sTrack && eTrack && !event.ControlDown() ) { auto &selectionState = pProject->GetSelectionState(); - selectionState.SelectRangeOfTracks - ( *trackList, *sTrack, *eTrack, pMixerBoard ); + selectionState.SelectRangeOfTracks( *trackList, *sTrack, *eTrack ); } #ifdef EXPERIMENTAL_SPECTRAL_EDITING @@ -1013,10 +1005,6 @@ UIHandle::Result SelectHandle::Cancel(AudacityProject *pProject) mSelectionStateChanger.reset(); pProject->GetViewInfo().selectedRegion = mInitialSelection; - // Refresh mixer board for change of set of selected tracks - if (MixerBoard* pMixerBoard = pProject->GetMixerBoard()) - pMixerBoard->Refresh(); - return RefreshCode::RefreshAll; }