1 /**********************************************************************
2 
3 Audacity: A Digital Audio Editor
4 
5 SampleHandle.h
6 
7 Paul Licameli
8 
9 **********************************************************************/
10 
11 #ifndef __AUDACITY_SAMPLE_HANDLE__
12 #define __AUDACITY_SAMPLE_HANDLE__
13 
14 #include "../../../../UIHandle.h"
15 #include "SampleCount.h"
16 
17 class wxMouseEvent;
18 class wxMouseState;
19 
20 class Track;
21 class ViewInfo;
22 class WaveTrack;
23 
24 class SampleHandle final : public UIHandle
25 {
26    SampleHandle(const SampleHandle&) = delete;
27    static HitTestPreview HitPreview
28       (const wxMouseState &state, const AudacityProject *pProject, bool unsafe);
29 
30 public:
31    explicit SampleHandle( const std::shared_ptr<WaveTrack> &pTrack );
32 
33    SampleHandle &operator=(const SampleHandle&) = default;
34 
35    static UIHandlePtr HitAnywhere
36       (std::weak_ptr<SampleHandle> &holder,
37        const wxMouseState &state, const std::shared_ptr<WaveTrack> &pTrack);
38    static UIHandlePtr HitTest
39       (std::weak_ptr<SampleHandle> &holder,
40        const wxMouseState &state, const wxRect &rect,
41        const AudacityProject *pProject, const std::shared_ptr<WaveTrack> &pTrack);
42 
43    virtual ~SampleHandle();
44 
GetTrack()45    std::shared_ptr<WaveTrack> GetTrack() const { return mClickedTrack; }
46 
47    void Enter(bool forward, AudacityProject *) override;
48 
49    Result Click
50       (const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
51 
52    Result Drag
53       (const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
54 
55    HitTestPreview Preview
56       (const TrackPanelMouseState &state, AudacityProject *pProject)
57       override;
58 
59    Result Release
60       (const TrackPanelMouseEvent &event, AudacityProject *pProject,
61        wxWindow *pParent) override;
62 
63    Result Cancel(AudacityProject *pProject) override;
64 
StopsOnKeystroke()65    bool StopsOnKeystroke() override { return true; }
66 
67 private:
68    float FindSampleEditingLevel
69       (const wxMouseEvent &event, const ViewInfo &viewInfo, double t0);
70 
71    std::shared_ptr<WaveTrack> mClickedTrack;
72    wxRect mRect{};
73 
74    sampleCount mClickedStartSample{};
75    sampleCount mLastDragSample{};
76    float mLastDragSampleValue{};
77    bool mAltKey{};
78 };
79 
80 #endif
81