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 1287 of file AdornedRulerPanel.cpp.

1293 : CellularPanel(parent, id, pos, size, viewinfo)
1294 , mProject { project }
1295 , mUpdater { ProjectTimeRuler::Get(*project).GetUpdater() }
1296 , mRuler { ProjectTimeRuler::Get(*project).GetRuler() }
1297{
1298 SetLayoutDirection(wxLayout_LeftToRight);
1299
1300 mQPCell = std::make_shared<QPCell>( this );
1301 mScrubbingCell = std::make_shared<ScrubbingCell>( this );
1302
1303 for (auto &button : mButtons)
1304 button = nullptr;
1305
1306 SetLabel( XO("Timeline") );
1307 SetName();
1308 SetBackgroundStyle(wxBG_STYLE_PAINT);
1309
1310 mLeftOffset = 0;
1311 mIndTime = -1;
1312
1313 mLeftDownClick = -1;
1315 mIsDragging = false;
1316
1317 mOuter = GetClientRect();
1318
1320
1322
1323 mRuler.SetLabelEdges( false );
1324
1326
1327 mIsRecording = false;
1328
1329 mPlayRegionDragsSelection = (gPrefs->Read(wxT("/QuickPlay/DragSelection"), 0L) == 1)? true : false;
1330
1331#if wxUSE_TOOLTIPS
1332 wxToolTip::Enable(true);
1333#endif
1334
1337
1338 // Delay until after CommandManager has been populated:
1340
1343
1344 // Bind event that updates the play region
1347
1349 mRuler.Subscribe([this](auto) { Refresh(); });
1350
1351 // And call it once to initialize it
1353}
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:347
NotifyingSelectedRegion selectedRegion
Definition: ViewInfo.h:215
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:208

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 1355 of file AdornedRulerPanel.cpp.

1356{
1357}

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 2687 of file AdornedRulerPanel.cpp.

2688{
2689 ProjectAudioManager::Get( *mProject ).Stop();
2690
2691 auto &viewInfo = ViewInfo::Get( *GetProject() );
2692 auto &playRegion = viewInfo.playRegion;
2693 playRegion.Clear();
2694
2695 Refresh();
2696}
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 2804 of file AdornedRulerPanel.cpp.

2805{
2806 if (!mOverlay) {
2807 mOverlay =
2808 std::make_shared<TrackPanelGuidelineOverlay>( mProject );
2809 auto pCellularPanel =
2810 dynamic_cast<CellularPanel*>( &GetProjectPanel( *GetProject() ) );
2811 if ( !pCellularPanel ) {
2812 wxASSERT( false );
2813 }
2814 else
2815 pCellularPanel->AddOverlay( mOverlay );
2816 this->AddOverlay( mOverlay->mPartner );
2817 }
2818}
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 1278 of file AdornedRulerPanel.cpp.

1279{
1280 auto *pPanel = GetAttachedWindows(project).Find( sKey );
1281 if (pPanel) {
1282 pPanel->wxWindow::Destroy();
1284 }
1285}
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:341
void Assign(const RegisteredFactory &key, ReplacementPointer &&replacement)
Reassign Site's pointer to ClientData.
Definition: ClientData.h:363
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 2431 of file AdornedRulerPanel.cpp.

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

References mInner, 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 2447 of file AdornedRulerPanel.cpp.

