Audacity 3.2.0
Classes | Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | List of all members
AdornedRulerPanel Class Referencefinal

This is an Audacity Specific ruler panel which additionally has border, selection markers, play marker. More...

#include <AdornedRulerPanel.h>

Inheritance diagram for AdornedRulerPanel:
[legend]
Collaboration diagram for AdornedRulerPanel:
[legend]

Classes

class  CommonCell
 
class  CommonRulerHandle
 
struct  MainGroup
 
class  MovePlayRegionHandle
 
class  NewPlayRegionHandle
 
class  PlayRegionAdjustingHandle
 
class  QPCell
 
struct  Resetter
 
class  ResizePlayRegionHandle
 
class  ScrubbingCell
 
class  ScrubbingHandle
 
class  ScrubbingRulerOverlay
 
struct  Subgroup
 
class  TrackPanelGuidelineOverlay
 

Public Member Functions

 AdornedRulerPanel (AudacityProject *project, wxWindow *parent, wxWindowID id, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, ViewInfo *viewinfo=NULL)
 
 ~AdornedRulerPanel ()
 
void Refresh (bool eraseBackground=true, const wxRect *rect=(const wxRect *) NULL) override
 
bool AcceptsFocus () const override
 
bool AcceptsFocusFromKeyboard () const override
 
void SetFocusFromKbd () override
 
int GetRulerHeight ()
 
wxRect GetInnerRect () const
 
void SetLeftOffset (int offset)
 
void DrawSelection ()
 
void SetPlayRegion (double playRegionStart, double playRegionEnd)
 
void ClearPlayRegion ()
 
void TogglePinnedHead ()
 
void GetMaxSize (wxCoord *width, wxCoord *height)
 
void InvalidateRuler ()
 
void UpdatePrefs () override
 
void ReCreateButtons ()
 
void UpdateQuickPlayPos (wxCoord &mousePosX)
 
bool ShowingScrubRuler () const
 
bool SetPanelSize ()
 
void DrawBothOverlays ()
 
void DoDrawScrubIndicator (wxDC *dc, wxCoord xx, int width, bool scrub, bool seek)
 
void UpdateButtonStates ()
 
void SetNumGuides (size_t nn)
 
AudacityProjectGetProject () const override
 
TimeDisplayMode GetTimeDisplayMode () const
 
void SetTimeDisplayMode (TimeDisplayMode rulerType)
 
- Public Member Functions inherited from CellularPanel
 CellularPanel (wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, ViewInfo *viewInfo, long style=wxTAB_TRAVERSAL|wxNO_BORDER)
 
 ~CellularPanel () override
 
virtual AudacityProjectGetProject () const =0
 
virtual std::shared_ptr< TrackPanelNodeRoot ()=0
 
virtual std::shared_ptr< TrackPanelCellGetFocusedCell ()=0
 
virtual void SetFocusedCell ()=0
 
virtual void ProcessUIHandleResult (TrackPanelCell *pClickedCell, TrackPanelCell *pLatestCell, unsigned refreshResult)=0
 
virtual void UpdateStatusMessage (const TranslatableString &)=0
 
void Visit (Visitor &visitor)
 
void VisitCells (const SimpleCellVisitor &visitor)
 
void VisitPreorder (const SimpleNodeVisitor &visitor)
 
void VisitPostorder (const SimpleNodeVisitor &visitor)
 
FoundCell FindCell (int mouseX, int mouseY)
 
wxRect FindRect (const TrackPanelCell &cell)
 
wxRect FindRect (const std::function< bool(TrackPanelNode &) > &pred)
 
UIHandlePtr Target ()
 
std::shared_ptr< TrackPanelCellLastCell () const
 
bool IsMouseCaptured ()
 Determines if a modal tool is active. More...
 
wxCoord MostRecentXCoord () const
 
void HandleCursorForPresentMouseState (bool doHit=true)
 
void Draw (TrackPanelDrawingContext &context, unsigned nPasses)
 
- Public Member Functions inherited from OverlayPanel
 OverlayPanel (wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style=wxTAB_TRAVERSAL|wxNO_BORDER)
 
void AddOverlay (const std::weak_ptr< Overlay > &pOverlay)
 
void ClearOverlays ()
 
void DrawOverlays (bool repaint_all, wxDC *pDC=nullptr)
 
- Public Member Functions inherited from BackedPanel
 BackedPanel (wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style)
 
 ~BackedPanel ()
 
wxDC & GetBackingDC ()
 
wxDC & GetBackingDCForRepaint ()
 
void ResizeBacking ()
 
void RepairBitmap (wxDC &dc, wxCoord x, wxCoord y, wxCoord width, wxCoord height)
 
void DisplayBitmap (wxDC &dc)
 
void OnSize (wxSizeEvent &event)
 
- Public Member Functions inherited from wxPanelWrapper
 wxPanelWrapper ()
 
 wxPanelWrapper (wxWindow *parent, wxWindowID winid=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxTAB_TRAVERSAL|wxNO_BORDER, const TranslatableString &name=XO("Panel"))
 
bool Create (wxWindow *parent, wxWindowID winid=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxTAB_TRAVERSAL|wxNO_BORDER, const TranslatableString &name=XO("Panel"))
 
void SetLabel (const TranslatableString &label)
 
void SetName (const TranslatableString &name)
 
void SetToolTip (const TranslatableString &toolTip)
 
void SetName ()
 
- Public Member Functions inherited from wxTabTraversalWrapper< wxPanel >
 wxTabTraversalWrapper (Args &&... args)
 
 wxTabTraversalWrapper (const wxTabTraversalWrapper &)=delete
 
 wxTabTraversalWrapper (wxTabTraversalWrapper &&)=delete
 
wxTabTraversalWrapperoperator= (const wxTabTraversalWrapper &)=delete
 
wxTabTraversalWrapperoperator= (wxTabTraversalWrapper &&)=delete
 

Static Public Member Functions

static AdornedRulerPanelGet (AudacityProject &project)
 
static const AdornedRulerPanelGet (const AudacityProject &project)
 
static void Destroy (AudacityProject &project)
 
static int GetRulerHeight (bool showScrubBar)
 
static TempAllowFocus TemporarilyAllowFocus ()
 

Private Types

enum class  MenuChoice { QuickPlay , Scrub }
 
enum  MouseEventState {
  mesNone , mesDraggingPlayRegionStart , mesDraggingPlayRegionEnd , mesSelectingPlayRegionClick ,
  mesSelectingPlayRegionRange
}
 
using TempAllowFocus = std::unique_ptr< bool, Resetter >
 

Private Member Functions

void DoIdle ()
 
void OnIdle (wxIdleEvent &evt)
 
void OnAudioStartStop (AudioIOEvent)
 
void OnPaint (wxPaintEvent &evt)
 
void OnSize (wxSizeEvent &evt)
 
void OnLeave (wxMouseEvent &evt)
 
void OnThemeChange (struct ThemeChangeMessage)
 
void OnSelectionChange (Observer::Message)
 
void DoSelectionChange (const SelectedRegion &selectedRegion)
 
bool UpdateRects ()
 
void HandleQPClick (wxMouseEvent &event, wxCoord mousePosX)
 
void HandleQPDrag (wxMouseEvent &event, wxCoord mousePosX)
 
void HandleQPRelease (wxMouseEvent &event)
 
void StartQPPlay (bool newDefault, bool cutPreview, const double *pStartTime=nullptr)
 
void DoDrawBackground (wxDC *dc)
 
void DoDrawEdge (wxDC *dc)
 
void DoDrawMarks (wxDC *dc, bool)
 
wxRect RegionRectangle (double t0, double t1) const
 
wxRect PlayRegionRectangle () const
 
wxRect SelectedRegionRectangle () const
 
void DoDrawPlayRegion (wxDC *dc, const wxRect &rectP, const wxRect &rectL, const wxRect &rectR)
 
void DoDrawPlayRegionLimits (wxDC *dc, const wxRect &rect)
 
void DoDrawOverlap (wxDC *dc, const wxRect &rect)
 
void DoDrawSelection (wxDC *dc, const wxRect &rectS, const wxRect &rectL, const wxRect &rectR)
 
void ShowContextMenu (MenuChoice choice, const wxPoint *pPosition)
 
double Pos2Time (int p, bool ignoreFisheye=false) const
 
int Time2Pos (double t, bool ignoreFisheye=false) const
 
bool IsWithinMarker (int mousePosX, double markerTime)
 
void ShowMenu (const wxPoint &pos)
 
void ShowScrubMenu (const wxPoint &pos)
 
void HandleSnapping (size_t index)
 
void OnTimelineFormatChange (wxCommandEvent &evt)
 
void OnSyncSelToQuickPlay (wxCommandEvent &evt)
 
void OnAutoScroll (wxCommandEvent &evt)
 
void OnTogglePlayRegion (wxCommandEvent &evt)
 
void OnClearPlayRegion (wxCommandEvent &evt)
 
void OnSetPlayRegionToSelection (wxCommandEvent &evt)
 
void OnPinnedButton (wxCommandEvent &event)
 
void OnTogglePinnedState (wxCommandEvent &event)
 
std::shared_ptr< TrackPanelNodeRoot () override
 
std::shared_ptr< TrackPanelCellGetFocusedCell () override
 
void SetFocusedCell () override
 
void ProcessUIHandleResult (TrackPanelCell *pClickedTrack, TrackPanelCell *pLatestCell, unsigned refreshResult) override
 
void UpdateStatusMessage (const TranslatableString &) override
 
void CreateOverlays ()
 
- Private Member Functions inherited from PrefsListener
 PrefsListener ()
 
virtual ~PrefsListener ()
 
virtual void UpdatePrefs ()=0
 
virtual void UpdateSelectedPrefs (int id)
 

Static Private Member Functions

static void DragSelection (AudacityProject &project)
 
- Static Private Member Functions inherited from PrefsListener
static void Broadcast (int id=0)
 Call this static function to notify all PrefsListener objects. More...
 

Private Attributes

AudacityProject *const mProject
 
LinearUpdatermUpdater
 
RulermRuler
 
TrackListmTracks
 
wxRect mOuter
 
wxRect mScrubZone
 
wxRect mInner
 
int mLeftOffset
 
double mIndTime
 
double mQuickPlayOffset [MAX_GUIDES] {}
 
double mQuickPlayPosUnsnapped [MAX_GUIDES] {}
 
double mQuickPlayPos [MAX_GUIDES] {}
 
bool mIsSnapped [MAX_GUIDES] {}
 
size_t mNumGuides { 1 }
 
PlayRegion mOldPlayRegion
 
bool mIsRecording
 
bool mPlayRegionDragsSelection
 
MouseEventState mMouseEventState
 
double mLeftDownClickUnsnapped
 
double mLeftDownClick
 
bool mIsDragging
 
wxWindow * mButtons [3]
 
bool mNeedButtonUpdate { true }
 
std::shared_ptr< TrackPanelGuidelineOverlaymOverlay
 
std::shared_ptr< QPCellmQPCell
 
std::shared_ptr< ScrubbingCellmScrubbingCell
 
Observer::Subscription mAudioIOSubscription
 
Observer::Subscription mPlayRegionSubscription
 
Observer::Subscription mThemeChangeSubscription
 
Observer::Subscription mRulerInvalidatedSubscription
 
SelectedRegion mLastDrawnSelectedRegion
 
std::pair< double, double > mLastDrawnPlayRegion {}
 
bool mLastPlayRegionActive = false
 
double mLastDrawnH {}
 
double mLastDrawnZoom {}
 
TimeDisplayMode mTimeDisplayMode
 

Static Private Attributes

static bool s_AcceptsFocus { false }
 
static constexpr size_t MAX_GUIDES = 2
 

Additional Inherited Members

