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 )
1072 const Channel &channel,
const wxRect & rect)
1077 const auto &pendingTracks = *artist->pPendingTracks;
1078 auto &track = pendingTracks.SubstitutePendingChangedTrack(
GetTrack(channel));
1079 auto name = track.GetName();
1082 auto &dc = context.
dc;
1084 wxCoord textWidth, textHeight;
1090 const int kOpaqueHeight = 44;
1091 const int kTranslucentHeight = 124;
1098 float f = wxClip((h-kOpaqueHeight)/(
float)(kTranslucentHeight-kOpaqueHeight),0.0,1.0);
1101 const int kOpaque = 255;
1102 const int kTranslucent = 140;
1104 int opacity = 255 - (255-140)*f;
1106 const auto nameRect =
1112 dc.DrawRoundedRectangle( nameRect, 8.0 );
1117 SecondMarginX = 1, SecondMarginY = 1,
1118 SecondMarginsX = 2 * SecondMarginX, SecondMarginsY = 2 * SecondMarginY,
1121 textWidth +
MarginsX + SecondMarginsX,
1122 textHeight +
MarginsY + SecondMarginsY );
1124 unsigned char *alpha=image.GetAlpha();
1125 memset(alpha, wxIMAGE_ALPHA_TRANSPARENT, image.GetWidth()*image.GetHeight());
1128 std::unique_ptr< wxGraphicsContext >
1129 pGc{ wxGraphicsContext::Create(image) };
1134 gc.DrawRoundedRectangle(
1135 SecondMarginX, SecondMarginY,
1139 wxBitmap bitmap( image );
1140 dc.DrawBitmap( bitmap,
1141 nameRect.x - SecondMarginX, nameRect.y - SecondMarginY );
1144 dc.DrawText(track.GetName(),
1189 virtual std::shared_ptr< Track >
DoFindTrack()
override {
return {}; }
1192 static auto instance = std::make_shared< EmptyCell >();
1199 const wxRect &rect,
unsigned iPass )
override
1203 auto dc = &context.
dc;
1206 dc->DrawRectangle( rect );
1214 const std::shared_ptr<ChannelView> &pView, wxCoord leftOffset)
1215 : mpView{ pView }, mLeftOffset{ leftOffset } {}
1221 { mLeftOffset, mpView }
1232 const std::shared_ptr<Channel> &pChannel,
1234 : mpChannel{ pChannel }
1235 , mRefinement{
std::move( refinement ) }
1236 , mLeftOffset{ leftOffset } {}
1240 auto y1 = rect.GetTop();
1241 for (
const auto &subView : mRefinement ) {
1242 y1 = std::max( y1, subView.first );
1243 refinement.emplace_back( y1,
1244 std::make_shared< VRulerAndChannel >(
1245 subView.second, mLeftOffset ) );
1247 return { Axis::Y, std::move( refinement ) };
1253 const wxRect &rect,
unsigned iPass )
override
1261 if (mRefinement.size() > 1) {
1263 auto &dc = context.
dc;
1265 auto iter = mRefinement.begin() + 1,
end = mRefinement.end();
1266 for ( ; iter !=
end; ++iter ) {
1267 auto yy = iter->first;
1268 AColor::Line( dc, mLeftOffset, yy, rect.GetRight(), yy );
1276 const wxRect &rect,
const wxRect &panelRect,
unsigned iPass )
override
1281 wxCoord textWidth, textHeight;
1306 const std::shared_ptr<Channel>& pChannel,
int fillBrushName
1307 ) : mpChannel{ pChannel }, mFillBrushName{ fillBrushName }
1314 const wxRect& rect,
unsigned iPass)
override
1318 context.
dc.SetPen(*wxTRANSPARENT_PEN);
1320 context.
dc.DrawRectangle(rect);
1321 wxRect bevel(rect.x, rect.y, rect.width - 1, rect.height - 1);
1328 return GetTrack(*mpChannel).shared_from_this();
1344 : mRefinement(
std::move(refinement))
1350 return { Axis::X, mRefinement };
1361 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1367 const auto channels = mpTrack->Channels();
1368 const auto pLast = *channels.rbegin();
1369 wxCoord yy = rect.GetTop();
1371 auto pHeight = heights.begin();
1372 for (
auto pChannel : channels) {
1374 if (
auto affordance = view.GetAffordanceControls()) {
1375 auto panelRect = std::make_shared<EmptyPanelRect>(pChannel,
1376 mpTrack->GetSelected()
1377 ? clrTrackInfoSelected : clrTrackInfo);
1379 std::make_pair(rect.GetLeft() + 1, panelRect),
1380 std::make_pair(mLeftOffset, affordance)
1383 .emplace_back(yy, std::make_shared<HorizontalGroup>(hgroup));
1387 auto height = *pHeight++;
1390 refinement.emplace_back(yy,
1391 std::make_shared<VRulersAndChannels>(pChannel,
1394 if (pChannel != pLast) {
1396 refinement.emplace_back(
1399 .shared_from_this());
1403 return { Axis::Y, std::move(refinement) };
1407 const wxRect& rect,
unsigned iPass)
override
1411 const auto channels = mpTrack->Channels();
1412 const auto pLast = *channels.rbegin();
1413 wxCoord yy = rect.GetTop();
1415 auto pHeight = heights.begin();
1416 for (
auto pChannel : channels) {
1418 auto height = *pHeight++;
1419 if (
auto affordance = view.GetAffordanceControls())
1421 auto trackRect = wxRect(
1424 rect.GetRight() - mLeftOffset,
1440 const std::shared_ptr<Track> &pTrack, wxCoord leftOffset)
1441 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1447 std::make_shared<ChannelStack>(mpTrack, mLeftOffset) }
1452 const wxRect &rect,
unsigned iPass)
override
1455 auto &dc = context.
dc;
1456 dc.SetBrush(*wxTRANSPARENT_BRUSH);
1457 dc.SetPen(*wxBLACK_PEN);
1468 const auto right = rect.GetRight();
1469 const auto bottom = rect.GetBottom();
1484 auto &trackPanel = *artist->parent;
1486 if (trackFocus.Get() == mpTrack.get() &&
1489 wxRect theRect = rect;
1490 auto &dc = context.
dc;
1491 dc.SetBrush(*wxTRANSPARENT_BRUSH);
1494 dc.DrawRectangle(theRect);
1498 dc.DrawRectangle(theRect);
1502 dc.DrawRectangle(theRect);
1508 const wxRect &rect,
const wxRect &,
unsigned iPass)
override
1538 const std::shared_ptr<Track> &pTrack, wxCoord leftOffset)
1539 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1543 std::make_shared<LabeledChannelGroup>(mpTrack, mLeftOffset) },
1546 **mpTrack->Channels().rbegin()).shared_from_this()
1558 const auto &viewInfo = *mPanel.GetViewInfo();
1559 wxCoord yy = -viewInfo.vpos;
1562 auto &
tracks = *mPanel.GetTracks();
1564 refinement.emplace_back( yy, EmptyCell::Instance() ),
1567 for (
const auto pTrack :
tracks) {
1569 for (
auto pChannel : pTrack->Channels()) {
1571 height += view.GetHeight();
1573 refinement.emplace_back( yy,
1574 std::make_shared<ResizingChannelGroup>(
1575 pTrack->SharedPointer(), viewInfo.GetLeftOffset())
1580 refinement.emplace_back(std::max(0, yy), mPanel.GetBackgroundCell());
1582 return { Axis::Y, std::move(refinement) };
1592 { 0, EmptyCell::Instance() },
1593 {
kLeftMargin, std::make_shared<Subgroup>(mPanel) },
1594 { rect.GetRight() + 1 -
kRightMargin, EmptyCell::Instance() }
1607 return std::make_shared< MainGroup >( *
this );
1616 if (
auto pGroup =
dynamic_cast<const LabeledChannelGroup*
>( &node ))
1617 return pGroup->mpTrack.get() == target;
1625 if (rect != wxRect{}) {
1630 GetClientSize(&rect.width,
nullptr);
1642 rect.Inflate( 0, dy );
1652 std::vector<wxRect> results;
1655 if (
auto pView = pRuler->GetChannelView())
1656 if (pView->FindChannel().get() == &target)
1657 results.push_back(rect);
1674 trackFocus.Set(trackFocus.Get());
const TranslatableString name
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)
wxColour & Colour(int iIndex)
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)
void DrawTrackName(int leftOffset, TrackPanelDrawingContext &context, const Channel &channel, const wxRect &rect)
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