1 /**********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 NoteTrackSliderHandles.cpp
6
7 Paul Licameli split from TrackPanel.cpp
8
9 **********************************************************************/
10
11
12 #include "NoteTrackSliderHandles.h"
13
14 #ifdef EXPERIMENTAL_MIDI_OUT
15
16 #include "NoteTrackControls.h"
17 #include "../../../../ProjectHistory.h"
18 #include "../../../../RefreshCode.h"
19 #include "../../../../TrackInfo.h"
20 #include "../../../../TrackPanel.h"
21 #include "../../../../TrackPanelAx.h"
22 #include "../../../../UndoManager.h"
23 #include "../../../../NoteTrack.h"
24 #include "ViewInfo.h"
25
VelocitySliderHandle(SliderFn sliderFn,const wxRect & rect,const std::shared_ptr<Track> & pTrack)26 VelocitySliderHandle::VelocitySliderHandle
27 ( SliderFn sliderFn, const wxRect &rect,
28 const std::shared_ptr<Track> &pTrack )
29 : SliderHandle{ sliderFn, rect, pTrack }
30 {}
31
~VelocitySliderHandle()32 VelocitySliderHandle::~VelocitySliderHandle()
33 {
34 }
35
GetNoteTrack() const36 std::shared_ptr<NoteTrack> VelocitySliderHandle::GetNoteTrack() const
37 {
38 return std::static_pointer_cast<NoteTrack>(mpTrack.lock());
39 }
40
GetValue()41 float VelocitySliderHandle::GetValue()
42 {
43 if (GetNoteTrack())
44 return GetNoteTrack()->GetVelocity();
45 else
46 return 0;
47 }
48
SetValue(AudacityProject * pProject,float newValue)49 UIHandle::Result VelocitySliderHandle::SetValue
50 (AudacityProject *pProject, float newValue)
51 {
52 (void)pProject;//Compiler food
53 auto pTrack = GetNoteTrack();
54
55 if (pTrack) {
56 pTrack->SetVelocity(newValue);
57 }
58
59 return RefreshCode::RefreshCell;
60 }
61
CommitChanges(const wxMouseEvent &,AudacityProject * pProject)62 UIHandle::Result VelocitySliderHandle::CommitChanges
63 (const wxMouseEvent &, AudacityProject *pProject)
64 {
65 ProjectHistory::Get( *pProject )
66 .PushState(XO("Moved velocity slider"), XO("Velocity"),
67 UndoPush::CONSOLIDATE);
68 return RefreshCode::RefreshCell;
69 }
70
Tip(const wxMouseState &,AudacityProject & project) const71 TranslatableString VelocitySliderHandle::Tip(
72 const wxMouseState &, AudacityProject &project) const
73 {
74 TranslatableString val;
75 float value = 0;
76
77 auto pTrack = GetNoteTrack();
78 if (pTrack)
79 value = pTrack->GetVelocity();
80
81 // LLL: Can't access the slider since Tip() is a const method and getting the slider
82 // is not, so duplicate what LWSlider does.
83
84 if (value > 0.0f)
85 // Signed
86 val = Verbatim("%+d").Format((int)value);
87 else
88 // Zero, or signed negative
89 val = Verbatim("%d").Format((int)value);
90
91 /* i18n-hint: An item name followed by a value, with appropriate separating punctuation */
92 return XO("%s: %s").Format(XO("Velocity"), val);
93 }
94
HitTest(std::weak_ptr<VelocitySliderHandle> & holder,const wxMouseState & state,const wxRect & rect,const std::shared_ptr<Track> & pTrack)95 UIHandlePtr VelocitySliderHandle::HitTest
96 (std::weak_ptr<VelocitySliderHandle> &holder,
97 const wxMouseState &state, const wxRect &rect,
98 const std::shared_ptr<Track> &pTrack)
99 {
100 if (!state.ButtonIsDown(wxMOUSE_BTN_LEFT))
101 return {};
102
103 wxRect sliderRect;
104 NoteTrackControls::GetVelocityRect(rect.GetTopLeft(), sliderRect);
105 if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) )
106 return {};
107 if (sliderRect.Contains(state.m_x, state.m_y)) {
108 auto sliderFn =
109 []( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
110 return NoteTrackControls::VelocitySlider
111 (sliderRect, static_cast<NoteTrack*>( pTrack ), true,
112 &TrackPanel::Get( *pProject ));
113 };
114 auto result = std::make_shared<VelocitySliderHandle>(
115 sliderFn, sliderRect, pTrack );
116 result = AssignUIHandlePtr(holder, result);
117
118 return result;
119 }
120 else
121 return {};
122 }
123
124 #endif
125