From 58fea6d520d7ed1d5ea43e73b07bc3b5ab3d799f Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Fri, 23 Jun 2017 18:08:15 -0400 Subject: [PATCH] null check uses of CommonTrackPanelCell::FindTrack --- .../notetrack/ui/NoteTrackControls.cpp | 2 +- .../wavetrack/ui/WaveTrackControls.cpp | 2 +- .../wavetrack/ui/WaveTrackVRulerControls.cpp | 2 + src/tracks/ui/ButtonHandle.cpp | 10 +++-- src/tracks/ui/SelectHandle.cpp | 44 +++++++++---------- src/tracks/ui/TrackControls.cpp | 3 ++ src/tracks/ui/TrackSelectHandle.cpp | 2 + 7 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp index 3e89b477c..8ec68ce37 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp @@ -151,7 +151,7 @@ HitTestResult NoteTrackControls::HitTest const wxRect &rect = evt.rect; if (event.ButtonDown() || event.ButtonDClick()) { auto track = FindTrack(); - if (track->GetKind() == Track::Note) { + if (track && track->GetKind() == Track::Note) { HitTestResult result; if (NULL != (result = MuteButtonHandle::HitTest diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp index 26f21387a..465ad52f5 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp @@ -61,7 +61,7 @@ HitTestResult WaveTrackControls::HitTest const wxRect &rect = evt.rect; if (event.Button(wxMOUSE_BTN_LEFT)) { auto track = FindTrack(); - if (track->GetKind() == Track::Wave) { + if (track && track->GetKind() == Track::Wave) { HitTestResult result; if (NULL != (result = MuteButtonHandle::HitTest diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.cpp index 7aa72aecd..41c126adc 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.cpp @@ -675,6 +675,8 @@ unsigned WaveTrackVRulerControls::HandleWheelRotation evt.event.Skip(false); Track *const pTrack = FindTrack(); + if (!pTrack) + return RefreshNone; wxASSERT(pTrack->GetKind() == Track::Wave); auto steps = evt.steps; diff --git a/src/tracks/ui/ButtonHandle.cpp b/src/tracks/ui/ButtonHandle.cpp index 3381be151..46be1a7e4 100644 --- a/src/tracks/ui/ButtonHandle.cpp +++ b/src/tracks/ui/ButtonHandle.cpp @@ -38,15 +38,19 @@ HitTestPreview ButtonHandle::HitPreview() UIHandle::Result ButtonHandle::Click (const TrackPanelMouseEvent &evt, AudacityProject *) { - const wxMouseEvent &event = evt.event; using namespace RefreshCode; + auto pTrack = Track::Pointer( + static_cast(evt.pCell)->FindTrack() ); + if ( !pTrack ) + return Cancelled; + + const wxMouseEvent &event = evt.event; if (!event.Button(wxMOUSE_BTN_LEFT)) return Cancelled; // Come here for left click or double click if (mRect.Contains(event.m_x, event.m_y)) { - mpTrack = Track::Pointer( - static_cast(evt.pCell)->FindTrack() ); + mpTrack = pTrack; TrackControls::gCaptureState = mDragCode; // Toggle visible button state return RefreshCell; diff --git a/src/tracks/ui/SelectHandle.cpp b/src/tracks/ui/SelectHandle.cpp index f37223bfa..6e29a528c 100644 --- a/src/tracks/ui/SelectHandle.cpp +++ b/src/tracks/ui/SelectHandle.cpp @@ -808,35 +808,35 @@ UIHandle::Result SelectHandle::Drag return RefreshNone; } - Track *clickedTrack = - static_cast(evt.pCell)->FindTrack(); - - // Handle which tracks are selected - Track *sTrack = pTrack.get(); - Track *eTrack = clickedTrack; - auto trackList = pProject->GetTracks(); - auto pMixerBoard = pProject->GetMixerBoard(); - if ( sTrack && eTrack && !event.ControlDown() ) { - auto &selectionState = pProject->GetSelectionState(); - selectionState.SelectRangeOfTracks + if ( auto clickedTrack = + static_cast(evt.pCell)->FindTrack() ) { + // Handle which tracks are selected + Track *sTrack = pTrack.get(); + Track *eTrack = clickedTrack; + auto trackList = pProject->GetTracks(); + auto pMixerBoard = pProject->GetMixerBoard(); + if ( sTrack && eTrack && !event.ControlDown() ) { + auto &selectionState = pProject->GetSelectionState(); + selectionState.SelectRangeOfTracks ( *trackList, *sTrack, *eTrack, pMixerBoard ); - } + } #ifdef EXPERIMENTAL_SPECTRAL_EDITING #ifndef SPECTRAL_EDITING_ESC_KEY - if (mFreqSelMode == FREQ_SEL_SNAPPING_CENTER && - !viewInfo.selectedRegion.isPoint()) - MoveSnappingFreqSelection + if (mFreqSelMode == FREQ_SEL_SNAPPING_CENTER && + !viewInfo.selectedRegion.isPoint()) + MoveSnappingFreqSelection (pProject, viewInfo, y, mRect.y, mRect.height, pTrack.get()); - else + else #endif - if (mFreqSelTrack.lock() == pTrack) - AdjustFreqSelection( - static_cast(pTrack.get()), - viewInfo, y, mRect.y, mRect.height); + if (mFreqSelTrack.lock() == pTrack) + AdjustFreqSelection( + static_cast(pTrack.get()), + viewInfo, y, mRect.y, mRect.height); #endif - - AdjustSelection(viewInfo, x, mRect.x, clickedTrack); + + AdjustSelection(viewInfo, x, mRect.x, clickedTrack); + } return RefreshNone diff --git a/src/tracks/ui/TrackControls.cpp b/src/tracks/ui/TrackControls.cpp index cdda45ec1..0d0e9ec29 100644 --- a/src/tracks/ui/TrackControls.cpp +++ b/src/tracks/ui/TrackControls.cpp @@ -203,6 +203,9 @@ unsigned TrackControls::DoContextMenu TrackInfo::GetTitleBarRect(rect, buttonRect); auto track = FindTrack(); + if (!track) + return RefreshCode::RefreshNone; + InitMenuData data{ track, pParent, RefreshCode::RefreshNone }; const auto pTable = &TrackMenuTable::Instance(); diff --git a/src/tracks/ui/TrackSelectHandle.cpp b/src/tracks/ui/TrackSelectHandle.cpp index efc53016c..d24d2e17d 100644 --- a/src/tracks/ui/TrackSelectHandle.cpp +++ b/src/tracks/ui/TrackSelectHandle.cpp @@ -96,6 +96,8 @@ UIHandle::Result TrackSelectHandle::Click TrackControls *const pControls = static_cast(evt.pCell); Track *const pTrack = pControls->FindTrack(); + if (!pTrack) + return Cancelled; TrackPanel *const trackPanel = pProject->GetTrackPanel(); const bool unsafe = pProject->IsAudioActive();