CommonTrackPanelCell::FindTrack returns shared_ptr

This commit is contained in:
Paul Licameli 2017-06-27 14:12:23 -04:00
parent b3208ab12d
commit 708d84ac22
21 changed files with 43 additions and 42 deletions

View File

@ -317,9 +317,9 @@ void Track::SyncLockAdjust(double oldT1, double newT1)
}
}
Track *Track::FindTrack()
std::shared_ptr<Track> Track::FindTrack()
{
return this;
return Pointer( this );
}
void PlayableTrack::Init( const PlayableTrack &orig )

View File

@ -308,7 +308,7 @@ class AUDACITY_DLL_API Track /* not final */
bool IsSyncLockSelected() const;
protected:
Track *FindTrack() override;
std::shared_ptr<Track> FindTrack() override;
// These are called to create controls on demand:
virtual std::shared_ptr<TrackControls> GetControls() = 0;

View File

@ -880,7 +880,8 @@ void TrackPanel::HandleCursor( const TrackPanelMouseEvent &tpmEvent )
const auto size = GetSize();
HitTestResult hitTest( pCell->HitTest(tpmEvent, GetProject()) );
tip = hitTest.preview.message;
ProcessUIHandleResult(this, mRuler, track, track, hitTest.preview.refreshCode);
ProcessUIHandleResult
(this, mRuler, track.get(), track.get(), hitTest.preview.refreshCode);
pCursor = hitTest.preview.cursor;
if (pCursor)
SetCursor(*pCursor);
@ -1234,7 +1235,7 @@ void TrackPanel::HandleWheelRotation( TrackPanelMouseEvent &tpmEvent )
unsigned result =
pCell->HandleWheelRotation( tpmEvent, GetProject() );
auto pTrack = static_cast<CommonTrackPanelCell*>(pCell)->FindTrack();
ProcessUIHandleResult(this, mRuler, pTrack, pTrack, result);
ProcessUIHandleResult(this, mRuler, pTrack.get(), pTrack.get(), result);
}
/// Filter captured keys typed into LabelTracks.
@ -1543,8 +1544,9 @@ void TrackPanel::HandleClick( const TrackPanelMouseEvent &tpmEvent )
if (refreshResult & RefreshCode::Cancelled)
mUIHandle = NULL;
else
mpClickedTrack = pTrack;
ProcessUIHandleResult(this, mRuler, pTrack, pTrack, refreshResult);
mpClickedTrack = pTrack.get();
ProcessUIHandleResult
(this, mRuler, pTrack.get(), pTrack.get(), refreshResult);
HandleCursor( tpmEvent );
}
}
@ -2513,8 +2515,7 @@ TrackPanel::FoundCell TrackPanel::FindCell(int mouseX, int mouseY)
iter = prev;
auto found = *iter;
return {
Track::Pointer(
static_cast<CommonTrackPanelCell*>( found.first.get() )->FindTrack() ),
static_cast<CommonTrackPanelCell*>( found.first.get() )->FindTrack(),
found.first,
found.second
};

View File

@ -72,7 +72,7 @@ UIHandle::Result TrackPanelResizeHandle::Click
const wxMouseEvent &event = evt.event;
CommonTrackPanelCell *const pCell =
static_cast<CommonTrackPanelCell*>(evt.pCell);
Track *track = track = pCell->FindTrack();
auto track = pCell->FindTrack().get();
if (track && dynamic_cast< TrackControls * >( pCell )) {
// Clicked under a label;
// if stereo, replace left channel with the right:

View File

@ -79,7 +79,7 @@ public:
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject) override;
Track *FindTrack() override { return mpTrack.lock().get(); };
std::shared_ptr<Track> FindTrack() override { return mpTrack.lock(); };
private:
friend class TrackPanelCellIterator;
std::weak_ptr<Track> mpTrack;

View File

@ -155,12 +155,12 @@ HitTestResult NoteTrackControls::HitTest
HitTestResult result;
if (NULL !=
(result = MuteButtonHandle::HitTest
(event, rect, pProject, track)).handle)
(event, rect, pProject, track.get())).handle)
return result;
if (NULL !=
(result = SoloButtonHandle::HitTest
(event, rect, pProject, track)).handle)
(event, rect, pProject, track.get())).handle)
return result;
#ifdef EXPERIMENTAL_MIDI_OUT
if (NULL != (result =

View File

@ -109,7 +109,7 @@ NoteTrackVZoomHandle::~NoteTrackVZoomHandle()
UIHandle::Result NoteTrackVZoomHandle::Click
(const TrackPanelMouseEvent &evt, AudacityProject *pProject)
{
mpTrack = Track::Pointer<NoteTrack>(
mpTrack = std::static_pointer_cast<NoteTrack>(
static_cast<NoteTrackVRulerControls*>(evt.pCell)->FindTrack() );
mRect = evt.rect;

View File

@ -196,7 +196,7 @@ UIHandle::Result StretchHandle::Drag
const int x = event.m_x;
Track *clickedTrack =
static_cast<CommonTrackPanelCell*>(evt.pCell)->FindTrack();
static_cast<CommonTrackPanelCell*>(evt.pCell)->FindTrack().get();
if (clickedTrack == NULL && mpTrack != NULL)
clickedTrack = mpTrack;

View File

@ -65,20 +65,20 @@ HitTestResult WaveTrackControls::HitTest
HitTestResult result;
if (NULL !=
(result = MuteButtonHandle::HitTest
(event, rect, pProject, track)).handle)
(event, rect, pProject, track.get())).handle)
return result;
if (NULL !=
(result = SoloButtonHandle::HitTest
(event, rect, pProject, track)).handle)
(event, rect, pProject, track.get())).handle)
return result;
if (NULL != (result =
GainSliderHandle::HitTest(event, rect, pProject, track)).handle)
GainSliderHandle::HitTest(event, rect, pProject, track.get())).handle)
return result;
if (NULL != (result =
PanSliderHandle::HitTest(event, rect, pProject, track)).handle)
PanSliderHandle::HitTest(event, rect, pProject, track.get())).handle)
return result;
}
}

View File

@ -559,7 +559,7 @@ WaveTrackVZoomHandle::~WaveTrackVZoomHandle()
UIHandle::Result WaveTrackVZoomHandle::Click
(const TrackPanelMouseEvent &evt, AudacityProject *)
{
mpTrack = Track::Pointer<WaveTrack>(
mpTrack = std::static_pointer_cast<WaveTrack>(
static_cast<WaveTrackVRulerControls*>(evt.pCell)->FindTrack() );
mRect = evt.rect;
@ -674,13 +674,13 @@ unsigned WaveTrackVRulerControls::HandleWheelRotation
// is a narrow enough target.
evt.event.Skip(false);
Track *const pTrack = FindTrack();
const auto pTrack = FindTrack();
if (!pTrack)
return RefreshNone;
wxASSERT(pTrack->GetKind() == Track::Wave);
auto steps = evt.steps;
WaveTrack *const wt = static_cast<WaveTrack*>(pTrack);
const auto wt = static_cast<WaveTrack*>(pTrack.get());
// Assume linked track is wave or null
const auto partner = static_cast<WaveTrack*>(wt->GetLink());
const bool isDB =

View File

@ -102,8 +102,8 @@ HitTestResult BackgroundCell::HitTest
return BackgroundHandle::HitAnywhere();
}
Track *BackgroundCell::FindTrack()
std::shared_ptr<Track> BackgroundCell::FindTrack()
{
return nullptr;
return {};
}

View File

@ -29,7 +29,7 @@ protected:
(const TrackPanelMouseEvent &event,
const AudacityProject *) override;
Track *FindTrack() override;
std::shared_ptr<Track> FindTrack() override;
private:
AudacityProject *mpProject;

View File

@ -39,8 +39,7 @@ UIHandle::Result ButtonHandle::Click
(const TrackPanelMouseEvent &evt, AudacityProject *)
{
using namespace RefreshCode;
auto pTrack = Track::Pointer(
static_cast<TrackControls*>(evt.pCell)->FindTrack() );
auto pTrack = static_cast<TrackControls*>(evt.pCell)->FindTrack();
if ( !pTrack )
return Cancelled;

View File

@ -12,6 +12,7 @@ Paul Licameli split from TrackPanel.cpp
#define __AUDACITY_COMMON_TRACK_PANEL_CELL__
#include "../../TrackPanelCell.h"
#include "../../MemoryX.h"
#include <stdlib.h>
class Track;
@ -26,7 +27,7 @@ public:
virtual ~CommonTrackPanelCell() = 0;
virtual Track *FindTrack() = 0;
virtual std::shared_ptr<Track> FindTrack() = 0;
protected:
unsigned HandleWheelRotation

View File

@ -818,7 +818,7 @@ UIHandle::Result SelectHandle::Drag
static_cast<CommonTrackPanelCell*>(evt.pCell)->FindTrack() ) {
// Handle which tracks are selected
Track *sTrack = pTrack.get();
Track *eTrack = clickedTrack;
Track *eTrack = clickedTrack.get();
auto trackList = pProject->GetTracks();
auto pMixerBoard = pProject->GetMixerBoard();
if ( sTrack && eTrack && !event.ControlDown() ) {
@ -841,7 +841,7 @@ UIHandle::Result SelectHandle::Drag
viewInfo, y, mRect.y, mRect.height);
#endif
AdjustSelection(viewInfo, x, mRect.x, clickedTrack);
AdjustSelection(viewInfo, x, mRect.x, clickedTrack.get());
}
return RefreshNone

View File

@ -501,7 +501,7 @@ UIHandle::Result TimeShiftHandle::Drag
// Uncommenting this permits drag to continue to work even over the controls area
/*
pTrack = static_cast<CommonTrackPanelCell*>(evt.pCell)->FindTrack();
pTrack = static_cast<CommonTrackPanelCell*>(evt.pCell)->FindTrack().get();
*/
if (!pTrack) {

View File

@ -32,9 +32,9 @@ TrackControls::~TrackControls()
{
}
Track *TrackControls::FindTrack()
std::shared_ptr<Track> TrackControls::FindTrack()
{
return mwTrack.lock().get();
return mwTrack.lock();
}
HitTestResult TrackControls::HitTest
@ -206,12 +206,12 @@ unsigned TrackControls::DoContextMenu
if (!track)
return RefreshCode::RefreshNone;
InitMenuData data{ track, pParent, RefreshCode::RefreshNone };
InitMenuData data{ track.get(), pParent, RefreshCode::RefreshNone };
const auto pTable = &TrackMenuTable::Instance();
auto pMenu = PopupMenuTable::BuildMenu(pParent, pTable, &data);
PopupMenuTable *const pExtension = GetMenuExtension(track);
PopupMenuTable *const pExtension = GetMenuExtension(track.get());
if (pExtension)
pMenu->Extend(pExtension);

View File

@ -25,7 +25,7 @@ public:
virtual ~TrackControls() = 0;
Track *FindTrack() override;
std::shared_ptr<Track> FindTrack() override;
// This is passed to the InitMenu() methods of the PopupMenuTable
// objects returned by GetMenuExtension:

View File

@ -95,7 +95,7 @@ UIHandle::Result TrackSelectHandle::Click
return Cancelled;
TrackControls *const pControls = static_cast<TrackControls*>(evt.pCell);
Track *const pTrack = pControls->FindTrack();
const auto pTrack = pControls->FindTrack();
if (!pTrack)
return Cancelled;
TrackPanel *const trackPanel = pProject->GetTrackPanel();
@ -110,12 +110,12 @@ UIHandle::Result TrackSelectHandle::Click
result |= Cancelled;
else {
mRearrangeCount = 0;
mpTrack = pTrack;
mpTrack = pTrack.get();
CalculateRearrangingThresholds(event);
}
pProject->HandleListSelection
(pTrack, event.ShiftDown(), event.ControlDown(), !unsafe);
(pTrack.get(), event.ShiftDown(), event.ControlDown(), !unsafe);
return result;
}

View File

@ -27,9 +27,9 @@ TrackVRulerControls::~TrackVRulerControls()
{
}
Track *TrackVRulerControls::FindTrack()
std::shared_ptr<Track> TrackVRulerControls::FindTrack()
{
return mwTrack.lock().get();
return mwTrack.lock();
}
HitTestResult TrackVRulerControls::HitTest

View File

@ -25,7 +25,7 @@ public:
virtual ~TrackVRulerControls() = 0;
Track *FindTrack() override;
std::shared_ptr<Track> FindTrack() override;
// Define a default hit test method, just for message and cursor
HitTestResult HitTest