90#include "../images/Cursors.h"
95#include <wx/dcclient.h>
96#include <wx/graphics.h>
167template <
class A,
class B,
class DIST >
bool within(
A a, B b, DIST d)
169 return (a > b - d) && (a < b + d);
186std::unique_ptr<wxCursor>
MakeCursor(
int WXUNUSED(CursorId), const
char * const pXpm[36],
int HotX,
int HotY )
188#define CURSORS_SIZE32
190 const int HotAdjust =0;
192 const int HotAdjust =8;
196 Image.SetMaskColour(255,0,0);
199 Image.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X, HotX-HotAdjust );
200 Image.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y, HotY-HotAdjust );
201 return std::make_unique<wxCursor>( Image );
207AttachedWindows::RegisteredFactory
sKey{
212 auto mainPage = window.GetTrackListWindow();
213 wxASSERT( mainPage );
217 window.NextWindowID(),
220 tracks.shared_from_this(),
245 pPanel->wxWindow::Destroy();
252#pragma warning( disable: 4355 )
257 const std::shared_ptr<TrackList> &tracks,
262 wxWANTS_CHARS | wxNO_BORDER),
266 mTrackArtist(nullptr),
267 mRefreshBacking(false)
269#pragma warning( default: 4355 )
272 SetLayoutDirection(wxLayout_LeftToRight);
275 SetBackgroundStyle(wxBG_STYLE_PAINT);
278 auto pAx = std::make_unique <TrackPanelAx>( *project );
279 pAx->SetWindow(
this );
280 wxWeakRef< TrackPanel > weakThis{
this };
282 [weakThis](
const Track &track ) -> wxRect {
284 return weakThis->FindTrackRect( &track );
289 *
this, std::move( pAx ) );
303 switch (event.
mType) {
304 case TrackListEvent::RESIZING:
305 case TrackListEvent::ADDITION:
306 OnTrackListResizing(event); break;
307 case TrackListEvent::DELETION:
308 OnTrackListDeletion(); break;
309 case TrackListEvent::TRACK_REQUEST_VISIBLE:
310 OnEnsureVisible(event); break;
364 auto window = GetParent();
366 while(window !=
nullptr)
368 if(
const auto projectWindow =
dynamic_cast<ProjectWindow*
>(window))
369 return projectWindow->FindProject().get();
371 window = window->GetParent();
379 const auto &
size = evt.GetSize();
388 if (IsShownOnScreen())
421 projectAudioManager.Stop(!gAudioIO->IsStreamActive());
426 if (projectAudioIO.GetAudioIOToken()>0 &&
427 !gAudioIO->IsAudioTokenActive(projectAudioIO.GetAudioIOToken()))
429 projectAudioIO.SetAudioIOToken(0);
430 window.RedrawProject();
437 window.GetPlaybackScroller().OnTimer();
483 wxRect box = GetUpdateRegion().GetBox();
510 dc.DestroyClippingRegion();
533 const auto panel =
this;
534 auto pLatestTrack =
FindTrack( pLatestCell ).get();
539 std::weak_ptr<Track>{
FindTrack( pClickedCell ) }
552 panel->UpdateViewIfNoTracks();
554 if (pLatestTrack == pClickedTrack)
556 pClickedTrack = NULL;
560 panel->UpdateVRuler(pClickedTrack);
563 panel->DrawOverlays(
false);
569 const bool refreshAll =
571 || ((refreshResult &
RefreshCell) && !pClickedTrack)
575 panel->Refresh(
false);
578 panel->RefreshTrack(pClickedTrack);
580 panel->RefreshTrack(pLatestTrack);
584 panel->MakeParentRedrawScrollbars();
586 if (refreshResult &
Resize)
587 panel->GetListener()->TP_HandleResize();
616 status.
Join(
XO(
"(Esc to cancel)"),
" " );
665 if( t && t->HasOwner() )
690 switch (event.GetKeyCode())
710 if (event.LeftDown()) {
721 if (event.ButtonUp()) {
724 const auto foundCell =
FindCell(event.m_x, event.m_y);
725 const auto t =
FindTrack( foundCell.pCell.get() );
765 const auto width = GetRect().GetWidth()
768 wxRect rect(left, top, width, height);
793 if( !rect || ( *rect == GetRect() ) )
797 wxWindow::Refresh(eraseBackground, rect);
817 wxRegion region = GetUpdateRegion();
819 const wxRect clip = GetRect();
831 bool bMultiToolDown =
837 bool sliderFlag = bMultiToolDown;
838 bool brushFlag =
false;
839#ifdef EXPERIMENTAL_BRUSH_TOOL
840 brushFlag = (ToolCodes::brushTool ==
settings.GetTool());
860(
const std::shared_ptr< CommonTrackPanelCell > &pCell)
874 wxASSERT(!channels.empty());
877 int nAffordances = 0;
879 std::vector<int> oldHeights;
880 for (
auto channel : channels) {
882 const auto height = view.GetHeight();
883 totalHeight += height;
884 oldHeights.push_back( height );
885 if (view.GetAffordanceControls())
890 auto nChannels =
static_cast<int>(oldHeights.size());
891 std::vector<int> results;
892 results.reserve(nChannels);
896 auto availableHeight = totalHeight
900 int cumulativeOldHeight = 0;
901 int cumulativeNewHeight = 0;
902 for (
const auto &oldHeight : oldHeights) {
904 cumulativeOldHeight += oldHeight;
905 const auto newHeight =
906 cumulativeOldHeight * availableHeight / totalHeight
907 - cumulativeNewHeight;
908 cumulativeNewHeight += newHeight;
909 results.push_back(newHeight);
918 for (
auto t :
GetTracks()->Any< WaveTrack >())
945 auto pHeight = heights.begin();
948 const auto height = *pHeight++;
949 rect.SetHeight( height );
950 const auto subViews = view.GetSubViews( rect );
951 if (subViews.empty())
954 auto iter = subViews.begin(),
end = subViews.end(), next = iter;
955 auto yy = iter->first;
956 wxSize vRulerSize{ 0, 0 };
957 for ( ; iter !=
end; iter = next ) {
959 auto nextY = ( next ==
end )
962 rect.SetHeight( nextY - yy );
978 for (
auto t : trackRange)
979 s.IncTo({t->vrulerSize.first, t->vrulerSize.second});
999 bool modifyState = e.
mExtra;
1001 auto pTrack = e.
mpTrack.lock();
1002 auto t = pTrack.get();
1007 for (
auto it :
GetTracks()->Leaders()) {
1008 trackTop += trackHeight;
1014 if (channels.contains(t)) {
1018 GetSize(&width, &height);
1020 if (trackTop < mViewInfo->vpos) {
1025 else if (trackTop + trackHeight >
mViewInfo->
vpos + height) {
1026 height = (trackTop + trackHeight) - (
mViewInfo->
vpos + height);
1045 int trackHeight = 0;
1049 auto range = tracks->Leaders();
1050 if (!range.empty()) {
1060 GetSize(&width, &height);
1084 wxDC &dc,
const Track *t, wxCoord *pW, wxCoord *pH )
1086 wxFont labelFont(12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
1087 dc.SetFont(labelFont);
1088 dc.GetTextExtent( t->
GetName(), pW, pH );
1093 const wxRect &trackRect, wxCoord textWidth, wxCoord textHeight )
1115 auto &dc = context.
dc;
1117 wxCoord textWidth, textHeight;
1123 const int kOpaqueHeight = 44;
1124 const int kTranslucentHeight = 124;
1131 float f = wxClip((h-kOpaqueHeight)/(
float)(kTranslucentHeight-kOpaqueHeight),0.0,1.0);
1134 const int kOpaque = 255;
1135 const int kTranslucent = 140;
1137 int opacity = 255 - (255-140)*f;
1139 const auto nameRect =
1145 dc.DrawRoundedRectangle( nameRect, 8.0 );
1150 SecondMarginX = 1, SecondMarginY = 1,
1151 SecondMarginsX = 2 * SecondMarginX, SecondMarginsY = 2 * SecondMarginY,
1154 textWidth +
MarginsX + SecondMarginsX,
1155 textHeight +
MarginsY + SecondMarginsY );
1157 unsigned char *alpha=image.GetAlpha();
1158 memset(alpha, wxIMAGE_ALPHA_TRANSPARENT, image.GetWidth()*image.GetHeight());
1161 std::unique_ptr< wxGraphicsContext >
1162 pGc{ wxGraphicsContext::Create(image) };
1167 gc.DrawRoundedRectangle(
1168 SecondMarginX, SecondMarginY,
1172 wxBitmap bitmap( image );
1173 dc.DrawBitmap( bitmap,
1174 nameRect.x - SecondMarginX, nameRect.y - SecondMarginY );
1222 virtual std::shared_ptr< Track >
DoFindTrack()
override {
return {}; }
1225 static auto instance = std::make_shared< EmptyCell >();
1232 const wxRect &rect,
unsigned iPass )
override
1236 auto dc = &context.
dc;
1239 dc->DrawRectangle( rect );
1247 const std::shared_ptr< TrackView > &pView, wxCoord leftOffset )
1248 : mpView{ pView }, mLeftOffset{ leftOffset } {}
1254 { mLeftOffset, mpView }
1265 const std::shared_ptr<Track> &pTrack,
1268 , mRefinement{
std::move( refinement ) }
1269 , mLeftOffset{ leftOffset } {}
1273 auto y1 = rect.GetTop();
1274 for (
const auto &subView : mRefinement ) {
1275 y1 = std::max( y1, subView.first );
1276 refinement.emplace_back( y1,
1277 std::make_shared< VRulerAndChannel >(
1278 subView.second, mLeftOffset ) );
1280 return { Axis::Y, std::move( refinement ) };
1286 const wxRect &rect,
unsigned iPass )
override
1292 context, mpTrack->SubstitutePendingChangedTrack().get(), rect );
1295 if (mRefinement.size() > 1) {
1297 auto &dc = context.
dc;
1299 auto iter = mRefinement.begin() + 1,
end = mRefinement.end();
1300 for ( ; iter !=
end; ++iter ) {
1301 auto yy = iter->first;
1302 AColor::Line( dc, mLeftOffset, yy, rect.GetRight(), yy );
1310 const wxRect &rect,
const wxRect &panelRect,
unsigned iPass )
override
1315 wxCoord textWidth, textHeight;
1317 &textWidth, &textHeight );
1338 : mTrack(track), mFillBrushName(fillBrushName)
1345 const wxRect& rect,
unsigned iPass)
override
1349 context.
dc.SetPen(*wxTRANSPARENT_PEN);
1351 context.
dc.DrawRectangle(rect);
1352 wxRect bevel(rect.x, rect.y, rect.width - 1, rect.height - 1);
1375 : mRefinement(
std::move(refinement))
1381 return { Axis::X, mRefinement };
1392 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1399 const auto pLast = *channels.rbegin();
1400 wxCoord yy = rect.GetTop();
1402 auto pHeight = heights.begin();
1403 for (
auto channel : channels )
1406 if (
auto affordance = view.GetAffordanceControls())
1408 auto panelRect = std::make_shared<EmptyPanelRect>(
1409 channel->shared_from_this(),
1410 channel->GetSelected() ? clrTrackInfoSelected : clrTrackInfo);
1412 std::make_pair(rect.GetLeft() + 1, panelRect),
1413 std::make_pair(mLeftOffset, affordance)
1415 refinement.emplace_back(yy, std::make_shared<HorizontalGroup>(hgroup));
1419 auto height = *pHeight++;
1422 refinement.emplace_back( yy,
1423 std::make_shared< VRulersAndChannels >(
1424 channel->shared_from_this(),
1427 if ( channel != pLast ) {
1429 refinement.emplace_back(
1435 return { Axis::Y, std::move( refinement ) };
1444 const auto pLast = *channels.rbegin();
1445 wxCoord yy = rect.GetTop();
1447 auto pHeight = heights.begin();
1448 for (
auto channel : channels)
1451 auto height = *pHeight++;
1452 if (
auto affordance = view.GetAffordanceControls())
1456 auto trackRect = wxRect(
1459 rect.GetRight() - mLeftOffset,
1475 const std::shared_ptr< Track > &pTrack, wxCoord leftOffset )
1476 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1482 std::make_shared< ChannelGroup >( mpTrack, mLeftOffset ) }
1487 const wxRect &rect,
unsigned iPass )
override
1490 auto &dc = context.
dc;
1491 dc.SetBrush(*wxTRANSPARENT_BRUSH);
1492 dc.SetPen(*wxBLACK_PEN);
1503 const auto right = rect.GetRight();
1504 const auto bottom = rect.GetBottom();
1519 auto &trackPanel = *artist->parent;
1521 if (trackFocus.Get() == mpTrack.get() &&
1524 wxRect theRect = rect;
1525 auto &dc = context.
dc;
1526 dc.SetBrush(*wxTRANSPARENT_BRUSH);
1529 dc.DrawRectangle(theRect);
1533 dc.DrawRectangle(theRect);
1537 dc.DrawRectangle(theRect);
1544 const wxRect &rect,
const wxRect &,
unsigned iPass )
override
1574 const std::shared_ptr< Track > &pTrack, wxCoord leftOffset )
1575 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1579 std::make_shared< LabeledChannelGroup >( mpTrack, mLeftOffset ) },
1594 const auto &viewInfo = *mPanel.GetViewInfo();
1595 wxCoord yy = -viewInfo.vpos;
1598 auto &tracks = *mPanel.GetTracks();
1600 refinement.emplace_back( yy, EmptyCell::Instance() ),
1603 for (
const auto leader : tracks.Leaders() ) {
1607 height += view.GetHeight();
1609 refinement.emplace_back( yy,
1610 std::make_shared< ResizingChannelGroup >(
1611 leader->SharedPointer(), viewInfo.GetLeftOffset() )
1616 refinement.emplace_back( std::max( 0, yy ), mPanel.GetBackgroundCell() );
1618 return { Axis::Y, std::move( refinement ) };
1628 { 0, EmptyCell::Instance() },
1629 {
kLeftMargin, std::make_shared< Subgroup >( mPanel ) },
1630 { rect.GetRight() + 1 -
kRightMargin, EmptyCell::Instance() }
1643 return std::make_shared< MainGroup >( *
this );
1657 if (
auto pGroup =
dynamic_cast<const LabeledChannelGroup*
>( &node ))
1658 return pGroup->mpTrack.get() == leader;
1666 if (rect != wxRect{}) {
1671 GetClientSize(&rect.width,
nullptr);
1683 rect.Inflate( 0, dy );
1693 std::vector<wxRect> results;
1697 pRuler && pRuler->
FindTrack().get() == target)
1698 results.push_back(rect);
1713 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 DoContextMenu(TrackPanelCell *pCell=nullptr)
void VisitCells(const SimpleCellVisitor &visitor)
FoundCell FindCell(int mouseX, int mouseY)
wxRect FindRect(const TrackPanelCell &cell)
wxMouseState mLastMouseState
wxCoord MostRecentXCoord() const
void HandleCursorForPresentMouseState(bool doHit=true)
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.
std::shared_ptr< Track > FindTrack()
@ 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)
AudioTrack subclass that can also be audibly replayed by the program.
bool IsAudioActive() const
static ProjectAudioIO & Get(AudacityProject &project)
static ProjectAudioManager & Get(AudacityProject &project)
void ModifyState(bool bWantsAutoSave)
static ProjectHistory & Get(AudacityProject &project)
static ProjectSettings & Get(AudacityProject &project)
static ProjectStatus & Get(AudacityProject &project)
void Set(const TranslatableString &msg, StatusBarField field=mainStatusBarField)
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.
void EnsureVisible(bool modifyState=false)
std::pair< int, int > vrulerSize
std::shared_ptr< Track > SubstitutePendingChangedTrack()
std::shared_ptr< Subclass > Lock(const std::weak_ptr< Subclass > &wTrack)
auto SelectedLeaders() -> TrackIterRange< TrackType >
auto Any() -> TrackIterRange< TrackType >
static TrackList & Get(AudacityProject &project)
void UpdatePendingTracks()
TrackIter< Track > FindLeader(Track *pTrack)
static auto Channels(TrackType *pTrack) -> TrackIterRange< TrackType >
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
AdornedRulerPanel * mRuler
size_t GetSelectedTrackCount() const
TrackPanelListener * mListener
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< CommonTrackPanelCell > GetBackgroundCell()
AudacityProject * GetProject() const override
void OnEnsureVisible(const TrackListEvent &event)
void OnSize(wxSizeEvent &)
std::vector< wxRect > FindRulerRects(const Track *target)
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 UpdateTrackVRuler(Track *t)
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)
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 VerticalScroll(float fracPosition)
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)
std::unique_ptr< TrackArtist > mTrackArtist
TrackPanelCell * GetFocusedCell() override
void OnTrackListResizing(const TrackListEvent &event)
virtual void TP_HandleResize()=0
virtual void TP_ScrollWindow(double scrollto)=0
virtual bool TP_ScrollUpDown(int delta)=0
virtual void TP_RedrawScrollbars()=0
The TrackPanel is built up of nodes, subtrees of the CellularPanel's area Common base class for Track...
static TrackPanelResizerCell & Get(Track &track)
static TrackVRulerControls & Get(TrackView &)
virtual void UpdateRuler(const wxRect &rect)=0
static int GetChannelGroupHeight(const Track *pTrack)
virtual Refinement GetSubViews(const wxRect &rect)
static int GetTrackHeight(const Track *pTrack)
static TrackView & Get(Track &)
std::vector< std::pair< wxCoord, std::shared_ptr< TrackView > > > Refinement
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)
NotifyingSelectedRegion selectedRegion
static ViewInfo & Get(AudacityProject &project)
void SetHeight(int height)
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
void SetZoom(double pixelsPerSecond)
int GetVRulerWidth() const
std::shared_ptr< Track > DoFindTrack() override
std::shared_ptr< Track > mTrack
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
std::vector< UIHandlePtr > HitTest(const TrackPanelMouseState &state, const AudacityProject *pProject) override
EmptyPanelRect(const std::shared_ptr< Track > &track, int fillBrushName)
void SetLabel(const TranslatableString &label)
void CallAfter(Action action)
Schedule an action to be done later, and in the main thread.
Services * Get()
Fetch the global instance, or nullptr if none is yet installed.
std::unique_ptr< WindowPlacement > FindFocus()
Find the window that is accepting keyboard input, if any.
void Capture(wxWindow *handler)
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
Namespace containing an enum 'what to do on a refresh?'.
AUDACITY_DLL_API void DrawCursor(TrackPanelDrawingContext &context, const wxRect &rect, const Track *track)
AttachedWindows::RegisteredFactory sKey
std::shared_ptr< Track > FindTrack(TrackPanelCell *pCell)
wxRect GetTrackNameRect(int leftOffset, const wxRect &trackRect, wxCoord textWidth, wxCoord textHeight)
void DrawTrackName(int leftOffset, TrackPanelDrawingContext &context, const Track *t, const wxRect &rect)
std::vector< int > FindAdjustedChannelHeights(Track &t)
void GetTrackNameExtent(wxDC &dc, const Track *t, wxCoord *pW, wxCoord *pH)
enum AudioIOEvent::Type type
Posted when effect is being added or removed to/from track or project.
std::shared_ptr< Track > track
null, if changes happened in the project scope
Sent after sync lock setting changes, with its new state.
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
std::shared_ptr< Track > mpTrack
ChannelGroup(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
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
std::shared_ptr< Track > mpTrack
ResizingChannelGroup(const std::shared_ptr< Track > &pTrack, wxCoord leftOffset)
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< TrackView > &pView, wxCoord leftOffset)
std::shared_ptr< TrackView > mpView
wxRect DrawingArea(TrackPanelDrawingContext &context, const wxRect &rect, const wxRect &panelRect, unsigned iPass) override
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
std::shared_ptr< Track > mpTrack
Subdivision Children(const wxRect &rect) override
TrackView::Refinement mRefinement
VRulersAndChannels(const std::shared_ptr< Track > &pTrack, TrackView::Refinement refinement, wxCoord leftOffset)