- Public Types inherited from CellularPanel
using SimpleCellVisitor = std::function< void(const wxRect &rect, TrackPanelCell &cell) >
 
using SimpleNodeVisitor = std::function< void(const wxRect &rect, TrackPanelNode &node) >
 
- Protected Member Functions inherited from CellularPanel
bool HasEscape ()
 
bool CancelDragging (bool escaping)
 
void DoContextMenu (std::shared_ptr< TrackPanelCell > pCell)
 
void ClearTargets ()
 
- Protected Attributes inherited from CellularPanel
ViewInfomViewInfo
 
wxMouseState mLastMouseState
 

Detailed Description

This is an Audacity Specific ruler panel which additionally has border, selection markers, play marker.

Once TrackPanel uses wxSizers, we will derive it from some wxWindow and the GetSize and SetSize functions will then be wxWidgets functions instead.

Definition at line 29 of file AdornedRulerPanel.h.

Member Typedef Documentation

◆ TempAllowFocus

using AdornedRulerPanel::TempAllowFocus = std::unique_ptr<bool, Resetter>
private

Definition at line 121 of file AdornedRulerPanel.h.

Member Enumeration Documentation

◆ MenuChoice

enum class AdornedRulerPanel::MenuChoice
strongprivate
Enumerator
QuickPlay 
Scrub 

Definition at line 129 of file AdornedRulerPanel.h.

129{ QuickPlay, Scrub };

◆ MouseEventState

Enumerator
mesNone 
mesDraggingPlayRegionStart 
mesDraggingPlayRegionEnd 
mesSelectingPlayRegionClick 
mesSelectingPlayRegionRange 

Definition at line 184 of file AdornedRulerPanel.h.

Constructor & Destructor Documentation

◆ AdornedRulerPanel()

AdornedRulerPanel::AdornedRulerPanel ( AudacityProject project,
wxWindow *  parent,
wxWindowID  id,
const wxPoint &  pos = wxDefaultPosition,
const wxSize &  size = wxDefaultSize,
ViewInfo viewinfo = NULL 
)

Definition at line 1285 of file AdornedRulerPanel.cpp.

1291 : CellularPanel(parent, id, pos, size, viewinfo)
1292 , mProject { project }
1293 , mUpdater { ProjectTimeRuler::Get(*project).GetUpdater() }
1294 , mRuler { ProjectTimeRuler::Get(*project).GetRuler() }
1295{
1296 SetLayoutDirection(wxLayout_LeftToRight);
1297
1298 mQPCell = std::make_shared<QPCell>( this );
1299 mScrubbingCell = std::make_shared<ScrubbingCell>( this );
1300
1301 for (auto &button : mButtons)
1302 button = nullptr;
1303
1304 SetLabel( XO("Timeline") );
1305 SetName();
1306 SetBackgroundStyle(wxBG_STYLE_PAINT);
1307
1308 mLeftOffset = 0;
1309 mIndTime = -1;
1310
1311 mLeftDownClick = -1;
1313 mIsDragging = false;
1314
1315 mOuter = GetClientRect();
1316
1318
1320
1321 mRuler.SetLabelEdges( false );
1322
1324
1325 mIsRecording = false;
1326
1327 mPlayRegionDragsSelection = (gPrefs->Read(wxT("/QuickPlay/DragSelection"), 0L) == 1)? true : false;
1328
1329#if wxUSE_TOOLTIPS
1330 wxToolTip::Enable(true);
1331#endif
1332
1335
1336 // Delay until after CommandManager has been populated:
1338
1341
1342 // Bind event that updates the play region
1345
1347 mRuler.Subscribe([this](auto) { Refresh(); });
1348
1349 // And call it once to initialize it
1351}
wxT("CloseDown"))
XO("Cut/Copy/Paste")
audacity::BasicSettings * gPrefs
Definition: Prefs.cpp:68
const auto project
THEME_API Theme theTheme
Definition: Theme.cpp:82
TimeDisplayModeSetting TimeDisplayModePreference
void OnSelectionChange(Observer::Message)
void UpdatePrefs() override
void OnAudioStartStop(AudioIOEvent)
std::shared_ptr< ScrubbingCell > mScrubbingCell
Observer::Subscription mAudioIOSubscription
LinearUpdater & mUpdater
void DoSelectionChange(const SelectedRegion &selectedRegion)
wxWindow * mButtons[3]
AudacityProject *const mProject
void Refresh(bool eraseBackground=true, const wxRect *rect=(const wxRect *) NULL) override
Observer::Subscription mPlayRegionSubscription
Observer::Subscription mRulerInvalidatedSubscription
TimeDisplayMode mTimeDisplayMode
Observer::Subscription mThemeChangeSubscription
MouseEventState mMouseEventState
std::shared_ptr< QPCell > mQPCell
void OnThemeChange(struct ThemeChangeMessage)
static AudioIO * Get()
Definition: AudioIO.cpp:126
ViewInfo * mViewInfo
CellularPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, ViewInfo *viewInfo, long style=wxTAB_TRAVERSAL|wxNO_BORDER)
Enum ReadEnum() const
Definition: Prefs.h:534
void SetData(const ZoomInfo *pZoomInfo=nullptr, int leftOffset=0)
Definition: LinearUpdater.h:33
Subscription Subscribe(Callback callback)
Connect a callback to the Publisher; later-connected are called earlier.
Definition: Observer.h:199
LinearUpdater & GetUpdater()
static ProjectTimeRuler & Get(AudacityProject &project)
void SetLabelEdges(bool labelEdges)
Definition: Ruler.cpp:179
static TrackList & Get(AudacityProject &project)
Definition: Track.cpp:314
NotifyingSelectedRegion selectedRegion
Definition: ViewInfo.h:216
virtual bool Read(const wxString &key, bool *value) const =0
void SetLabel(const TranslatableString &label)
void CallAfter(Action action)
Schedule an action to be done later, and in the main thread.
Definition: BasicUI.cpp:214

References BasicUI::CallAfter(), DoSelectionChange(), AudioIO::Get(), TrackList::Get(), gPrefs, mAudioIOSubscription, mButtons, mesNone, mIndTime, mIsDragging, mIsRecording, mLeftDownClick, mLeftOffset, mMouseEventState, mOuter, mPlayRegionDragsSelection, mPlayRegionSubscription, mQPCell, mRuler, mRulerInvalidatedSubscription, mScrubbingCell, mThemeChangeSubscription, mTimeDisplayMode, mTracks, mUpdater, CellularPanel::mViewInfo, OnAudioStartStop(), OnSelectionChange(), OnThemeChange(), project, audacity::BasicSettings::Read(), EnumSetting< Enum >::ReadEnum(), Refresh(), ViewInfo::selectedRegion, LinearUpdater::SetData(), wxPanelWrapper::SetLabel(), Ruler::SetLabelEdges(), wxPanelWrapper::SetName(), Observer::Publisher< Message, NotifyAll >::Subscribe(), theTheme, TimeDisplayModePreference, UpdatePrefs(), wxT(), and XO().

Here is the call graph for this function:

◆ ~AdornedRulerPanel()

AdornedRulerPanel::~AdornedRulerPanel ( )

Definition at line 1353 of file AdornedRulerPanel.cpp.

1354{
1355}

Member Function Documentation

◆ AcceptsFocus()

bool AdornedRulerPanel::AcceptsFocus ( ) const
inlineoverride

Definition at line 51 of file AdornedRulerPanel.h.

51{ return s_AcceptsFocus; }
static bool s_AcceptsFocus

◆ AcceptsFocusFromKeyboard()

bool AdornedRulerPanel::AcceptsFocusFromKeyboard ( ) const
inlineoverride

Definition at line 52 of file AdornedRulerPanel.h.

52{ return true; }

◆ ClearPlayRegion()

void AdornedRulerPanel::ClearPlayRegion ( )

Definition at line 2680 of file AdornedRulerPanel.cpp.

2681{
2682 ProjectAudioManager::Get( *mProject ).Stop();
2683
2684 auto &viewInfo = ViewInfo::Get( *GetProject() );
2685 auto &playRegion = viewInfo.playRegion;
2686 playRegion.Clear();
2687
2688 Refresh();
2689}
AudacityProject * GetProject() const override
void Stop(bool stopStream=true)
static ProjectAudioManager & Get(AudacityProject &project)
static ViewInfo & Get(AudacityProject &project)
Definition: ViewInfo.cpp:235

References ViewInfo::Get(), ProjectAudioManager::Get(), GetProject(), Refresh(), and ProjectAudioManager::Stop().

Here is the call graph for this function:

◆ CreateOverlays()

void AdornedRulerPanel::CreateOverlays ( )
private

Definition at line 2797 of file AdornedRulerPanel.cpp.

2798{
2799 if (!mOverlay) {
2800 mOverlay =
2801 std::make_shared<TrackPanelGuidelineOverlay>( mProject );
2802 auto pCellularPanel =
2803 dynamic_cast<CellularPanel*>( &GetProjectPanel( *GetProject() ) );
2804 if ( !pCellularPanel ) {
2805 wxASSERT( false );
2806 }
2807 else
2808 pCellularPanel->AddOverlay( mOverlay );
2809 this->AddOverlay( mOverlay->mPartner );
2810 }
2811}
AUDACITY_DLL_API wxWindow & GetProjectPanel(AudacityProject &project)
Get the main sub-window of the project frame that displays track data.
std::shared_ptr< TrackPanelGuidelineOverlay > mOverlay
Formerly part of TrackPanel, this abstract base class has no special knowledge of Track objects and i...
Definition: CellularPanel.h:34
void AddOverlay(const std::weak_ptr< Overlay > &pOverlay)

References OverlayPanel::AddOverlay(), GetProject(), GetProjectPanel(), mOverlay, and mProject.

Here is the call graph for this function:

◆ Destroy()

void AdornedRulerPanel::Destroy ( AudacityProject project)
static

Definition at line 1276 of file AdornedRulerPanel.cpp.

1277{
1278 auto *pPanel = GetAttachedWindows(project).Find( sKey );
1279 if (pPanel) {
1280 pPanel->wxWindow::Destroy();
1282 }
1283}
AUDACITY_DLL_API AttachedWindows & GetAttachedWindows(AudacityProject &project)
Subclass * Find(const RegisteredFactory &key)
Get a (bare) pointer to an attachment, or null, down-cast it to Subclass *; will not create on demand...
Definition: ClientData.h:342
void Assign(const RegisteredFactory &key, ReplacementPointer &&replacement)
Reassign Site's pointer to ClientData.
Definition: ClientData.h:364
AttachedWindows::RegisteredFactory sKey

References ClientData::Site< Host, ClientData, ObjectCopyingPolicy, Pointer, ObjectLockingPolicy, RegistryLockingPolicy >::Assign(), ClientData::Site< Host, ClientData, ObjectCopyingPolicy, Pointer, ObjectLockingPolicy, RegistryLockingPolicy >::Find(), GetAttachedWindows(), project, and anonymous_namespace{AdornedRulerPanel.cpp}::sKey.

Referenced by ProjectManager::OnCloseWindow().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoDrawBackground()

void AdornedRulerPanel::DoDrawBackground ( wxDC *  dc)
private

Definition at line 2428 of file AdornedRulerPanel.cpp.

2429{
2430 // Draw AdornedRulerPanel border
2432 dc->DrawRectangle( mOuter );
2433
2434 if (ShowingScrubRuler()) {
2435 // Let's distinguish the scrubbing area by using a themable
2436 // colour and a line to set it off.
2437 AColor::UseThemeColour(dc, clrScrubRuler, TimelineTextColor() );
2438 wxRect ScrubRect = mScrubZone;
2439 ScrubRect.Inflate( 1,0 );
2440 dc->DrawRectangle(ScrubRect);
2441 }
2442}
ColorId TimelineBackgroundColor()
ColorId TimelineTextColor()
static void UseThemeColour(wxDC *dc, int iBrush, int iPen=-1, int alpha=255)
Definition: AColor.cpp:354
bool ShowingScrubRuler() const

