Audacity 3.2.0
TimeTrackVRulerControls.cpp
Go to the documentation of this file.
1/**********************************************************************
2
3Audacity: A Digital Audio Editor
4
5TimeTrackVRulerControls.cpp
6
7Paul Licameli split from TrackPanel.cpp
8
9**********************************************************************/
10
11
14
15#include "../../../HitTestResult.h"
16
17#include "AColor.h"
18#include "AllThemeResources.h"
19#include "ProjectHistory.h"
20#include "../../../RefreshCode.h"
21#include "Theme.h"
22#include "TimeTrack.h"
23#include "../../../TrackArtist.h"
24#include "../../../TrackPanelDrawingContext.h"
25#include "../../../TrackPanelMouseEvent.h"
26#include "../../../UIHandle.h"
27#include "../../../widgets/Ruler.h"
28#include "../../../widgets/LinearUpdater.h"
29#include "../../../widgets/LogarithmicUpdater.h"
30#include "../../../widgets/RealFormat.h"
31
33{
34}
35
36namespace {
38 {
39 static Ruler theRuler{
41 };
42 return theRuler;
43 }
44}
45
46std::vector<UIHandlePtr> TimeTrackVRulerControls::HitTest(
47 const TrackPanelMouseState &st,
48 const AudacityProject *pProject)
49{
50 std::vector<UIHandlePtr> results;
51
52 if ( st.state.GetX() <= st.rect.GetRight() - kGuard ) {
53 auto pTrack = FindTrack()->SharedPointer<TimeTrack>( );
54 if (pTrack) {
55 auto result = std::make_shared<TimeTrackVZoomHandle>(
56 pTrack, st.rect, st.state.m_y );
57 result = AssignUIHandlePtr(mVZoomHandle, result);
58 results.push_back(result);
59 }
60 }
61
62 auto more = TrackVRulerControls::HitTest(st, pProject);
63 std::copy(more.begin(), more.end(), std::back_inserter(results));
64
65 return results;
66}
67
70 const wxRect &rect_, unsigned iPass )
71{
72 TrackVRulerControls::Draw( context, rect_, iPass );
73
74 // Draw on a later pass because the bevel overpaints one pixel
75 // out of bounds on the bottom
76
77 if ( iPass == TrackArtist::PassControls ) {
78 auto t = FindTrack();
79 if ( !t )
80 return;
81
82 auto rect = rect_;
83 --rect.width;
84 --rect.height;
85
86 auto dc = &context.dc;
87 wxRect bev = rect;
88 bev.Inflate(-1, 0);
89 bev.width += 1;
90 AColor::BevelTrackInfo(*dc, true, bev);
91
92 // Right align the ruler
93 wxRect rr = rect;
94 rr.width--;
95 if (t && t->vrulerSize.first < rect.GetWidth()) {
96 int adj = rr.GetWidth() - t->vrulerSize.first;
97 rr.x += adj;
98 rr.width -= adj;
99 }
100
101 UpdateRuler(rr);
102
103 auto vruler = &ruler();
104
105 vruler->SetTickColour( theTheme.Colour( clrTrackPanelText ));
106 vruler->Draw(*dc);
107 }
108}
109
110void TimeTrackVRulerControls::UpdateRuler( const wxRect &rect )
111{
112 const auto tt = std::static_pointer_cast< TimeTrack >( FindTrack() );
113 if (!tt)
114 return;
115 auto vruler = &ruler();
116
117 float min, max;
118 min = tt->GetRangeLower() * 100.0;
119 max = tt->GetRangeUpper() * 100.0;
120
121 vruler->SetDbMirrorValue( 0.0 );
122 vruler->SetBounds(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height-1);
123 vruler->SetOrientation(wxVERTICAL);
124 vruler->SetRange(max, min);
125 vruler->SetFormat(tt->GetDisplayLog()
128 vruler->SetUnits({});
129 vruler->SetLabelEdges(false);
130 if (tt->GetDisplayLog())
131 vruler->SetUpdater(&LogarithmicUpdater::Instance());
132 else
133 vruler->SetUpdater(&LinearUpdater::Instance());
134
135 vruler->GetMaxSize( &tt->vrulerSize.first, &tt->vrulerSize.second );
136}
int min(int a, int b)
THEME_API Theme theTheme
Definition: Theme.cpp:82
const int kGuard
std::shared_ptr< Subclass > AssignUIHandlePtr(std::weak_ptr< Subclass > &holder, const std::shared_ptr< Subclass > &pNew)
Definition: UIHandle.h:151
static void BevelTrackInfo(wxDC &dc, bool up, const wxRect &r, bool highlight=false)
Definition: AColor.cpp:340
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Definition: Project.h:90
std::shared_ptr< Track > FindTrack()
static const LinearUpdater & Instance()
static const LogarithmicUpdater & Instance()
static const RealFormat & LinearInstance()
Definition: RealFormat.cpp:14
static const RealFormat & LogInstance()
Definition: RealFormat.cpp:20
Used to display a Ruler.
Definition: Ruler.h:28
wxColour & Colour(int iIndex)
A kind of Track used to 'warp time'.
Definition: TimeTrack.h:22
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
std::weak_ptr< TimeTrackVZoomHandle > mVZoomHandle
void UpdateRuler(const wxRect &rect) override
std::vector< UIHandlePtr > HitTest(const TrackPanelMouseState &state, const AudacityProject *) override
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
std::vector< UIHandlePtr > HitTest(const TrackPanelMouseState &state, const AudacityProject *pProject) override