1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-03 09:09:47 +02:00
audacity/src/tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.cpp
Paul Licameli b0c6a67c33 TrackPanelMouseEvent stores shared_ptr to cell; some handles too...
... those handles that force a simulated button-up when play interrupts drag,
and can assume that pointers to tracks remain nonNULL and part of the current
project state (not the undo history).

Also pass shared_ptr to Track into more hit test routines.
2017-06-28 01:46:56 -04:00

99 lines
2.5 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
NoteTrackSliderHandles.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../../Audacity.h"
#include "NoteTrackSliderHandles.h"
#ifdef EXPERIMENTAL_MIDI_OUT
#include "../../../../HitTestResult.h"
#include "../../../../MixerBoard.h"
#include "../../../../Project.h"
#include "../../../../RefreshCode.h"
#include "../../../../TrackPanel.h" // for TrackInfo
#include "../../../../UndoManager.h"
#include "../../../../NoteTrack.h"
VelocitySliderHandle::VelocitySliderHandle()
: SliderHandle()
{
}
VelocitySliderHandle::~VelocitySliderHandle()
{
}
VelocitySliderHandle &VelocitySliderHandle::Instance()
{
static VelocitySliderHandle instance;
return instance;
}
std::shared_ptr<NoteTrack> VelocitySliderHandle::GetNoteTrack()
{
return std::static_pointer_cast<NoteTrack>(mpTrack.lock());
}
float VelocitySliderHandle::GetValue()
{
return GetNoteTrack()->GetVelocity();
}
UIHandle::Result VelocitySliderHandle::SetValue
(AudacityProject *pProject, float newValue)
{
auto pTrack = GetNoteTrack();
pTrack->SetVelocity(newValue);
MixerBoard *const pMixerBoard = pProject->GetMixerBoard();
if (pMixerBoard)
pMixerBoard->UpdateVelocity(pTrack.get());
return RefreshCode::RefreshCell;
}
UIHandle::Result VelocitySliderHandle::CommitChanges
(const wxMouseEvent &, AudacityProject *pProject)
{
pProject->PushState(_("Moved velocity slider"), _("Velocity"), UndoPush::CONSOLIDATE);
return RefreshCode::RefreshCell;
}
HitTestResult VelocitySliderHandle::HitTest
(const wxMouseEvent &event, const wxRect &rect,
const AudacityProject *pProject, const std::shared_ptr<Track> &pTrack)
{
if (!event.Button(wxMOUSE_BTN_LEFT))
return {};
wxRect sliderRect;
TrackInfo::GetVelocityRect(rect.GetTopLeft(), sliderRect);
if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) )
return {};
if (sliderRect.Contains(event.m_x, event.m_y)) {
Instance().mSliderFn =
[]( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
return TrackInfo::VelocitySlider
(sliderRect, static_cast<NoteTrack*>( pTrack ), true,
const_cast<TrackPanel*>(pProject->GetTrackPanel()));
};
Instance().mRect = sliderRect;
Instance().mpTrack = pTrack;
return { HitPreview(), &Instance() };
}
else
return {};
}
#endif