1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-12-08 17:46:25 +01:00
Files
audacity/src/tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.cpp
Paul Licameli 89c8e8ac39 null checks
2017-07-15 14:05:03 -04:00

194 lines
5.2 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
WaveTrackSliderHandles.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../../Audacity.h"
#include "WaveTrackSliderHandles.h"
#include "../../../../HitTestResult.h"
#include "../../../../MixerBoard.h"
#include "../../../../Project.h"
#include "../../../../RefreshCode.h"
#include "../../../../TrackPanel.h"
#include "../../../../UndoManager.h"
#include "../../../../WaveTrack.h"
GainSliderHandle::GainSliderHandle
( SliderFn sliderFn, const wxRect &rect, const std::shared_ptr<Track> &pTrack )
: SliderHandle{ sliderFn, rect, pTrack }
{}
GainSliderHandle::~GainSliderHandle()
{
}
std::shared_ptr<WaveTrack> GainSliderHandle::GetWaveTrack()
{
return std::static_pointer_cast<WaveTrack>(mpTrack.lock());
}
float GainSliderHandle::GetValue()
{
if (GetWaveTrack())
return GetWaveTrack()->GetGain();
else
return 0;
}
UIHandle::Result GainSliderHandle::SetValue
(AudacityProject *pProject, float newValue)
{
auto pTrack = GetWaveTrack();
if (pTrack) {
pTrack->SetGain(newValue);
// Assume linked track is wave or null
const auto link = static_cast<WaveTrack*>(mpTrack.lock()->GetLink());
if (link)
link->SetGain(newValue);
MixerBoard *const pMixerBoard = pProject->GetMixerBoard();
if (pMixerBoard)
pMixerBoard->UpdateGain(pTrack.get());
}
return RefreshCode::RefreshNone;
}
UIHandle::Result GainSliderHandle::CommitChanges
(const wxMouseEvent &, AudacityProject *pProject)
{
pProject->PushState(_("Moved gain slider"), _("Gain"), UndoPush::CONSOLIDATE);
return RefreshCode::RefreshCell;
}
UIHandlePtr GainSliderHandle::HitTest
(std::weak_ptr<GainSliderHandle> &holder,
const wxMouseState &state, const wxRect &rect,
const std::shared_ptr<Track> &pTrack)
{
if (!state.ButtonIsDown(wxMOUSE_BTN_LEFT))
return {};
wxRect sliderRect;
TrackInfo::GetGainRect(rect.GetTopLeft(), sliderRect);
if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) )
return {};
if (sliderRect.Contains(state.m_x, state.m_y)) {
wxRect sliderRect;
TrackInfo::GetGainRect(rect.GetTopLeft(), sliderRect);
auto sliderFn =
[]( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
return TrackInfo::GainSlider
(sliderRect, static_cast<WaveTrack*>( pTrack ), true,
const_cast<TrackPanel*>(pProject->GetTrackPanel()));
};
auto result =
std::make_shared<GainSliderHandle>( sliderFn, sliderRect, pTrack );
result = AssignUIHandlePtr(holder, result);
return result;
}
else
return {};
}
////////////////////////////////////////////////////////////////////////////////
PanSliderHandle::PanSliderHandle
( SliderFn sliderFn, const wxRect &rect, const std::shared_ptr<Track> &pTrack )
: SliderHandle{ sliderFn, rect, pTrack }
{}
PanSliderHandle::~PanSliderHandle()
{
}
std::shared_ptr<WaveTrack> PanSliderHandle::GetWaveTrack()
{
return std::static_pointer_cast<WaveTrack>(mpTrack.lock());
}
float PanSliderHandle::GetValue()
{
if (GetWaveTrack())
return GetWaveTrack()->GetPan();
else
return 0;
}
UIHandle::Result PanSliderHandle::SetValue(AudacityProject *pProject, float newValue)
{
using namespace RefreshCode;
Result result = RefreshNone;
auto pTrack = GetWaveTrack();
if (pTrack) {
#ifdef EXPERIMENTAL_OUTPUT_DISPLAY
bool panZero = false;
panZero = static_cast<WaveTrack*>(mpTrack)->SetPan(newValue);
#else
pTrack->SetPan(newValue);
#endif
// Assume linked track is wave or null
const auto link = static_cast<WaveTrack*>(pTrack->GetLink());
if (link)
link->SetPan(newValue);
MixerBoard *const pMixerBoard = pProject->GetMixerBoard();
if (pMixerBoard)
pMixerBoard->UpdatePan(pTrack.get());
#ifdef EXPERIMENTAL_OUTPUT_DISPLAY
if(panZero)
result |= FixScrollbars;
#endif
}
return result;
}
UIHandle::Result PanSliderHandle::CommitChanges
(const wxMouseEvent &, AudacityProject *pProject)
{
pProject->PushState(_("Moved pan slider"), _("Pan"), UndoPush::CONSOLIDATE);
return RefreshCode::RefreshCell;
}
UIHandlePtr PanSliderHandle::HitTest
(std::weak_ptr<PanSliderHandle> &holder,
const wxMouseState &state, const wxRect &rect,
const std::shared_ptr<Track> &pTrack)
{
if (!state.ButtonIsDown(wxMOUSE_BTN_LEFT))
return {};
wxRect sliderRect;
TrackInfo::GetPanRect(rect.GetTopLeft(), sliderRect);
if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) )
return {};
if (sliderRect.Contains(state.m_x, state.m_y)) {
auto sliderFn =
[]( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
return TrackInfo::PanSlider
(sliderRect, static_cast<WaveTrack*>( pTrack ), true,
const_cast<TrackPanel*>(pProject->GetTrackPanel()));
};
auto result = std::make_shared<PanSliderHandle>(
sliderFn, sliderRect, pTrack );
result = AssignUIHandlePtr(holder, result);
return result;
}
else
return {};
}