1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-09 16:41:14 +02:00

Bug1425: Better selection for key-modified clicks in TCP, Mixer board

This commit is contained in:
Paul Licameli 2016-06-26 12:10:20 -04:00
commit a9a7ab635b
4 changed files with 45 additions and 77 deletions

View File

@ -699,65 +699,21 @@ wxColour MixerTrackCluster::GetTrackColor()
// event handlers // event handlers
void MixerTrackCluster::HandleSelect(const bool bShiftDown) void MixerTrackCluster::HandleSelect(bool bShiftDown, bool bControlDown)
{ {
if (bShiftDown)
{
// ShiftDown => Just toggle selection on this track.
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
bool bSelect = !mTrack->GetSelected(); Track *pTrack = mTrack;
mTrack->SetSelected(bSelect);
#else #else
bool bSelect = !mLeftTrack->GetSelected(); Track *pTrack = mLeftTrack;
mLeftTrack->SetSelected(bSelect);
#endif #endif
if (mRightTrack)
mRightTrack->SetSelected(bSelect);
// Refresh only this MixerTrackCluster and WaveTrack in TrackPanel. mProject->GetTrackPanel()->HandleListSelection(pTrack, bShiftDown, bControlDown);
this->Refresh(true);
#ifdef EXPERIMENTAL_MIDI_OUT
mProject->RefreshTPTrack(mTrack);
#else
mProject->RefreshTPTrack(mLeftTrack);
#endif
}
else
{
// exclusive select
mProject->SelectNone();
#ifdef EXPERIMENTAL_MIDI_OUT
mTrack->SetSelected(true);
#else
mLeftTrack->SetSelected(true);
#endif
if (mRightTrack)
mRightTrack->SetSelected(true);
if (mProject->GetSel0() >= mProject->GetSel1())
{
// No range previously selected, so use the range of this track.
#ifdef EXPERIMENTAL_MIDI_OUT
mProject->mViewInfo.selectedRegion.setTimes(
mTrack->GetOffset(), mTrack->GetEndTime());
#else
mProject->mViewInfo.selectedRegion.setTimes(
mLeftTrack->GetOffset(), mLeftTrack->GetEndTime());
#endif
}
// Exclusive select, so refresh all MixerTrackClusters.
// This could just be a call to wxWindow::Refresh, but this is
// more efficient and when ProjectLogo is shown as background,
// it's necessary to prevent blinking.
mMixerBoard->RefreshTrackClusters(false);
}
} }
void MixerTrackCluster::OnMouseEvent(wxMouseEvent& event) void MixerTrackCluster::OnMouseEvent(wxMouseEvent& event)
{ {
if (event.ButtonUp()) if (event.ButtonUp())
this->HandleSelect(event.ShiftDown()); this->HandleSelect(event.ShiftDown(), event.ControlDown());
else else
event.Skip(); event.Skip();
} }
@ -791,8 +747,8 @@ void MixerTrackCluster::OnPaint(wxPaintEvent & WXUNUSED(event))
void MixerTrackCluster::OnButton_MusicalInstrument(wxCommandEvent& WXUNUSED(event)) void MixerTrackCluster::OnButton_MusicalInstrument(wxCommandEvent& WXUNUSED(event))
{ {
bool bShiftDown = ::wxGetMouseState().ShiftDown(); const auto &state = ::wxGetMouseState();
this->HandleSelect(bShiftDown); this->HandleSelect(state.ShiftDown(), state.ControlDown());
} }
void MixerTrackCluster::OnSlider_Gain(wxCommandEvent& WXUNUSED(event)) void MixerTrackCluster::OnSlider_Gain(wxCommandEvent& WXUNUSED(event))

View File

@ -100,7 +100,7 @@ private:
wxColour GetTrackColor(); wxColour GetTrackColor();
// event handlers // event handlers
void HandleSelect(const bool bShiftDown); void HandleSelect(bool bShiftDown, bool bControlDown);
void OnKeyEvent(wxKeyEvent& event); void OnKeyEvent(wxKeyEvent& event);
void OnMouseEvent(wxMouseEvent& event); void OnMouseEvent(wxMouseEvent& event);

View File

@ -1879,12 +1879,11 @@ void TrackPanel::SelectRangeOfTracks(Track *sTrack, Track *eTrack)
// Swap the track pointers if needed // Swap the track pointers if needed
if (eTrack->GetIndex() < sTrack->GetIndex()) if (eTrack->GetIndex() < sTrack->GetIndex())
std::swap(sTrack, eTrack); std::swap(sTrack, eTrack);
Track *t = eTrack;
TrackListIterator iter(mTracks); TrackListIterator iter(mTracks);
sTrack = iter.StartWith(sTrack); sTrack = iter.StartWith(sTrack);
do { do {
SelectTrack(sTrack, true); SelectTrack(sTrack, true, false);
if (sTrack == eTrack) { if (sTrack == eTrack) {
break; break;
} }
@ -4937,27 +4936,27 @@ void TrackPanel::HandleLabelClick(wxMouseEvent & event)
{ {
wxRect midiRect; wxRect midiRect;
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
// this is an awful hack: make a NEW rectangle at an offset because // this is an awful hack: make a NEW rectangle at an offset because
// MuteSoloFunc thinks buttons are located below some text, e.g. // MuteSoloFunc thinks buttons are located below some text, e.g.
// "Mono, 44100Hz 32-bit float", but this is not true for a Note track // "Mono, 44100Hz 32-bit float", but this is not true for a Note track
wxRect muteSoloRect(rect); wxRect muteSoloRect(rect);
muteSoloRect.y -= 34; // subtract the height of wave track text muteSoloRect.y -= 34; // subtract the height of wave track text
if (MuteSoloFunc(t, muteSoloRect, event.m_x, event.m_y, false) || if (MuteSoloFunc(t, muteSoloRect, event.m_x, event.m_y, false) ||
MuteSoloFunc(t, muteSoloRect, event.m_x, event.m_y, true)) MuteSoloFunc(t, muteSoloRect, event.m_x, event.m_y, true))
return; return;
// this is a similar hack: GainFunc expects a Wave track slider, so it's // this is a similar hack: GainFunc expects a Wave track slider, so it's
// looking in the wrong place. We pass it a bogus rectangle created when // looking in the wrong place. We pass it a bogus rectangle created when
// the slider was placed to "fake" GainFunc into finding the slider in // the slider was placed to "fake" GainFunc into finding the slider in
// its actual location. // its actual location.
if (GainFunc(t, ((NoteTrack *) t)->GetGainPlacementRect(), if (GainFunc(t, ((NoteTrack *) t)->GetGainPlacementRect(),
event, event.m_x, event.m_y)) event, event.m_x, event.m_y))
return; return;
#endif #endif
mTrackInfo.GetTrackControlsRect(rect, midiRect); mTrackInfo.GetTrackControlsRect(rect, midiRect);
if (midiRect.Contains(event.m_x, event.m_y) && if (midiRect.Contains(event.m_x, event.m_y) &&
((NoteTrack *) t)->LabelClick(midiRect, event.m_x, event.m_y, ((NoteTrack *)t)->LabelClick(midiRect, event.m_x, event.m_y,
event.Button(wxMOUSE_BTN_RIGHT))) { event.Button(wxMOUSE_BTN_RIGHT))) {
Refresh(false); Refresh(false);
return; return;
} }
@ -4977,20 +4976,31 @@ void TrackPanel::HandleLabelClick(wxMouseEvent & event)
// can drag the track up or down to swap it with others // can drag the track up or down to swap it with others
if (!unsafe) { if (!unsafe) {
mRearrangeCount = 0; mRearrangeCount = 0;
SetCapturedTrack( t, IsRearranging ); SetCapturedTrack(t, IsRearranging);
TrackPanel::CalculateRearrangingThresholds(event); TrackPanel::CalculateRearrangingThresholds(event);
} }
HandleListSelection(t, event.ShiftDown(), event.ControlDown());
if (!unsafe)
MakeParentModifyState(true);
}
void TrackPanel::HandleListSelection(Track *t, bool shift, bool ctrl)
{
// AS: If the shift button is being held down, invert // AS: If the shift button is being held down, invert
// the selection on this track. // the selection on this track.
if (event.ShiftDown()) { if (ctrl) {
SelectTrack(t, !t->GetSelected()); SelectTrack(t, !t->GetSelected());
Refresh(false); Refresh(false);
return; return;
} }
SelectNone(); SelectNone();
SelectTrack(t, true); if (shift && mLastPickedTrack)
SelectRangeOfTracks(t, mLastPickedTrack);
else
SelectTrack(t, true);
SetFocusedTrack(t); SetFocusedTrack(t);
SelectTrackLength(t); SelectTrackLength(t);
@ -4998,9 +5008,6 @@ void TrackPanel::HandleLabelClick(wxMouseEvent & event)
MixerBoard* pMixerBoard = this->GetMixerBoard(); MixerBoard* pMixerBoard = this->GetMixerBoard();
if (pMixerBoard) if (pMixerBoard)
pMixerBoard->RefreshTrackClusters(); pMixerBoard->RefreshTrackClusters();
if (!unsafe)
MakeParentModifyState(true);
} }
/// The user is dragging one of the tracks: change the track order /// The user is dragging one of the tracks: change the track order

View File

@ -398,6 +398,11 @@ protected:
virtual void HandleResize(wxMouseEvent & event); virtual void HandleResize(wxMouseEvent & event);
virtual void HandleLabelClick(wxMouseEvent & event); virtual void HandleLabelClick(wxMouseEvent & event);
public:
virtual void HandleListSelection(Track *t, bool shift, bool ctrl);
protected:
virtual void HandleRearrange(wxMouseEvent & event); virtual void HandleRearrange(wxMouseEvent & event);
virtual void CalculateRearrangingThresholds(wxMouseEvent & event); virtual void CalculateRearrangingThresholds(wxMouseEvent & event);
virtual void HandleClosing(wxMouseEvent & event); virtual void HandleClosing(wxMouseEvent & event);