1 /**********************************************************************
2 
3 Audacity: A Digital Audio Editor
4 
5 TrackSelectHandle.h
6 
7 Paul Licameli split from TrackPanel.cpp
8 
9 **********************************************************************/
10 
11 #ifndef __AUDACITY_TRACK_SELECT_HANDLE__
12 #define __AUDACITY_TRACK_SELECT_HANDLE__
13 
14 #include "../../UIHandle.h"
15 
16 class wxMouseEvent;
17 class Track;
18 
19 class TrackSelectHandle final : public UIHandle
20 {
21    TrackSelectHandle(const TrackSelectHandle&) = delete;
22 
23 public:
24    explicit TrackSelectHandle( const std::shared_ptr<Track> &pTrack );
25 
26    TrackSelectHandle &operator=(const TrackSelectHandle&) = default;
27 
28    static UIHandlePtr HitAnywhere
29       (std::weak_ptr<TrackSelectHandle> &holder,
30        const std::shared_ptr<Track> &pTrack);
31 
32    virtual ~TrackSelectHandle();
33 
34    Result Click
35       (const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
36 
37    Result Drag
38       (const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
39 
40    HitTestPreview Preview
41       (const TrackPanelMouseState &state, AudacityProject *pProject)
42       override;
43 
44    Result Release
45       (const TrackPanelMouseEvent &event, AudacityProject *pProject,
46        wxWindow *pParent) override;
47 
48    Result Cancel(AudacityProject *) override;
49 
StopsOnKeystroke()50    bool StopsOnKeystroke() override { return true; }
51 
52 private:
53    std::shared_ptr<Track> mpTrack;
54    bool mClicked{};
55 
56    // JH: if the user is dragging a track, at what y
57    //   coordinate should the dragging track move up or down?
58    int mMoveUpThreshold {};
59    int mMoveDownThreshold {};
60    int mRearrangeCount {};
61 
62    void CalculateRearrangingThresholds(
63       const wxMouseEvent & event, AudacityProject *project);
64 };
65 
66 #endif
67