1 /**********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 TimeTrackControls.cpp
6
7 Paul Licameli split from TrackPanel.cpp
8
9 **********************************************************************/
10
11
12 #include "TimeTrackControls.h"
13
14 #include "../../../HitTestResult.h"
15 #include "Project.h"
16 #include "../../../ProjectHistory.h"
17 #include "../../../RefreshCode.h"
18 #include "../../../TimeTrack.h"
19 #include "../../../widgets/PopupMenuTable.h"
20 #include <wx/numdlg.h>
21
~TimeTrackControls()22 TimeTrackControls::~TimeTrackControls()
23 {
24 }
25
HitTest(const TrackPanelMouseState & state,const AudacityProject * pProject)26 std::vector<UIHandlePtr> TimeTrackControls::HitTest
27 (const TrackPanelMouseState & state,
28 const AudacityProject *pProject)
29 {
30 return CommonTrackControls::HitTest(state, pProject);
31 }
32
33 enum
34 {
35 OnTimeTrackLinID = 30000,
36 OnTimeTrackLogID,
37 OnTimeTrackLogIntID,
38 OnSetTimeTrackRangeID,
39 };
40
Instance()41 TimeTrackMenuTable &TimeTrackMenuTable::Instance()
42 {
43 static TimeTrackMenuTable instance;
44 return instance;
45 }
46
InitUserData(void * pUserData)47 void TimeTrackMenuTable::InitUserData(void *pUserData)
48 {
49 mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData);
50 }
51
OnSetTimeTrackRange(wxCommandEvent &)52 void TimeTrackMenuTable::OnSetTimeTrackRange(wxCommandEvent & /*event*/)
53 {
54 TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
55 if (pTrack) {
56 long lower = (long)(pTrack->GetRangeLower() * 100.0 + 0.5);
57 long upper = (long)(pTrack->GetRangeUpper() * 100.0 + 0.5);
58
59 // MB: these lower/upper limits match the maximum allowed range of the time track
60 // envelope, but this is not strictly required
61 lower = wxGetNumberFromUser(_("Change lower speed limit (%) to:"),
62 _("Lower speed limit"),
63 _("Lower speed limit"),
64 lower,
65 TimeTrackControls::kRangeMin,
66 TimeTrackControls::kRangeMax);
67
68 upper = wxGetNumberFromUser(_("Change upper speed limit (%) to:"),
69 _("Upper speed limit"),
70 _("Upper speed limit"),
71 upper,
72 lower + 1,
73 TimeTrackControls::kRangeMax);
74
75 if (lower >= TimeTrackControls::kRangeMin &&
76 upper <= TimeTrackControls::kRangeMax &&
77 lower < upper) {
78 AudacityProject *const project = &mpData->project;
79 pTrack->SetRangeLower((double)lower / 100.0);
80 pTrack->SetRangeUpper((double)upper / 100.0);
81 ProjectHistory::Get( *project )
82 .PushState(XO("Set range to '%ld' - '%ld'").Format( lower, upper ),
83 /* i18n-hint: (verb)*/
84 XO("Set Range"));
85 mpData->result = RefreshCode::RefreshAll;
86 }
87 }
88 }
89
OnTimeTrackLin(wxCommandEvent &)90 void TimeTrackMenuTable::OnTimeTrackLin(wxCommandEvent & /*event*/)
91 {
92 TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
93 pTrack->SetDisplayLog(false);
94 AudacityProject *const project = &mpData->project;
95 ProjectHistory::Get( *project )
96 .PushState(XO("Set time track display to linear"), XO("Set Display"));
97
98 using namespace RefreshCode;
99 mpData->result = RefreshAll | UpdateVRuler;
100 }
101
OnTimeTrackLog(wxCommandEvent &)102 void TimeTrackMenuTable::OnTimeTrackLog(wxCommandEvent & /*event*/)
103 {
104 TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
105 pTrack->SetDisplayLog(true);
106 AudacityProject *const project = &mpData->project;
107 ProjectHistory::Get( *project )
108 .PushState(XO("Set time track display to logarithmic"), XO("Set Display"));
109
110 using namespace RefreshCode;
111 mpData->result = RefreshAll | UpdateVRuler;
112 }
113
OnTimeTrackLogInt(wxCommandEvent &)114 void TimeTrackMenuTable::OnTimeTrackLogInt(wxCommandEvent & /*event*/)
115 {
116 TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
117 AudacityProject *const project = &mpData->project;
118 if (pTrack->GetInterpolateLog()) {
119 pTrack->SetInterpolateLog(false);
120 ProjectHistory::Get( *project )
121 .PushState(XO("Set time track interpolation to linear"), XO("Set Interpolation"));
122 }
123 else {
124 pTrack->SetInterpolateLog(true);
125 ProjectHistory::Get( *project ).
126 PushState(XO("Set time track interpolation to logarithmic"), XO("Set Interpolation"));
127 }
128 mpData->result = RefreshCode::RefreshAll;
129 }
130
131 BEGIN_POPUP_MENU(TimeTrackMenuTable)
__anonf5c3db290202( PopupMenuHandler &handler )132 static const auto findTrack = []( PopupMenuHandler &handler ){
133 return static_cast<TimeTrack*>(
134 static_cast<TimeTrackMenuTable&>( handler ).mpData->pTrack );
135 };
136
137 BeginSection( "Scales" );
138 AppendRadioItem( "Linear", OnTimeTrackLinID, XXO("&Linear scale"),
139 POPUP_MENU_FN( OnTimeTrackLin ),
__anonf5c3db290302( PopupMenuHandler &handler, wxMenu &menu, int id )140 []( PopupMenuHandler &handler, wxMenu &menu, int id ){
141 menu.Check( id, !findTrack(handler)->GetDisplayLog() );
142 } );
143 AppendRadioItem( "Log", OnTimeTrackLogID, XXO("L&ogarithmic scale"),
144 POPUP_MENU_FN( OnTimeTrackLog ),
__anonf5c3db290402( PopupMenuHandler &handler, wxMenu &menu, int id )145 []( PopupMenuHandler &handler, wxMenu &menu, int id ){
146 menu.Check( id, findTrack(handler)->GetDisplayLog() );
147 } );
148 EndSection();
149
150 BeginSection( "Other" );
151 AppendItem( "Range", OnSetTimeTrackRangeID, XXO("&Range..."),
152 POPUP_MENU_FN( OnSetTimeTrackRange ) );
153 AppendCheckItem( "LogInterp", OnTimeTrackLogIntID,
154 XXO("Logarithmic &Interpolation"), POPUP_MENU_FN( OnTimeTrackLogInt),
__anonf5c3db290502( PopupMenuHandler &handler, wxMenu &menu, int id )155 []( PopupMenuHandler &handler, wxMenu &menu, int id ){
156 menu.Check( id, findTrack(handler)->GetInterpolateLog() );
157 } );
158 EndSection();
159
END_POPUP_MENU()160 END_POPUP_MENU()
161
162 PopupMenuTable *TimeTrackControls::GetMenuExtension(Track *)
163 {
164 return &TimeTrackMenuTable::Instance();
165 }
166
167 using DoGetTimeTrackControls = DoGetControls::Override< TimeTrack >;
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(DoGetTimeTrackControls)168 DEFINE_ATTACHED_VIRTUAL_OVERRIDE(DoGetTimeTrackControls) {
169 return [](TimeTrack &track) {
170 return std::make_shared<TimeTrackControls>( track.SharedPointer() );
171 };
172 }
173
174 #include "../../ui/TrackView.h"
175
176 using GetDefaultTimeTrackHeight = GetDefaultTrackHeight::Override< TimeTrack >;
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(GetDefaultTimeTrackHeight)177 DEFINE_ATTACHED_VIRTUAL_OVERRIDE(GetDefaultTimeTrackHeight) {
178 return [](TimeTrack &) {
179 return 100;
180 };
181 }
182