diff --git a/src/MixerBoard.cpp b/src/MixerBoard.cpp index b61f1a1a5..2ab7e76fd 100644 --- a/src/MixerBoard.cpp +++ b/src/MixerBoard.cpp @@ -874,6 +874,7 @@ void MixerBoardScrolledWindow::OnMouseEvent(wxMouseEvent& event) BEGIN_EVENT_TABLE(MixerBoard, wxWindow) + EVT_PAINT(MixerBoard::OnPaint) EVT_SIZE(MixerBoard::OnSize) END_EVENT_TABLE() @@ -944,6 +945,18 @@ MixerBoard::MixerBoard(AudacityProject* pProject, mProject->GetTracks()->Bind(EVT_TRACKLIST_SELECTION_CHANGE, &MixerBoard::OnTrackChanged, this); + + mProject->GetTracks()->Bind(EVT_TRACKLIST_PERMUTED, + &MixerBoard::OnTrackSetChanged, + this); + + mProject->GetTracks()->Bind(EVT_TRACKLIST_ADDITION, + &MixerBoard::OnTrackSetChanged, + this); + + mProject->GetTracks()->Bind(EVT_TRACKLIST_DELETION, + &MixerBoard::OnTrackSetChanged, + this); } @@ -1048,53 +1061,6 @@ int MixerBoard::GetTrackClustersWidth() kDoubleInset; // plus final right margin } -void MixerBoard::MoveTrackCluster(const PlayableTrack* pTrack, - bool bUp) // Up in TrackPanel is left in MixerBoard. -{ - MixerTrackCluster* pMixerTrackCluster; - int nIndex = FindMixerTrackCluster(pTrack, &pMixerTrackCluster); - if (pMixerTrackCluster == NULL) - return; // Couldn't find it. - - wxPoint pos; - if (bUp) - { // Move it up (left). - if (nIndex <= 0) - return; // It's already first (0), or not found (-1). - - pos = pMixerTrackCluster->GetPosition(); - mMixerTrackClusters[nIndex] = mMixerTrackClusters[nIndex - 1]; - mMixerTrackClusters[nIndex]->Move(pos); - - mMixerTrackClusters[nIndex - 1] = pMixerTrackCluster; - pMixerTrackCluster->Move(pos.x - (kInset + kMixerTrackClusterWidth), pos.y); - } - else - { // Move it down (right). - if (((unsigned int)nIndex + 1) >= mMixerTrackClusters.size()) - return; // It's already last. - - pos = pMixerTrackCluster->GetPosition(); - mMixerTrackClusters[nIndex] = mMixerTrackClusters[nIndex + 1]; - mMixerTrackClusters[nIndex]->Move(pos); - - mMixerTrackClusters[nIndex + 1] = pMixerTrackCluster; - pMixerTrackCluster->Move(pos.x + (kInset + kMixerTrackClusterWidth), pos.y); - } -} - -void MixerBoard::RemoveTrackCluster(const PlayableTrack* pTrack) -{ - // Find and destroy. - MixerTrackCluster* pMixerTrackCluster; - int nIndex = this->FindMixerTrackCluster(pTrack, &pMixerTrackCluster); - - if (pMixerTrackCluster == NULL) - return; // Couldn't find it. - - RemoveTrackCluster(nIndex); -} - void MixerBoard::RemoveTrackCluster(size_t nIndex) { auto pMixerTrackCluster = mMixerTrackClusters[nIndex]; @@ -1436,6 +1402,17 @@ void MixerBoard::LoadMusicalInstruments() // event handlers +void MixerBoard::OnPaint(wxPaintEvent& evt) +{ + if (!mUpToDate) { + mUpToDate = true; + UpdateTrackClusters(); + Refresh(); + } + // Does the base class do anything for repainting? + evt.Skip(); +} + void MixerBoard::OnSize(wxSizeEvent &evt) { // this->FitInside() doesn't work, and it doesn't happen automatically. Is wxScrolledWindow wrong? @@ -1483,6 +1460,13 @@ void MixerBoard::OnTrackChanged(TrackListEvent &evt) } } +void MixerBoard::OnTrackSetChanged(wxEvent &evt) +{ + evt.Skip(); + mUpToDate = false; + Refresh(); +} + // class MixerBoardFrame BEGIN_EVENT_TABLE(MixerBoardFrame, wxFrame) diff --git a/src/MixerBoard.h b/src/MixerBoard.h index 78d18b18b..1da2332af 100644 --- a/src/MixerBoard.h +++ b/src/MixerBoard.h @@ -214,9 +214,6 @@ public: void UpdateTrackClusters(); int GetTrackClustersWidth(); - void MoveTrackCluster(const PlayableTrack* pTrack, bool bUp); // Up in TrackPanel is left in MixerBoard. - void RemoveTrackCluster(const PlayableTrack* pTrack); - void RemoveTrackCluster(size_t nIndex); wxBitmap* GetMusicalInstrumentBitmap(const Track *pTrack); @@ -242,7 +239,8 @@ public: void UpdateWidth(); private: - void MakeButtonBitmap( wxMemoryDC & dc, wxBitmap & bitmap, + void RemoveTrackCluster(size_t nIndex); + void MakeButtonBitmap( wxMemoryDC & dc, wxBitmap & bitmap, wxRect & bev, const wxString & str, bool up ); void CreateMuteSoloImages(); int FindMixerTrackCluster(const PlayableTrack* pTrack, @@ -250,8 +248,10 @@ private: void LoadMusicalInstruments(); // event handlers + void OnPaint(wxPaintEvent& evt); void OnSize(wxSizeEvent &evt); void OnTimer(wxCommandEvent &event); + void OnTrackSetChanged(wxEvent &event); void OnTrackChanged(TrackListEvent &event); @@ -272,6 +272,7 @@ private: MixerBoardScrolledWindow* mScrolledWindow; // Holds the MixerTrackClusters and handles scrolling. double mPrevT1; TrackList* mTracks; + bool mUpToDate{ false }; public: DECLARE_EVENT_TABLE() diff --git a/src/Project.cpp b/src/Project.cpp index 9d4673fd8..22bf10cf7 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -4707,7 +4707,6 @@ void AudacityProject::PopState(const UndoState &state) HandleResize(); GetMenuManager(*this).UpdateMenus(*this); - this->UpdateMixerBoard(); AutoSave(); } @@ -4721,7 +4720,6 @@ void AudacityProject::SetStateTo(unsigned int n) mTrackPanel->SetFocusedTrack(NULL); mTrackPanel->Refresh(false); GetMenuManager(*this).ModifyUndoMenuItems(*this); - this->UpdateMixerBoard(); } void AudacityProject::UpdateMixerBoard() @@ -5598,15 +5596,6 @@ void AudacityProject::RemoveTrack(Track * toRemove) wxString name = toRemove->GetName(); - auto playable = dynamic_cast(toRemove); - if (playable) - { - // Update mixer board displayed tracks. - MixerBoard* pMixerBoard = this->GetMixerBoard(); - if (pMixerBoard) - pMixerBoard->RemoveTrackCluster(playable); // Will remove partner shown in same cluster. - } - auto channels = TrackList::Channels(toRemove); // Be careful to post-increment over positions that get erased! auto &iter = channels.first; diff --git a/src/menus/EditMenus.cpp b/src/menus/EditMenus.cpp index 35059b060..a69f228a6 100644 --- a/src/menus/EditMenus.cpp +++ b/src/menus/EditMenus.cpp @@ -2,7 +2,6 @@ #include "../AudacityApp.h" // for EVT_CLIPBOARD_CHANGE #include "../LabelTrack.h" #include "../Menus.h" -#include "../MixerBoard.h" #include "../NoteTrack.h" #include "../Prefs.h" #include "../Project.h" @@ -219,7 +218,6 @@ void DoUndo(AudacityProject &project) { auto trackPanel = project.GetTrackPanel(); auto &undoManager = *project.GetUndoManager(); - auto mixerBoard = project.GetMixerBoard(); auto historyWindow = project.GetHistoryWindow(); if (!project.UndoAvailable()) { @@ -239,10 +237,6 @@ void DoUndo(AudacityProject &project) project.RedrawProject(); - if (mixerBoard) - // Mixer board may need to change for selection state and pan/gain - mixerBoard->Refresh(); - MenuManager::ModifyUndoMenuItems(project); } @@ -260,7 +254,6 @@ void OnRedo(const CommandContext &context) auto &project = context.project; auto trackPanel = project.GetTrackPanel(); auto &undoManager = *project.GetUndoManager(); - auto mixerBoard = project.GetMixerBoard(); auto historyWindow = project.GetHistoryWindow(); if (!project.RedoAvailable()) { @@ -279,10 +272,6 @@ void OnRedo(const CommandContext &context) project.RedrawProject(); - if (mixerBoard) - // Mixer board may need to change for selection state and pan/gain - mixerBoard->Refresh(); - MenuManager::ModifyUndoMenuItems(project); } diff --git a/src/menus/TrackMenus.cpp b/src/menus/TrackMenus.cpp index 2df5f91a4..7ac2122c1 100644 --- a/src/menus/TrackMenus.cpp +++ b/src/menus/TrackMenus.cpp @@ -515,7 +515,6 @@ void DoRemoveTracks( AudacityProject &project ) { auto tracks = project.GetTracks(); auto trackPanel = project.GetTrackPanel(); - auto mixerBoard = project.GetMixerBoard(); std::vector toRemove; for (auto track : tracks->Selected()) @@ -528,10 +527,6 @@ void DoRemoveTracks( AudacityProject &project ) f = *--found; } - if (mixerBoard) - for (auto track : tracks->Selected()) - mixerBoard->RemoveTrackCluster(track); - for (auto track : toRemove) tracks->Remove(track); @@ -554,9 +549,6 @@ void DoRemoveTracks( AudacityProject &project ) trackPanel->UpdateViewIfNoTracks(); trackPanel->Refresh(false); - - if (mixerBoard) - mixerBoard->Refresh(true); } void DoMoveTrack @@ -564,11 +556,9 @@ void DoMoveTrack { auto trackPanel = project.GetTrackPanel(); auto tracks = project.GetTracks(); - auto mixerBoard = project.GetMixerBoard(); // Update mixer board. wxString longDesc, shortDesc; - auto pt = dynamic_cast(target); switch (choice) { case OnMoveTopID: @@ -576,32 +566,27 @@ void DoMoveTrack longDesc = _("Moved '%s' to Top"); shortDesc = _("Move Track to Top"); - while (tracks->CanMoveUp(target)) { - if (tracks->Move(target, true)) { - if (mixerBoard && pt) - mixerBoard->MoveTrackCluster(pt, true); - } - } + // TODO: write TrackList::Rotate to do this in one step and avoid emitting + // an event for each swap + while (tracks->CanMoveUp(target)) + tracks->Move(target, true); + break; case OnMoveBottomID: /* i18n-hint: Past tense of 'to move', as in 'moved audio track up'.*/ longDesc = _("Moved '%s' to Bottom"); shortDesc = _("Move Track to Bottom"); - while (tracks->CanMoveDown(target)) { - if(tracks->Move(target, false)) { - if (mixerBoard && pt) - mixerBoard->MoveTrackCluster(pt, false); - } - } + // TODO: write TrackList::Rotate to do this in one step and avoid emitting + // an event for each swap + while (tracks->CanMoveDown(target)) + tracks->Move(target, false); + break; default: bool bUp = (OnMoveUpID == choice); - if (tracks->Move(target, bUp)) { - if (mixerBoard && pt) - mixerBoard->MoveTrackCluster(pt, bUp); - } + tracks->Move(target, bUp); longDesc = /* i18n-hint: Past tense of 'to move', as in 'moved audio track up'.*/ bUp? _("Moved '%s' Up") diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp index 6477e19b1..8712090ee 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp @@ -16,7 +16,6 @@ Paul Licameli split from TrackPanel.cpp #include "../../../../AudioIO.h" #include "../../../../HitTestResult.h" -#include "../../../../MixerBoard.h" #include "../../../../Menus.h" #include "../../../../Project.h" #include "../../../../RefreshCode.h" @@ -944,10 +943,6 @@ void WaveTrackMenuTable::OnSwapChannels(wxCommandEvent &) tracks->MoveUp( partner ); tracks->GroupChannels( *partner, 2 ); - MixerBoard* pMixerBoard = project->GetMixerBoard(); - if (pMixerBoard) - pMixerBoard->UpdateTrackClusters(); - if (hasFocus) project->GetTrackPanel()->SetFocusedTrack(partner); diff --git a/src/tracks/ui/TrackSelectHandle.cpp b/src/tracks/ui/TrackSelectHandle.cpp index 9a4a4c77d..eb0d195a5 100644 --- a/src/tracks/ui/TrackSelectHandle.cpp +++ b/src/tracks/ui/TrackSelectHandle.cpp @@ -14,7 +14,6 @@ Paul Licameli split from TrackPanel.cpp #include "../../Experimental.h" #include "../../HitTestResult.h" #include "../../Menus.h" -#include "../../MixerBoard.h" #include "../../Project.h" #include "../../RefreshCode.h" #include "../../TrackPanel.h" @@ -123,21 +122,14 @@ UIHandle::Result TrackSelectHandle::Drag if (unsafe) return result; - MixerBoard* pMixerBoard = pProject->GetMixerBoard(); // Update mixer board, too. if (event.m_y < mMoveUpThreshold || event.m_y < 0) { tracks->MoveUp(mpTrack.get()); --mRearrangeCount; - if (pMixerBoard) - if(auto pPlayable = dynamic_cast< const PlayableTrack* >( mpTrack.get() )) - pMixerBoard->MoveTrackCluster(pPlayable, true /* up */); } else if ( event.m_y > mMoveDownThreshold || event.m_y > evt.whole.GetHeight() ) { tracks->MoveDown(mpTrack.get()); ++mRearrangeCount; - if (pMixerBoard) - if(auto pPlayable = dynamic_cast< const PlayableTrack* >( mpTrack.get() )) - pMixerBoard->MoveTrackCluster(pPlayable, false /* down */); } else return result;