2448{
2449 wxRect r = mOuter;
2450 r.width -= RightMargin;
2451 r.height -= BottomMargin;
2452 AColor::BevelTrackInfo( *dc, true, r );
2453
2454 // Black stroke at bottom
2455 dc->SetPen( *wxBLACK_PEN );
2456 AColor::Line( *dc, mOuter.x,
2457 mOuter.y + mOuter.height - 1,
2458 mOuter.x + mOuter.width - 1 ,
2459 mOuter.y + mOuter.height - 1 );
2460}
@ RightMargin
@ BottomMargin
static void Line(wxDC &dc, wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
Definition: AColor.cpp:187
static void BevelTrackInfo(wxDC &dc, bool up, const wxRect &r, bool highlight=false)
Definition: AColor.cpp:340

References AColor::BevelTrackInfo(), BottomMargin, AColor::Line(), mOuter, and RightMargin.

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 2462 of file AdornedRulerPanel.cpp.

2463{
2464 const double min = Pos2Time(0);
2465 const double hiddenMin = Pos2Time(0, true);
2466 const double max = Pos2Time(mInner.width);
2467 const double hiddenMax = Pos2Time(mInner.width, true);
2468
2470 mRuler.SetRange( min, max, hiddenMin, hiddenMax );
2472 {
2473 mRuler.SetTickLengths({ 5, 3, 1 });
2474 }
2476 {
2477 mRuler.SetTickLengths({ 4, 2, 2 });
2478 }
2479 mRuler.Draw( *dc );
2480}
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 2578 of file AdornedRulerPanel.cpp.

2579{
2580 dc->SetBrush( wxBrush{ AlphaBlend(
2582 SelectionOpacity) } );
2583 dc->SetPen( *wxTRANSPARENT_PEN );
2584 dc->DrawRectangle( rect );
2585}
ColorId TimelineLimitsColor()
ColorId TimelineLoopRegionColor(bool isActive)
static wxColour AlphaBlend(ColorId fg, ColorId bg, double alpha)
constexpr double SelectionOpacity

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

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 2519 of file AdornedRulerPanel.cpp.

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

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 2539 of file AdornedRulerPanel.cpp.

2540{
2541 // Color the edges of the play region like the ticks and numbers
2542 ADCChanger cleanup( dc );
2543 const auto edgeColour = theTheme.Colour(TimelineLimitsColor());
2544 dc->SetPen( { edgeColour } );
2545 dc->SetBrush( { edgeColour } );
2546
2547 constexpr int side = 7;
2548 constexpr int sideLessOne = side - 1;
2549
2550 // Paint two shapes, each a line plus triangle at bottom
2551 const auto left = rect.GetLeft(),
2552 right = rect.GetRight(),
2553 bottom = rect.GetBottom(),
2554 top = rect.GetTop();
2555 {
2556 wxPoint points[]{
2557 {left, bottom - sideLessOne},
2558 {left - sideLessOne, bottom},
2559 {left, bottom},
2560 {left, top},
2561 };
2562 dc->DrawPolygon( 4, points );
2563 }
2564
2565 {
2566 wxPoint points[]{
2567 {right, top},
2568 {right, bottom},
2569 {right + sideLessOne, bottom},
2570 {right, bottom - sideLessOne},
2571 };
2572 dc->DrawPolygon( 4, points );
2573 }
2574}
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 2612 of file AdornedRulerPanel.cpp.

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

2589{
2590 dc->SetBrush( wxBrush{ AlphaBlend(
2592 dc->SetPen( *wxTRANSPARENT_PEN );
2593 dc->DrawRectangle( rectS.Intersect(rectL) );
2594 dc->DrawRectangle( rectS.Intersect(rectR) );
2595}

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

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 1507 of file AdornedRulerPanel.cpp.

1508{
1509 bool changed = UpdateRects();
1510 changed = SetPanelSize() || changed;
1511
1512 auto &project = *mProject;
1513 auto &viewInfo = ViewInfo::Get( project );
1514 const auto &selectedRegion = viewInfo.selectedRegion;
1515 const auto &playRegion = viewInfo.playRegion;
1516
1517 changed = changed
1518 || mLastDrawnSelectedRegion != selectedRegion
1519 || mLastDrawnPlayRegion != std::pair{
1520 playRegion.GetLastActiveStart(), playRegion.GetLastActiveEnd() }
1521 || mLastDrawnH != viewInfo.hpos
1522 || mLastDrawnZoom != viewInfo.GetZoom()
1523 || mLastPlayRegionActive != viewInfo.playRegion.Active()
1524 ;
1525 if (changed)
1526 // Cause ruler redraw anyway, because we may be zooming or scrolling,
1527 // showing or hiding the scrub bar, etc.
1528 Refresh();
1529}
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 1642 of file AdornedRulerPanel.cpp.

1644{
1645
1646 auto gAudioIO = AudioIOBase::Get();
1647 if ( !ViewInfo::Get( *mProject ).playRegion.Active() ) {
1648 // "Inactivated" play region follows the selection.
1649 SetPlayRegion( selectedRegion.t0(), selectedRegion.t1() );
1650 }
1651}
void SetPlayRegion(double playRegionStart, double playRegionEnd)
static AudioIOBase * Get()
Definition: AudioIOBase.cpp:94
bool Active() const
Definition: ViewInfo.h:124
double t1() const
double t0() const
PlayRegion playRegion
Definition: ViewInfo.h:216

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 2292 of file AdornedRulerPanel.cpp.

2293{
2294 auto &viewInfo = ViewInfo::Get( project );
2295 const auto &playRegion = viewInfo.playRegion;
2296 auto &selectedRegion = viewInfo.selectedRegion;
2297 selectedRegion.setT0(playRegion.GetStart(), false);
2298 selectedRegion.setT1(playRegion.GetEnd(), true);
2299}

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 2157 of file AdornedRulerPanel.cpp.

2158{
2159 auto pCellularPanel =
2160 dynamic_cast<CellularPanel*>( &GetProjectPanel( *GetProject() ) );
2161 if ( !pCellularPanel ) {
2162 wxASSERT( false );
2163 }
2164 else
2165 pCellularPanel->DrawOverlays( false );
2166 DrawOverlays( false );
2167}
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 2482 of file AdornedRulerPanel.cpp.

2483{
2484 Refresh();
2485}

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 1267 of file AdornedRulerPanel.cpp.

1268{
1270}
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:317

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 1272 of file AdornedRulerPanel.cpp.

1274{
1275 return Get( const_cast< AudacityProject & >( project ) );
1276}
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 2780 of file AdornedRulerPanel.cpp.

2781{
2782 // No switching of focus yet to the other, scrub zone
2783 return mQPCell;
2784}

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 2698 of file AdornedRulerPanel.cpp.

2699{
2700 mRuler.GetMaxSize(width, height);
2701}
void GetMaxSize(wxCoord *width, wxCoord *height)
Definition: Ruler.cpp:616

References Ruler::GetMaxSize(), and mRuler.

Here is the call graph for this function:

◆ GetProject()

AudacityProject * AdornedRulerPanel::GetProject ( ) const
overridevirtual

Implements CellularPanel.

Definition at line 2775 of file AdornedRulerPanel.cpp.

2776{
2777 return mProject;
2778}

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 2597 of file AdornedRulerPanel.cpp.

2598{
2599 return ProperRulerHeight + (showScrubBar ? ScrubHeight : 0);
2600}
@ ProperRulerHeight
@ ScrubHeight

References ProperRulerHeight, and ScrubHeight.

◆ GetTimeDisplayMode()

TimeDisplayMode AdornedRulerPanel::GetTimeDisplayMode ( ) const

Definition at line 2835 of file AdornedRulerPanel.cpp.

2836{
2837 return mTimeDisplayMode;
2838}

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 2301 of file AdornedRulerPanel.cpp.

2302{
2303 // Play region dragging can snap to selection boundaries
2304 const auto &selectedRegion = ViewInfo::Get(*GetProject()).selectedRegion;
2305 SnapPointArray candidates;
2307 candidates = {
2308 SnapPoint{ selectedRegion.t0() },
2309 SnapPoint{ selectedRegion.t1() },
2310 };
2311 SnapManager snapManager{ *mProject, *mTracks, *mViewInfo, move(candidates) };
2312 auto results = snapManager.Snap(nullptr, mQuickPlayPos[index], false);
2313 mQuickPlayPos[index] = results.outTime;
2314 mIsSnapped[index] = results.Snapped();
2315}
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 1430 of file AdornedRulerPanel.cpp.

1431{
1433}
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 1720 of file AdornedRulerPanel.cpp.

1721{
1722 if (markerTime < 0)
1723 return false;
1724
1725 int pixelPos = Time2Pos(markerTime);
1726 int boundLeft = pixelPos - SELECT_TOLERANCE_PIXEL;
1727 int boundRight = pixelPos + SELECT_TOLERANCE_PIXEL;
1728
1729 return mousePosX >= boundLeft && mousePosX < boundRight;
1730}
#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 1531 of file AdornedRulerPanel.cpp.

1532{
1533 if (evt.type == AudioIOEvent::MONITOR)
1534 return;
1535 if ( evt.type == AudioIOEvent::CAPTURE ) {
1536 if (evt.on)
1537 {
1538 mIsRecording = true;
1539 this->CellularPanel::CancelDragging( false );
1541
1543 }
1544 else {
1545 mIsRecording = false;
1547 }
1548 }
1549
1550 if ( !evt.on )
1551 // So that the play region is updated
1553}
bool CancelDragging(bool escaping)
bool on
Definition: AudioIO.h:66
enum AudioIOEvent::Type type

References CellularPanel::CancelDragging(), AudioIOEvent::CAPTURE, CellularPanel::ClearTargets(), DoSelectionChange(), mIsRecording, AudioIOEvent::MONITOR, CellularPanel::mViewInfo, AudioIOEvent::on, 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 2338 of file AdornedRulerPanel.cpp.

2339{
2341 gPrefs->Write(wxT("/GUI/AutoScroll"), false);
2342 else
2343 gPrefs->Write(wxT("/GUI/AutoScroll"), true);
2344
2345 gPrefs->Flush();
2346
2348}
static void Broadcast(int id=0)
Call this static function to notify all PrefsListener objects.
Definition: Prefs.cpp:128
bool bUpdateTrackIndicator
Definition: ViewInfo.h:226
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 2356 of file AdornedRulerPanel.cpp.

2357{
2359}
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 1501 of file AdornedRulerPanel.cpp.

1502{
1503 evt.Skip();
1504 DoIdle();
1505}

References DoIdle().

Here is the call graph for this function:

◆ OnLeave()

void AdornedRulerPanel::OnLeave ( wxMouseEvent &  evt)
private

Definition at line 1621 of file AdornedRulerPanel.cpp.

1622{
1623 evt.Skip();
1624 CallAfter([this]{
1626 });
1627}

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

Here is the call graph for this function:

◆ OnPaint()

void AdornedRulerPanel::OnPaint ( wxPaintEvent &  evt)
private

Definition at line 1555 of file AdornedRulerPanel.cpp.

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

2191{
2193}
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 1636 of file AdornedRulerPanel.cpp.

1637{
1638 auto &selectedRegion = mViewInfo->selectedRegion;
1639 DoSelectionChange( selectedRegion );
1640}

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 2361 of file AdornedRulerPanel.cpp.

2362{
2364}
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 1608 of file AdornedRulerPanel.cpp.

1609{
1610 mOuter = GetClientRect();
1611 if (mOuter.GetWidth() == 0 || mOuter.GetHeight() == 0)
1612 {
1613 return;
1614 }
1615
1616 UpdateRects();
1617
1619}
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 2331 of file AdornedRulerPanel.cpp.

2332{
2334 gPrefs->Write(wxT("/QuickPlay/DragSelection"), mPlayRegionDragsSelection);
2335 gPrefs->Flush();
2336}

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 1629 of file AdornedRulerPanel.cpp.

1630{
1631 if (message.appearance)
1632 return;
1634}
std::optional< PreferredSystemAppearance > appearance
Definition: Theme.h:112

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 2317 of file AdornedRulerPanel.cpp.

2318{
2319 int id = event.GetId();
2320 TimeDisplayMode changeFlag = mTimeDisplayMode;
2321 wxASSERT(id == OnMinutesAndSecondsID || id == OnBeatsAndMeasuresID);
2324
2326
2327 if (changeFlag != mTimeDisplayMode)
2328 Refresh();
2329}
@ 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 2195 of file AdornedRulerPanel.cpp.

2196{
2199}

References TogglePinnedHead(), and UpdateButtonStates().

Here is the call graph for this function:

◆ OnTogglePlayRegion()

void AdornedRulerPanel::OnTogglePlayRegion ( wxCommandEvent &  evt)
private

Definition at line 2351 of file AdornedRulerPanel.cpp.

2352{
2354}
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 2487 of file AdornedRulerPanel.cpp.

2488{
2489 const auto &viewInfo = ViewInfo::Get(*mProject);
2490 const auto &playRegion = viewInfo.playRegion;
2491 const auto t0 = playRegion.GetLastActiveStart(),
2492 t1 = playRegion.GetLastActiveEnd();
2493 return RegionRectangle(t0, t1);
2494}
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 1706 of file AdornedRulerPanel.cpp.

1707{
1709 , ignoreFisheye
1710 );
1711}
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 2790 of file AdornedRulerPanel.cpp.

2792{
2793 if (refreshResult & RefreshCode::RefreshAll)
2794 Refresh(); // Overlays will be repainted too
2795 else if (refreshResult & RefreshCode::DrawOverlays)
2796 DrawBothOverlays(); // cheaper redrawing of guidelines only
2797}

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

Here is the call graph for this function:

◆ ReCreateButtons()

void AdornedRulerPanel::ReCreateButtons ( )

Definition at line 1383 of file AdornedRulerPanel.cpp.

1384{
1385 // TODO: Should we do this to destroy the grabber??
1386 // Get rid of any children we may have
1387 // DestroyChildren();
1388
1390 SetBackgroundColour(theTheme.Colour( clrMedium ));
1391
1392 for (auto & button : mButtons) {
1393 if (button)
1394 button->Destroy();
1395 button = nullptr;
1396 }
1397
1398 size_t iButton = 0;
1399 // Make the short row of time ruler push buttons.
1400 // Don't bother with sizers. Their sizes and positions are fixed.
1401 // Add a grabber converted to a spacer.
1402 // This makes it visually clearer that the button is a button.
1403
1404 wxPoint position( 1, 0 );
1405
1406 Grabber * pGrabber = safenew Grabber(this, {});
1407 pGrabber->SetAsSpacer( true );
1408 //pGrabber->SetSize( 10, 27 ); // default is 10,27
1409 pGrabber->SetPosition( position );
1410
1411 position.x = 12;
1412
1413 auto size = theTheme.ImageSize( bmpRecoloredUpSmall );
1414 size.y = std::min(size.y, GetRulerHeight(false));
1415
1416 const auto button = ToolBar::MakeButton(
1417 this,
1418 bmpRecoloredUpSmall, bmpRecoloredDownSmall,
1419 bmpRecoloredUpHiliteSmall, bmpRecoloredHiliteSmall,
1420 bmpCogwheel, bmpCogwheel, bmpCogwheel,
1421 OnTogglePinnedStateID, position, true, size
1422 );
1423
1424 position.x += size.GetWidth();
1425 mButtons[iButton++] = button;
1426
1428}
@ OnTogglePinnedStateID
#define safenew
Definition: MemoryX.h:9
The widget to the left of a ToolBar that allows it to be dragged around to NEW positions.
Definition: Grabber.h:107
void SetAsSpacer(bool bIsSpacer)
Definition: Grabber.cpp:99
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:875
static void MakeButtonBackgroundsSmall()
Definition: ToolBar.cpp:837

References ThemeBase::Colour(), GetRulerHeight(), ThemeBase::ImageSize(), ToolBar::MakeButton(), ToolBar::MakeButtonBackgroundsSmall(), mButtons, min(), OnTogglePinnedStateID, safenew, Grabber::SetAsSpacer(), 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 1359 of file AdornedRulerPanel.cpp.

1360{
1361 CellularPanel::Refresh( eraseBackground, rect );
1363}
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 2504 of file AdornedRulerPanel.cpp.

2505{
2506 int p0 = -1, p1 = -1;
2507 if (t0 == t1)
2508 // Make the rectangle off-screen horizontally, but set the height
2509 ;
2510 else {
2511 p0 = max(1, Time2Pos(t0));
2512 p1 = min(mInner.width, Time2Pos(t1));
2513 }
2514
2515 const int left = p0, top = mInner.y, right = p1, bottom = mInner.GetBottom();
2516 return { wxPoint{left, top}, wxPoint{right, bottom} };
2517}

References min(), mInner, 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 2769 of file AdornedRulerPanel.cpp.

2770{
2771 // Root is a throwaway object
2772 return std::make_shared< MainGroup >( *this );
2773}

◆ SelectedRegionRectangle()

wxRect AdornedRulerPanel::SelectedRegionRectangle ( ) const
private

Definition at line 2496 of file AdornedRulerPanel.cpp.

2497{
2498 const auto &viewInfo = ViewInfo::Get(*mProject);
2499 const auto &selectedRegion = viewInfo.selectedRegion;
2500 const auto t0 = selectedRegion.t0(), t1 = selectedRegion.t1();
2501 return RegionRectangle(t0, t1);
2502}

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 2786 of file AdornedRulerPanel.cpp.

2787{
2788}

◆ SetFocusFromKbd()

void AdornedRulerPanel::SetFocusFromKbd ( )
override

Definition at line 2723 of file AdornedRulerPanel.cpp.

2724{
2725 auto temp = TemporarilyAllowFocus();
2726 SetFocus();
2727}
static TempAllowFocus TemporarilyAllowFocus()
void SetFocus(const WindowPlacement &focus)
Set the window that accepts keyboard input.
Definition: BasicUI.h:382

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

Here is the call graph for this function:

◆ SetLeftOffset()

void AdornedRulerPanel::SetLeftOffset ( int  offset)

Definition at line 2602 of file AdornedRulerPanel.cpp.

2603{
2604 if (mLeftOffset != offset) {
2605 mLeftOffset = offset;
2606 mUpdater.SetData(mViewInfo, offset);
2608 }
2609}

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 2710 of file AdornedRulerPanel.cpp.

2711{
2712 nn = std::min(nn, MAX_GUIDES);
2713 // If increasing the number of guides, reinitialize newer ones
2714 for (size_t ii = mNumGuides; ii < nn; ++ii) {
2715 mQuickPlayOffset[ii] = 0;
2716 mQuickPlayPosUnsnapped[ii] = 0;
2717 mQuickPlayPos[ii] = 0;
2718 mIsSnapped[ii] = false;
2719 }
2720 mNumGuides = nn;
2721}
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 2143 of file AdornedRulerPanel.cpp.

2144{
2145 const auto oldSize = GetSize();
2146 wxSize size { oldSize.GetWidth(), GetRulerHeight(ShowingScrubRuler()) };
2147 if ( size != oldSize ) {
2148 SetSize(size);
2149 SetMinSize(size);
2150 PostSizeEventToParent();
2151 return true;
2152 }
2153 else
2154 return false;
2155}

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 2671 of file AdornedRulerPanel.cpp.

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

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 2840 of file AdornedRulerPanel.cpp.

2841{
2842 if (mTimeDisplayMode == type)
2843 return;
2844
2845 mTimeDisplayMode = type;
2847 Refresh();
2848}

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 2367 of file AdornedRulerPanel.cpp.

2369{
2370 wxPoint position;
2371 if(pPosition)
2372 position = *pPosition;
2373 else
2374 {
2375 auto rect = GetRect();
2376 //Old code put menu too low down. y position applied twice.
2377 //position = { rect.GetLeft() + 1, rect.GetBottom() + 1 };
2378
2379 // The cell does not pass in the mouse or button position.
2380 // We happen to know this is the pin/unpin button
2381 // so these magic values 'fix a bug' - but really the cell should
2382 // pass more information to work with in.
2383 position = { rect.GetLeft() + 38, rect.GetHeight()/2 + 1 };
2384 }
2385
2386 switch (choice) {
2388 ShowMenu(position);
2390 break;
2391 case MenuChoice::Scrub:
2392 ShowScrubMenu(position); break;
2393 default:
2394 return;
2395 }
2396}
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 2762 of file AdornedRulerPanel.cpp.

2763{
2764 auto &scrubber = Scrubber::Get( *GetProject() );
2765 return scrubber.ShowsBar();
2766}
static Scrubber & Get(AudacityProject &project)
Definition: Scrubbing.cpp:188

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 2223 of file AdornedRulerPanel.cpp.

2224{
2225 const auto &viewInfo = ViewInfo::Get( *GetProject() );
2226 const auto &playRegion = viewInfo.playRegion;
2227 wxMenu rulerMenu;
2228
2229 {
2230 auto item = rulerMenu.AppendRadioItem(OnMinutesAndSecondsID,
2231 _("Minutes and Seconds"));
2233 }
2234
2235 {
2236 auto item = rulerMenu.AppendRadioItem(OnBeatsAndMeasuresID,
2237 _("Beats and Measures"));
2239 }
2240
2241 rulerMenu.AppendSeparator();
2242
2243 auto pDrag = rulerMenu.AppendCheckItem(OnSyncQuickPlaySelID, _("Setting a loop region also makes an audio selection"));
2244 pDrag->Check(mPlayRegionDragsSelection && playRegion.Active());
2245 pDrag->Enable(playRegion.Active());
2246
2247 {
2248 auto item = rulerMenu.AppendCheckItem(OnTogglePlayRegionID,
2250 item->Check(playRegion.Active());
2251 }
2252
2253 {
2254 auto item = rulerMenu.Append(OnClearPlayRegionID,
2255 /* i18n-hint Clear is a verb */
2256 _("Clear Loop"));
2257 }
2258
2259 {
2260 auto item = rulerMenu.Append(OnSetPlayRegionToSelectionID,
2261 _("Set Loop To Selection"));
2262 }
2263
2264 rulerMenu.AppendSeparator();
2265
2266 rulerMenu.AppendCheckItem(OnAutoScrollID, _("Scroll view to playhead"))->
2268
2269 rulerMenu.AppendCheckItem(OnTogglePinnedStateID, _("Continuous scrolling"))->
2271
2272 BasicMenu::Handle{ &rulerMenu }.Popup(
2274 { pos.x, pos.y }
2275 );
2276}
@ 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 2278 of file AdornedRulerPanel.cpp.

2279{
2280 auto &scrubber = Scrubber::Get( *mProject );
2281 PushEventHandler(&scrubber);
2282 auto cleanup = finally([this]{ PopEventHandler(); });
2283
2284 wxMenu rulerMenu;
2285 scrubber.PopulatePopupMenu(rulerMenu);
2286 BasicMenu::Handle{ &rulerMenu }.Popup(
2288 { pos.x, pos.y }
2289 );
2290}

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 2061 of file AdornedRulerPanel.cpp.

2063{
2064 const double t0 = mTracks->GetStartTime();
2065 const double t1 = mTracks->GetEndTime();
2066 auto &viewInfo = ViewInfo::Get( *mProject );
2067 const auto &playRegion = viewInfo.playRegion;
2068 const auto &selectedRegion = viewInfo.selectedRegion;
2069 const double sel0 = selectedRegion.t0();
2070 const double sel1 = selectedRegion.t1();
2071
2072 // Start / Restart playback on left click.
2073 bool startPlaying = true; // = (playRegion.GetStart() >= 0);
2074
2075 if (startPlaying) {
2076 bool loopEnabled = true;
2077 auto oldStart = std::max(0.0, playRegion.GetStart());
2078 double start = oldStart, end = 0;
2079
2080 if (playRegion.Empty()) {
2081 // Play either a selection or the project.
2082 if (oldStart > sel0 && oldStart < sel1) {
2083 // we are in a selection, so use the selection
2084 start = sel0;
2085 end = sel1;
2086 } // not in a selection, so use the project
2087 else {
2088 start = t0;
2089 end = t1;
2090 }
2091 }
2092 else
2093 end = std::max(start, playRegion.GetEnd());
2094
2095 // Looping a tiny selection may freeze, so just play it once.
2096 loopEnabled = ((end - start) > 0.001)? true : false;
2097
2098 newDefault = (loopEnabled && newDefault);
2099 if (newDefault)
2100 cutPreview = false;
2101 auto options = ProjectAudioIO::GetDefaultOptions(*mProject, newDefault);
2102
2103 if (!cutPreview) {
2104 if (pStartTime)
2105 options.pStartTime.emplace(*pStartTime);
2106 }
2107 else
2108 options.envelope = nullptr;
2109
2110 auto mode =
2111 cutPreview ? PlayMode::cutPreviewPlay
2112 : newDefault ? PlayMode::loopedPlay
2114
2115 // Stop only after deciding where to start again, because an event
2116 // callback may change the play region back to the selection
2117 auto &projectAudioManager = ProjectAudioManager::Get( *mProject );
2118 projectAudioManager.Stop();
2119
2120 // Don't change play region, assume caller set it as needed
2121 // playRegion.SetTimes( start, end );
2122 // Refresh();
2123
2124 projectAudioManager.PlayPlayRegion((SelectedRegion(start, end)),
2125 options, mode,
2126 false);
2127
2128 }
2129}
@ 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:991
double GetStartTime() const
Return the least start time of the tracks, or 0 when no tracks.
Definition: Track.cpp:985
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
Definition: PackedArray.h:159

References cutPreviewPlay, PackedArray::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 2705 of file AdornedRulerPanel.cpp.

2705 {
2706 s_AcceptsFocus = true;
2707 return TempAllowFocus{ &s_AcceptsFocus };
2708}
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 1713 of file AdornedRulerPanel.cpp.

1714{
1716 , ignoreFisheye
1717 );
1718}
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 2820 of file AdornedRulerPanel.cpp.

2821{
2825
2826 auto &project = *mProject;
2827 // Update button image
2829
2830 auto &scrubber = Scrubber::Get( project );
2831 if (scrubber.HasMark())
2832 scrubber.SetScrollScrubbing(value);
2833}
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 2169 of file AdornedRulerPanel.cpp.

2170{
2171 auto common = [this](
2172 AButton &button, const CommandID &commandName, const TranslatableString &label) {
2173 ComponentInterfaceSymbol command{ commandName, label };
2174 ToolBar::SetButtonToolTip( *mProject, button, &command, 1u );
2175 button.SetLabel( Verbatim( button.GetToolTipText() ) );
2176
2177 button.UpdateStatus();
2178 };
2179
2180 {
2181 auto timelineOptionsButton = static_cast<AButton*>(FindWindow(OnTogglePinnedStateID));
2182 timelineOptionsButton->PopUp();
2183 // Bug 1584: Tooltip now shows what clicking will do.
2184 // Bug 2357: Action of button (and hence tooltip wording) updated.
2185 const auto label = XO("Timeline Options");
2186 common(*timelineOptionsButton, wxT("PinnedHead"), label);
2187 }
2188}
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:455
void PopUp()
Definition: AButton.cpp:585
void SetLabel(const TranslatableString &label)
Definition: AButton.cpp:189
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:970
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 1365 of file AdornedRulerPanel.cpp.

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

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 2201 of file AdornedRulerPanel.cpp.

2202{
2203 // Invoked for mouse-over preview events, or dragging, or scrub position
2204 // polling updates. Remember x coordinates, converted to times, for
2205 // drawing of guides.
2206
2207 // Keep Quick-Play within usable track area. (Dependent on zoom)
2208 const auto &viewInfo = ViewInfo::Get( *mProject );
2209 auto width = viewInfo.GetTracksUsableWidth();
2210 mousePosX = std::max(mousePosX, viewInfo.GetLeftOffset());
2211 mousePosX = std::min(mousePosX, viewInfo.GetLeftOffset() + width - 1);
2212 const auto time = Pos2Time(mousePosX);
2213
2214 for (size_t ii = 0; ii < mNumGuides; ++ii) {
2216 time + mQuickPlayOffset[ii];
2217 HandleSnapping(ii);
2218 }
2219}
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 1653 of file AdornedRulerPanel.cpp.

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

References BottomMargin, LeftMargin, min(), mInner, 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 2799 of file AdornedRulerPanel.cpp.

2800{
2801 ProjectStatus::Get( *GetProject() ).Set(message);
2802}
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

Definition at line 149 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel(), Pos2Time(), SetLeftOffset(), and Time2Pos().

◆ 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

Definition at line 145 of file AdornedRulerPanel.h.

Referenced by AdornedRulerPanel(), DoDrawEdge(), OnSize(), and UpdateRects().

◆ 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: