Associate View object with Track, analogous with controls

This commit is contained in:
Paul Licameli 2018-11-07 18:16:22 -05:00
parent 18ba27a641
commit 059d7eaa42
16 changed files with 251 additions and 0 deletions

View File

@ -319,8 +319,10 @@ private:
std::weak_ptr<LabelTextHandle> mTextHandle;
protected:
std::shared_ptr<TrackView> DoGetView() override;
std::shared_ptr<TrackControls> DoGetControls() override;
std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override;
friend class GetInfoCommand; // to get labels.
friend class SetLabelCommand; // to set labels.
};

View File

@ -226,6 +226,7 @@ class AUDACITY_DLL_API NoteTrack final
std::weak_ptr<StretchHandle> mStretchHandle;
protected:
std::shared_ptr<TrackView> DoGetView() override;
std::shared_ptr<TrackControls> DoGetControls() override;
std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override;
};

View File

@ -123,6 +123,7 @@ class TimeTrack final : public Track {
friend class TrackFactory;
protected:
std::shared_ptr<TrackView> DoGetView() override;
std::shared_ptr<TrackControls> DoGetControls() override;
std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override;
};

View File

@ -37,6 +37,7 @@ class PlayableTrack;
class LabelTrack;
class TimeTrack;
class TrackControls;
class TrackView;
class TrackVRulerControls;
class TrackPanelResizerCell;
class WaveTrack;
@ -285,6 +286,11 @@ class AUDACITY_DLL_API Track /* not final */
mutable wxSize vrulerSize;
// Return another, associated TrackPanelCell object that implements
// click and drag and keystrokes in the track contents.
std::shared_ptr<TrackView> GetTrackView();
std::shared_ptr<const TrackView> GetTrackView() const;
// Return another, associated TrackPanelCell object that implements the
// drop-down, close and minimize buttons, etc.
std::shared_ptr<TrackPanelCell> GetTrackControls();
@ -752,10 +758,12 @@ protected:
std::shared_ptr<Track> DoFindTrack() override;
// These are called to create controls on demand:
virtual std::shared_ptr<TrackView> DoGetView() = 0;
virtual std::shared_ptr<TrackControls> DoGetControls() = 0;
virtual std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() = 0;
// These hold the controls:
std::shared_ptr<TrackView> mpView;
std::shared_ptr<TrackControls> mpControls;
std::shared_ptr<TrackVRulerControls> mpVRulerContols;
std::shared_ptr<TrackPanelResizerCell> mpResizer;

View File

@ -699,6 +699,7 @@ private:
std::weak_ptr<EnvelopeHandle> mEnvelopeHandle;
protected:
std::shared_ptr<TrackView> DoGetView() override;
std::shared_ptr<TrackControls> DoGetControls() override;
std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override;
};

View File

