1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-17 16:40:07 +02:00

Merge ESC key aborts selection drag, restores time, frequency selection, selected tracks

This commit is contained in:
Paul-Licameli 2015-04-12 12:46:41 -04:00
commit 797109d97f
2 changed files with 58 additions and 20 deletions

View File

@ -590,6 +590,8 @@ TrackPanel::TrackPanel(wxWindow * parent, wxWindowID id,
mLastScrubTime = 0;
mLastScrubPosition = 0;
#endif
mInitialTrackSelection = new std::vector<bool>;
}
TrackPanel::~TrackPanel()
@ -651,6 +653,8 @@ TrackPanel::~TrackPanel()
#if !wxUSE_ACCESSIBILITY
delete mAx;
#endif
delete mInitialTrackSelection;
}
void TrackPanel::BuildMenus(void)
@ -1472,6 +1476,19 @@ void TrackPanel::HandleEscapeKey()
{
switch (mMouseCapture)
{
case IsSelecting:
{
TrackListIterator iter(mTracks);
std::vector<bool>::const_iterator
it = mInitialTrackSelection->begin(),
end = mInitialTrackSelection->end();
for (Track *t = iter.First(); t; t = iter.Next()) {
wxASSERT(it != end);
t->SetSelected(*it++);
}
mViewInfo->selectedRegion = mInitialSelection;
}
break;
case IsZooming:
case IsVZooming:
break;
@ -2228,14 +2245,39 @@ void TrackPanel::SelectionHandleClick(wxMouseEvent & event,
Track * pTrack, wxRect r)
{
Track *rightTrack = NULL;
bool nextTrackIsLinkFromPTrack = false;
mCapturedTrack = pTrack;
mCapturedRect = r;
mMouseClickX = event.m_x;
mMouseClickY = event.m_y;
bool startNewSelection = true;
mMouseCapture=IsSelecting;
mInitialSelection = mViewInfo->selectedRegion;
// Save initial state of track selections, also,
// if the shift button is down and no track is selected yet,
// at least select the track we clicked into.
bool isAtLeastOneTrackSelected = false;
mInitialTrackSelection->clear();
{
bool nextTrackIsLinkFromPTrack = false;
TrackListIterator iter(mTracks);
for (Track *t = iter.First(); t; t = iter.Next()) {
const bool isSelected = t->GetSelected();
mInitialTrackSelection->push_back(isSelected);
if (isSelected) {
isAtLeastOneTrackSelected = true;
}
if (!isAtLeastOneTrackSelected) {
if (t == pTrack && t->GetLinked()) {
nextTrackIsLinkFromPTrack = true;
}
else if (nextTrackIsLinkFromPTrack) {
rightTrack = t;
nextTrackIsLinkFromPTrack = false;
}
}
}
}
// We create a new snap manager in case any snap-points have changed
if (mSnapManager)
@ -2264,23 +2306,6 @@ void TrackPanel::SelectionHandleClick(wxMouseEvent & event,
&& !stretch
#endif
) {
// If the shift button is down and no track is selected yet,
// at least select the track we clicked into.
bool isAtLeastOneTrackSelected = false;
TrackListIterator iter(mTracks);
for (Track *t = iter.First(); t; t = iter.Next()) {
if (t->GetSelected()) {
isAtLeastOneTrackSelected = true;
break;
} else if (t == pTrack && t->GetLinked()) {
nextTrackIsLinkFromPTrack = true;
} else if (nextTrackIsLinkFromPTrack) {
rightTrack = t;
nextTrackIsLinkFromPTrack = false;
}
}
if (!isAtLeastOneTrackSelected) {
pTrack->SetSelected(true);
if (rightTrack)
@ -2351,10 +2376,15 @@ void TrackPanel::SelectionHandleClick(wxMouseEvent & event,
mLastScrubPosition = PositionToTime(event.m_x, GetLeftOffset());
#else
StartOrJumpPlayback(event);
// Not starting a drag
SetCapturedTrack(NULL, IsUncaptured);
#endif
return;
}
//Make sure you are within the selected track
bool startNewSelection = true;
if (pTrack && pTrack->GetSelected()) {
// Adjusting selection edges can be turned off in the
// preferences now
@ -2438,9 +2468,12 @@ void TrackPanel::SelectionHandleClick(wxMouseEvent & event,
// IF the user clicked a label, THEN select all other tracks by Label
if (lt->IsSelected()) {
mTracks->Select( lt );
mTracks->Select(lt);
SelectTracksByLabel( lt );
DisplaySelection();
// Not starting a drag
SetCapturedTrack(NULL, IsUncaptured);
return;
}
}

View File

@ -12,6 +12,7 @@
#define __AUDACITY_TRACK_PANEL__
#include <memory>
#include <vector>
#include <wx/dcmemory.h>
#include <wx/dynarray.h>
@ -573,6 +574,10 @@ protected:
wxLongLong mLastSelectionAdjustment;
SelectedRegion mInitialSelection;
// Extra indirection to avoid the stupid MSW compiler warnings! Rrrr!
std::vector<bool> *mInitialTrackSelection;
bool mSelStartValid;
double mSelStart;