mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-28 06:08:40 +02:00
More careful use of weak pointers to tracks in UIHandles
This commit is contained in:
parent
e2f0a16839
commit
6684c7b9b0
@ -130,7 +130,7 @@ void SelectionState::ChangeSelectionOnShiftClick
|
||||
Track* pFirst = nullptr;
|
||||
Track* pLast = nullptr;
|
||||
// We will either extend from the first or from the last.
|
||||
auto pExtendFrom = mLastPickedTrack.lock();
|
||||
auto pExtendFrom = tracks.Lock(mLastPickedTrack);
|
||||
|
||||
if( !pExtendFrom ) {
|
||||
TrackListIterator iter( &tracks );
|
||||
|
11
src/Track.h
11
src/Track.h
@ -606,6 +606,17 @@ class TrackList final : public wxEvtHandler, public ListOfTracks
|
||||
/// Mainly a test function. Uses a linear search, so could be slow.
|
||||
bool Contains(const Track * t) const;
|
||||
|
||||
// Return non-null only if the weak pointer is not, and the track is
|
||||
// owned by this list; constant time.
|
||||
template <typename Subclass>
|
||||
std::shared_ptr<Subclass> Lock(const std::weak_ptr<Subclass> &wTrack)
|
||||
{
|
||||
auto pTrack = wTrack.lock();
|
||||
if (pTrack && this == pTrack->mList)
|
||||
return pTrack;
|
||||
return {};
|
||||
}
|
||||
|
||||
bool IsEmpty() const;
|
||||
int GetCount() const;
|
||||
|
||||
|
@ -153,7 +153,7 @@ UIHandle::Result TrackPanelResizeHandle::Click
|
||||
UIHandle::Result TrackPanelResizeHandle::Drag
|
||||
(const TrackPanelMouseEvent &evt, AudacityProject *pProject)
|
||||
{
|
||||
auto pTrack = mpTrack.lock();
|
||||
auto pTrack = pProject->GetTracks()->Lock(mpTrack);
|
||||
if ( !pTrack )
|
||||
return RefreshCode::Cancelled;
|
||||
|
||||
@ -338,7 +338,7 @@ UIHandle::Result TrackPanelResizeHandle::Release
|
||||
|
||||
UIHandle::Result TrackPanelResizeHandle::Cancel(AudacityProject *pProject)
|
||||
{
|
||||
auto pTrack = mpTrack.lock();
|
||||
auto pTrack = pProject->GetTracks()->Lock(mpTrack);
|
||||
if ( !pTrack )
|
||||
return RefreshCode::Cancelled;
|
||||
|
||||
@ -357,7 +357,7 @@ UIHandle::Result TrackPanelResizeHandle::Cancel(AudacityProject *pProject)
|
||||
pTrack->SetHeight(mInitialUpperActualHeight);
|
||||
pTrack->SetMinimized(mInitialMinimized);
|
||||
#ifdef EXPERIMENTAL_OUTPUT_DISPLAY
|
||||
if( !MONO_WAVE_PAN(mpTrack) )
|
||||
if( !MONO_WAVE_PAN(pTrack) )
|
||||
#endif
|
||||
{
|
||||
next->SetHeight(mInitialActualHeight);
|
||||
@ -371,7 +371,7 @@ UIHandle::Result TrackPanelResizeHandle::Cancel(AudacityProject *pProject)
|
||||
pTrack->SetHeight(mInitialActualHeight);
|
||||
pTrack->SetMinimized(mInitialMinimized);
|
||||
#ifdef EXPERIMENTAL_OUTPUT_DISPLAY
|
||||
if( !MONO_WAVE_PAN(mpTrack) )
|
||||
if( !MONO_WAVE_PAN(pTrack) )
|
||||
#endif
|
||||
{
|
||||
prev->SetHeight(mInitialUpperActualHeight);
|
||||
|
@ -53,7 +53,7 @@ void LabelDefaultClickHandle::RestoreState( AudacityProject *pProject )
|
||||
{
|
||||
if ( mLabelState ) {
|
||||
for ( const auto &pair : mLabelState->mPairs )
|
||||
if (auto pLt = pair.first.lock())
|
||||
if (auto pLt = pProject->GetTracks()->Lock(pair.first))
|
||||
pLt->RestoreFlags( pair.second );
|
||||
mLabelState.reset();
|
||||
}
|
||||
|
@ -122,7 +122,7 @@ UIHandle::Result LabelTextHandle::Drag
|
||||
auto result = LabelDefaultClickHandle::Drag( evt, pProject );
|
||||
|
||||
const wxMouseEvent &event = evt.event;
|
||||
auto pLT = mpLT.lock();
|
||||
auto pLT = pProject->GetTracks()->Lock(mpLT);
|
||||
if(pLT)
|
||||
pLT->HandleTextDragRelease(event);
|
||||
|
||||
@ -170,7 +170,7 @@ UIHandle::Result LabelTextHandle::Release
|
||||
}
|
||||
|
||||
const wxMouseEvent &event = evt.event;
|
||||
auto pLT = mpLT.lock();
|
||||
auto pLT = pProject->GetTracks()->Lock(mpLT);
|
||||
if (pLT)
|
||||
pLT->HandleTextDragRelease(event);
|
||||
|
||||
|
@ -121,7 +121,7 @@ UIHandle::Result NoteTrackClickHandle::Release
|
||||
{
|
||||
using namespace RefreshCode;
|
||||
|
||||
auto pTrack = mpTrack.lock();
|
||||
auto pTrack = pProject->GetTracks()->Lock(mpTrack);
|
||||
if (!pTrack)
|
||||
return Cancelled;
|
||||
|
||||
|
@ -127,14 +127,15 @@ UIHandle::Result NoteTrackVZoomHandle::Drag
|
||||
(const TrackPanelMouseEvent &evt, AudacityProject *pProject)
|
||||
{
|
||||
using namespace RefreshCode;
|
||||
if (!mpTrack.lock())
|
||||
auto pTrack = pProject->GetTracks()->Lock(mpTrack);
|
||||
if (!pTrack)
|
||||
return Cancelled;
|
||||
|
||||
const wxMouseEvent &event = evt.event;
|
||||
mZoomEnd = event.m_y;
|
||||
if (IsDragZooming(mZoomStart, mZoomEnd)) {
|
||||
// changed Note track to work like audio track
|
||||
// mpTrack->VScroll(mZoomStart, mZoomEnd);
|
||||
// pTrack->VScroll(mZoomStart, mZoomEnd);
|
||||
return RefreshAll;
|
||||
}
|
||||
return RefreshNone;
|
||||
@ -151,7 +152,7 @@ UIHandle::Result NoteTrackVZoomHandle::Release
|
||||
wxWindow *pParent)
|
||||
{
|
||||
using namespace RefreshCode;
|
||||
auto pTrack = mpTrack.lock();
|
||||
auto pTrack = pProject->GetTracks()->Lock(mpTrack);
|
||||
if (!pTrack)
|
||||
return RefreshNone;
|
||||
|
||||
@ -184,7 +185,7 @@ UIHandle::Result NoteTrackVZoomHandle::Cancel(AudacityProject *pProject)
|
||||
void NoteTrackVZoomHandle::DrawExtras
|
||||
(DrawingPass pass, wxDC * dc, const wxRegion &, const wxRect &panelRect)
|
||||
{
|
||||
if (!mpTrack.lock())
|
||||
if (!mpTrack.lock()) //? TrackList::Lock()
|
||||
return;
|
||||
|
||||
if ( pass == UIHandle::Cells &&
|
||||
|
@ -571,10 +571,11 @@ UIHandle::Result WaveTrackVZoomHandle::Click
|
||||
}
|
||||
|
||||
UIHandle::Result WaveTrackVZoomHandle::Drag
|
||||
(const TrackPanelMouseEvent &evt, AudacityProject *)
|
||||
(const TrackPanelMouseEvent &evt, AudacityProject *pProject)
|
||||
{
|
||||
using namespace RefreshCode;
|
||||
if (!mpTrack.lock())
|
||||
auto pTrack = pProject->GetTracks()->Lock(mpTrack);
|
||||
if (!pTrack)
|
||||
return Cancelled;
|
||||
|
||||
const wxMouseEvent &event = evt.event;
|
||||
@ -595,7 +596,7 @@ UIHandle::Result WaveTrackVZoomHandle::Release
|
||||
wxWindow *pParent)
|
||||
{
|
||||
using namespace RefreshCode;
|
||||
auto pTrack = mpTrack.lock();
|
||||
auto pTrack = pProject->GetTracks()->Lock(mpTrack);
|
||||
if (!pTrack)
|
||||
return RefreshNone;
|
||||
|
||||
@ -640,7 +641,7 @@ UIHandle::Result WaveTrackVZoomHandle::Cancel(AudacityProject*)
|
||||
void WaveTrackVZoomHandle::DrawExtras
|
||||
(DrawingPass pass, wxDC * dc, const wxRegion &, const wxRect &panelRect)
|
||||
{
|
||||
if (!mpTrack.lock())
|
||||
if (!mpTrack.lock()) // TrackList::Lock()?
|
||||
return;
|
||||
|
||||
if ( pass == UIHandle::Cells &&
|
||||
|
@ -59,11 +59,12 @@ UIHandle::Result ButtonHandle::Click
|
||||
}
|
||||
|
||||
UIHandle::Result ButtonHandle::Drag
|
||||
(const TrackPanelMouseEvent &evt, AudacityProject *)
|
||||
(const TrackPanelMouseEvent &evt, AudacityProject *pProject)
|
||||
{
|
||||
const wxMouseEvent &event = evt.event;
|
||||
using namespace RefreshCode;
|
||||
if (!mpTrack.lock())
|
||||
auto pTrack = pProject->GetTracks()->Lock(mpTrack);
|
||||
if (!pTrack)
|
||||
return Cancelled;
|
||||
|
||||
const int newState =
|
||||
@ -88,7 +89,7 @@ UIHandle::Result ButtonHandle::Release
|
||||
wxWindow *pParent)
|
||||
{
|
||||
using namespace RefreshCode;
|
||||
auto pTrack = mpTrack.lock();
|
||||
auto pTrack = pProject->GetTracks()->Lock(mpTrack);
|
||||
if (!pTrack)
|
||||
return Cancelled;
|
||||
|
||||
|
@ -617,7 +617,7 @@ UIHandle::Result SelectHandle::Click
|
||||
#endif
|
||||
mSelStartValid = true;
|
||||
mSelStart = value;
|
||||
AdjustSelection(viewInfo, event.m_x, mRect.x, pTrack);
|
||||
AdjustSelection(pProject, viewInfo, event.m_x, mRect.x, pTrack);
|
||||
break;
|
||||
}
|
||||
#ifdef EXPERIMENTAL_SPECTRAL_EDITING
|
||||
@ -796,7 +796,7 @@ UIHandle::Result SelectHandle::Drag
|
||||
}
|
||||
|
||||
// Also fuhggeddaboudit if not in a track.
|
||||
auto pTrack = mpTrack.lock();
|
||||
auto pTrack = pProject->GetTracks()->Lock(mpTrack);
|
||||
if (!pTrack)
|
||||
return RefreshNone;
|
||||
|
||||
@ -836,13 +836,13 @@ UIHandle::Result SelectHandle::Drag
|
||||
(pProject, viewInfo, y, mRect.y, mRect.height, pTrack.get());
|
||||
else
|
||||
#endif
|
||||
if (mFreqSelTrack.lock() == pTrack)
|
||||
if (pProject->GetTracks()->Lock(mFreqSelTrack) == pTrack)
|
||||
AdjustFreqSelection(
|
||||
static_cast<WaveTrack*>(pTrack.get()),
|
||||
viewInfo, y, mRect.y, mRect.height);
|
||||
#endif
|
||||
|
||||
AdjustSelection(viewInfo, x, mRect.x, clickedTrack.get());
|
||||
AdjustSelection(pProject, viewInfo, x, mRect.x, clickedTrack.get());
|
||||
}
|
||||
|
||||
return RefreshNone
|
||||
@ -997,7 +997,7 @@ void SelectHandle::OnTimer(wxCommandEvent &event)
|
||||
}
|
||||
}
|
||||
|
||||
auto pTrack = mpTrack.lock();
|
||||
auto pTrack = mpTrack.lock(); // TrackList::Lock() ?
|
||||
if (mAutoScrolling && pTrack) {
|
||||
// AS: To keep the selection working properly as we scroll,
|
||||
// we fake a mouse event (remember, this method is called
|
||||
@ -1026,7 +1026,7 @@ void SelectHandle::StartSelection
|
||||
mSnapLeft = -1;
|
||||
mSnapRight = -1;
|
||||
bool snappedPoint, snappedTime;
|
||||
auto pTrack = mpTrack.lock();
|
||||
auto pTrack = pProject->GetTracks()->Lock(mpTrack);
|
||||
if (mSnapManager->Snap(pTrack.get(), mSelStart, false,
|
||||
&s, &snappedPoint, &snappedTime)) {
|
||||
if (snappedPoint)
|
||||
@ -1045,7 +1045,8 @@ void SelectHandle::StartSelection
|
||||
|
||||
/// Extend or contract the existing selection
|
||||
void SelectHandle::AdjustSelection
|
||||
(ViewInfo &viewInfo, int mouseXCoordinate, int trackLeftEdge,
|
||||
(AudacityProject *pProject,
|
||||
ViewInfo &viewInfo, int mouseXCoordinate, int trackLeftEdge,
|
||||
Track *track)
|
||||
{
|
||||
if (!mSelStartValid)
|
||||
@ -1059,7 +1060,7 @@ void SelectHandle::AdjustSelection
|
||||
|
||||
auto pTrack = Track::Pointer( track );
|
||||
if (!pTrack)
|
||||
pTrack = mpTrack.lock();
|
||||
pTrack = pProject->GetTracks()->Lock(mpTrack);
|
||||
|
||||
if (mSelStart < selend) {
|
||||
sel0 = mSelStart;
|
||||
|
@ -74,7 +74,8 @@ private:
|
||||
void StartSelection
|
||||
(AudacityProject *pProject, int mouseXCoordinate, int trackLeftEdge);
|
||||
void AdjustSelection
|
||||
(ViewInfo &viewInfo, int mouseXCoordinate, int trackLeftEdge,
|
||||
(AudacityProject *pProject,
|
||||
ViewInfo &viewInfo, int mouseXCoordinate, int trackLeftEdge,
|
||||
Track *pTrack);
|
||||
|
||||
void StartFreqSelection
|
||||
|
@ -12,6 +12,7 @@ Paul Licameli
|
||||
#include "SliderHandle.h"
|
||||
#include "../../widgets/ASlider.h"
|
||||
#include "../../HitTestResult.h"
|
||||
#include "../../Project.h"
|
||||
#include "../../RefreshCode.h"
|
||||
#include "../../TrackPanelMouseEvent.h"
|
||||
|
||||
@ -98,3 +99,9 @@ UIHandle::Result SliderHandle::Cancel(AudacityProject *pProject)
|
||||
mpTrack.reset();
|
||||
return RefreshCode::RefreshCell | result;
|
||||
}
|
||||
|
||||
LWSlider *SliderHandle::GetSlider( AudacityProject *pProject )
|
||||
{
|
||||
auto pTrack = pProject->GetTracks()->Lock(mpTrack);
|
||||
return mSliderFn( pProject, mRect, pTrack.get() );
|
||||
}
|
||||
|
@ -61,8 +61,7 @@ protected:
|
||||
wxRect mRect{};
|
||||
using SliderFn = LWSlider *(*)( AudacityProject*, const wxRect&, Track* );
|
||||
SliderFn mSliderFn;
|
||||
LWSlider *GetSlider( AudacityProject *pProject )
|
||||
{ return mSliderFn( pProject, mRect, mpTrack.lock().get() ); }
|
||||
LWSlider *GetSlider( AudacityProject *pProject );
|
||||
|
||||
float mStartingValue {};
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user