Audacity 3.2.0
SelectHandle.h
Go to the documentation of this file.
1/**********************************************************************
2
3Audacity: A Digital Audio Editor
4
5SelectHandle.h
6
7Paul Licameli split from TrackPanel.cpp
8
9**********************************************************************/
10
11#ifndef __AUDACITY_SELECT_HANDLE__
12#define __AUDACITY_SELECT_HANDLE__
13
14#include "../../UIHandle.h"
15#include "SelectedRegion.h"
16#include "Snap.h"
17
18#include <vector>
19
21class SnapManager;
22class SpectrumAnalyst;
23class Track;
24class ChannelView;
25class TrackList;
26class ViewInfo;
27class WaveTrack;
28class wxMouseState;
29
30class AUDACITY_DLL_API SelectHandle : public UIHandle
31{
33
34public:
36 const std::shared_ptr<ChannelView> &pChannelView, bool useSnap,
37 const TrackList &trackList,
38 const TrackPanelMouseState &st, const ViewInfo &viewInfo);
39
40 // This always hits, but details of the hit vary with mouse position and
41 // key state.
42 static UIHandlePtr HitTest(
43 std::weak_ptr<SelectHandle> &holder,
44 const TrackPanelMouseState &state, const AudacityProject *pProject,
45 const std::shared_ptr<ChannelView> &pChannelView);
46
48
49 virtual ~SelectHandle();
50
51 std::shared_ptr<const Channel> FindChannel() const override;
52
53 bool IsDragging() const override;
54
55 void SetUseSnap(bool use, AudacityProject *pProject);
56 void Enter(bool forward, AudacityProject *pProject) override;
57
58 bool HasSnap() const;
59 bool HasEscape(AudacityProject *pProject) const override;
60
61 bool Escape(AudacityProject *pProject) override;
62
64 (const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
65
67 (const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
68
70 (const TrackPanelMouseState &state, AudacityProject *pProject)
71 override;
72
74 (const TrackPanelMouseEvent &event, AudacityProject *pProject,
75 wxWindow *pParent) override;
76
77 Result Cancel(AudacityProject*) override;
78
80 (const SelectHandle &oldState,
81 const SelectHandle &newState);
82
83private:
84 std::weak_ptr<Track> FindTrack();
85
86 void Connect(AudacityProject *pProject);
87
88 void StartSelection(AudacityProject *pProject);
89 void AdjustSelection(
90 AudacityProject *pProject,
91 ViewInfo &viewInfo, int mouseXCoordinate, int trackLeftEdge,
92 Track *pTrack);
93 void AssignSelection(ViewInfo &viewInfo, double selend, Track *pTrack);
94
95 void StartFreqSelection(
96 ViewInfo &viewInfo, int mouseYCoordinate, int trackTopEdge,
97 int trackHeight, ChannelView *pChannelView);
98 void AdjustFreqSelection(
99 const WaveTrack *wt,
100 ViewInfo &viewInfo, int mouseYCoordinate, int trackTopEdge,
101 int trackHeight);
102
103 void HandleCenterFrequencyClick(
104 const ViewInfo &viewInfo, bool shiftDown,
105 const WaveTrack *pTrack, double value);
106 static void StartSnappingFreqSelection(
107 SpectrumAnalyst &analyst,
108 const ViewInfo &viewInfo, const WaveTrack *pTrack);
109 void MoveSnappingFreqSelection(
110 AudacityProject *pProject, ViewInfo &viewInfo, int mouseYCoordinate,
111 int trackTopEdge,
112 int trackHeight, ChannelView *pChannelView);
113public:
114 // This is needed to implement a command assignable to keystrokes
115 static void SnapCenterOnce(
116 SpectrumAnalyst &analyst,
117 ViewInfo &viewInfo, const WaveTrack *pTrack, bool up);
118private:
119
120 // TrackPanelDrawable implementation
121 void Draw(
123 const wxRect &rect, unsigned iPass ) override;
124
125 wxRect DrawingArea(
127 const wxRect &rect, const wxRect &panelRect, unsigned iPass ) override;
128
129 //void ResetFreqSelectionPin
130 // (const ViewInfo &viewInfo, double hintFrequency, bool logF);
131
132
133 std::weak_ptr<ChannelView> mpView;
134 wxRect mRect{};
135 SelectedRegion mInitialSelection{};
136
137 std::shared_ptr<SnapManager> mSnapManager;
139 bool mUseSnap{ true };
140
141 bool mSelStartValid{};
142 double mSelStart{ 0.0 };
143
144 int mSelectionBoundary{ 0 };
145
148
152
156 } mFreqSelMode{ FREQ_SEL_INVALID };
157 std::weak_ptr<const WaveTrack> mFreqSelTrack;
158 // Following holds:
159 // the center for FREQ_SEL_PINNED_CENTER,
160 // the ratio of top to center (== center to bottom) for FREQ_SEL_DRAG_CENTER,
161 // a frequency boundary for FREQ_SEL_FREE, FREQ_SEL_TOP_FREE, or
162 // FREQ_SEL_BOTTOM_FREE,
163 // and is ignored otherwise.
164 double mFreqSelPin{ -1.0 };
165 std::shared_ptr<SpectrumAnalyst> mFrequencySnapper;
166
167 int mMostRecentX{ -1 }, mMostRecentY{ -1 };
168
169 bool mAutoScrolling{};
170
171 std::shared_ptr<SelectionStateChanger> mSelectionStateChanger;
172
173 class TimerHandler;
175 std::shared_ptr<TimerHandler> mTimerHandler;
176};
177#endif
std::shared_ptr< UIHandle > UIHandlePtr
Definition: CellularPanel.h:28
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Definition: Project.h:90
SelectHandle(const SelectHandle &)
friend TimerHandler
Definition: SelectHandle.h:173
SnapResults mSnapEnd
Definition: SelectHandle.h:138
std::weak_ptr< const WaveTrack > mFreqSelTrack
Definition: SelectHandle.h:157
SelectHandle & operator=(const SelectHandle &)=default
std::shared_ptr< TimerHandler > mTimerHandler
Definition: SelectHandle.h:175
std::shared_ptr< SelectionStateChanger > mSelectionStateChanger
Definition: SelectHandle.h:171
std::weak_ptr< ChannelView > mpView
Definition: SelectHandle.h:133
std::shared_ptr< SpectrumAnalyst > mFrequencySnapper
Definition: SelectHandle.h:165
std::shared_ptr< SnapManager > mSnapManager
Definition: SelectHandle.h:137
@ FREQ_SEL_SNAPPING_CENTER
Definition: SelectHandle.h:149
@ FREQ_SEL_PINNED_CENTER
Definition: SelectHandle.h:150
Defines a selected portion of a project.
Used for finding the peaks, for snapping to peaks.
Abstract base class for an object holding data associated with points on a time axis.
Definition: Track.h:122
A flat linked list of tracks supporting Add, Remove, Clear, and Contains, serialization of the list o...
Definition: Track.h:993
virtual void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass)
virtual wxRect DrawingArea(TrackPanelDrawingContext &context, const wxRect &rect, const wxRect &panelRect, unsigned iPass)
Short-lived drawing and event-handling object associated with a TrackPanelCell.
Definition: UIHandle.h:36
virtual void Enter(bool forward, AudacityProject *pProject)
Definition: UIHandle.cpp:20
virtual Result Drag(const TrackPanelMouseEvent &event, AudacityProject *pProject)=0
virtual std::shared_ptr< const Channel > FindChannel() const =0
virtual Result Release(const TrackPanelMouseEvent &event, AudacityProject *pProject, wxWindow *pParent)=0
unsigned Result
Definition: UIHandle.h:39
virtual bool IsDragging() const
Definition: UIHandle.cpp:58
static UIHandle::Result NeedChangeHighlight(const UIHandle &, const UIHandle &)
Definition: UIHandle.h:138
virtual HitTestPreview Preview(const TrackPanelMouseState &state, AudacityProject *pProject)=0
virtual bool HasEscape(AudacityProject *pProject) const
Definition: UIHandle.cpp:34
virtual bool Escape(AudacityProject *pProject)
Definition: UIHandle.cpp:39
virtual Result Cancel(AudacityProject *pProject)=0
virtual Result Click(const TrackPanelMouseEvent &event, AudacityProject *pProject)=0
A Track that contains audio waveform data.
Definition: WaveTrack.h:227
bool HitTest(const RectangleArgs &args, const wxPoint &mousePos)
std::shared_ptr< Track > FindTrack(TrackPanelCell *pCell)
Definition: TrackPanel.cpp:537