93#include "../images/Cursors.h"
98#include <wx/dcclient.h>
99#include <wx/graphics.h>
170template <
class A,
class B,
class DIST >
bool within(
A a, B b, DIST d)
172 return (a > b - d) && (a < b + d);
189std::unique_ptr<wxCursor>
MakeCursor(
int WXUNUSED(CursorId), const
char * const pXpm[36],
int HotX,
int HotY )
191#define CURSORS_SIZE32
193 const int HotAdjust =0;
195 const int HotAdjust =8;
199 Image.SetMaskColour(255,0,0);
202 Image.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X, HotX-HotAdjust );
203 Image.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y, HotY-HotAdjust );
204 return std::make_unique<wxCursor>( Image );
210AttachedWindows::RegisteredFactory
sKey{
215 auto mainPage = window.GetTrackListWindow();
216 wxASSERT( mainPage );
220 window.NextWindowID(),
223 tracks.shared_from_this(),
248 pPanel->wxWindow::Destroy();
255#pragma warning( disable: 4355 )
260 const std::shared_ptr<TrackList> &
tracks,
265 wxWANTS_CHARS | wxNO_BORDER),
268 mTrackArtist(nullptr),
269 mRefreshBacking(false)
271#pragma warning( default: 4355 )
274 SetLayoutDirection(wxLayout_LeftToRight);
277 SetBackgroundStyle(wxBG_STYLE_PAINT);
279#if wxUSE_ACCESSIBILITY
283 weakThis = wxWeakRef<TrackPanel>{
this }
284 ] (
const Track &track) -> wxRect {
286 return weakThis->FindTrackRect(&track);
294 viewport.weak_from_this(), focus.weak_from_this(),
finder });
295 focus.SetCallbacks(std::make_unique<TrackPanelAx::Adapter>(pAx));
310 switch (event.
mType) {
311 case TrackListEvent::RESIZING:
312 case TrackListEvent::ADDITION:
313 OnTrackListResizing(event); break;
314 case TrackListEvent::DELETION:
315 OnTrackListDeletion(); break;
337 if (
auto pTrack =
dynamic_cast<Track *
>(msg.
group))
374 auto window = GetParent();
376 while(window !=
nullptr)
378 if(
const auto projectWindow =
dynamic_cast<ProjectWindow*
>(window))
379 return projectWindow->FindProject().get();
381 window = window->GetParent();
389 const auto &
size = evt.GetSize();
398 if (IsShownOnScreen())
432 projectAudioManager.Stop(!gAudioIO->IsStreamActive());
437 if (projectAudioIO.GetAudioIOToken()>0 &&
438 !gAudioIO->IsAudioTokenActive(projectAudioIO.GetAudioIOToken()))
440 projectAudioIO.SetAudioIOToken(0);
448 window.GetPlaybackScroller().OnTimer();
500 wxRect box = GetUpdateRegion().GetBox();
527 dc.DestroyClippingRegion();
553 const auto panel =
this;
554 auto pLatestTrack =
FindTrack( pLatestCell ).get();
559 std::weak_ptr<Track>{
FindTrack( pClickedCell ) }
572 panel->UpdateViewIfNoTracks();
574 if (pLatestTrack == pClickedTrack)
575 pLatestTrack =
nullptr;
576 pClickedTrack =
nullptr;
580 panel->UpdateVRuler(pClickedTrack);
583 panel->DrawOverlays(
false);
589 const bool refreshAll =
591 || ((refreshResult &
RefreshCell) && !pClickedTrack)
595 panel->Refresh(
false);
598 panel->RefreshTrack(pClickedTrack);
600 panel->RefreshTrack(pLatestTrack);
604 panel->MakeParentRedrawScrollbars();
606 if (refreshResult &
Resize)
611 focus.Set(pClickedTrack);
612 if (
const auto pFocus = focus.Get())
640 status.
Join(
XO(
"(Esc to cancel)"),
" " );
689 if( t && t->HasOwner() )
714 switch (event.GetKeyCode())
734 if (event.LeftDown()) {
745 if (event.ButtonUp()) {
748 const auto foundCell =
FindCell(event.m_x, event.m_y);
749 const auto t =
FindTrack( foundCell.pCell.get() );
786 const auto width = GetRect().GetWidth()
789 wxRect rect(left, top, width, height);
814 if( !rect || ( *rect == GetRect() ) )
818 wxWindow::Refresh(eraseBackground, rect);
840 wxRegion region = GetUpdateRegion();
842 const wxRect clip = GetRect();
856 bool bMultiToolDown =
862 bool sliderFlag = bMultiToolDown;
863 bool brushFlag =
false;
864#ifdef EXPERIMENTAL_BRUSH_TOOL
865 brushFlag = (ToolCodes::brushTool ==
settings.GetTool());
871 &pendingTracks.SubstitutePendingChangedTrack(*pt));
885(
const std::shared_ptr< CommonTrackPanelCell > &pCell)
899 assert(!channels.empty());
902 int nAffordances = 0;
904 std::vector<int> oldHeights;
905 for (
auto pChannel : channels) {
907 const auto height = view.GetHeight();
908 totalHeight += height;
909 oldHeights.push_back(height);
910 if (view.GetAffordanceControls())
915 auto nChannels =
static_cast<int>(oldHeights.size());
916 std::vector<int> results;
917 results.reserve(nChannels);
921 auto availableHeight = totalHeight
925 int cumulativeOldHeight = 0;
926 int cumulativeNewHeight = 0;
927 for (
const auto &oldHeight : oldHeights) {
929 cumulativeOldHeight += oldHeight;
930 const auto newHeight =
931 cumulativeOldHeight * availableHeight / totalHeight
932 - cumulativeNewHeight;
933 cumulativeNewHeight += newHeight;
934 results.push_back(newHeight);
943 for (
auto t :
GetTracks()->Any<WaveTrack>())
966 auto pHeight = heights.begin();
967 for (
auto pChannel : t.
Channels()) {
969 const auto height = *pHeight++;
970 rect.SetHeight(height);
971 const auto subViews = view.GetSubViews(rect);
972 if (subViews.empty())
975 auto iter = subViews.begin(),
end = subViews.end(), next = iter;
976 auto yy = iter->first;
977 wxSize vRulerSize{ 0, 0 };
978 auto &
size = view.vrulerSize;
979 for (; iter !=
end; iter = next) {
981 auto nextY = (next ==
end)
984 rect.SetHeight(nextY - yy);
988 vRulerSize.IncTo({
size.first,
size.second });
991 size = { vRulerSize.x, vRulerSize.y };
1001 for (
auto t : trackRange)
1002 for (
auto pChannel : t->Channels()) {
1004 s.IncTo({ size.first, size.second });
1051 wxDC &dc,
const Channel &channel, wxCoord *pW, wxCoord *pH)
1053 wxFont labelFont(12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
1054 dc.SetFont(labelFont);
1055 dc.GetTextExtent(
GetTrack(channel).GetName(), pW, pH);
1060 const wxRect &trackRect, wxCoord textWidth, wxCoord textHeight )
1110 virtual std::shared_ptr< Track >
DoFindTrack()
override {
return {}; }
1113 static auto instance = std::make_shared< EmptyCell >();
1120 const wxRect &rect,
unsigned iPass )
override
1124 auto dc = &context.
dc;
1127 dc->DrawRectangle( rect );
1135 const std::shared_ptr<ChannelView> &pView, wxCoord leftOffset)
1136 : mpView{ pView }, mLeftOffset{ leftOffset } {}
1142 { mLeftOffset, mpView }
1153 const std::shared_ptr<Channel> &pChannel,
1155 : mpChannel{ pChannel }
1156 , mRefinement{
std::move( refinement ) }
1157 , mLeftOffset{ leftOffset } {}
1161 auto y1 = rect.GetTop();
1162 for (
const auto &subView : mRefinement ) {
1163 y1 = std::max( y1, subView.first );
1164 refinement.emplace_back( y1,
1165 std::make_shared< VRulerAndChannel >(
1166 subView.second, mLeftOffset ) );
1168 return { Axis::Y, std::move( refinement ) };
1174 const wxRect &rect,
unsigned iPass )
override
1180 if (mRefinement.size() > 1) {
1182 auto &dc = context.
dc;
1184 auto iter = mRefinement.begin() + 1,
end = mRefinement.end();
1185 for ( ; iter !=
end; ++iter ) {
1186 auto yy = iter->first;
1187 AColor::Line( dc, mLeftOffset, yy, rect.GetRight(), yy );
1195 const wxRect &rect,
const wxRect &panelRect,
unsigned iPass )
override
1200 wxCoord textWidth, textHeight;
1225 const std::shared_ptr<Channel>& pChannel,
int fillBrushName
1226 ) : mpChannel{ pChannel }, mFillBrushName{ fillBrushName }
1233 const wxRect& rect,
unsigned iPass)
override
1237 context.
dc.SetPen(*wxTRANSPARENT_PEN);
1239 context.
dc.DrawRectangle(rect);
1240 wxRect bevel(rect.x, rect.y, rect.width - 1, rect.height - 1);
1247 return GetTrack(*mpChannel).shared_from_this();
1263 : mRefinement(
std::move(refinement))
1269 return { Axis::X, mRefinement };
1280 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1286 const auto channels = mpTrack->Channels();
1287 const auto pLast = *channels.rbegin();
1288 wxCoord yy = rect.GetTop();
1290 auto pHeight = heights.begin();
1291 for (
auto pChannel : channels) {
1293 if (
auto affordance = view.GetAffordanceControls()) {
1294 auto panelRect = std::make_shared<EmptyPanelRect>(pChannel,
1295 mpTrack->GetSelected()
1296 ? clrTrackInfoSelected : clrTrackInfo);
1298 std::make_pair(rect.GetLeft() + 1, panelRect),
1299 std::make_pair(mLeftOffset, affordance)
1302 .emplace_back(yy, std::make_shared<HorizontalGroup>(hgroup));
1306 auto height = *pHeight++;
1309 refinement.emplace_back(yy,
1310 std::make_shared<VRulersAndChannels>(pChannel,
1313 if (pChannel != pLast) {
1315 refinement.emplace_back(
1318 .shared_from_this());
1322 return { Axis::Y, std::move(refinement) };
1326 const wxRect& rect,
unsigned iPass)
override
1330 const auto channels = mpTrack->Channels();
1331 const auto pLast = *channels.rbegin();
1332 wxCoord yy = rect.GetTop();
1334 auto pHeight = heights.begin();
1335 for (
auto pChannel : channels) {
1337 auto height = *pHeight++;
1338 if (
auto affordance = view.GetAffordanceControls())
1340 auto trackRect = wxRect(
1343 rect.GetRight() - mLeftOffset,
1359 const std::shared_ptr<Track> &pTrack, wxCoord leftOffset)
1360 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1366 std::make_shared<ChannelStack>(mpTrack, mLeftOffset) }
1371 const wxRect &rect,
unsigned iPass)
override
1374 auto &dc = context.
dc;
1375 dc.SetBrush(*wxTRANSPARENT_BRUSH);
1376 dc.SetPen(*wxBLACK_PEN);
1387 const auto right = rect.GetRight();
1388 const auto bottom = rect.GetBottom();
1403 auto &trackPanel = *artist->parent;
1405 if (trackFocus.Get() == mpTrack.get() &&
1408 wxRect theRect = rect;
1409 auto &dc = context.
dc;
1410 dc.SetBrush(*wxTRANSPARENT_BRUSH);
1413 dc.DrawRectangle(theRect);
1417 dc.DrawRectangle(theRect);
1421 dc.DrawRectangle(theRect);
1427 const wxRect &rect,
const wxRect &,
unsigned iPass)
override
1457 const std::shared_ptr<Track> &pTrack, wxCoord leftOffset)
1458 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1462 std::make_shared<LabeledChannelGroup>(mpTrack, mLeftOffset) },
1465 **mpTrack->Channels().rbegin()).shared_from_this()
1477 const auto &viewInfo = *mPanel.GetViewInfo();
1478 wxCoord yy = -viewInfo.vpos;
1481 auto &
tracks = *mPanel.GetTracks();
1483 refinement.emplace_back( yy, EmptyCell::Instance() ),
1486 for (
const auto pTrack :
tracks) {
1488 for (
auto pChannel : pTrack->Channels()) {
1490 height += view.GetHeight();
1492 refinement.emplace_back( yy,
1493 std::make_shared<ResizingChannelGroup>(
1494 pTrack->SharedPointer(), viewInfo.GetLeftOffset())
1499 refinement.emplace_back(std::max(0, yy), mPanel.GetBackgroundCell());
1501 return { Axis::Y, std::move(refinement) };
1511 { 0, EmptyCell::Instance() },
1512 {
kLeftMargin, std::make_shared<Subgroup>(mPanel) },
1513 { rect.GetRight() + 1 -
kRightMargin, EmptyCell::Instance() }
1526 return std::make_shared< MainGroup >( *
this );
1535 if (
auto pGroup =
dynamic_cast<const LabeledChannelGroup*
>( &node ))
1536 return pGroup->mpTrack.get() == target;
1544 if (rect != wxRect{}) {
1549 GetClientSize(&rect.width,
nullptr);
1561 rect.Inflate( 0, dy );
1571 std::vector<wxRect> results;
1574 if (
auto pView = pRuler->GetChannelView())
1575 if (pView->FindChannel().get() == &target)
1576 results.push_back(rect);
1593 trackFocus.Set(trackFocus.Get());
AUDACITY_DLL_API void SetProjectPanel(AudacityProject &project, wxWindow &panel)
AUDACITY_DLL_API wxFrame & GetProjectFrame(AudacityProject &project)
Get the top-level window associated with the project (as a wxFrame only, when you do not need to use ...
AUDACITY_DLL_API AttachedWindows & GetAttachedWindows(AudacityProject &project)
accessors for certain important windows associated with each project
constexpr auto kTimerInterval
static Settings & settings()
std::unique_ptr< wxCursor > MakeCursor(int WXUNUSED(CursorId), const char *const pXpm[36], int HotX, int HotY)
bool within(A a, B b, DIST d)
@ kTrackSeparatorThickness
@ kChannelSeparatorThickness
static void Line(wxDC &dc, wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
static void CursorColor(wxDC *dc)
static void TrackFocusPen(wxDC *dc, int level)
static void BevelTrackInfo(wxDC &dc, bool up, const wxRect &r, bool highlight=false)
static void TrackPanelBackground(wxDC *dc, bool selected)
static void UseThemeColour(wxDC *dc, int iBrush, int iPen=-1, int alpha=255)
This is an Audacity Specific ruler panel which additionally has border, selection markers,...
void Refresh(bool eraseBackground=true, const wxRect *rect=(const wxRect *) NULL) override
void SetLeftOffset(int offset)
static AdornedRulerPanel & Get(AudacityProject &project)
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
wxDC & GetBackingDCForRepaint()
void DisplayBitmap(wxDC &dc)
void RepairBitmap(wxDC &dc, wxCoord x, wxCoord y, wxCoord width, wxCoord height)
Formerly part of TrackPanel, this abstract base class has no special knowledge of Track objects and i...
void Draw(TrackPanelDrawingContext &context, unsigned nPasses)
void VisitCells(const SimpleCellVisitor &visitor)
FoundCell FindCell(int mouseX, int mouseY)
wxRect FindRect(const TrackPanelCell &cell)
wxMouseState mLastMouseState
void DoContextMenu(std::shared_ptr< TrackPanelCell > pCell)
wxCoord MostRecentXCoord() const
void HandleCursorForPresentMouseState(bool doHit=true)
IteratorRange< ChannelIterator< ChannelType > > Channels()
Get range of channels with mutative access.
std::shared_ptr< ChannelType > GetChannel(size_t iChannel)
Retrieve a channel, cast to the given type.
ChannelGroup & GetChannelGroup()
Channel object's lifetime is assumed to be nested in its Track's.
static ChannelVRulerControls & Get(ChannelView &)
virtual void UpdateRuler(const wxRect &rect)=0
static ChannelView & Get(Channel &channel)
std::vector< std::pair< wxCoord, std::shared_ptr< ChannelView > > > Refinement
virtual Refinement GetSubViews(const wxRect &rect)
std::pair< int, int > vrulerSize
static int GetChannelGroupHeight(const Track *pTrack)
Subclass * Find(const RegisteredFactory &key)
Get a (bare) pointer to an attachment, or null, down-cast it to Subclass *; will not create on demand...
Subclass & Get(const RegisteredFactory &key)
Get reference to an attachment, creating on demand if not present, down-cast it to Subclass.
void Assign(const RegisteredFactory &key, ReplacementPointer &&replacement)
Reassign Site's pointer to ClientData.
@ TrackPanel
Full repaint time of the TrackPanel.
static Stopwatch CreateStopwatch(SectionID section) noexcept
Create a Stopwatch for the section specified.
Subscription Subscribe(Callback callback)
Connect a callback to the Publisher; later-connected are called earlier.
void DrawOverlays(bool repaint_all, wxDC *pDC=nullptr)
static PendingTracks & Get(AudacityProject &project)
void UpdatePendingTracks()
AudioTrack subclass that can also be audibly replayed by the program.
bool IsAudioActive() const
static ProjectAudioIO & Get(AudacityProject &project)
static ProjectAudioManager & Get(AudacityProject &project)
static ProjectSettings & Get(AudacityProject &project)
static ProjectStatus & Get(AudacityProject &project)
void Set(const TranslatableString &msg, StatusBarField field=MainStatusBarField())
static ProjectTimeRuler & Get(AudacityProject &project)
A top-level window associated with a project, and handling scrollbars and zooming.
static ProjectWindow & Get(AudacityProject &project)
static RealtimeEffectManager & Get(AudacityProject &project)
Defines a selected portion of a project.
static SyncLockState & Get(AudacityProject &project)
static TrackArtist * Get(TrackPanelDrawingContext &)
static TrackControls & Get(Track &track)
static TrackFocus & Get(AudacityProject &project)
Abstract base class for an object holding data associated with points on a time axis.
std::shared_ptr< Subclass > Lock(const std::weak_ptr< Subclass > &wTrack)
auto Any() -> TrackIterRange< TrackType >
static TrackList & Get(AudacityProject &project)
auto Selected() -> TrackIterRange< TrackType >
Helper to TrackPanel to give accessibility.
virtual void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass)
std::pair< Axis, Refinement > Subdivision
std::vector< Child > Refinement
The TrackPanel class coordinates updates and operations on the main part of the screen which contains...
void UpdateVRuler(Track *t)
void UpdatePrefs() override
Observer::Subscription mProjectRulerInvalidatedSubscription
AdornedRulerPanel * mRuler
size_t GetSelectedTrackCount() const
void UpdateViewIfNoTracks()
std::shared_ptr< TrackList > mTracks
double GetMostRecentXPos()
std::shared_ptr< TrackPanelNode > Root() override
void ProcessUIHandleResult(TrackPanelCell *pClickedTrack, TrackPanelCell *pLatestCell, unsigned refreshResult) override
Observer::Subscription mAudioIOSubscription
std::shared_ptr< TrackPanelCell > GetFocusedCell() override
std::shared_ptr< CommonTrackPanelCell > GetBackgroundCell()
AudacityProject * GetProject() const override
void OnSize(wxSizeEvent &)
Observer::Subscription mTrackListSubscription
SelectedRegion mLastDrawnSelectedRegion
void Refresh(bool eraseBackground=true, const wxRect *rect=(const wxRect *) NULL) override
void OnTrackMenu(Track *t=NULL)
const TrackList * GetTracks() const
static TrackPanel & Get(AudacityProject &project)
void OnTrackFocusChange(struct TrackFocusChangeMessage)
void UpdateSelectionDisplay()
Observer::Subscription mRealtimeEffectManagerSubscription
std::shared_ptr< CommonTrackPanelCell > mpBackground
wxRect FindFocusedTrackRect(const Track *target)
Observer::Subscription mSyncLockSubscription
void OnTimer(wxTimerEvent &event)
AS: This gets called on our wx timer events.
void OnKeyDown(wxKeyEvent &event)
void SetFocusedCell() override
void UpdateStatusMessage(const TranslatableString &status) override
static void Destroy(AudacityProject &project)
void OnTrackListDeletion()
wxRect FindTrackRect(const Track *target)
std::vector< wxRect > FindRulerRects(const Channel &target)
void OnMouseEvent(wxMouseEvent &event)
void DrawTracks(wxDC *dc)
void SetBackgroundCell(const std::shared_ptr< CommonTrackPanelCell > &pCell)
TrackPanel::AudacityTimer mTimer
void OnUndoReset(struct UndoRedoMessage)
Observer::Subscription mUndoSubscription
void OnAudioIO(AudioIOEvent)
TrackPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, const std::shared_ptr< TrackList > &tracks, ViewInfo *viewInfo, AudacityProject *project, AdornedRulerPanel *ruler)
void OnSyncLockChange(struct SyncLockChangeMessage)
void MakeParentRedrawScrollbars()
void OnIdle(wxIdleEvent &event)
void OnPaint(wxPaintEvent &event)
Observer::Subscription mFocusChangeSubscription
void RefreshTrack(Track *trk, bool refreshbacking=true)
void UpdateTrackVRuler(Track &t)
std::unique_ptr< TrackArtist > mTrackArtist
Observer::Subscription mSelectionSubscription
void OnTrackListResizing(const TrackListEvent &event)
The TrackPanel is built up of nodes, subtrees of the CellularPanel's area Common base class for Track...
static TrackPanelResizerCell & Get(Channel &channel)
Holds a msgid for the translation catalog; may also bind format arguments.
TranslatableString & Join(TranslatableString arg, const wxString &separator={}) &
Append another translatable string.
static UndoManager & Get(AudacityProject &project)
int vpos
Pixel distance from top of tracks to top of visible scrolled area.
NotifyingSelectedRegion selectedRegion
static ViewInfo & Get(AudacityProject &project)
void SetHeight(int height)
void UpdateScrollbarsForTracks()
void ShowTrack(const Track &track)
void SetHorizontalThumb(double scrollto, bool doScroll=true)
static Viewport & Get(AudacityProject &project)
double PositionToTime(int64 position, int64 origin=0, bool ignoreFisheye=false) const
static double GetDefaultZoom()
double GetScreenEndTime() const
int GetVRulerOffset() const
void SetVRulerWidth(int width)
int GetLeftOffset() const
double hpos
Leftmost visible timeline position in seconds.
void SetZoom(double pixelsPerSecond)
int GetVRulerWidth() const
EmptyPanelRect(const std::shared_ptr< Channel > &pChannel, int fillBrushName)
std::shared_ptr< Track > DoFindTrack() override
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
std::vector< UIHandlePtr > HitTest(const TrackPanelMouseState &state, const AudacityProject *pProject) override
std::shared_ptr< Channel > mpChannel
void SetLabel(const TranslatableString &label)
void SetFocus(const WindowPlacement &focus)
Set the window that accepts keyboard input.
void CallAfter(Action action)
Schedule an action to be done later, and in the main thread.
std::unique_ptr< WindowPlacement > FindFocus()
Find the window that is accepting keyboard input, if any.
void Capture(wxWindow *handler)
Namespace containing an enum 'what to do on a refresh?'.
AUDACITY_DLL_API void DrawCursor(TrackPanelDrawingContext &context, const wxRect &rect, const Track *track)
const Track & GetTrack(const Channel &channel)
AttachedWindows::RegisteredFactory sKey
std::shared_ptr< Track > FindTrack(TrackPanelCell *pCell)
void GetTrackNameExtent(wxDC &dc, const Channel &channel, wxCoord *pW, wxCoord *pH)
wxRect GetTrackNameRect(int leftOffset, const wxRect &trackRect, wxCoord textWidth, wxCoord textHeight)
std::vector< int > FindAdjustedChannelHeights(Track &t)
const char * end(const char *str) noexcept
enum AudioIOEvent::Type type
Posted when effect is being added or removed to/from channel group or project.
ChannelGroup * group
null, if changes happened in the project scope
Sent after sync lock setting changes, with its new state.
bool focusPanel
whether to focus the window that shows tracks
Notification of changes in individual tracks of TrackList, or of TrackList's composition.
const std::weak_ptr< Track > mpTrack
Type of message published by UndoManager.
enum UndoRedoMessage::Type type
const std::shared_ptr< Track > mpTrack
ChannelStack(const std::shared_ptr< Track > &pTrack, wxCoord leftOffset)
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
Subdivision Children(const wxRect &rect_) override
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
static std::shared_ptr< EmptyCell > Instance()
virtual std::shared_ptr< Track > DoFindTrack() override
std::vector< UIHandlePtr > HitTest(const TrackPanelMouseState &, const AudacityProject *) override
HorizontalGroup(Refinement refinement)
Subdivision Children(const wxRect &) override
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
const std::shared_ptr< Track > mpTrack
LabeledChannelGroup(const std::shared_ptr< Track > &pTrack, wxCoord leftOffset)
Subdivision Children(const wxRect &rect) override
wxRect DrawingArea(TrackPanelDrawingContext &, const wxRect &rect, const wxRect &, unsigned iPass) override
MainGroup(TrackPanel &panel)
Subdivision Children(const wxRect &rect) override
ResizingChannelGroup(const std::shared_ptr< Track > &pTrack, wxCoord leftOffset)
const std::shared_ptr< Track > mpTrack
Subdivision Children(const wxRect &rect) override
Subdivision Children(const wxRect &rect) override
Subgroup(TrackPanel &panel)
Subdivision Children(const wxRect &rect) override
VRulerAndChannel(const std::shared_ptr< ChannelView > &pView, wxCoord leftOffset)
std::shared_ptr< ChannelView > mpView
wxRect DrawingArea(TrackPanelDrawingContext &context, const wxRect &rect, const wxRect &panelRect, unsigned iPass) override
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
ChannelView::Refinement mRefinement
VRulersAndChannels(const std::shared_ptr< Channel > &pChannel, ChannelView::Refinement refinement, wxCoord leftOffset)
Subdivision Children(const wxRect &rect) override
std::shared_ptr< Channel > mpChannel