1 /*!********************************************************************
2 *
3  Audacity: A Digital Audio Editor
4 
5  WaveTrackAffordanceControls.h
6 
7  Vitaly Sverchinsky
8 
9  **********************************************************************/
10 
11 #pragma once
12 
13 #include <wx/font.h>
14 #include <wx/event.h>
15 
16 #include "../../../ui/CommonTrackPanelCell.h"
17 #include "../../../ui/TextEditHelper.h"
18 
19 
20 struct TrackListEvent;
21 
22 class AffordanceHandle;
23 class SelectHandle;
24 class WaveClip;
25 class TrackPanelResizeHandle;
26 class WaveClipTitleEditHandle;
27 class WaveTrackAffordanceHandle;
28 class WaveClipTrimHandle;
29 class TrackList;
30 
31 //Handles clip movement, selection, navigation and
32 //allow name change
33 class AUDACITY_DLL_API WaveTrackAffordanceControls :
34     public CommonTrackCell,
35     public TextEditDelegate,
36     public wxEvtHandler,
37     public std::enable_shared_from_this<WaveTrackAffordanceControls>
38 {
39     std::weak_ptr<WaveClip> mFocusClip;
40     std::weak_ptr<WaveTrackAffordanceHandle> mAffordanceHandle;
41     std::weak_ptr<TrackPanelResizeHandle> mResizeHandle;
42     std::weak_ptr<WaveClipTitleEditHandle> mTitleEditHandle;
43     std::weak_ptr<SelectHandle> mSelectHandle;
44     std::weak_ptr<WaveClipTrimHandle> mClipTrimHandle;
45 
46     std::weak_ptr<WaveClip> mEditedClip;
47     std::shared_ptr<TextEditHelper> mTextEditHelper;
48 
49     wxFont mClipNameFont;
50 
51 public:
52     WaveTrackAffordanceControls(const std::shared_ptr<Track>& pTrack);
53 
54     std::vector<UIHandlePtr> HitTest(const TrackPanelMouseState& state, const AudacityProject* pProject) override;
55 
56     void Draw(TrackPanelDrawingContext& context, const wxRect& rect, unsigned iPass) override;
57 
58     //Invokes name editing for a clip that currently is
59     //in focus(as a result of hit testing), returns true on success
60     //false if there is no focus
61     bool StartEditClipName(AudacityProject* project);
62 
63     std::weak_ptr<WaveClip> GetSelectedClip() const;
64 
65     unsigned CaptureKey
66     (wxKeyEvent& event, ViewInfo& viewInfo, wxWindow* pParent,
67         AudacityProject* project) override;
68 
69     unsigned KeyDown (wxKeyEvent& event, ViewInfo& viewInfo, wxWindow* pParent,
70         AudacityProject* project) override;
71 
72     unsigned Char
73     (wxKeyEvent& event, ViewInfo& viewInfo, wxWindow* pParent,
74         AudacityProject* project) override;
75 
76     unsigned LoseFocus(AudacityProject *project) override;
77 
78     void OnTextEditFinished(AudacityProject* project, const wxString& text) override;
79     void OnTextEditCancelled(AudacityProject* project) override;
80     void OnTextModified(AudacityProject* project, const wxString& text) override;
81     void OnTextContextMenu(AudacityProject* project, const wxPoint& position) override;
82 
83     bool StartEditNameOfMatchingClip( AudacityProject &project,
84         std::function<bool(WaveClip&)> test /*!<
85             Edit the first clip in the track's list satisfying the test */
86     );
87 
88     unsigned OnAffordanceClick(const TrackPanelMouseEvent& event, AudacityProject* project);
89 
90     bool OnTextCopy(AudacityProject& project);
91     bool OnTextCut(AudacityProject& project);
92     bool OnTextPaste(AudacityProject& project);
93     bool OnTextSelect(AudacityProject& project);
94 
95 private:
96     void ResetClipNameEdit();
97 
98     void OnTrackChanged(TrackListEvent& evt);
99 
100     unsigned ExitTextEditing();
101 
102     std::shared_ptr<TextEditHelper> MakeTextEditHelper(const wxString& text);
103 };
104