MixerBoard listens to TrackList for selection changes

This commit is contained in:
Paul Licameli 2018-02-05 18:30:18 -05:00
parent 96d104cb38
commit 7150d43083
10 changed files with 61 additions and 95 deletions

View File

@ -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>() + &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<PlayableTrack*>( pTrack.get() );
if ( pPlayable ) {
MixerTrackCluster *pMixerTrackCluster;
FindMixerTrackCluster( pPlayable, &pMixerTrackCluster );
if ( pMixerTrackCluster )
pMixerTrackCluster->Refresh();
}
}
// class MixerBoardFrame

View File

@ -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:

View File

@ -6144,8 +6144,6 @@ void AudacityProject::SelectNone()
t->SetSelected(false);
mTrackPanel->Refresh(false);
if (mMixerBoard)
mMixerBoard->Refresh(false);
}
void AudacityProject::ZoomInByFactor( double ZoomFactor )

View File

@ -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();
}
}

View File

@ -11,7 +11,6 @@
class Track;
class TrackList;
class MixerBoard;
class ViewInfo;
#include "MemoryX.h"
#include <vector>
@ -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;

View File

@ -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);

View File

@ -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.

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}