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