91#include "../images/Cursors.h"
96#include <wx/dcclient.h>
97#include <wx/graphics.h>
168template <
class A,
class B,
class DIST >
bool within(
A a, B b, DIST d)
170 return (a > b - d) && (a < b + d);
187std::unique_ptr<wxCursor>
MakeCursor(
int WXUNUSED(CursorId), const
char * const pXpm[36],
int HotX,
int HotY )
189#define CURSORS_SIZE32
191 const int HotAdjust =0;
193 const int HotAdjust =8;
197 Image.SetMaskColour(255,0,0);
200 Image.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X, HotX-HotAdjust );
201 Image.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y, HotY-HotAdjust );
202 return std::make_unique<wxCursor>( Image );
208AttachedWindows::RegisteredFactory
sKey{
213 auto mainPage = window.GetTrackListWindow();
214 wxASSERT( mainPage );
218 window.NextWindowID(),
221 tracks.shared_from_this(),
246 pPanel->wxWindow::Destroy();
253#pragma warning( disable: 4355 )
258 const std::shared_ptr<TrackList> &
tracks,
263 wxWANTS_CHARS | wxNO_BORDER),
267 mTrackArtist(nullptr),
268 mRefreshBacking(false)
270#pragma warning( default: 4355 )
273 SetLayoutDirection(wxLayout_LeftToRight);
276 SetBackgroundStyle(wxBG_STYLE_PAINT);
279 auto pAx = std::make_unique <TrackPanelAx>( *
project );
280 pAx->SetWindow(
this );
281 wxWeakRef< TrackPanel > weakThis{
this };
283 [weakThis](
const Track &track ) -> wxRect {
285 return weakThis->FindTrackRect( &track );
290 *
this, std::move( pAx ) );
304 switch (event.
mType) {
305 case TrackListEvent::RESIZING:
306 case TrackListEvent::ADDITION:
307 OnTrackListResizing(event); break;
308 case TrackListEvent::DELETION:
309 OnTrackListDeletion(); break;
310 case TrackListEvent::TRACK_REQUEST_VISIBLE:
311 OnEnsureVisible(event); break;
333 if (
auto pTrack =
dynamic_cast<Track *
>(msg.
group))
368 auto window = GetParent();
370 while(window !=
nullptr)
372 if(
const auto projectWindow =
dynamic_cast<ProjectWindow*
>(window))
373 return projectWindow->FindProject().get();
375 window = window->GetParent();
383 const auto &
size = evt.GetSize();
392 if (IsShownOnScreen())
425 projectAudioManager.Stop(!gAudioIO->IsStreamActive());
430 if (projectAudioIO.GetAudioIOToken()>0 &&
431 !gAudioIO->IsAudioTokenActive(projectAudioIO.GetAudioIOToken()))
433 projectAudioIO.SetAudioIOToken(0);
434 window.RedrawProject();
441 window.GetPlaybackScroller().OnTimer();
487 wxRect box = GetUpdateRegion().GetBox();
514 dc.DestroyClippingRegion();
537 const auto panel =
this;
538 auto pLatestTrack =
FindTrack( pLatestCell ).get();
543 std::weak_ptr<Track>{
FindTrack( pClickedCell ) }
556 panel->UpdateViewIfNoTracks();
558 if (pLatestTrack == pClickedTrack)
560 pClickedTrack = NULL;
564 panel->UpdateVRuler(pClickedTrack);
567 panel->DrawOverlays(
false);
573 const bool refreshAll =
575 || ((refreshResult &
RefreshCell) && !pClickedTrack)
579 panel->Refresh(
false);
582 panel->RefreshTrack(pClickedTrack);
584 panel->RefreshTrack(pLatestTrack);
588 panel->MakeParentRedrawScrollbars();
590 if (refreshResult &
Resize)
591 panel->GetListener()->TP_HandleResize();
620 status.
Join(
XO(
"(Esc to cancel)"),
" " );
669 if( t && t->HasOwner() )
694 switch (event.GetKeyCode())
714 if (event.LeftDown()) {
725 if (event.ButtonUp()) {
728 const auto foundCell =
FindCell(event.m_x, event.m_y);
729 const auto t =
FindTrack( foundCell.pCell.get() );
768 const auto width = GetRect().GetWidth()
771 wxRect rect(left, top, width, height);
796 if( !rect || ( *rect == GetRect() ) )
800 wxWindow::Refresh(eraseBackground, rect);
822 wxRegion region = GetUpdateRegion();
824 const wxRect clip = GetRect();
836 bool bMultiToolDown =
842 bool sliderFlag = bMultiToolDown;
843 bool brushFlag =
false;
844#ifdef EXPERIMENTAL_BRUSH_TOOL
845 brushFlag = (ToolCodes::brushTool ==
settings.GetTool());
865(
const std::shared_ptr< CommonTrackPanelCell > &pCell)
883 assert(!channels.empty());
886 int nAffordances = 0;
888 std::vector<int> oldHeights;
889 for (
auto pChannel : channels) {
891 const auto height = view.GetHeight();
892 totalHeight += height;
893 oldHeights.push_back(height);
894 if (view.GetAffordanceControls())
899 auto nChannels =
static_cast<int>(oldHeights.size());
900 std::vector<int> results;
901 results.reserve(nChannels);
905 auto availableHeight = totalHeight
909 int cumulativeOldHeight = 0;
910 int cumulativeNewHeight = 0;
911 for (
const auto &oldHeight : oldHeights) {
913 cumulativeOldHeight += oldHeight;
914 const auto newHeight =
915 cumulativeOldHeight * availableHeight / totalHeight
916 - cumulativeNewHeight;
917 cumulativeNewHeight += newHeight;
918 results.push_back(newHeight);
927 for (
auto t :
GetTracks()->Any<WaveTrack>())
952 auto pHeight = heights.begin();
953 for (
auto pChannel : t.
Channels()) {
955 const auto height = *pHeight++;
956 rect.SetHeight(height);
957 const auto subViews = view.GetSubViews(rect);
958 if (subViews.empty())
961 auto iter = subViews.begin(),
end = subViews.end(), next = iter;
962 auto yy = iter->first;
963 wxSize vRulerSize{ 0, 0 };
964 auto &
size = view.vrulerSize;
965 for (; iter !=
end; iter = next) {
967 auto nextY = (next ==
end)
970 rect.SetHeight(nextY - yy);
974 vRulerSize.IncTo({
size.first,
size.second });
977 size = { vRulerSize.x, vRulerSize.y };
987 for (
auto t : trackRange)
988 for (
auto pChannel : t->Channels()) {
990 s.IncTo({ size.first, size.second });
1012 bool modifyState = e.
mExtra;
1013 auto pTrack = e.
mpTrack.lock();
1014 auto t = pTrack.get();
1016 assert(!t || t->IsLeader());
1020 trackTop += trackHeight;
1028 GetSize(&width, &height);
1030 if (trackTop < mViewInfo->vpos) {
1035 else if (trackTop + trackHeight >
mViewInfo->
vpos + height) {
1036 height = (trackTop + trackHeight) - (
mViewInfo->
vpos + height);
1055 int trackHeight = 0;
1059 auto range =
tracks->Any();
1060 if (!range.empty()) {
1070 GetSize(&width, &height);
1108 wxDC &dc,
const Channel &channel, wxCoord *pW, wxCoord *pH)
1110 wxFont labelFont(12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
1111 dc.SetFont(labelFont);
1112 dc.GetTextExtent(
GetTrack(channel).GetName(), pW, pH);
1117 const wxRect &trackRect, wxCoord textWidth, wxCoord textHeight )
1129 const Channel &channel,
const wxRect & rect)
1134 auto name = track.GetName();
1137 if (!track.IsLeader())
1139 auto &dc = context.
dc;
1141 wxCoord textWidth, textHeight;
1147 const int kOpaqueHeight = 44;
1148 const int kTranslucentHeight = 124;
1155 float f = wxClip((h-kOpaqueHeight)/(
float)(kTranslucentHeight-kOpaqueHeight),0.0,1.0);
1158 const int kOpaque = 255;
1159 const int kTranslucent = 140;
1161 int opacity = 255 - (255-140)*f;
1163 const auto nameRect =
1169 dc.DrawRoundedRectangle( nameRect, 8.0 );
1174 SecondMarginX = 1, SecondMarginY = 1,
1175 SecondMarginsX = 2 * SecondMarginX, SecondMarginsY = 2 * SecondMarginY,
1178 textWidth +
MarginsX + SecondMarginsX,
1179 textHeight +
MarginsY + SecondMarginsY );
1181 unsigned char *alpha=image.GetAlpha();
1182 memset(alpha, wxIMAGE_ALPHA_TRANSPARENT, image.GetWidth()*image.GetHeight());
1185 std::unique_ptr< wxGraphicsContext >
1186 pGc{ wxGraphicsContext::Create(image) };
1191 gc.DrawRoundedRectangle(
1192 SecondMarginX, SecondMarginY,
1196 wxBitmap bitmap( image );
1197 dc.DrawBitmap( bitmap,
1198 nameRect.x - SecondMarginX, nameRect.y - SecondMarginY );
1201 dc.DrawText(track.GetName(),
1246 virtual std::shared_ptr< Track >
DoFindTrack()
override {
return {}; }
1249 static auto instance = std::make_shared< EmptyCell >();
1256 const wxRect &rect,
unsigned iPass )
override
1260 auto dc = &context.
dc;
1263 dc->DrawRectangle( rect );
1271 const std::shared_ptr<ChannelView> &pView, wxCoord leftOffset)
1272 : mpView{ pView }, mLeftOffset{ leftOffset } {}
1278 { mLeftOffset, mpView }
1289 const std::shared_ptr<Channel> &pChannel,
1291 : mpChannel{ pChannel }
1292 , mRefinement{
std::move( refinement ) }
1293 , mLeftOffset{ leftOffset } {}
1297 auto y1 = rect.GetTop();
1298 for (
const auto &subView : mRefinement ) {
1299 y1 = std::max( y1, subView.first );
1300 refinement.emplace_back( y1,
1301 std::make_shared< VRulerAndChannel >(
1302 subView.second, mLeftOffset ) );
1304 return { Axis::Y, std::move( refinement ) };
1310 const wxRect &rect,
unsigned iPass )
override
1318 if (mRefinement.size() > 1) {
1320 auto &dc = context.
dc;
1322 auto iter = mRefinement.begin() + 1,
end = mRefinement.end();
1323 for ( ; iter !=
end; ++iter ) {
1324 auto yy = iter->first;
1325 AColor::Line( dc, mLeftOffset, yy, rect.GetRight(), yy );
1333 const wxRect &rect,
const wxRect &panelRect,
unsigned iPass )
override
1338 wxCoord textWidth, textHeight;
1363 const std::shared_ptr<Channel>& pChannel,
int fillBrushName
1364 ) : mpChannel{ pChannel }, mFillBrushName{ fillBrushName }
1371 const wxRect& rect,
unsigned iPass)
override
1375 context.
dc.SetPen(*wxTRANSPARENT_PEN);
1377 context.
dc.DrawRectangle(rect);
1378 wxRect bevel(rect.x, rect.y, rect.width - 1, rect.height - 1);
1385 return GetTrack(*mpChannel).shared_from_this();
1401 : mRefinement(
std::move(refinement))
1407 return { Axis::X, mRefinement };
1421 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1427 const auto channels = mpTrack->Channels();
1428 const auto pLast = *channels.rbegin();
1429 wxCoord yy = rect.GetTop();
1431 auto pHeight = heights.begin();
1432 for (
auto pChannel : channels) {
1434 if (
auto affordance = view.GetAffordanceControls()) {
1435 auto panelRect = std::make_shared<EmptyPanelRect>(pChannel,
1436 mpTrack->GetSelected()
1437 ? clrTrackInfoSelected : clrTrackInfo);
1439 std::make_pair(rect.GetLeft() + 1, panelRect),
1440 std::make_pair(mLeftOffset, affordance)
1443 .emplace_back(yy, std::make_shared<HorizontalGroup>(hgroup));
1447 auto height = *pHeight++;
1450 refinement.emplace_back(yy,
1451 std::make_shared<VRulersAndChannels>(pChannel,
1454 if (pChannel != pLast) {
1456 refinement.emplace_back(
1459 .shared_from_this());
1463 return { Axis::Y, std::move(refinement) };
1467 const wxRect& rect,
unsigned iPass)
override
1471 const auto channels = mpTrack->Channels();
1472 const auto pLast = *channels.rbegin();
1473 wxCoord yy = rect.GetTop();
1474 assert(mpTrack->IsLeader());
1476 auto pHeight = heights.begin();
1477 for (
auto pChannel : channels) {
1479 auto height = *pHeight++;
1480 if (
auto affordance = view.GetAffordanceControls())
1482 auto trackRect = wxRect(
1485 rect.GetRight() - mLeftOffset,
1504 const std::shared_ptr<Track> &pTrack, wxCoord leftOffset)
1505 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1511 std::make_shared<ChannelStack>(mpTrack, mLeftOffset) }
1516 const wxRect &rect,
unsigned iPass)
override
1519 auto &dc = context.
dc;
1520 dc.SetBrush(*wxTRANSPARENT_BRUSH);
1521 dc.SetPen(*wxBLACK_PEN);
1532 const auto right = rect.GetRight();
1533 const auto bottom = rect.GetBottom();
1548 auto &trackPanel = *artist->parent;
1550 if (trackFocus.Get() == mpTrack.get() &&
1553 wxRect theRect = rect;
1554 auto &dc = context.
dc;
1555 dc.SetBrush(*wxTRANSPARENT_BRUSH);
1558 dc.DrawRectangle(theRect);
1562 dc.DrawRectangle(theRect);
1566 dc.DrawRectangle(theRect);
1572 const wxRect &rect,
const wxRect &,
unsigned iPass)
override
1605 const std::shared_ptr<Track> &pTrack, wxCoord leftOffset)
1606 : mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
1610 std::make_shared<LabeledChannelGroup>(mpTrack, mLeftOffset) },
1613 **mpTrack->Channels().rbegin()).shared_from_this()
1625 const auto &viewInfo = *mPanel.GetViewInfo();
1626 wxCoord yy = -viewInfo.vpos;
1629 auto &
tracks = *mPanel.GetTracks();
1631 refinement.emplace_back( yy, EmptyCell::Instance() ),
1634 for (
const auto leader :
tracks) {
1636 for (
auto pChannel : leader->Channels()) {
1638 height += view.GetHeight();
1640 refinement.emplace_back( yy,
1641 std::make_shared<ResizingChannelGroup>(
1642 leader->SharedPointer(), viewInfo.GetLeftOffset())
1647 refinement.emplace_back(std::max(0, yy), mPanel.GetBackgroundCell());
1649 return { Axis::Y, std::move(refinement) };
1659 { 0, EmptyCell::Instance() },
1660 {
kLeftMargin, std::make_shared<Subgroup>(mPanel) },
1661 { rect.GetRight() + 1 -
kRightMargin, EmptyCell::Instance() }
1674 return std::make_shared< MainGroup >( *
this );
1688 if (
auto pGroup =
dynamic_cast<const LabeledChannelGroup*
>( &node ))
1689 return pGroup->mpTrack.get() == leader;
1697 if (rect != wxRect{}) {
1702 GetClientSize(&rect.width,
nullptr);
1714 rect.Inflate( 0, dy );
1724 std::vector<wxRect> results;
1727 if (
auto pView = pRuler->GetChannelView())
1728 if (pView->FindChannel().get() == &target)
1729 results.push_back(rect);
1747 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)
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)
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)
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.
void EnsureVisible(bool modifyState=false)
std::shared_ptr< Track > SubstitutePendingChangedTrack()
bool IsLeader() const override
std::shared_ptr< Subclass > Lock(const std::weak_ptr< Subclass > &wTrack)
TrackIter< Track > Find(Track *pTrack)
auto Any() -> TrackIterRange< TrackType >
static TrackList & Get(AudacityProject &project)
void UpdatePendingTracks()
auto Selected() -> TrackIterRange< TrackType >
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
Observer::Subscription mProjectRulerInvalidatedSubscription
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 &)
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 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)
void UpdateTrackVRuler(Track &t)
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(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)
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
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 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.
auto begin(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)
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)
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.
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