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;
1188 AColor::Line( dc, mLeftOffset, yy, rect.GetRight(), yy );
1205 : mRefinement(
std::move(refinement))
1211 return { Axis::X, mRefinement };
1222 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1228 const auto channels = mpTrack->Channels();
1229 const auto pLast = *channels.rbegin();
1230 wxCoord yy = rect.GetTop();
1232 auto pHeight = heights.begin();
1233 for (
auto pChannel : channels) {
1235 if (
auto affordance = view.GetAffordanceControls()) {
1237 std::make_pair(mLeftOffset, affordance)
1240 .emplace_back(yy, std::make_shared<HorizontalGroup>(hgroup));
1244 auto height = *pHeight++;
1247 refinement.emplace_back(yy,
1248 std::make_shared<VRulersAndChannels>(pChannel,
1251 if (pChannel != pLast) {
1253 refinement.emplace_back(
1256 .shared_from_this());
1260 return { Axis::Y, std::move(refinement) };
1264 const wxRect& rect,
unsigned iPass)
override
1269 auto vRulerRect = rect;
1270 vRulerRect.width = mLeftOffset - rect.x;
1272 auto dc = &context.
dc;
1276 dc->DrawRectangle( vRulerRect );
1278 const auto channels = mpTrack->Channels();
1280 if(
auto affordance = view.GetAffordanceControls())
1284 AColor::Line( *dc, vRulerRect.GetLeft(), yy, vRulerRect.GetRight(), yy );
1288 dc->SetPen(*wxBLACK_PEN);
1290 AColor::Line( *dc, vRulerRect.GetLeftTop(), vRulerRect.GetLeftBottom() );
1291 AColor::Line( *dc, vRulerRect.GetRightTop(), vRulerRect.GetRightBottom() );
1294 const auto channels = mpTrack->Channels();
1295 const auto pLast = *channels.rbegin();
1296 wxCoord yy = rect.GetTop();
1298 auto pHeight = heights.begin();
1299 for (
auto pChannel : channels) {
1301 auto height = *pHeight++;
1302 if (
auto affordance = view.GetAffordanceControls())
1304 auto trackRect = wxRect(
1307 rect.GetRight() - mLeftOffset,
1323 const std::shared_ptr<Track> &pTrack, wxCoord leftOffset)
1324 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1330 std::make_shared<ChannelStack>(mpTrack, mLeftOffset) }
1335 const wxRect &rect,
unsigned iPass)
override
1338 auto &dc = context.
dc;
1339 dc.SetBrush(*wxTRANSPARENT_BRUSH);
1340 dc.SetPen(*wxBLACK_PEN);
1353 const auto right = rect.GetRight();
1354 const auto bottom = rect.GetBottom();
1370 auto &trackPanel = *artist->parent;
1372 if (trackFocus.Get() == mpTrack.get() &&
1375 wxRect theRect = rect;
1376 auto &dc = context.
dc;
1377 dc.SetBrush(*wxTRANSPARENT_BRUSH);
1380 dc.DrawRectangle(theRect);
1384 dc.DrawRectangle(theRect);
1388 dc.DrawRectangle(theRect);
1394 const wxRect &rect,
const wxRect &,
unsigned iPass)
override
1424 const std::shared_ptr<Track> &pTrack, wxCoord leftOffset)
1425 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1429 std::make_shared<LabeledChannelGroup>(mpTrack, mLeftOffset) },
1432 **mpTrack->Channels().rbegin()).shared_from_this()
1444 const auto &viewInfo = *mPanel.GetViewInfo();
1445 wxCoord yy = -viewInfo.vpos;
1448 auto &
tracks = *mPanel.GetTracks();
1450 refinement.emplace_back( yy, EmptyCell::Instance() ),
1453 for (
const auto pTrack :
tracks) {
1455 for (
auto pChannel : pTrack->Channels()) {
1457 height += view.GetHeight();
1459 refinement.emplace_back( yy,
1460 std::make_shared<ResizingChannelGroup>(
1461 pTrack->SharedPointer(), viewInfo.GetLeftOffset())
1466 refinement.emplace_back(std::max(0, yy), mPanel.GetBackgroundCell());
1468 return { Axis::Y, std::move(refinement) };
1478 { 0, EmptyCell::Instance() },
1479 {
kLeftMargin, std::make_shared<Subgroup>(mPanel) },
1480 { rect.GetRight() + 1 -
kRightMargin, EmptyCell::Instance() }
1493 return std::make_shared< MainGroup >( *
this );
1502 if (
auto pGroup =
dynamic_cast<const LabeledChannelGroup*
>( &node ))
1503 return pGroup->mpTrack.get() == target;
1511 if (rect != wxRect{}) {
1516 GetClientSize(&rect.width,
nullptr);
1528 rect.Inflate( 0, dy );
1538 std::vector<wxRect> results;
1541 if (
auto pView = pRuler->GetChannelView())
1542 if (pView->FindChannel().get() == &target)
1543 results.push_back(rect);
1560 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 MediumTrackInfo(wxDC *dc, bool selected)
static void Dark(wxDC *dc, bool selected, bool highlight=false)
static void TrackFocusPen(wxDC *dc, int level)
static void TrackPanelBackground(wxDC *dc, bool selected)
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
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
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