@ -8,6 +8,7 @@ Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "LabelTrackView.h"
#include "../../../LabelTrack.h"
#include "LabelTrackControls.h"
@ -18,6 +19,10 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../HitTestResult.h"
#include "../../../TrackPanelMouseEvent.h"
LabelTrackView::~LabelTrackView()
{
}
std::vector<UIHandlePtr> LabelTrack::DetailedHitTest
(const TrackPanelMouseState &st,
const AudacityProject *WXUNUSED(pProject), int, bool)
@ -39,6 +44,11 @@ std::vector<UIHandlePtr> LabelTrack::DetailedHitTest
return results;
}
std::shared_ptr<TrackView> LabelTrack::DoGetView()
{
return std::make_shared<LabelTrackView>( SharedPointer() );
}
std::shared_ptr<TrackControls> LabelTrack::DoGetControls()
{
return std::make_shared<LabelTrackControls>( SharedPointer() );

View File

@ -0,0 +1,28 @@
/**********************************************************************
Audacity: A Digital Audio Editor
LabelTrackView.h
Paul Licameli split from class LabelTrack
**********************************************************************/
#ifndef __AUDACITY_LABEL_TRACK_VIEW__
#define __AUDACITY_LABEL_TRACK_VIEW__
#include "../../ui/TrackView.h"
class LabelTrackView final : public TrackView
{
LabelTrackView( const LabelTrackView& ) = delete;
LabelTrackView &operator=( const LabelTrackView& ) = delete;
public:
explicit
LabelTrackView( const std::shared_ptr<Track> &pTrack )
: TrackView{ pTrack } {}
~LabelTrackView() override;
};
#endif

View File

@ -9,6 +9,8 @@ Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../../Audacity.h" // for USE_* macros
#include "NoteTrackView.h"
#ifdef USE_MIDI
#include "../../../../NoteTrack.h"
@ -22,6 +24,10 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../ui/SelectHandle.h"
#include "StretchHandle.h"
NoteTrackView::~NoteTrackView()
{
}
std::vector<UIHandlePtr> NoteTrack::DetailedHitTest
(const TrackPanelMouseState &WXUNUSED(state),
const AudacityProject *WXUNUSED(pProject), int, bool )
@ -41,6 +47,11 @@ std::vector<UIHandlePtr> NoteTrack::DetailedHitTest
return results;
}
std::shared_ptr<TrackView> NoteTrack::DoGetView()
{
return std::make_shared<NoteTrackView>( SharedPointer() );
}
std::shared_ptr<TrackControls> NoteTrack::DoGetControls()
{
return std::make_shared<NoteTrackControls>( SharedPointer() );

View File

@ -0,0 +1,28 @@
/**********************************************************************
Audacity: A Digital Audio Editor
NoteTrackView.h
Paul Licameli split from class NoteTrack
**********************************************************************/
#ifndef __AUDACITY_NOTE_TRACK_VIEW__
#define __AUDACITY_NOTE_TRACK_VIEW__
#include "../../../ui/TrackView.h"
class NoteTrackView final : public TrackView
{
NoteTrackView( const NoteTrackView& ) = delete;
NoteTrackView &operator=( const NoteTrackView& ) = delete;
public:
explicit
NoteTrackView( const std::shared_ptr<Track> &pTrack )
: TrackView{ pTrack } {}
~NoteTrackView() override;
};
#endif

View File

@ -8,6 +8,7 @@ Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "WaveTrackView.h"
#include "../../../../WaveTrack.h"
#include "WaveTrackControls.h"
@ -23,6 +24,10 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../ui/TimeShiftHandle.h"
#include "../../../../ProjectSettings.h"
WaveTrackView::~WaveTrackView()
{
}
std::vector<UIHandlePtr> WaveTrack::DetailedHitTest
(const TrackPanelMouseState &st,
const AudacityProject *pProject, int currentTool, bool bMultiTool)
@ -101,6 +106,11 @@ std::vector<UIHandlePtr> WaveTrack::DetailedHitTest
return results;
}
std::shared_ptr<TrackView> WaveTrack::DoGetView()
{
return std::make_shared<WaveTrackView>( SharedPointer() );
}
std::shared_ptr<TrackControls> WaveTrack::DoGetControls()
{
return std::make_shared<WaveTrackControls>( SharedPointer() );

View File

@ -0,0 +1,28 @@
/**********************************************************************
Audacity: A Digital Audio Editor
WaveTrackView.h
Paul Licameli split from class WaveTrack
**********************************************************************/
#ifndef __AUDACITY_WAVE_TRACK_VIEW__
#define __AUDACITY_WAVE_TRACK_VIEW__
#include "../../../ui/TrackView.h"
class WaveTrackView final : public TrackView
{
WaveTrackView( const WaveTrackView& ) = delete;
WaveTrackView &operator=( const WaveTrackView& ) = delete;
public:
explicit
WaveTrackView( const std::shared_ptr<Track> &pTrack )
: TrackView{ pTrack } {}
~WaveTrackView() override;
};
#endif

View File

@ -8,6 +8,7 @@ Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "TimeTrackView.h"
#include "../../../TimeTrack.h"
#include "TimeTrackControls.h"
@ -18,6 +19,10 @@ Paul Licameli split from TrackPanel.cpp
#include "../../ui/EnvelopeHandle.h"
TimeTrackView::~TimeTrackView()
{
}
std::vector<UIHandlePtr> TimeTrack::DetailedHitTest
(const TrackPanelMouseState &st,
const AudacityProject *pProject, int, bool)
@ -30,6 +35,11 @@ std::vector<UIHandlePtr> TimeTrack::DetailedHitTest
return results;
}
std::shared_ptr<TrackView> TimeTrack::DoGetView()
{
return std::make_shared<TimeTrackView>( SharedPointer() );
}
std::shared_ptr<TrackControls> TimeTrack::DoGetControls()
{
return std::make_shared<TimeTrackControls>( SharedPointer() );

View File

@ -0,0 +1,28 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TimeTrackView.h
Paul Licameli split from class TimeTrack
**********************************************************************/
#ifndef __AUDACITY_TIME_TRACK_VIEW__
#define __AUDACITY_TIME_TRACK_VIEW__
#include "../../ui/TrackView.h"
class TimeTrackView final : public TrackView
{
TimeTrackView( const TimeTrackView& ) = delete;
TimeTrackView &operator=( const TimeTrackView& ) = delete;
public:
explicit
TimeTrackView( const std::shared_ptr<Track> &pTrack )
: TrackView{ pTrack } {}
~TimeTrackView() override;
};
#endif

View File

@ -11,6 +11,7 @@ Paul Licameli split from TrackPanel.cpp
#ifndef __AUDACITY_COMMON_TRACK_PANEL_CELL__
#define __AUDACITY_COMMON_TRACK_PANEL_CELL__
#include "../../Audacity.h"
#include "../../TrackPanelCell.h"
#include <stdlib.h>

View File

@ -8,6 +8,7 @@ Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "TrackView.h"
#include "../../Track.h"
#include "../../TrackPanelMouseEvent.h"
@ -19,6 +20,27 @@ Paul Licameli split from TrackPanel.cpp
#include "BackgroundCell.h"
#include "../../ProjectSettings.h"
TrackView::~TrackView()
{
}
TrackView &TrackView::Get( Track &track )
{
return *track.GetTrackView();
}
const TrackView &TrackView::Get( const Track &track )
{
return *track.GetTrackView();
}
std::vector<UIHandlePtr> TrackView::HitTest
(const TrackPanelMouseState &st,
const AudacityProject *pProject)
{
return {};
}
std::vector<UIHandlePtr> Track::HitTest
(const TrackPanelMouseState &st,
const AudacityProject *pProject)
@ -78,6 +100,24 @@ std::shared_ptr<TrackPanelCell> Track::ContextMenuDelegate()
return TrackControls::Get( *this ).shared_from_this();
}
std::shared_ptr<TrackPanelCell> TrackView::ContextMenuDelegate()
{
return TrackControls::Get( *FindTrack() ).shared_from_this();
}
std::shared_ptr<TrackView> Track::GetTrackView()
{
if (!mpView)
// create on demand
mpView = DoGetView();
return mpView;
}
std::shared_ptr<const TrackView> Track::GetTrackView() const
{
return const_cast<Track*>(this)->GetTrackView();
}
std::shared_ptr<TrackPanelCell> Track::GetTrackControls()
{
if (!mpControls)

View File

@ -0,0 +1,44 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TrackView.h
Paul Licameli split from class Track
**********************************************************************/
#ifndef __AUDACITY_TRACK_VIEW__
#define __AUDACITY_TRACK_VIEW__
#include <memory>
#include "CommonTrackPanelCell.h" // to inherit
class Track;
class TrackView /* not final */ : public CommonTrackCell
{
TrackView( const TrackView& ) = delete;
TrackView &operator=( const TrackView& ) = delete;
public:
explicit
TrackView( const std::shared_ptr<Track> &pTrack )
: CommonTrackCell{ pTrack } {}
virtual ~TrackView() = 0;
static TrackView &Get( Track & );
static const TrackView &Get( const Track & );
std::vector<UIHandlePtr> HitTest
(const TrackPanelMouseState &, const AudacityProject *pProject)
final override;
// Delegates the handling to the related TCP cell
std::shared_ptr<TrackPanelCell> ContextMenuDelegate() override;
protected:
Track *GetTrack() const;
};
#endif