MixerBoard listens to TrackList for selection changes
This commit is contained in:
parent
96d104cb38
commit
7150d43083
|
@ -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
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -6144,8 +6144,6 @@ void AudacityProject::SelectNone()
|
|||
t->SetSelected(false);
|
||||
|
||||
mTrackPanel->Refresh(false);
|
||||
if (mMixerBoard)
|
||||
mMixerBoard->Refresh(false);
|
||||
}
|
||||
|
||||
void AudacityProject::ZoomInByFactor( double ZoomFactor )
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue