Audacity 3.2.0
TrackButtonHandles.cpp
Go to the documentation of this file.
1/**********************************************************************
2
3Audacity: A Digital Audio Editor
4
5TrackButtonHandles.cpp
6
7Paul Licameli split from TrackPanel.cpp
8
9**********************************************************************/
10
11
12#include "TrackButtonHandles.h"
13
14#include "PendingTracks.h"
15#include "Project.h"
16#include "ProjectAudioIO.h"
17#include "../../ProjectAudioManager.h"
18#include "ProjectHistory.h"
19#include "../../SelectUtilities.h"
20#include "../../RefreshCode.h"
21#include "Track.h"
22#include "TrackFocus.h"
23#include "CommonTrackInfo.h"
24#include "../../TrackPanel.h"
25#include "../../TrackUtilities.h"
26#include "CommandManager.h"
27#include "../../tracks/ui/ChannelView.h"
28
30( const std::shared_ptr<Track> &pTrack, const wxRect &rect )
31 : ButtonHandle{ pTrack, rect }
32{}
33
35{
36}
37
39(const wxMouseEvent &, AudacityProject *pProject, wxWindow*)
40{
41 using namespace RefreshCode;
42
43 if (auto pTrack = mpTrack.lock()) {
44 auto channels = pTrack->Channels();
45 bool wasMinimized = ChannelView::Get(**channels.begin()).GetMinimized();
46 for (auto pChannel : channels)
47 ChannelView::Get(*pChannel).SetMinimized( !wasMinimized );
48 ProjectHistory::Get(*pProject).ModifyState(true);
49
50 // Redraw all tracks when any one of them expands or contracts
51 // (Could we invent a return code that draws only those at or below
52 // the affected track?)
54 }
55
56 return RefreshNone;
57}
58
60 const wxMouseState &, AudacityProject &) const
61{
62 auto pTrack = GetTrack();
63 return ChannelView::Get(*pTrack->GetChannel(0)).GetMinimized()
64 ? XO("Expand") : XO("Collapse");
65}
66
68(std::weak_ptr<MinimizeButtonHandle> &holder,
69 const wxMouseState &state, const wxRect &rect, TrackPanelCell *pCell)
70{
71 wxRect buttonRect;
72 CommonTrackInfo::GetMinimizeRect(rect, buttonRect);
73
74 if (buttonRect.Contains(state.m_x, state.m_y)) {
75 auto pTrack = static_cast<CommonTrackPanelCell*>(pCell)->FindTrack();
76 auto result = std::make_shared<MinimizeButtonHandle>( pTrack, buttonRect );
77 result = AssignUIHandlePtr(holder, result);
78 return result;
79 }
80 else
81 return {};
82}
83
86( const std::shared_ptr<Track> &pTrack, const wxRect &rect )
87 : ButtonHandle{ pTrack, rect }
88{}
89
91{
92}
93
95(const wxMouseEvent &event, AudacityProject *pProject, wxWindow*)
96{
97 using namespace RefreshCode;
98
99 auto pTrack = mpTrack.lock();
100 if (pTrack)
101 {
102 const bool unsafe = ProjectAudioIO::Get( *pProject ).IsAudioActive();
104 *pTrack, event.ShiftDown(), event.ControlDown(), !unsafe);
105// return RefreshAll ;
106 }
107
108 return RefreshNone;
109}
110
112 const wxMouseState &, AudacityProject &) const
113{
114 auto pTrack = GetTrack();
115#if defined(__WXMAC__)
116 return pTrack->GetSelected() ? XO("Command+Click to deselect") : XO("Select track");
117#else
118 return pTrack->GetSelected() ? XO("Ctrl+Click to deselect") : XO("Select track");
119#endif
120}
121
123(std::weak_ptr<SelectButtonHandle> &holder,
124 const wxMouseState &state, const wxRect &rect, TrackPanelCell *pCell)
125{
126 wxRect buttonRect;
127 CommonTrackInfo::GetSelectButtonRect(rect, buttonRect);
128
129 if (buttonRect.Contains(state.m_x, state.m_y)) {
130 auto pTrack = static_cast<CommonTrackPanelCell*>(pCell)->FindTrack();
131 auto result = std::make_shared<SelectButtonHandle>( pTrack, buttonRect );
132 result = AssignUIHandlePtr(holder, result);
133 return result;
134 }
135 else
136 return {};
137}
138
140
142( const std::shared_ptr<Track> &pTrack, const wxRect &rect )
143 : ButtonHandle{ pTrack, rect }
144{}
145
147{
148}
149
151 AudacityProject *pProject, wxWindow*)
152{
153 using namespace RefreshCode;
154 Result result = RefreshNone;
155
156 auto pTrack = mpTrack.lock();
157 if (pTrack) {
158 auto &toRemove = PendingTracks::Get(*pProject)
161 if (!ProjectAudioIO::Get( *pProject ).IsAudioActive()) {
162 // This pushes an undo item:
163 TrackUtilities::DoRemoveTrack(*pProject, toRemove);
164 // Redraw all tracks when any one of them closes
165 // (Could we invent a return code that draws only those at or below
166 // the affected track?)
168 }
169 }
170
171 return result;
172}
173
175 const wxMouseState &, AudacityProject &project) const
176{
177 auto name = XO("Delete Track");
178 auto focused =
179 TrackFocus::Get( project ).Get() == GetTrack().get();
180 if (!focused)
181 return name;
182
183 auto &commandManager = CommandManager::Get( project );
184 ComponentInterfaceSymbol command{ wxT("TrackClose"), name };
185 return commandManager.DescribeCommandsAndShortcuts( &command, 1u );
186}
187
189(std::weak_ptr<CloseButtonHandle> &holder,
190 const wxMouseState &state, const wxRect &rect, TrackPanelCell *pCell)
191{
192 wxRect buttonRect;
193 CommonTrackInfo::GetCloseBoxRect(rect, buttonRect);
194
195 if (buttonRect.Contains(state.m_x, state.m_y)) {
196 auto pTrack = static_cast<CommonTrackPanelCell*>(pCell)->FindTrack();
197 auto result = std::make_shared<CloseButtonHandle>( pTrack, buttonRect );
198 result = AssignUIHandlePtr(holder, result);
199 return result;
200 }
201 else
202 return {};
203}
204
206
208( const std::shared_ptr<TrackPanelCell> &pCell,
209 const std::shared_ptr<Track> &pTrack, const wxRect &rect )
210 : ButtonHandle{ pTrack, rect }
211 , mpCell{ pCell }
212{}
213
215{
216}
217
219(const wxMouseEvent &, AudacityProject *pProject, wxWindow *WXUNUSED(pParent))
220{
221 auto &trackPanel = TrackPanel::Get( *pProject );
222 auto pCell = mpCell.lock();
223 if (!pCell)
225 auto pTrack =
226 static_cast<CommonTrackPanelCell*>(pCell.get())->FindTrack();
227 if (!pTrack)
229 trackPanel.CallAfter(
230 [&trackPanel,pTrack]{ trackPanel.OnTrackMenu( pTrack.get() ); } );
232}
233
235 const wxMouseState &, AudacityProject &project) const
236{
237 auto name = XO("Open menu...");
238 auto focused =
239 TrackFocus::Get( project ).Get() == GetTrack().get();
240 if (!focused)
241 return name;
242
243 auto &commandManager = CommandManager::Get( project );
244 ComponentInterfaceSymbol command{ wxT("TrackMenu"), name };
245 return commandManager.DescribeCommandsAndShortcuts( &command, 1u );
246}
247
249(std::weak_ptr<MenuButtonHandle> &holder,
250 const wxMouseState &state, const wxRect &rect,
251 const std::shared_ptr<TrackPanelCell> &pCell)
252{
253 wxRect buttonRect;
254 CommonTrackInfo::GetTitleBarRect(rect, buttonRect);
255
256 if (buttonRect.Contains(state.m_x, state.m_y)) {
257 auto pTrack = static_cast<CommonTrackPanelCell*>(pCell.get())->FindTrack();
258 auto result = std::make_shared<MenuButtonHandle>( pCell, pTrack, buttonRect );
259 result = AssignUIHandlePtr(holder, result);
260 return result;
261 }
262 else
263 return {};
264}
wxT("CloseDown"))
std::shared_ptr< UIHandle > UIHandlePtr
Definition: CellularPanel.h:28
const TranslatableString name
Definition: Distortion.cpp:76
XO("Cut/Copy/Paste")
const auto project
declares abstract base class Track, TrackList, and iterators over TrackList
std::shared_ptr< Subclass > AssignUIHandlePtr(std::weak_ptr< Subclass > &holder, const std::shared_ptr< Subclass > &pNew)
Definition: UIHandle.h:164
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Definition: Project.h:90
A UIHandle for a TrackPanel button, such as the Mute and Solo buttons.
Definition: ButtonHandle.h:26
std::weak_ptr< Track > mpTrack
Definition: ButtonHandle.h:74
std::shared_ptr< Track > GetTrack() const
Definition: ButtonHandle.h:30
std::shared_ptr< const Track > FindTrack() const override
static ChannelView & Get(Channel &channel)
bool GetMinimized() const
Definition: ChannelView.h:69
void SetMinimized(bool minimized)
Subclass & Get(const RegisteredFactory &key)
Get reference to an attachment, creating on demand if not present, down-cast it to Subclass.
Definition: ClientData.h:318
CloseButtonHandle(const CloseButtonHandle &)=delete
static UIHandlePtr HitTest(std::weak_ptr< CloseButtonHandle > &holder, const wxMouseState &state, const wxRect &rect, TrackPanelCell *pCell)
TranslatableString Tip(const wxMouseState &state, AudacityProject &project) const override
Result CommitChanges(const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override
static CommandManager & Get(AudacityProject &project)
ComponentInterfaceSymbol pairs a persistent string identifier used internally with an optional,...
MenuButtonHandle(const MenuButtonHandle &)=delete
Result CommitChanges(const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override
static UIHandlePtr HitTest(std::weak_ptr< MenuButtonHandle > &holder, const wxMouseState &state, const wxRect &rect, const std::shared_ptr< TrackPanelCell > &pCell)
TranslatableString Tip(const wxMouseState &state, AudacityProject &) const override
std::weak_ptr< TrackPanelCell > mpCell
MinimizeButtonHandle(const MinimizeButtonHandle &)=delete
Result CommitChanges(const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override
static UIHandlePtr HitTest(std::weak_ptr< MinimizeButtonHandle > &holder, const wxMouseState &state, const wxRect &rect, TrackPanelCell *pCell)
TranslatableString Tip(const wxMouseState &state, AudacityProject &) const override
Track & SubstitutePendingChangedTrack(Track &track) const
static PendingTracks & Get(AudacityProject &project)
bool IsAudioActive() const
static ProjectAudioIO & Get(AudacityProject &project)
static ProjectAudioManager & Get(AudacityProject &project)
void ModifyState(bool bWantsAutoSave)
static ProjectHistory & Get(AudacityProject &project)
SelectButtonHandle(const SelectButtonHandle &)=delete
TranslatableString Tip(const wxMouseState &state, AudacityProject &) const override
Result CommitChanges(const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override
static UIHandlePtr HitTest(std::weak_ptr< SelectButtonHandle > &holder, const wxMouseState &state, const wxRect &rect, TrackPanelCell *pCell)
Track * Get()
Definition: TrackFocus.cpp:156
static TrackPanel & Get(AudacityProject &project)
Definition: TrackPanel.cpp:234
Holds a msgid for the translation catalog; may also bind format arguments.
unsigned Result
Definition: UIHandle.h:40
AUDACITY_DLL_API void GetCloseBoxRect(const wxRect &rect, wxRect &dest)
AUDACITY_DLL_API void GetSelectButtonRect(const wxRect &rect, wxRect &dest)
AUDACITY_DLL_API void GetMinimizeRect(const wxRect &rect, wxRect &dest)
AUDACITY_DLL_API void GetTitleBarRect(const wxRect &rect, wxRect &dest)
Namespace containing an enum 'what to do on a refresh?'.
Definition: RefreshCode.h:16
void DoListSelection(AudacityProject &project, Track &t, bool shift, bool ctrl, bool modifyState)
AUDACITY_DLL_API void DoRemoveTrack(AudacityProject &project, Track &toRemove)