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