Audacity 3.2.0
TimeTrackControls.cpp
Go to the documentation of this file.
1/**********************************************************************
2
3Audacity: A Digital Audio Editor
4
5TimeTrackControls.cpp
6
7Paul 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
23{
24}
25
26std::vector<UIHandlePtr> TimeTrackControls::HitTest
27(const TrackPanelMouseState & state,
28 const AudacityProject *pProject)
29{
30 return CommonTrackControls::HitTest(state, pProject);
31}
32
33enum
34{
39};
40
42{
43 static TimeTrackMenuTable instance;
44 return instance;
45}
46
48{
49 mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData);
50}
51
52void TimeTrackMenuTable::OnSetTimeTrackRange(wxCommandEvent & /*event*/)
53{
54 auto &track = static_cast<TimeTrack&>(mpData->track);
55 long lower = (long)(track.GetRangeLower() * 100.0 + 0.5);
56 long upper = (long)(track.GetRangeUpper() * 100.0 + 0.5);
57
58 // MB: these lower/upper limits match the maximum allowed range of the time track
59 // envelope, but this is not strictly required
60 lower = wxGetNumberFromUser(_("Change lower speed limit (%) to:"),
61 _("Lower speed limit"),
62 _("Lower speed limit"),
63 lower,
66
67 upper = wxGetNumberFromUser(_("Change upper speed limit (%) to:"),
68 _("Upper speed limit"),
69 _("Upper speed limit"),
70 upper,
71 lower + 1,
73
74 if (lower >= TimeTrackControls::kRangeMin &&
76 lower < upper) {
78 track.SetRangeLower((double)lower / 100.0);
79 track.SetRangeUpper((double)upper / 100.0);
81 .PushState(XO("Set range to '%ld' - '%ld'").Format( lower, upper ),
82 /* i18n-hint: (verb)*/
83 XO("Set Range"));
85 }
86}
87
88void TimeTrackMenuTable::OnTimeTrackLin(wxCommandEvent & /*event*/)
89{
90 auto &track = static_cast<TimeTrack&>(mpData->track);
91 track.SetDisplayLog(false);
94 .PushState(XO("Set time track display to linear"), XO("Set Display"));
95
96 using namespace RefreshCode;
98}
99
100void TimeTrackMenuTable::OnTimeTrackLog(wxCommandEvent & /*event*/)
101{
102 auto &track = static_cast<TimeTrack&>(mpData->track);
103 track.SetDisplayLog(true);
106 .PushState(XO("Set time track display to logarithmic"), XO("Set Display"));
107
108 using namespace RefreshCode;
110}
111
112void TimeTrackMenuTable::OnTimeTrackLogInt(wxCommandEvent & /*event*/)
113{
114 auto &track = static_cast<TimeTrack&>(mpData->track);
116 if (track.GetInterpolateLog()) {
117 track.SetInterpolateLog(false);
119 .PushState(XO("Set time track interpolation to linear"), XO("Set Interpolation"));
120 }
121 else {
122 track.SetInterpolateLog(true);
123 ProjectHistory::Get( *project ).
124 PushState(XO("Set time track interpolation to logarithmic"), XO("Set Interpolation"));
125 }
127}
128
130 static const auto findTrack =
132 return static_cast<TimeTrack&>(
133 static_cast<TimeTrackMenuTable&>(handler).mpData->track);
134 };
135
136 BeginSection( "Scales" );
137 AppendRadioItem( "Linear", OnTimeTrackLinID, XXO("&Linear scale"),
138 POPUP_MENU_FN( OnTimeTrackLin ),
139 []( PopupMenuHandler &handler, wxMenu &menu, int id ){
140 menu.Check( id, !findTrack(handler).GetDisplayLog() );
141 } );
142 AppendRadioItem( "Log", OnTimeTrackLogID, XXO("L&ogarithmic scale"),
143 POPUP_MENU_FN( OnTimeTrackLog ),
144 []( PopupMenuHandler &handler, wxMenu &menu, int id ){
145 menu.Check( id, findTrack(handler).GetDisplayLog() );
146 } );
148
149 BeginSection( "Other" );
150 AppendItem( "Range", OnSetTimeTrackRangeID, XXO("&Range..."),
151 POPUP_MENU_FN( OnSetTimeTrackRange ) );
153 XXO("Logarithmic &Interpolation"), POPUP_MENU_FN( OnTimeTrackLogInt),
154 []( PopupMenuHandler &handler, wxMenu &menu, int id ){
155 menu.Check( id, findTrack(handler).GetInterpolateLog() );
156 } );
157 EndSection();
158
160
162{
164}
165
168 return [](TimeTrack &track) {
169 return std::make_shared<TimeTrackControls>( track.SharedPointer() );
170 };
171}
172
173#include "../../ui/ChannelView.h"
174
177 return [](TimeTrack &) {
178 return 100;
179 };
180}
XO("Cut/Copy/Paste")
XXO("&Cut/Copy/Paste Toolbar")
#define _(s)
Definition: Internat.h:73
#define END_POPUP_MENU()
#define BEGIN_POPUP_MENU(HandlerClass)
#define POPUP_MENU_FN(memFn)
const auto project
EndSection()
@ OnTimeTrackLogIntID
@ OnTimeTrackLinID
@ OnTimeTrackLogID
@ OnSetTimeTrackRangeID
AppendCheckItem("LogInterp", OnTimeTrackLogIntID, XXO("Logarithmic &Interpolation"), POPUP_MENU_FN(OnTimeTrackLogInt), [](PopupMenuHandler &handler, wxMenu &menu, int id){ menu.Check(id, findTrack(handler).GetInterpolateLog());})
AppendRadioItem("Linear", OnTimeTrackLinID, XXO("&Linear scale"), POPUP_MENU_FN(OnTimeTrackLin), [](PopupMenuHandler &handler, wxMenu &menu, int id){ menu.Check(id, !findTrack(handler).GetDisplayLog());})
BeginSection("Scales")
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(DoGetTimeTrackControls)
static const auto findTrack
AppendItem("Range", OnSetTimeTrackRangeID, XXO("&Range..."), POPUP_MENU_FN(OnSetTimeTrackRange))
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Definition: Project.h:90
virtual std::vector< UIHandlePtr > HitTest(const TrackPanelMouseState &state, const AudacityProject *) override=0
Abstract base class used in importing a file.
void PushState(const TranslatableString &desc, const TranslatableString &shortDesc)
static ProjectHistory & Get(AudacityProject &project)
std::vector< UIHandlePtr > HitTest(const TrackPanelMouseState &state, const AudacityProject *pProject) override
static const int kRangeMin
static const int kRangeMax
A kind of Track used to 'warp time'.
Definition: TimeTrack.h:24
void SetDisplayLog(bool displayLog)
Definition: TimeTrack.h:95
void OnTimeTrackLog(wxCommandEvent &)
static TimeTrackMenuTable & Instance()
void OnTimeTrackLin(wxCommandEvent &)
void OnSetTimeTrackRange(wxCommandEvent &)
void InitUserData(void *pUserData) override
Called before the menu items are appended.
void OnTimeTrackLogInt(wxCommandEvent &)
CommonTrackControls::InitMenuData * mpData
Abstract base class for an object holding data associated with points on a time axis.
Definition: Track.h:110
Namespace containing an enum 'what to do on a refresh?'.
Definition: RefreshCode.h:16
For defining overrides of the method.