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