References mOuter, mScrubZone, ShowingScrubRuler(), TimelineBackgroundColor(), TimelineTextColor(), and AColor::UseThemeColour().

Referenced by OnPaint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoDrawEdge()

void AdornedRulerPanel::DoDrawEdge ( wxDC *  dc)
private

Definition at line 2444 of file AdornedRulerPanel.cpp.

2445{
2446 // Black stroke at bottom
2447 dc->SetPen( *wxBLACK_PEN );
2448 AColor::Line( *dc, mOuter.x,
2449 mOuter.y + mOuter.height - 1,
2450 mOuter.x + mOuter.width - 1 ,
2451 mOuter.y + mOuter.height - 1 );
2452}
static void Line(wxDC &dc, wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
Definition: AColor.cpp:194

References AColor::Line(), and mOuter.

Referenced by OnPaint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoDrawMarks()

void AdornedRulerPanel::DoDrawMarks ( wxDC *  dc,
bool   
)
private

Definition at line 2454 of file AdornedRulerPanel.cpp.

2455{
2456 const double min = Pos2Time(mInner.x);
2457 const double hiddenMin = Pos2Time(mInner.x, true);
2458 const double max = Pos2Time(mInner.x + mInner.width);
2459 const double hiddenMax = Pos2Time(mInner.x + mInner.width, true);
2460
2462 mRuler.SetRange( min, max, hiddenMin, hiddenMax );
2464 {
2465 mRuler.SetTickLengths({ 5, 3, 1 });
2466 }
2468 {
2469 mRuler.SetTickLengths({ 4, 2, 2 });
2470 }
2471 mRuler.Draw( *dc );
2472}
int min(int a, int b)
double Pos2Time(int p, bool ignoreFisheye=false) const
void SetTickColour(const wxColour &colour)
Definition: Ruler.h:135
void Draw(wxDC &dc) const
Definition: Ruler.cpp:441
void SetTickLengths(const TickLengths &tLengths)
Definition: Ruler.cpp:255
void SetRange(double min, double max)
Definition: Ruler.cpp:152
wxColour & Colour(int iIndex)

References BeatsAndMeasures, ThemeBase::Colour(), Ruler::Draw(), min(), mInner, MinutesAndSeconds, mRuler, mTimeDisplayMode, Pos2Time(), Ruler::SetRange(), Ruler::SetTickColour(), Ruler::SetTickLengths(), theTheme, and TimelineTextColor().

Referenced by OnPaint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoDrawOverlap()

void AdornedRulerPanel::DoDrawOverlap ( wxDC *  dc,
const wxRect &  rect 
)
private

Definition at line 2571 of file AdornedRulerPanel.cpp.

2572{
2573 dc->SetBrush( wxBrush{ AlphaBlend(
2575 SelectionOpacity) } );
2576 dc->SetPen( *wxTRANSPARENT_PEN );
2577 dc->DrawRectangle( rect );
2578}
ColorId TimelineLoopRegionColor(bool isActive)
static wxColour AlphaBlend(ColorId fg, ColorId bg, double alpha)
ColorId TimelineSelectionColor()
constexpr double SelectionOpacity

References AlphaBlend(), mLastPlayRegionActive, SelectionOpacity, TimelineLoopRegionColor(), and TimelineSelectionColor().

Referenced by OnPaint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoDrawPlayRegion()

void AdornedRulerPanel::DoDrawPlayRegion ( wxDC *  dc,
const wxRect &  rectP,
const wxRect &  rectL,
const wxRect &  rectR 
)
private

Definition at line 2512 of file AdornedRulerPanel.cpp.

2514{
2515 const auto &viewInfo = ViewInfo::Get(*mProject);
2516 const auto& playRegion = viewInfo.playRegion;
2517
2518 const bool isActive = (mLastPlayRegionActive = playRegion.Active());
2519
2520 if (playRegion.IsLastActiveRegionClear())
2521 return;
2522
2523 // Paint the selected region bolder if independently varying, else dim
2524 const auto color = TimelineLoopRegionColor(isActive);
2525 dc->SetBrush( wxBrush( theTheme.Colour( color )) );
2526 dc->SetPen( wxPen( theTheme.Colour( color )) );
2527
2528 dc->DrawRectangle( rectP.Intersect(rectL) );
2529 dc->DrawRectangle( rectP.Intersect(rectR) );
2530}

References ThemeBase::Colour(), ViewInfo::Get(), mLastPlayRegionActive, mProject, theTheme, and TimelineLoopRegionColor().

Referenced by OnPaint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoDrawPlayRegionLimits()

void AdornedRulerPanel::DoDrawPlayRegionLimits ( wxDC *  dc,
const wxRect &  rect 
)
private

Definition at line 2532 of file AdornedRulerPanel.cpp.

2533{
2534 // Color the edges of the play region like the ticks and numbers
2535 ADCChanger cleanup( dc );
2536 const auto edgeColour = theTheme.Colour(TimelineLimitsColor());
2537 dc->SetPen( { edgeColour } );
2538 dc->SetBrush( { edgeColour } );
2539
2540 constexpr int side = 7;
2541 constexpr int sideLessOne = side - 1;
2542
2543 // Paint two shapes, each a line plus triangle at bottom
2544 const auto left = rect.GetLeft(),
2545 right = rect.GetRight(),
2546 bottom = rect.GetBottom(),
2547 top = rect.GetTop();
2548 {
2549 wxPoint points[]{
2550 {left, bottom - sideLessOne},
2551 {left - sideLessOne, bottom},
2552 {left, bottom},
2553 {left, top},
2554 };
2555 dc->DrawPolygon( 4, points );
2556 }
2557
2558 {
2559 wxPoint points[]{
2560 {right, top},
2561 {right, bottom},
2562 {right + sideLessOne, bottom},
2563 {right, bottom - sideLessOne},
2564 };
2565 dc->DrawPolygon( 4, points );
2566 }
2567}
ColorId TimelineLimitsColor()
Makes temporary drawing context changes that you back out of, RAII style.
Definition: OverlayPanel.h:72

References ThemeBase::Colour(), theTheme, and TimelineLimitsColor().

Referenced by OnPaint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoDrawScrubIndicator()

void AdornedRulerPanel::DoDrawScrubIndicator ( wxDC *  dc,
wxCoord  xx,
int  width,
bool  scrub,
bool  seek 
)

Definition at line 2605 of file AdornedRulerPanel.cpp.

2607{
2608 ADCChanger changer(dc); // Undo pen and brush changes at function exit
2609
2610 wxPoint tri[ 3 ];
2611 if (seek) {
2612 auto height = IndicatorHeightForWidth(width);
2613 // Make four triangles
2614 const int TriangleWidth = width * 3 / 8;
2615
2616 // Double-double headed, left-right
2617 auto yy = ShowingScrubRuler()
2618 ? mScrubZone.y
2619 : (mInner.GetBottom() + 1) - 1 /* bevel */ - height;
2620 tri[ 0 ].x = xx - IndicatorOffset;
2621 tri[ 0 ].y = yy;
2622 tri[ 1 ].x = xx - IndicatorOffset;
2623 tri[ 1 ].y = yy + height;
2624 tri[ 2 ].x = xx - TriangleWidth;
2625 tri[ 2 ].y = yy + height / 2;
2626 dc->DrawPolygon( 3, tri );
2627
2628 tri[ 0 ].x -= TriangleWidth;
2629 tri[ 1 ].x -= TriangleWidth;
2630 tri[ 2 ].x -= TriangleWidth;
2631 dc->DrawPolygon( 3, tri );
2632
2633 tri[ 0 ].x = tri[ 1 ].x = xx + IndicatorOffset;
2634 tri[ 2 ].x = xx + TriangleWidth;
2635 dc->DrawPolygon( 3, tri );
2636
2637
2638 tri[ 0 ].x += TriangleWidth;
2639 tri[ 1 ].x += TriangleWidth;
2640 tri[ 2 ].x += TriangleWidth;
2641 dc->DrawPolygon( 3, tri );
2642 }
2643 else if (scrub) {
2644 auto height = IndicatorHeightForWidth(width);
2645 const int IndicatorHalfWidth = width / 2;
2646
2647 // Double headed, left-right
2648 auto yy = ShowingScrubRuler()
2649 ? mScrubZone.y
2650 : (mInner.GetBottom() + 1) - 1 /* bevel */ - height;
2651 tri[ 0 ].x = xx - IndicatorOffset;
2652 tri[ 0 ].y = yy;
2653 tri[ 1 ].x = xx - IndicatorOffset;
2654 tri[ 1 ].y = yy + height;
2655 tri[ 2 ].x = xx - IndicatorHalfWidth;
2656 tri[ 2 ].y = yy + height / 2;
2657 dc->DrawPolygon( 3, tri );
2658 tri[ 0 ].x = tri[ 1 ].x = xx + IndicatorOffset;
2659 tri[ 2 ].x = xx + IndicatorHalfWidth;
2660 dc->DrawPolygon( 3, tri );
2661 }
2662}
@ IndicatorOffset
int IndicatorHeightForWidth(int width)

References IndicatorHeightForWidth(), IndicatorOffset, mInner, mScrubZone, and ShowingScrubRuler().

Here is the call graph for this function:

◆ DoDrawSelection()

void AdornedRulerPanel::DoDrawSelection ( wxDC *  dc,
const wxRect &  rectS,
const wxRect &  rectL,
const wxRect &  rectR 
)
private

Definition at line 2580 of file AdornedRulerPanel.cpp.

2582{
2583 dc->SetBrush( wxBrush{ AlphaBlend(
2585 dc->SetPen( *wxTRANSPARENT_PEN );
2586 dc->DrawRectangle( rectS.Intersect(rectL) );
2587 dc->DrawRectangle( rectS.Intersect(rectR) );
2588}

References AlphaBlend(), SelectionOpacity, TimelineBackgroundColor(), and TimelineSelectionColor().

Referenced by OnPaint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoIdle()

void AdornedRulerPanel::DoIdle ( )
private

Definition at line 1500 of file AdornedRulerPanel.cpp.

1501{
1502 bool changed = UpdateRects();
1503 changed = SetPanelSize() || changed;
1504
1505 auto &project = *mProject;
1506 auto &viewInfo = ViewInfo::Get( project );
1507 const auto &selectedRegion = viewInfo.selectedRegion;
1508 const auto &playRegion = viewInfo.playRegion;
1509
1510 changed = changed
1511 || mLastDrawnSelectedRegion != selectedRegion
1512 || mLastDrawnPlayRegion != std::pair{
1513 playRegion.GetLastActiveStart(), playRegion.GetLastActiveEnd() }
1514 || mLastDrawnH != viewInfo.hpos
1515 || mLastDrawnZoom != viewInfo.GetZoom()
1516 || mLastPlayRegionActive != viewInfo.playRegion.Active()
1517 ;
1518 if (changed)
1519 // Cause ruler redraw anyway, because we may be zooming or scrolling,
1520 // showing or hiding the scrub bar, etc.
1521 Refresh();
1522}
std::pair< double, double > mLastDrawnPlayRegion
SelectedRegion mLastDrawnSelectedRegion

References ViewInfo::Get(), mLastDrawnH, mLastDrawnPlayRegion, mLastDrawnSelectedRegion, mLastDrawnZoom, mLastPlayRegionActive, mProject, project, Refresh(), SetPanelSize(), and UpdateRects().

Referenced by OnIdle().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoSelectionChange()

void AdornedRulerPanel::DoSelectionChange ( const SelectedRegion selectedRegion)
private

Definition at line 1634 of file AdornedRulerPanel.cpp.

1636{
1637
1638 auto gAudioIO = AudioIOBase::Get();
1639 if ( !ViewInfo::Get( *mProject ).playRegion.Active() ) {
1640 // "Inactivated" play region follows the selection.
1641 SetPlayRegion( selectedRegion.t0(), selectedRegion.t1() );
1642 }
1643}
void SetPlayRegion(double playRegionStart, double playRegionEnd)
static AudioIOBase * Get()
Definition: AudioIOBase.cpp:94
bool Active() const
Definition: ViewInfo.h:125
double t1() const
double t0() const
PlayRegion playRegion
Definition: ViewInfo.h:217

References PlayRegion::Active(), AudioIOBase::Get(), ViewInfo::Get(), ViewInfo::playRegion, SetPlayRegion(), SelectedRegion::t0(), and SelectedRegion::t1().

Referenced by AdornedRulerPanel(), OnAudioStartStop(), and OnSelectionChange().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DragSelection()

void AdornedRulerPanel::DragSelection ( AudacityProject project)
staticprivate

Definition at line 2284 of file AdornedRulerPanel.cpp.

2285{
2286 auto &viewInfo = ViewInfo::Get( project );
2287 const auto &playRegion = viewInfo.playRegion;
2288 auto &selectedRegion = viewInfo.selectedRegion;
2289 selectedRegion.setT0(playRegion.GetStart(), false);
2290 selectedRegion.setT1(playRegion.GetEnd(), true);
2291}

References ViewInfo::Get(), and project.

Referenced by AdornedRulerPanel::PlayRegionAdjustingHandle::Drag().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DrawBothOverlays()

void AdornedRulerPanel::DrawBothOverlays ( )

Definition at line 2149 of file AdornedRulerPanel.cpp.

2150{
2151 auto pCellularPanel =
2152 dynamic_cast<CellularPanel*>( &GetProjectPanel( *GetProject() ) );
2153 if ( !pCellularPanel ) {
2154 wxASSERT( false );
2155 }
2156 else
2157 pCellularPanel->DrawOverlays( false );
2158 DrawOverlays( false );
2159}
void DrawOverlays(bool repaint_all, wxDC *pDC=nullptr)

References OverlayPanel::DrawOverlays(), GetProject(), and GetProjectPanel().

Referenced by OnLeave(), and ProcessUIHandleResult().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DrawSelection()

void AdornedRulerPanel::DrawSelection ( )

Definition at line 2474 of file AdornedRulerPanel.cpp.

2475{
2476 Refresh();
2477}

References Refresh().

Referenced by TrackPanel::UpdateSelectionDisplay().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Get() [1/2]

AdornedRulerPanel & AdornedRulerPanel::Get ( AudacityProject project)
static

Definition at line 1265 of file AdornedRulerPanel.cpp.

1266{
1268}
This is an Audacity Specific ruler panel which additionally has border, selection markers,...
Subclass & Get(const RegisteredFactory &key)
Get reference to an attachment, creating on demand if not present, down-cast it to Subclass.
Definition: ClientData.h:318

References ClientData::Site< Host, ClientData, ObjectCopyingPolicy, Pointer, ObjectLockingPolicy, RegistryLockingPolicy >::Get(), GetAttachedWindows(), project, and anonymous_namespace{AdornedRulerPanel.cpp}::sKey.

Referenced by AdornedRulerPanel::PlayRegionAdjustingHandle::Drag(), AdornedRulerPanel::TrackPanelGuidelineOverlay::Draw(), EditCursorOverlay::Draw(), PlayIndicatorOverlayBase::Draw(), Get(), anonymous_namespace{PlayIndicatorOverlay.cpp}::GetIndicatorBitmap(), AdornedRulerPanel::ScrubbingRulerOverlay::GetRuler(), anonymous_namespace{TimelineMenus.cpp}::GetTimeDisplayMode(), AdornedRulerPanel::PlayRegionAdjustingHandle::HasEscape(), InitProjectWindow(), anonymous_namespace{SelectMenus.cpp}::MoveWhenAudioInactive(), anonymous_namespace{EditMenus.cpp}::OnCut(), PlayIndicatorOverlay::OnTimer(), ScrubbingOverlay::OnTimer(), anonymous_namespace{AdornedRulerPanel.cpp}::OnTogglePinnedHead(), AudacityMirProject::ReconfigureMusicGrid(), ScrubForwarder::ScrubForwarder(), anonymous_namespace{TimelineMenus.cpp}::SetTimeDisplayMode(), AdornedRulerPanel::PlayRegionAdjustingHandle::SnappedTime(), AdornedRulerPanel::PlayRegionAdjustingHandle::SnappedTimes(), AdornedRulerPanel::CommonRulerHandle::StartPlay(), AdornedRulerPanel::PlayRegionAdjustingHandle::Unsnap(), AdornedRulerPanel::TrackPanelGuidelineOverlay::Update(), and AudacityMirProject::ViewIsBeatsAndMeasures().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Get() [2/2]

const AdornedRulerPanel & AdornedRulerPanel::Get ( const AudacityProject project)
static

Definition at line 1270 of file AdornedRulerPanel.cpp.

1272{
1273 return Get( const_cast< AudacityProject & >( project ) );
1274}
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...
Definition: Project.h:90

References Get(), and project.

Here is the call graph for this function:

◆ GetFocusedCell()

std::shared_ptr< TrackPanelCell > AdornedRulerPanel::GetFocusedCell ( )
overrideprivatevirtual

Implements CellularPanel.

Definition at line 2773 of file AdornedRulerPanel.cpp.

2774{
2775 // No switching of focus yet to the other, scrub zone
2776 return mQPCell;
2777}

References mQPCell.

◆ GetInnerRect()

wxRect AdornedRulerPanel::GetInnerRect ( ) const
inline

Definition at line 58 of file AdornedRulerPanel.h.

58{ return mInner; }

Referenced by anonymous_namespace{PlayIndicatorOverlay.cpp}::GetIndicatorBitmap().

Here is the caller graph for this function:

◆ GetMaxSize()

void AdornedRulerPanel::GetMaxSize ( wxCoord *  width,
wxCoord *  height 
)

Definition at line 2691 of file AdornedRulerPanel.cpp.

2692{
2693 mRuler.GetMaxSize(width, height);
2694}
void GetMaxSize(wxCoord *width, wxCoord *height)
Definition: Ruler.cpp:612

References Ruler::GetMaxSize(), and mRuler.

Here is the call graph for this function:

◆ GetProject()

AudacityProject * AdornedRulerPanel::GetProject ( ) const
overridevirtual

Implements CellularPanel.

Definition at line 2768 of file AdornedRulerPanel.cpp.

2769{
2770 return mProject;
2771}

References mProject.

Referenced by ClearPlayRegion(), CreateOverlays(), DrawBothOverlays(), HandleSnapping(), OnPaint(), SetPlayRegion(), ShowingScrubRuler(), ShowMenu(), and UpdateStatusMessage().

Here is the caller graph for this function:

◆ GetRulerHeight() [1/2]

int AdornedRulerPanel::GetRulerHeight ( )
inline

Definition at line 56 of file AdornedRulerPanel.h.

References GetRulerHeight().

Referenced by GetRulerHeight(), ReCreateButtons(), and SetPanelSize().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetRulerHeight() [2/2]

int AdornedRulerPanel::GetRulerHeight ( bool  showScrubBar)
static

Definition at line 2590 of file AdornedRulerPanel.cpp.

2591{
2592 return ProperRulerHeight + (showScrubBar ? ScrubHeight : 0);
2593}
@ ProperRulerHeight
@ ScrubHeight

References ProperRulerHeight, and ScrubHeight.

◆ GetTimeDisplayMode()

TimeDisplayMode AdornedRulerPanel::GetTimeDisplayMode ( ) const

Definition at line 2828 of file AdornedRulerPanel.cpp.

2829{
2830 return mTimeDisplayMode;
2831}

References mTimeDisplayMode.

Referenced by AudacityMirProject::ViewIsBeatsAndMeasures().

Here is the caller graph for this function:

◆ HandleQPClick()

void AdornedRulerPanel::HandleQPClick ( wxMouseEvent &  event,
wxCoord  mousePosX 
)
private

◆ HandleQPDrag()

void AdornedRulerPanel::HandleQPDrag ( wxMouseEvent &  event,
wxCoord  mousePosX 
)
private

◆ HandleQPRelease()

void AdornedRulerPanel::HandleQPRelease ( wxMouseEvent &  event)
private

◆ HandleSnapping()

void AdornedRulerPanel::HandleSnapping ( size_t  index)
private

Definition at line 2293 of file AdornedRulerPanel.cpp.

2294{
2295 // Play region dragging can snap to selection boundaries
2296 const auto &selectedRegion = ViewInfo::Get(*GetProject()).selectedRegion;
2297 SnapPointArray candidates;
2299 candidates = {
2300 SnapPoint{ selectedRegion.t0() },
2301 SnapPoint{ selectedRegion.t1() },
2302 };
2303 SnapManager snapManager{ *mProject, *mTracks, *mViewInfo, move(candidates) };
2304 auto results = snapManager.Snap(nullptr, mQuickPlayPos[index], false);
2305 mQuickPlayPos[index] = results.outTime;
2306 mIsSnapped[index] = results.Snapped();
2307}
std::vector< SnapPoint > SnapPointArray
Definition: Snap.h:43
bool mIsSnapped[MAX_GUIDES]
double mQuickPlayPos[MAX_GUIDES]
Definition: Snap.h:31

References ViewInfo::Get(), GetProject(), mIsSnapped, mPlayRegionDragsSelection, mProject, mQuickPlayPos, mTracks, CellularPanel::mViewInfo, and ViewInfo::selectedRegion.

Referenced by UpdateQuickPlayPos().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ InvalidateRuler()

void AdornedRulerPanel::InvalidateRuler ( )

Definition at line 1423 of file AdornedRulerPanel.cpp.

1424{
1426}
void Invalidate()
Definition: Ruler.cpp:317

References Ruler::Invalidate(), and mRuler.

Here is the call graph for this function:

◆ IsWithinMarker()

bool AdornedRulerPanel::IsWithinMarker ( int  mousePosX,
double  markerTime 
)
private

Definition at line 1712 of file AdornedRulerPanel.cpp.

1713{
1714 if (markerTime < 0)
1715 return false;
1716
1717 int pixelPos = Time2Pos(markerTime);
1718 int boundLeft = pixelPos - SELECT_TOLERANCE_PIXEL;
1719 int boundRight = pixelPos + SELECT_TOLERANCE_PIXEL;
1720
1721 return mousePosX >= boundLeft && mousePosX < boundRight;
1722}
#define SELECT_TOLERANCE_PIXEL
int Time2Pos(double t, bool ignoreFisheye=false) const

References SELECT_TOLERANCE_PIXEL, and Time2Pos().

Here is the call graph for this function:

◆ OnAudioStartStop()

void AdornedRulerPanel::OnAudioStartStop ( AudioIOEvent  evt)
private

Definition at line 1524 of file AdornedRulerPanel.cpp.

1525{
1527 return;
1528 if ( evt.type == AudioIOEvent::CAPTURE ) {
1529 if (evt.on)
1530 {
1531 mIsRecording = true;
1532 this->CellularPanel::CancelDragging( false );
1534
1536 }
1537 else {
1538 mIsRecording = false;
1540 }
1541 }
1542
1543 if ( !evt.on )
1544 // So that the play region is updated
1546}
bool CancelDragging(bool escaping)
bool on
Definition: AudioIO.h:67
enum AudioIOEvent::Type type

References CellularPanel::CancelDragging(), AudioIOEvent::CAPTURE, CellularPanel::ClearTargets(), DoSelectionChange(), mIsRecording, AudioIOEvent::MONITOR, CellularPanel::mViewInfo, AudioIOEvent::on, AudioIOEvent::PAUSE, ViewInfo::selectedRegion, AudioIOEvent::type, and UpdateButtonStates().

Referenced by AdornedRulerPanel().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnAutoScroll()

void AdornedRulerPanel::OnAutoScroll ( wxCommandEvent &  evt)
private

Definition at line 2330 of file AdornedRulerPanel.cpp.

2331{
2333 gPrefs->Write(wxT("/GUI/AutoScroll"), false);
2334 else
2335 gPrefs->Write(wxT("/GUI/AutoScroll"), true);
2336
2337 gPrefs->Flush();
2338
2340}
static void Broadcast(int id=0)
Call this static function to notify all PrefsListener objects.
Definition: Prefs.cpp:128
bool bUpdateTrackIndicator
Definition: ViewInfo.h:227
static int UpdateScrollPrefsID()
Definition: ViewInfo.cpp:304
virtual bool Flush() noexcept=0
virtual bool Write(const wxString &key, bool value)=0

References PrefsListener::Broadcast(), ViewInfo::bUpdateTrackIndicator, audacity::BasicSettings::Flush(), gPrefs, CellularPanel::mViewInfo, ViewInfo::UpdateScrollPrefsID(), audacity::BasicSettings::Write(), and wxT().

Here is the call graph for this function:

◆ OnClearPlayRegion()

void AdornedRulerPanel::OnClearPlayRegion ( wxCommandEvent &  evt)
private

Definition at line 2348 of file AdornedRulerPanel.cpp.

2349{
2351}
void ClearPlayRegion(AudacityProject &project)

References SelectUtilities::ClearPlayRegion(), and mProject.

Here is the call graph for this function:

◆ OnIdle()

void AdornedRulerPanel::OnIdle ( wxIdleEvent &  evt)
private

Definition at line 1494 of file AdornedRulerPanel.cpp.

1495{
1496 evt.Skip();
1497 DoIdle();
1498}

References DoIdle().

Here is the call graph for this function:

◆ OnLeave()

void AdornedRulerPanel::OnLeave ( wxMouseEvent &  evt)
private

Definition at line 1613 of file AdornedRulerPanel.cpp.

1614{
1615 evt.Skip();
1616 CallAfter([this]{
1618 });
1619}

References BasicUI::CallAfter(), and DrawBothOverlays().

Here is the call graph for this function:

◆ OnPaint()

void AdornedRulerPanel::OnPaint ( wxPaintEvent &  evt)
private

Definition at line 1548 of file AdornedRulerPanel.cpp.

1549{
1550 const auto &viewInfo = ViewInfo::Get( *GetProject() );
1551 const auto &playRegion = viewInfo.playRegion;
1552 const auto playRegionBounds = std::pair{
1553 playRegion.GetLastActiveStart(), playRegion.GetLastActiveEnd() };
1554 mLastDrawnH = viewInfo.hpos;
1555 mLastDrawnZoom = viewInfo.GetZoom();
1556 mLastDrawnPlayRegion = playRegionBounds;
1557 mLastDrawnSelectedRegion = viewInfo.selectedRegion;
1558 // To do, note other fisheye state when we have that
1559
1560 wxPaintDC dc(this);
1561
1562 auto &backDC = GetBackingDCForRepaint();
1563
1564 DoDrawBackground(&backDC);
1565
1566 // Find play region rectangle, selected rectangle, and their overlap
1567 const auto rectP = PlayRegionRectangle(),
1568 rectS = SelectedRegionRectangle(),
1569 rectO = rectP.Intersect(rectS);
1570
1571 // What's left and right of the overlap? Assume same tops and bottoms
1572 const auto top = rectP.GetTop(),
1573 bottom = rectP.GetBottom();
1574 wxRect rectL = mInner;
1575 wxRect rectR = {};
1576 if (!rectO.IsEmpty()) {
1577 rectR = { wxPoint{ rectO.GetRight() + 1, top }, rectL.GetBottomRight() };
1578 rectL = { rectL.GetTopLeft(), wxPoint{ rectO.GetLeft() - 1, bottom } };
1579 }
1580
1581 DoDrawPlayRegion(&backDC, rectP, rectL, rectR);
1582 DoDrawOverlap(&backDC, rectO);
1583 DoDrawSelection(&backDC, rectS, rectL, rectR);
1584
1585 DoDrawPlayRegionLimits(&backDC, rectP);
1586
1587 DoDrawMarks(&backDC, true);
1588
1589 DoDrawEdge(&backDC);
1590
1591 DisplayBitmap(dc);
1592
1593 // Stroke extras direct to the client area,
1594 // maybe outside of the damaged area
1595 // As with TrackPanel, do not make a NEW wxClientDC or else Mac flashes badly!
1596 dc.DestroyClippingRegion();
1597 DrawOverlays(true, &dc);
1598}
wxRect PlayRegionRectangle() const
void DoDrawOverlap(wxDC *dc, const wxRect &rect)
wxRect SelectedRegionRectangle() const
void DoDrawMarks(wxDC *dc, bool)
void DoDrawPlayRegion(wxDC *dc, const wxRect &rectP, const wxRect &rectL, const wxRect &rectR)
void DoDrawSelection(wxDC *dc, const wxRect &rectS, const wxRect &rectL, const wxRect &rectR)
void DoDrawBackground(wxDC *dc)
void DoDrawPlayRegionLimits(wxDC *dc, const wxRect &rect)
void DoDrawEdge(wxDC *dc)
wxDC & GetBackingDCForRepaint()
Definition: BackedPanel.cpp:35
void DisplayBitmap(wxDC &dc)
Definition: BackedPanel.cpp:65

References BackedPanel::DisplayBitmap(), DoDrawBackground(), DoDrawEdge(), DoDrawMarks(), DoDrawOverlap(), DoDrawPlayRegion(), DoDrawPlayRegionLimits(), DoDrawSelection(), OverlayPanel::DrawOverlays(), ViewInfo::Get(), BackedPanel::GetBackingDCForRepaint(), GetProject(), mInner, mLastDrawnH, mLastDrawnPlayRegion, mLastDrawnSelectedRegion, mLastDrawnZoom, PlayRegionRectangle(), and SelectedRegionRectangle().

Here is the call graph for this function:

◆ OnPinnedButton()

void AdornedRulerPanel::OnPinnedButton ( wxCommandEvent &  event)
private

Definition at line 2182 of file AdornedRulerPanel.cpp.

2183{
2185}
void ShowContextMenu(MenuChoice choice, const wxPoint *pPosition)

References QuickPlay, and ShowContextMenu().

Here is the call graph for this function:

◆ OnSelectionChange()

void AdornedRulerPanel::OnSelectionChange ( Observer::Message  )
private

Definition at line 1628 of file AdornedRulerPanel.cpp.

1629{
1630 auto &selectedRegion = mViewInfo->selectedRegion;
1631 DoSelectionChange( selectedRegion );
1632}

References DoSelectionChange(), CellularPanel::mViewInfo, and ViewInfo::selectedRegion.

Referenced by AdornedRulerPanel().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnSetPlayRegionToSelection()

void AdornedRulerPanel::OnSetPlayRegionToSelection ( wxCommandEvent &  evt)
private

Definition at line 2353 of file AdornedRulerPanel.cpp.

2354{
2356}
void SetPlayRegionToSelection(AudacityProject &project)

References mProject, and SelectUtilities::SetPlayRegionToSelection().

Here is the call graph for this function:

◆ OnSize()

void AdornedRulerPanel::OnSize ( wxSizeEvent &  evt)
private

Definition at line 1600 of file AdornedRulerPanel.cpp.

1601{
1602 mOuter = GetClientRect();
1603 if (mOuter.GetWidth() == 0 || mOuter.GetHeight() == 0)
1604 {
1605 return;
1606 }
1607
1608 UpdateRects();
1609
1611}
void OnSize(wxSizeEvent &event)
Definition: BackedPanel.cpp:71

References mOuter, BackedPanel::OnSize(), and UpdateRects().

Here is the call graph for this function:

◆ OnSyncSelToQuickPlay()

void AdornedRulerPanel::OnSyncSelToQuickPlay ( wxCommandEvent &  evt)
private

Definition at line 2323 of file AdornedRulerPanel.cpp.

2324{
2326 gPrefs->Write(wxT("/QuickPlay/DragSelection"), mPlayRegionDragsSelection);
2327 gPrefs->Flush();
2328}

References audacity::BasicSettings::Flush(), gPrefs, mPlayRegionDragsSelection, audacity::BasicSettings::Write(), and wxT().

Here is the call graph for this function:

◆ OnThemeChange()

void AdornedRulerPanel::OnThemeChange ( struct ThemeChangeMessage  message)
private

Definition at line 1621 of file AdornedRulerPanel.cpp.

1622{
1623 if (message.appearance)
1624 return;
1626}
std::optional< PreferredSystemAppearance > appearance
Definition: Theme.h:111

References ThemeChangeMessage::appearance, and ReCreateButtons().

Referenced by AdornedRulerPanel().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnTimelineFormatChange()

void AdornedRulerPanel::OnTimelineFormatChange ( wxCommandEvent &  evt)
private

Definition at line 2309 of file AdornedRulerPanel.cpp.

2310{
2311 int id = event.GetId();
2312 TimeDisplayMode changeFlag = mTimeDisplayMode;
2313 wxASSERT(id == OnMinutesAndSecondsID || id == OnBeatsAndMeasuresID);
2316
2318
2319 if (changeFlag != mTimeDisplayMode)
2320 Refresh();
2321}
@ OnBeatsAndMeasuresID
@ OnMinutesAndSecondsID
TimeDisplayMode
bool WriteEnum(TimeDisplayMode value)

References BeatsAndMeasures, MinutesAndSeconds, mTimeDisplayMode, OnBeatsAndMeasuresID, OnMinutesAndSecondsID, Refresh(), TimeDisplayModePreference, and TimeDisplayModeSetting::WriteEnum().

Here is the call graph for this function:

◆ OnTogglePinnedState()

void AdornedRulerPanel::OnTogglePinnedState ( wxCommandEvent &  event)
private

Definition at line 2187 of file AdornedRulerPanel.cpp.

2188{
2191}

References TogglePinnedHead(), and UpdateButtonStates().

Here is the call graph for this function:

◆ OnTogglePlayRegion()

void AdornedRulerPanel::OnTogglePlayRegion ( wxCommandEvent &  evt)
private

Definition at line 2343 of file AdornedRulerPanel.cpp.

2344{
2346}
void TogglePlayRegion(AudacityProject &project)

References mProject, and SelectUtilities::TogglePlayRegion().

Here is the call graph for this function:

◆ PlayRegionRectangle()

wxRect AdornedRulerPanel::PlayRegionRectangle ( ) const
private

Definition at line 2479 of file AdornedRulerPanel.cpp.

2480{
2481 const auto &viewInfo = ViewInfo::Get(*mProject);
2482 const auto &playRegion = viewInfo.playRegion;
2483 const auto t0 = playRegion.GetLastActiveStart(),
2484 t1 = playRegion.GetLastActiveEnd();
2485 return RegionRectangle(t0, t1);
2486}
wxRect RegionRectangle(double t0, double t1) const

References ViewInfo::Get(), mProject, and RegionRectangle().

Referenced by OnPaint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Pos2Time()

double AdornedRulerPanel::Pos2Time ( int  p,
bool  ignoreFisheye = false 
) const
private

Definition at line 1698 of file AdornedRulerPanel.cpp.

1699{
1701 , ignoreFisheye
1702 );
1703}
double PositionToTime(int64 position, int64 origin=0, bool ignoreFisheye=false) const
Definition: ZoomInfo.cpp:34

References mLeftOffset, CellularPanel::mViewInfo, and ZoomInfo::PositionToTime().

Referenced by DoDrawMarks(), and UpdateQuickPlayPos().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ProcessUIHandleResult()

void AdornedRulerPanel::ProcessUIHandleResult ( TrackPanelCell pClickedTrack,
TrackPanelCell pLatestCell,
unsigned  refreshResult 
)
overrideprivatevirtual

Implements CellularPanel.

Definition at line 2783 of file AdornedRulerPanel.cpp.

2785{
2786 if (refreshResult & RefreshCode::RefreshAll)
2787 Refresh(); // Overlays will be repainted too
2788 else if (refreshResult & RefreshCode::DrawOverlays)
2789 DrawBothOverlays(); // cheaper redrawing of guidelines only
2790}

References DrawBothOverlays(), RefreshCode::DrawOverlays, Refresh(), and RefreshCode::RefreshAll.

Here is the call graph for this function:

◆ ReCreateButtons()

void AdornedRulerPanel::ReCreateButtons ( )

Definition at line 1381 of file AdornedRulerPanel.cpp.

1382{
1383 // TODO: Should we do this to destroy the grabber??
1384 // Get rid of any children we may have
1385 // DestroyChildren();
1386
1388 SetBackgroundColour(GetBackgroundColour());
1389
1390 for (auto & button : mButtons) {
1391 if (button)
1392 button->Destroy();
1393 button = nullptr;
1394 }
1395
1396 size_t iButton = 0;
1397 // Make the short row of time ruler push buttons.
1398 // Don't bother with sizers. Their sizes and positions are fixed.
1399 // Add a grabber converted to a spacer.
1400 // This makes it visually clearer that the button is a button.
1401
1402 wxPoint position( 12, 0 );
1403
1404 position.x = 12;
1405
1406 auto size = theTheme.ImageSize( bmpRecoloredUpSmall );
1407 size.y = std::min(size.y, GetRulerHeight(false));
1408
1409 const auto button = ToolBar::MakeButton(
1410 this,
1411 bmpRecoloredUpSmall, bmpRecoloredDownSmall,
1412 bmpRecoloredUpHiliteSmall, bmpRecoloredHiliteSmall,
1413 bmpCogwheel, bmpCogwheel, bmpCogwheel,
1414 OnTogglePinnedStateID, position, true, size
1415 );
1416
1417 position.x += size.GetWidth();
1418 mButtons[iButton++] = button;
1419
1421}
@ OnTogglePinnedStateID
wxSize ImageSize(int iIndex)
static AButton * MakeButton(wxWindow *parent, teBmps eUp, teBmps eDown, teBmps eHilite, teBmps eDownHi, teBmps eStandardUp, teBmps eStandardDown, teBmps eDisabled, wxWindowID id, wxPoint placement, bool processdownevents, wxSize size)
Definition: ToolBar.cpp:839
static void MakeButtonBackgroundsSmall()
Definition: ToolBar.cpp:819

References GetRulerHeight(), ThemeBase::ImageSize(), ToolBar::MakeButton(), ToolBar::MakeButtonBackgroundsSmall(), mButtons, min(), OnTogglePinnedStateID, size, theTheme, and UpdateButtonStates().

Referenced by OnThemeChange(), and UpdatePrefs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Refresh()

void AdornedRulerPanel::Refresh ( bool  eraseBackground = true,
const wxRect *  rect = (const wxRect *) NULL 
)
override

Definition at line 1357 of file AdornedRulerPanel.cpp.

1358{
1359 CellularPanel::Refresh( eraseBackground, rect );
1361}
void HandleCursorForPresentMouseState(bool doHit=true)

References BasicUI::CallAfter(), and CellularPanel::HandleCursorForPresentMouseState().

Referenced by AdornedRulerPanel(), ClearPlayRegion(), DoIdle(), DrawSelection(), OnTimelineFormatChange(), ProcessUIHandleResult(), SetPlayRegion(), SetTimeDisplayMode(), UpdatePrefs(), and TrackPanel::UpdateVRulerSize().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ RegionRectangle()

wxRect AdornedRulerPanel::RegionRectangle ( double  t0,
double  t1 
) const
private

Definition at line 2496 of file AdornedRulerPanel.cpp.

2497{
2498 int p0 = -PLAY_REGION_TRIANGLE_SIZE;
2499 int p1 = -PLAY_REGION_TRIANGLE_SIZE;
2500 if (t0 == t1)
2501 // Make the rectangle off-screen horizontally, but set the height
2502 ;
2503 else {
2504 p0 = max(mInner.x, Time2Pos(t0));
2505 p1 = min(mInner.x + mInner.width, Time2Pos(t1));
2506 }
2507
2508 const int left = p0, top = mInner.y, right = p1, bottom = mInner.GetBottom();
2509 return { wxPoint{left, top}, wxPoint{right, bottom} };
2510}
#define PLAY_REGION_TRIANGLE_SIZE

References min(), mInner, PLAY_REGION_TRIANGLE_SIZE, and Time2Pos().

Referenced by PlayRegionRectangle(), and SelectedRegionRectangle().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Root()

std::shared_ptr< TrackPanelNode > AdornedRulerPanel::Root ( )
overrideprivatevirtual

Implements CellularPanel.

Definition at line 2762 of file AdornedRulerPanel.cpp.

2763{
2764 // Root is a throwaway object
2765 return std::make_shared< MainGroup >( *this );
2766}

◆ SelectedRegionRectangle()

wxRect AdornedRulerPanel::SelectedRegionRectangle ( ) const
private

Definition at line 2488 of file AdornedRulerPanel.cpp.

2489{
2490 const auto &viewInfo = ViewInfo::Get(*mProject);
2491 const auto &selectedRegion = viewInfo.selectedRegion;
2492 const auto t0 = selectedRegion.t0(), t1 = selectedRegion.t1();
2493 return RegionRectangle(t0, t1);
2494}

References ViewInfo::Get(), mProject, and RegionRectangle().

Referenced by OnPaint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetFocusedCell()

void AdornedRulerPanel::SetFocusedCell ( )
overrideprivatevirtual

Implements CellularPanel.

Definition at line 2779 of file AdornedRulerPanel.cpp.

2780{
2781}

◆ SetFocusFromKbd()

void AdornedRulerPanel::SetFocusFromKbd ( )
override

Definition at line 2716 of file AdornedRulerPanel.cpp.

2717{
2718 auto temp = TemporarilyAllowFocus();
2719 SetFocus();
2720}
static TempAllowFocus TemporarilyAllowFocus()
void SetFocus(const WindowPlacement &focus)
Set the window that accepts keyboard input.
Definition: BasicUI.h:392

References BasicUI::SetFocus(), and TemporarilyAllowFocus().

Here is the call graph for this function:

◆ SetLeftOffset()

void AdornedRulerPanel::SetLeftOffset ( int  offset)

Definition at line 2595 of file AdornedRulerPanel.cpp.

2596{
2597 if (mLeftOffset != offset) {
2598 mLeftOffset = offset;
2599 mUpdater.SetData(mViewInfo, offset);
2601 }
2602}

References Ruler::Invalidate(), mLeftOffset, mRuler, mUpdater, CellularPanel::mViewInfo, and LinearUpdater::SetData().

Referenced by TrackPanel::UpdateVRulerSize().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetNumGuides()

void AdornedRulerPanel::SetNumGuides ( size_t  nn)

Definition at line 2703 of file AdornedRulerPanel.cpp.

2704{
2705 nn = std::min(nn, MAX_GUIDES);
2706 // If increasing the number of guides, reinitialize newer ones
2707 for (size_t ii = mNumGuides; ii < nn; ++ii) {
2708 mQuickPlayOffset[ii] = 0;
2709 mQuickPlayPosUnsnapped[ii] = 0;
2710 mQuickPlayPos[ii] = 0;
2711 mIsSnapped[ii] = false;
2712 }
2713 mNumGuides = nn;
2714}
double mQuickPlayOffset[MAX_GUIDES]
static constexpr size_t MAX_GUIDES
double mQuickPlayPosUnsnapped[MAX_GUIDES]

References MAX_GUIDES, min(), mIsSnapped, mNumGuides, mQuickPlayOffset, mQuickPlayPos, and mQuickPlayPosUnsnapped.

Here is the call graph for this function:

◆ SetPanelSize()

bool AdornedRulerPanel::SetPanelSize ( )

Definition at line 2135 of file AdornedRulerPanel.cpp.

2136{
2137 const auto oldSize = GetSize();
2138 wxSize size { oldSize.GetWidth(), GetRulerHeight(ShowingScrubRuler()) };
2139 if ( size != oldSize ) {
2140 SetSize(size);
2141 SetMinSize(size);
2142 PostSizeEventToParent();
2143 return true;
2144 }
2145 else
2146 return false;
2147}

References GetRulerHeight(), ShowingScrubRuler(), and size.

Referenced by DoIdle().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetPlayRegion()

void AdornedRulerPanel::SetPlayRegion ( double  playRegionStart,
double  playRegionEnd 
)

Definition at line 2664 of file AdornedRulerPanel.cpp.

2666{
2667 // This is called by AudacityProject to make the play region follow
2668 // the current selection. But while the user is selecting a play region
2669 // with the mouse directly in the ruler, changes from outside are blocked.
2671 return;
2672
2673 auto &viewInfo = ViewInfo::Get( *GetProject() );
2674 auto &playRegion = viewInfo.playRegion;
2675 playRegion.SetTimes( playRegionStart, playRegionEnd );
2676
2677 Refresh();
2678}

References ViewInfo::Get(), GetProject(), mesNone, mMouseEventState, and Refresh().

Referenced by DoSelectionChange().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetTimeDisplayMode()

void AdornedRulerPanel::SetTimeDisplayMode ( TimeDisplayMode  rulerType)

Definition at line 2833 of file AdornedRulerPanel.cpp.

2834{
2835 if (mTimeDisplayMode == type)
2836 return;
2837
2838 mTimeDisplayMode = type;
2840 Refresh();
2841}

References mTimeDisplayMode, Refresh(), TimeDisplayModePreference, and TimeDisplayModeSetting::WriteEnum().

Referenced by AudacityMirProject::ReconfigureMusicGrid().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ShowContextMenu()

void AdornedRulerPanel::ShowContextMenu ( MenuChoice  choice,
const wxPoint *  pPosition 
)
private

Definition at line 2359 of file AdornedRulerPanel.cpp.

2361{
2362 wxPoint position;
2363 if(pPosition)
2364 position = *pPosition;
2365 else
2366 {
2367 auto rect = GetRect();
2368 //Old code put menu too low down. y position applied twice.
2369 //position = { rect.GetLeft() + 1, rect.GetBottom() + 1 };
2370
2371 // The cell does not pass in the mouse or button position.
2372 // We happen to know this is the pin/unpin button
2373 // so these magic values 'fix a bug' - but really the cell should
2374 // pass more information to work with in.
2375 position = { rect.GetLeft() + 38, rect.GetHeight()/2 + 1 };
2376 }
2377
2378 switch (choice) {
2380 ShowMenu(position);
2382 break;
2383 case MenuChoice::Scrub:
2384 ShowScrubMenu(position); break;
2385 default:
2386 return;
2387 }
2388}
void ShowScrubMenu(const wxPoint &pos)
void ShowMenu(const wxPoint &pos)

References QuickPlay, Scrub, ShowMenu(), ShowScrubMenu(), and UpdateButtonStates().

Referenced by OnPinnedButton().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ShowingScrubRuler()

bool AdornedRulerPanel::ShowingScrubRuler ( ) const

Definition at line 2755 of file AdornedRulerPanel.cpp.

2756{
2757 auto &scrubber = Scrubber::Get( *GetProject() );
2758 return scrubber.ShowsBar();
2759}
static Scrubber & Get(AudacityProject &project)
Definition: Scrubbing.cpp:186

References Scrubber::Get(), and GetProject().

Referenced by AdornedRulerPanel::Subgroup::Children(), DoDrawBackground(), DoDrawScrubIndicator(), SetPanelSize(), and UpdateRects().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ShowMenu()

void AdornedRulerPanel::ShowMenu ( const wxPoint &  pos)
private

Definition at line 2215 of file AdornedRulerPanel.cpp.

2216{
2217 const auto &viewInfo = ViewInfo::Get( *GetProject() );
2218 const auto &playRegion = viewInfo.playRegion;
2219 wxMenu rulerMenu;
2220
2221 {
2222 auto item = rulerMenu.AppendRadioItem(OnMinutesAndSecondsID,
2223 _("Minutes and Seconds"));
2225 }
2226
2227 {
2228 auto item = rulerMenu.AppendRadioItem(OnBeatsAndMeasuresID,
2229 _("Beats and Measures"));
2231 }
2232
2233 rulerMenu.AppendSeparator();
2234
2235 auto pDrag = rulerMenu.AppendCheckItem(OnSyncQuickPlaySelID, _("Setting a loop region also makes an audio selection"));
2236 pDrag->Check(mPlayRegionDragsSelection && playRegion.Active());
2237 pDrag->Enable(playRegion.Active());
2238
2239 {
2240 auto item = rulerMenu.AppendCheckItem(OnTogglePlayRegionID,
2242 item->Check(playRegion.Active());
2243 }
2244
2245 {
2246 auto item = rulerMenu.Append(OnClearPlayRegionID,
2247 /* i18n-hint Clear is a verb */
2248 _("Clear Loop"));
2249 }
2250
2251 {
2252 auto item = rulerMenu.Append(OnSetPlayRegionToSelectionID,
2253 _("Set Loop To Selection"));
2254 }
2255
2256 rulerMenu.AppendSeparator();
2257
2258 rulerMenu.AppendCheckItem(OnAutoScrollID, _("Scroll view to playhead"))->
2260
2261 rulerMenu.AppendCheckItem(OnTogglePinnedStateID, _("Continuous scrolling"))->
2263
2264 BasicMenu::Handle{ &rulerMenu }.Popup(
2266 { pos.x, pos.y }
2267 );
2268}
@ OnSetPlayRegionToSelectionID
@ OnClearPlayRegionID
@ OnAutoScrollID
@ OnTogglePlayRegionID
@ OnSyncQuickPlaySelID
#define _(s)
Definition: Internat.h:73
const TranslatableString LoopToggleText
Definition: ViewInfo.cpp:227
void Popup(const BasicUI::WindowPlacement &window, const Point &pos={})
Display the menu at pos, invoke at most one action, then hide it.
Definition: BasicMenu.cpp:209
static bool GetPinnedHeadPreference()
wxString Translation() const
TranslatableString Stripped(unsigned options=MenuCodes) const
non-mutating, constructs another TranslatableString object
Window placement information for wxWidgetsBasicUI can be constructed from a wxWindow pointer.

References _, BeatsAndMeasures, ViewInfo::bUpdateTrackIndicator, ViewInfo::Get(), TracksPrefs::GetPinnedHeadPreference(), GetProject(), LoopToggleText, MinutesAndSeconds, mPlayRegionDragsSelection, mTimeDisplayMode, CellularPanel::mViewInfo, OnAutoScrollID, OnBeatsAndMeasuresID, OnClearPlayRegionID, OnMinutesAndSecondsID, OnSetPlayRegionToSelectionID, OnSyncQuickPlaySelID, OnTogglePinnedStateID, OnTogglePlayRegionID, BasicMenu::Handle::Popup(), TranslatableString::Stripped(), and TranslatableString::Translation().

Referenced by ShowContextMenu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ShowScrubMenu()

void AdornedRulerPanel::ShowScrubMenu ( const wxPoint &  pos)
private

Definition at line 2270 of file AdornedRulerPanel.cpp.

2271{
2272 auto &scrubber = Scrubber::Get( *mProject );
2273 PushEventHandler(&scrubber);
2274 auto cleanup = finally([this]{ PopEventHandler(); });
2275
2276 wxMenu rulerMenu;
2277 scrubber.PopulatePopupMenu(rulerMenu);
2278 BasicMenu::Handle{ &rulerMenu }.Popup(
2280 { pos.x, pos.y }
2281 );
2282}

References Scrubber::Get(), mProject, and BasicMenu::Handle::Popup().

Referenced by ShowContextMenu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ StartQPPlay()

void AdornedRulerPanel::StartQPPlay ( bool  newDefault,
bool  cutPreview,
const double *  pStartTime = nullptr 
)
private

Definition at line 2053 of file AdornedRulerPanel.cpp.

2055{
2056 const double t0 = mTracks->GetStartTime();
2057 const double t1 = mTracks->GetEndTime();
2058 auto &viewInfo = ViewInfo::Get( *mProject );
2059 const auto &playRegion = viewInfo.playRegion;
2060 const auto &selectedRegion = viewInfo.selectedRegion;
2061 const double sel0 = selectedRegion.t0();
2062 const double sel1 = selectedRegion.t1();
2063
2064 // Start / Restart playback on left click.
2065 bool startPlaying = true; // = (playRegion.GetStart() >= 0);
2066
2067 if (startPlaying) {
2068 bool loopEnabled = true;
2069 auto oldStart = std::max(0.0, playRegion.GetStart());
2070 double start = oldStart, end = 0;
2071
2072 if (playRegion.Empty()) {
2073 // Play either a selection or the project.
2074 if (oldStart > sel0 && oldStart < sel1) {
2075 // we are in a selection, so use the selection
2076 start = sel0;
2077 end = sel1;
2078 } // not in a selection, so use the project
2079 else {
2080 start = t0;
2081 end = t1;
2082 }
2083 }
2084 else
2085 end = std::max(start, playRegion.GetEnd());
2086
2087 // Looping a tiny selection may freeze, so just play it once.
2088 loopEnabled = ((end - start) > 0.001)? true : false;
2089
2090 newDefault = (loopEnabled && newDefault);
2091 if (newDefault)
2092 cutPreview = false;
2093 auto options = ProjectAudioIO::GetDefaultOptions(*mProject, newDefault);
2094
2095 if (!cutPreview) {
2096 if (pStartTime)
2097 options.pStartTime.emplace(*pStartTime);
2098 }
2099 else
2100 options.envelope = nullptr;
2101
2102 auto mode =
2103 cutPreview ? PlayMode::cutPreviewPlay
2104 : newDefault ? PlayMode::loopedPlay
2106
2107 // Stop only after deciding where to start again, because an event
2108 // callback may change the play region back to the selection
2109 auto &projectAudioManager = ProjectAudioManager::Get( *mProject );
2110 projectAudioManager.Stop();
2111
2112 // Don't change play region, assume caller set it as needed
2113 // playRegion.SetTimes( start, end );
2114 // Refresh();
2115
2116 projectAudioManager.PlayPlayRegion((SelectedRegion(start, end)),
2117 options, mode,
2118 false);
2119
2120 }
2121}
@ cutPreviewPlay
static AudioIOStartStreamOptions GetDefaultOptions(AudacityProject &project, bool newDefaults=false)
Invoke the global hook, supplying a default argument.
Defines a selected portion of a project.
double GetEndTime() const
Return the greatest end time of the tracks, or 0 when no tracks.
Definition: Track.cpp:784
double GetStartTime() const
Return the least start time of the tracks, or 0 when no tracks.
Definition: Track.cpp:778
const char * end(const char *str) noexcept
Definition: StringUtils.h:106

References cutPreviewPlay, details::end(), ViewInfo::Get(), ProjectAudioManager::Get(), ProjectAudioIO::GetDefaultOptions(), TrackList::GetEndTime(), TrackList::GetStartTime(), loopedPlay, mProject, mTracks, and normalPlay.

Here is the call graph for this function:

◆ TemporarilyAllowFocus()

auto AdornedRulerPanel::TemporarilyAllowFocus ( )
static

Definition at line 2698 of file AdornedRulerPanel.cpp.

2698 {
2699 s_AcceptsFocus = true;
2700 return TempAllowFocus{ &s_AcceptsFocus };
2701}
std::unique_ptr< bool, Resetter > TempAllowFocus

Referenced by SetFocusFromKbd().

Here is the caller graph for this function:

◆ Time2Pos()

int AdornedRulerPanel::Time2Pos ( double  t,
bool  ignoreFisheye = false 
) const
private

Definition at line 1705 of file AdornedRulerPanel.cpp.

1706{
1708 , ignoreFisheye
1709 );
1710}
int64 TimeToPosition(double time, int64 origin=0, bool ignoreFisheye=false) const
STM: Converts a project time to screen x position.
Definition: ZoomInfo.cpp:44

References mLeftOffset, CellularPanel::mViewInfo, and ZoomInfo::TimeToPosition().

Referenced by IsWithinMarker(), and RegionRectangle().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ TogglePinnedHead()

void AdornedRulerPanel::TogglePinnedHead ( )

Definition at line 2813 of file AdornedRulerPanel.cpp.

2814{
2818
2819 auto &project = *mProject;
2820 // Update button image
2822
2823 auto &scrubber = Scrubber::Get( project );
2824 if (scrubber.HasMark())
2825 scrubber.SetScrollScrubbing(value);
2826}
static void ModifyAllProjectToolbarMenus()
static void SetPinnedHeadPreference(bool value, bool flush=false)

References Scrubber::Get(), TracksPrefs::GetPinnedHeadPreference(), ToolManager::ModifyAllProjectToolbarMenus(), mProject, project, TracksPrefs::SetPinnedHeadPreference(), and UpdateButtonStates().

Referenced by anonymous_namespace{AdornedRulerPanel.cpp}::OnTogglePinnedHead(), and OnTogglePinnedState().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdateButtonStates()

void AdornedRulerPanel::UpdateButtonStates ( )

Definition at line 2161 of file AdornedRulerPanel.cpp.

2162{
2163 auto common = [this](
2164 AButton &button, const CommandID &commandName, const TranslatableString &label) {
2165 ComponentInterfaceSymbol command{ commandName, label };
2166 ToolBar::SetButtonToolTip( *mProject, button, &command, 1u );
2167 button.SetLabel( Verbatim( button.GetToolTipText() ) );
2168
2169 button.UpdateStatus();
2170 };
2171
2172 {
2173 auto timelineOptionsButton = static_cast<AButton*>(FindWindow(OnTogglePinnedStateID));
2174 timelineOptionsButton->PopUp();
2175 // Bug 1584: Tooltip now shows what clicking will do.
2176 // Bug 2357: Action of button (and hence tooltip wording) updated.
2177 const auto label = XO("Timeline Options");
2178 common(*timelineOptionsButton, wxT("PinnedHead"), label);
2179 }
2180}
TranslatableString label
Definition: TagsEditor.cpp:165
TranslatableString Verbatim(wxString str)
Require calls to the one-argument constructor to go through this distinct global function name.
A wxButton with mouse-over behaviour.
Definition: AButton.h:104
void UpdateStatus()
Definition: AButton.cpp:522
void PopUp()
Definition: AButton.cpp:652
void SetLabel(const TranslatableString &label)
Definition: AButton.cpp:205
ComponentInterfaceSymbol pairs a persistent string identifier used internally with an optional,...
static void SetButtonToolTip(AudacityProject &project, AButton &button, const ComponentInterfaceSymbol commands[], size_t nCommands)
Definition: ToolBar.cpp:934
Holds a msgid for the translation catalog; may also bind format arguments.

References label, mProject, OnTogglePinnedStateID, AButton::PopUp(), ToolBar::SetButtonToolTip(), AButton::SetLabel(), AButton::UpdateStatus(), Verbatim(), wxT(), and XO().

Referenced by OnAudioStartStop(), OnTogglePinnedState(), ReCreateButtons(), ShowContextMenu(), TogglePinnedHead(), and UpdatePrefs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdatePrefs()

void AdornedRulerPanel::UpdatePrefs ( )
overridevirtual

Implements PrefsListener.

Definition at line 1363 of file AdornedRulerPanel.cpp.

1364{
1365 if (mNeedButtonUpdate) {
1366 // Visit this block once only in the lifetime of this panel
1367 mNeedButtonUpdate = false;
1368 // Do this first time setting of button status texts
1369 // when we are sure the CommandManager is initialized.
1371 }
1372
1373 // Update button texts for language change
1375
1377 Refresh();
1378 // Update();
1379}

References mNeedButtonUpdate, mTimeDisplayMode, EnumSetting< Enum >::ReadEnum(), ReCreateButtons(), Refresh(), TimeDisplayModePreference, and UpdateButtonStates().

Referenced by AdornedRulerPanel().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdateQuickPlayPos()

void AdornedRulerPanel::UpdateQuickPlayPos ( wxCoord &  mousePosX)

Definition at line 2193 of file AdornedRulerPanel.cpp.

2194{
2195 // Invoked for mouse-over preview events, or dragging, or scrub position
2196 // polling updates. Remember x coordinates, converted to times, for
2197 // drawing of guides.
2198
2199 // Keep Quick-Play within usable track area. (Dependent on zoom)
2200 const auto &viewInfo = ViewInfo::Get( *mProject );
2201 auto width = viewInfo.GetTracksUsableWidth();
2202 mousePosX = std::max(mousePosX, viewInfo.GetLeftOffset());
2203 mousePosX = std::min(mousePosX, viewInfo.GetLeftOffset() + width - 1);
2204 const auto time = Pos2Time(mousePosX);
2205
2206 for (size_t ii = 0; ii < mNumGuides; ++ii) {
2208 time + mQuickPlayOffset[ii];
2209 HandleSnapping(ii);
2210 }
2211}
void HandleSnapping(size_t index)

References ViewInfo::Get(), HandleSnapping(), min(), mNumGuides, mProject, mQuickPlayOffset, mQuickPlayPos, mQuickPlayPosUnsnapped, and Pos2Time().

Here is the call graph for this function:

◆ UpdateRects()

bool AdornedRulerPanel::UpdateRects ( )
private

Definition at line 1645 of file AdornedRulerPanel.cpp.

1646{
1647 auto inner = mOuter;
1648 wxRect scrubZone;
1649 inner.x += LeftMargin + mLeftOffset;
1650 inner.width -= (LeftMargin + RightMargin + mLeftOffset);
1651
1652 auto top = &inner;
1653 auto bottom = &inner;
1654
1655 if (ShowingScrubRuler()) {
1656 scrubZone = inner;
1657 auto scrubHeight = std::min(scrubZone.height, (int)(ScrubHeight));
1658
1659 int topHeight;
1660#ifdef SCRUB_ABOVE
1661 top = &scrubZone, topHeight = scrubHeight;
1662#else
1663 auto qpHeight = scrubZone.height - scrubHeight;
1664 bottom = &scrubZone, topHeight = qpHeight;
1665 // Increase scrub zone height so that hit testing finds it and
1666 // not QP region, when on bottom 'edge'.
1667 scrubZone.height+=BottomMargin;
1668#endif
1669
1670 top->height = topHeight;
1671 bottom->height -= topHeight;
1672 bottom->y += topHeight;
1673 }
1674
1675 top->y += TopMargin;
1676 top->height -= TopMargin;
1677
1678 bottom->height -= BottomMargin;
1679
1680 if (!ShowingScrubRuler())
1681 scrubZone = inner;
1682
1683 if ( inner == mInner && scrubZone == mScrubZone )
1684 // no changes
1685 return false;
1686
1687 mInner = inner;
1688 mScrubZone = scrubZone;
1689
1690 mRuler.SetBounds(mInner.GetLeft(),
1691 mInner.GetTop(),
1692 mInner.GetRight(),
1693 mInner.GetBottom());
1694
1695 return true;
1696}
@ LeftMargin
@ RightMargin
@ TopMargin
@ BottomMargin
void SetBounds(int left, int top, int right, int bottom)
Definition: Ruler.cpp:304

References BottomMargin, LeftMargin, min(), mInner, mLeftOffset, mOuter, mRuler, mScrubZone, RightMargin, ScrubHeight, Ruler::SetBounds(), ShowingScrubRuler(), and TopMargin.

Referenced by DoIdle(), and OnSize().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdateStatusMessage()

void AdornedRulerPanel::UpdateStatusMessage ( const TranslatableString message)
overrideprivatevirtual

Implements CellularPanel.

Definition at line 2792 of file AdornedRulerPanel.cpp.

2793{
2794 ProjectStatus::Get( *GetProject() ).Set(message);
2795}
static ProjectStatus & Get(AudacityProject &project)
void Set(const TranslatableString &msg, StatusBarField field=MainStatusBarField())

References ProjectStatus::Get(), GetProject(), and ProjectStatus::Set().

Here is the call graph for this function:

Member Data Documentation

◆ mAudioIOSubscription

Observer::Subscription AdornedRulerPanel::mAudioIOSubscription
private

Definition at line 245 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel().

◆ MAX_GUIDES

constexpr size_t AdornedRulerPanel::MAX_GUIDES = 2
staticconstexprprivate

Definition at line 154 of file AdornedRulerPanel.h.

Referenced by SetNumGuides().

◆ mButtons

wxWindow* AdornedRulerPanel::mButtons[3]
private

Definition at line 199 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel(), and ReCreateButtons().

◆ mIndTime

double AdornedRulerPanel::mIndTime
private

Definition at line 152 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel().

◆ mInner

wxRect AdornedRulerPanel::mInner
private

◆ mIsDragging

bool AdornedRulerPanel::mIsDragging
private

Definition at line 195 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel().

◆ mIsRecording

bool AdornedRulerPanel::mIsRecording
private

Definition at line 163 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel(), and OnAudioStartStop().

◆ mIsSnapped

bool AdornedRulerPanel::mIsSnapped[MAX_GUIDES] {}
private

Definition at line 158 of file AdornedRulerPanel.h.

Referenced by HandleSnapping(), and SetNumGuides().

◆ mLastDrawnH

double AdornedRulerPanel::mLastDrawnH {}
private

Definition at line 257 of file AdornedRulerPanel.h.

Referenced by DoIdle(), and OnPaint().

◆ mLastDrawnPlayRegion

std::pair<double, double> AdornedRulerPanel::mLastDrawnPlayRegion {}
private

Definition at line 255 of file AdornedRulerPanel.h.

Referenced by DoIdle(), and OnPaint().

◆ mLastDrawnSelectedRegion

SelectedRegion AdornedRulerPanel::mLastDrawnSelectedRegion
private

Definition at line 254 of file AdornedRulerPanel.h.

Referenced by DoIdle(), and OnPaint().

◆ mLastDrawnZoom

double AdornedRulerPanel::mLastDrawnZoom {}
private

Definition at line 258 of file AdornedRulerPanel.h.

Referenced by DoIdle(), and OnPaint().

◆ mLastPlayRegionActive

bool AdornedRulerPanel::mLastPlayRegionActive = false
private

Definition at line 256 of file AdornedRulerPanel.h.

Referenced by DoDrawOverlap(), DoDrawPlayRegion(), and DoIdle().

◆ mLeftDownClick

double AdornedRulerPanel::mLeftDownClick
private

Definition at line 194 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel().

◆ mLeftDownClickUnsnapped

double AdornedRulerPanel::mLeftDownClickUnsnapped
private

Definition at line 193 of file AdornedRulerPanel.h.

◆ mLeftOffset

int AdornedRulerPanel::mLeftOffset
private

◆ mMouseEventState

MouseEventState AdornedRulerPanel::mMouseEventState
private

Definition at line 192 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel(), and SetPlayRegion().

◆ mNeedButtonUpdate

bool AdornedRulerPanel::mNeedButtonUpdate { true }
private

Definition at line 200 of file AdornedRulerPanel.h.

Referenced by UpdatePrefs().

◆ mNumGuides

size_t AdornedRulerPanel::mNumGuides { 1 }
private

Definition at line 159 of file AdornedRulerPanel.h.

Referenced by SetNumGuides(), and UpdateQuickPlayPos().

◆ mOldPlayRegion

PlayRegion AdornedRulerPanel::mOldPlayRegion
private

Definition at line 161 of file AdornedRulerPanel.h.

◆ mOuter

wxRect AdornedRulerPanel::mOuter
private

◆ mOverlay

std::shared_ptr<TrackPanelGuidelineOverlay> AdornedRulerPanel::mOverlay
private

Definition at line 224 of file AdornedRulerPanel.h.

Referenced by CreateOverlays().

◆ mPlayRegionDragsSelection

bool AdornedRulerPanel::mPlayRegionDragsSelection
private

◆ mPlayRegionSubscription

Observer::Subscription AdornedRulerPanel::mPlayRegionSubscription
private

Definition at line 246 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel().

◆ mProject

AudacityProject* const AdornedRulerPanel::mProject
private

◆ mQPCell

std::shared_ptr<QPCell> AdornedRulerPanel::mQPCell
private

◆ mQuickPlayOffset

double AdornedRulerPanel::mQuickPlayOffset[MAX_GUIDES] {}
private

Definition at line 155 of file AdornedRulerPanel.h.

Referenced by SetNumGuides(), and UpdateQuickPlayPos().

◆ mQuickPlayPos

double AdornedRulerPanel::mQuickPlayPos[MAX_GUIDES] {}
private

Definition at line 157 of file AdornedRulerPanel.h.

Referenced by HandleSnapping(), SetNumGuides(), and UpdateQuickPlayPos().

◆ mQuickPlayPosUnsnapped

double AdornedRulerPanel::mQuickPlayPosUnsnapped[MAX_GUIDES] {}
private

Definition at line 156 of file AdornedRulerPanel.h.

Referenced by SetNumGuides(), and UpdateQuickPlayPos().

◆ mRuler

Ruler& AdornedRulerPanel::mRuler
private

◆ mRulerInvalidatedSubscription

Observer::Subscription AdornedRulerPanel::mRulerInvalidatedSubscription
private

Definition at line 248 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel().

◆ mScrubbingCell

std::shared_ptr<ScrubbingCell> AdornedRulerPanel::mScrubbingCell
private

◆ mScrubZone

wxRect AdornedRulerPanel::mScrubZone
private

◆ mThemeChangeSubscription

Observer::Subscription AdornedRulerPanel::mThemeChangeSubscription
private

Definition at line 247 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel().

◆ mTimeDisplayMode

TimeDisplayMode AdornedRulerPanel::mTimeDisplayMode
private

◆ mTracks

TrackList* AdornedRulerPanel::mTracks
private

Definition at line 143 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel(), HandleSnapping(), and StartQPPlay().

◆ mUpdater

LinearUpdater& AdornedRulerPanel::mUpdater
private

Definition at line 140 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel(), and SetLeftOffset().

◆ s_AcceptsFocus

bool AdornedRulerPanel::s_AcceptsFocus { false }
staticprivate

Definition at line 119 of file AdornedRulerPanel.h.


The documentation for this class was generated from the following files: