1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-05 16:43:52 +01:00

Bug1665: Pan, Gain, Velocity were unresponsive except on last track

This commit is contained in:
Paul Licameli
2017-06-22 13:42:59 -04:00
parent 88cafa7a89
commit d37de4a96c
4 changed files with 48 additions and 29 deletions

View File

@@ -79,12 +79,15 @@ HitTestResult VelocitySliderHandle::HitTest
if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) )
return {};
if (sliderRect.Contains(event.m_x, event.m_y)) {
NoteTrack *const notetrack = static_cast<NoteTrack*>(pTrack);
auto slider = TrackInfo::VelocitySlider
(sliderRect, notetrack, true,
Instance().mSliderFn =
[]( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
return TrackInfo::VelocitySlider
(sliderRect, static_cast<NoteTrack*>( pTrack ), true,
const_cast<TrackPanel*>(pProject->GetTrackPanel()));
Instance().mpSlider = slider;
Instance().mpTrack = notetrack;
};
Instance().mRect = sliderRect;
Instance().mpTrack = pTrack;
return { HitPreview(), &Instance() };
}
else

View File

@@ -72,7 +72,7 @@ UIHandle::Result GainSliderHandle::CommitChanges
HitTestResult GainSliderHandle::HitTest
(const wxMouseEvent &event, const wxRect &rect,
const AudacityProject *pProject, Track *pTrack)
const AudacityProject *, Track *pTrack)
{
if (!event.Button(wxMOUSE_BTN_LEFT))
return {};
@@ -82,14 +82,18 @@ HitTestResult GainSliderHandle::HitTest
if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) )
return {};
if (sliderRect.Contains(event.m_x, event.m_y)) {
WaveTrack *const wavetrack = static_cast<WaveTrack*>(pTrack);
wxRect sliderRect;
TrackInfo::GetGainRect(rect.GetTopLeft(), sliderRect);
auto slider = TrackInfo::GainSlider
(sliderRect, wavetrack, true,
Instance().mSliderFn =
[]( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
return TrackInfo::GainSlider
(sliderRect, static_cast<WaveTrack*>( pTrack ), true,
const_cast<TrackPanel*>(pProject->GetTrackPanel()));
Instance().mpSlider = slider;
Instance().mpTrack = wavetrack;
};
Instance().mRect = sliderRect;
Instance().mpTrack = pTrack;
return {
HitPreview(),
&Instance()
@@ -174,12 +178,15 @@ HitTestResult PanSliderHandle::HitTest
if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) )
return {};
if (sliderRect.Contains(event.m_x, event.m_y)) {
WaveTrack *const wavetrack = static_cast<WaveTrack*>(pTrack);
auto slider = TrackInfo::PanSlider
(sliderRect, wavetrack, true,
Instance().mSliderFn =
[]( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
return TrackInfo::PanSlider
(sliderRect, static_cast<WaveTrack*>( pTrack ), true,
const_cast<TrackPanel*>(pProject->GetTrackPanel()));
Instance().mpSlider = slider;
Instance().mpTrack = wavetrack;
};
Instance().mRect = sliderRect;
Instance().mpTrack = pTrack;
return {
HitPreview(),
&Instance()

View File

@@ -30,7 +30,7 @@ HitTestPreview SliderHandle::HitPreview()
}
UIHandle::Result SliderHandle::Click
(const TrackPanelMouseEvent &evt, AudacityProject *)
(const TrackPanelMouseEvent &evt, AudacityProject *pProject)
{
wxMouseEvent &event = evt.event;
using namespace RefreshCode;
@@ -39,8 +39,8 @@ UIHandle::Result SliderHandle::Click
// Come here for left click or double click
mStartingValue = GetValue();
mpSlider->Set(mStartingValue);
mpSlider->OnMouseEvent(event);
GetSlider( pProject )->Set(mStartingValue);
GetSlider( pProject )->OnMouseEvent(event);
if (event.ButtonDClick())
// Just did a modal dialog in OnMouseEvent
@@ -55,8 +55,8 @@ UIHandle::Result SliderHandle::Drag
{
wxMouseEvent &event = evt.event;
using namespace RefreshCode;
mpSlider->OnMouseEvent(event);
const float newValue = mpSlider->Get();
GetSlider( pProject )->OnMouseEvent(event);
const float newValue = GetSlider( pProject )->Get();
// Make a non-permanent change to the project data:
return RefreshCell | SetValue(pProject, newValue);
@@ -75,22 +75,26 @@ UIHandle::Result SliderHandle::Release
{
using namespace RefreshCode;
wxMouseEvent &event = evt.event;
mpSlider->OnMouseEvent(event);
const float newValue = mpSlider->Get();
GetSlider( pProject )->OnMouseEvent(event);
const float newValue = GetSlider( pProject )->Get();
Result result = RefreshCell;
// Commit changes to the project data:
result |= SetValue(pProject, newValue);
result |= CommitChanges(event, pProject);
mpTrack = nullptr;
return result;
}
UIHandle::Result SliderHandle::Cancel(AudacityProject *pProject)
{
wxMouseEvent event(wxEVT_LEFT_UP);
mpSlider->OnMouseEvent(event);
GetSlider( pProject )->OnMouseEvent(event);
// Undo un-committed changes to project data:
return RefreshCode::RefreshCell | SetValue(pProject, mStartingValue);
auto result = SetValue(pProject, mStartingValue);
mpTrack = nullptr;
return RefreshCode::RefreshCell | result;
}

View File

@@ -12,6 +12,7 @@ Paul Licameli
#define __AUDACITY_SLIDER_HANDLE__
#include "../../UIHandle.h"
#include <wx/gdicmn.h>
class wxMouseEvent;
class LWSlider;
@@ -56,7 +57,11 @@ protected:
// Derived track is expected to set these two before Click():
Track *mpTrack {};
LWSlider *mpSlider {};
wxRect mRect{};
using SliderFn = LWSlider *(*)( AudacityProject*, const wxRect&, Track* );
SliderFn mSliderFn;
LWSlider *GetSlider( AudacityProject *pProject )
{ return mSliderFn( pProject, mRect, mpTrack ); }
float mStartingValue {};
};