1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-02 17:09:26 +02:00
audacity/src/tracks/timetrack/ui/TimeTrackControls.cpp
Paul Licameli 2bec03ac08 TrackView subclasses do not depend on corresponding TrackControls...
... use an AttachedVirtualFunction to compute the default view height from
the controls.

This frees LabelTrackControls from cycles.

Also made Track::DoSetHeight non-virtual
2019-07-09 00:05:01 -04:00

192 lines
5.8 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
TimeTrackControls.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../Audacity.h"
#include "TimeTrackControls.h"
#include "../../../HitTestResult.h"
#include "../../../Project.h"
#include "../../../ProjectHistory.h"
#include "../../../RefreshCode.h"
#include "../../../TimeTrack.h"
#include "../../../widgets/PopupMenuTable.h"
#include <wx/numdlg.h>
TimeTrackControls::~TimeTrackControls()
{
}
std::vector<UIHandlePtr> TimeTrackControls::HitTest
(const TrackPanelMouseState & state,
const AudacityProject *pProject)
{
return CommonTrackControls::HitTest(state, pProject);
}
enum
{
OnTimeTrackLinID = 30000,
OnTimeTrackLogID,
OnTimeTrackLogIntID,
OnSetTimeTrackRangeID,
};
class TimeTrackMenuTable : public PopupMenuTable
{
TimeTrackMenuTable() : mpData(NULL) {}
DECLARE_POPUP_MENU(TimeTrackMenuTable);
public:
static TimeTrackMenuTable &Instance();
private:
void InitMenu(Menu *pMenu, void *pUserData) override
{
mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData);
TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
pMenu->Check(OnTimeTrackLogIntID, pTrack->GetInterpolateLog());
auto isLog = pTrack->GetDisplayLog();
pMenu->Check(OnTimeTrackLinID, !isLog);
pMenu->Check(OnTimeTrackLogID, isLog);
}
void DestroyMenu() override
{
mpData = nullptr;
}
CommonTrackControls::InitMenuData *mpData;
void OnSetTimeTrackRange(wxCommandEvent & /*event*/);
void OnTimeTrackLin(wxCommandEvent & /*event*/);
void OnTimeTrackLog(wxCommandEvent & /*event*/);
void OnTimeTrackLogInt(wxCommandEvent & /*event*/);
};
TimeTrackMenuTable &TimeTrackMenuTable::Instance()
{
static TimeTrackMenuTable instance;
return instance;
}
void TimeTrackMenuTable::OnSetTimeTrackRange(wxCommandEvent & /*event*/)
{
TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
if (pTrack) {
long lower = (long)(pTrack->GetRangeLower() * 100.0 + 0.5);
long upper = (long)(pTrack->GetRangeUpper() * 100.0 + 0.5);
// MB: these lower/upper limits match the maximum allowed range of the time track
// envelope, but this is not strictly required
lower = wxGetNumberFromUser(_("Change lower speed limit (%) to:"),
_("Lower speed limit"),
_("Lower speed limit"),
lower,
10,
1000);
upper = wxGetNumberFromUser(_("Change upper speed limit (%) to:"),
_("Upper speed limit"),
_("Upper speed limit"),
upper,
lower + 1,
1000);
if (lower >= 10 && upper <= 1000 && lower < upper) {
AudacityProject *const project = ::GetActiveProject();
pTrack->SetRangeLower((double)lower / 100.0);
pTrack->SetRangeUpper((double)upper / 100.0);
ProjectHistory::Get( *project )
.PushState(wxString::Format(_("Set range to '%ld' - '%ld'"),
lower,
upper),
/* i18n-hint: (verb)*/
_("Set Range"));
mpData->result = RefreshCode::RefreshAll;
}
}
}
void TimeTrackMenuTable::OnTimeTrackLin(wxCommandEvent & /*event*/)
{
TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
pTrack->SetDisplayLog(false);
AudacityProject *const project = ::GetActiveProject();
ProjectHistory::Get( *project )
.PushState(_("Set time track display to linear"), _("Set Display"));
using namespace RefreshCode;
mpData->result = RefreshAll | UpdateVRuler;
}
void TimeTrackMenuTable::OnTimeTrackLog(wxCommandEvent & /*event*/)
{
TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
pTrack->SetDisplayLog(true);
AudacityProject *const project = ::GetActiveProject();
ProjectHistory::Get( *project )
.PushState(_("Set time track display to logarithmic"), _("Set Display"));
using namespace RefreshCode;
mpData->result = RefreshAll | UpdateVRuler;
}
void TimeTrackMenuTable::OnTimeTrackLogInt(wxCommandEvent & /*event*/)
{
TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
AudacityProject *const project = ::GetActiveProject();
if (pTrack->GetInterpolateLog()) {
pTrack->SetInterpolateLog(false);
ProjectHistory::Get( *project )
.PushState(_("Set time track interpolation to linear"), _("Set Interpolation"));
}
else {
pTrack->SetInterpolateLog(true);
ProjectHistory::Get( *project ).
PushState(_("Set time track interpolation to logarithmic"), _("Set Interpolation"));
}
mpData->result = RefreshCode::RefreshAll;
}
BEGIN_POPUP_MENU(TimeTrackMenuTable)
POPUP_MENU_SEPARATOR()
POPUP_MENU_RADIO_ITEM(OnTimeTrackLinID, _("&Linear scale"), OnTimeTrackLin)
POPUP_MENU_RADIO_ITEM(OnTimeTrackLogID, _("L&ogarithmic scale"), OnTimeTrackLog)
POPUP_MENU_SEPARATOR()
POPUP_MENU_ITEM(OnSetTimeTrackRangeID, _("&Range..."), OnSetTimeTrackRange)
POPUP_MENU_CHECK_ITEM(OnTimeTrackLogIntID, _("Logarithmic &Interpolation"), OnTimeTrackLogInt)
END_POPUP_MENU()
PopupMenuTable *TimeTrackControls::GetMenuExtension(Track *)
{
return &TimeTrackMenuTable::Instance();
}
using DoGetTimeTrackControls = DoGetControls::Override< TimeTrack >;
template<> template<> auto DoGetTimeTrackControls::Implementation() -> Function {
return [](TimeTrack &track) {
return std::make_shared<TimeTrackControls>( track.SharedPointer() );
};
}
static DoGetTimeTrackControls registerDoGetTimeTrackControls;
#include "../../ui/TrackView.h"
using GetDefaultTimeTrackHeight = GetDefaultTrackHeight::Override< TimeTrack >;
template<> template<>
auto GetDefaultTimeTrackHeight::Implementation() -> Function {
return [](TimeTrack &) {
return 100;
};
}
static GetDefaultTimeTrackHeight registerGetDefaultTimeTrackHeight;