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 ) ) if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) )
return {}; return {};
if (sliderRect.Contains(event.m_x, event.m_y)) { if (sliderRect.Contains(event.m_x, event.m_y)) {
NoteTrack *const notetrack = static_cast<NoteTrack*>(pTrack); Instance().mSliderFn =
auto slider = TrackInfo::VelocitySlider []( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
(sliderRect, notetrack, true, return TrackInfo::VelocitySlider
const_cast<TrackPanel*>(pProject->GetTrackPanel())); (sliderRect, static_cast<NoteTrack*>( pTrack ), true,
Instance().mpSlider = slider; const_cast<TrackPanel*>(pProject->GetTrackPanel()));
Instance().mpTrack = notetrack; };
Instance().mRect = sliderRect;
Instance().mpTrack = pTrack;
return { HitPreview(), &Instance() }; return { HitPreview(), &Instance() };
} }
else else

View File

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

View File

@@ -30,7 +30,7 @@ HitTestPreview SliderHandle::HitPreview()
} }
UIHandle::Result SliderHandle::Click UIHandle::Result SliderHandle::Click
(const TrackPanelMouseEvent &evt, AudacityProject *) (const TrackPanelMouseEvent &evt, AudacityProject *pProject)
{ {
wxMouseEvent &event = evt.event; wxMouseEvent &event = evt.event;
using namespace RefreshCode; using namespace RefreshCode;
@@ -39,8 +39,8 @@ UIHandle::Result SliderHandle::Click
// Come here for left click or double click // Come here for left click or double click
mStartingValue = GetValue(); mStartingValue = GetValue();
mpSlider->Set(mStartingValue); GetSlider( pProject )->Set(mStartingValue);
mpSlider->OnMouseEvent(event); GetSlider( pProject )->OnMouseEvent(event);
if (event.ButtonDClick()) if (event.ButtonDClick())
// Just did a modal dialog in OnMouseEvent // Just did a modal dialog in OnMouseEvent
@@ -55,8 +55,8 @@ UIHandle::Result SliderHandle::Drag
{ {
wxMouseEvent &event = evt.event; wxMouseEvent &event = evt.event;
using namespace RefreshCode; using namespace RefreshCode;
mpSlider->OnMouseEvent(event); GetSlider( pProject )->OnMouseEvent(event);
const float newValue = mpSlider->Get(); const float newValue = GetSlider( pProject )->Get();
// Make a non-permanent change to the project data: // Make a non-permanent change to the project data:
return RefreshCell | SetValue(pProject, newValue); return RefreshCell | SetValue(pProject, newValue);
@@ -75,22 +75,26 @@ UIHandle::Result SliderHandle::Release
{ {
using namespace RefreshCode; using namespace RefreshCode;
wxMouseEvent &event = evt.event; wxMouseEvent &event = evt.event;
mpSlider->OnMouseEvent(event); GetSlider( pProject )->OnMouseEvent(event);
const float newValue = mpSlider->Get(); const float newValue = GetSlider( pProject )->Get();
Result result = RefreshCell; Result result = RefreshCell;
// Commit changes to the project data: // Commit changes to the project data:
result |= SetValue(pProject, newValue); result |= SetValue(pProject, newValue);
result |= CommitChanges(event, pProject); result |= CommitChanges(event, pProject);
mpTrack = nullptr;
return result; return result;
} }
UIHandle::Result SliderHandle::Cancel(AudacityProject *pProject) UIHandle::Result SliderHandle::Cancel(AudacityProject *pProject)
{ {
wxMouseEvent event(wxEVT_LEFT_UP); wxMouseEvent event(wxEVT_LEFT_UP);
mpSlider->OnMouseEvent(event); GetSlider( pProject )->OnMouseEvent(event);
// Undo un-committed changes to project data: // 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__ #define __AUDACITY_SLIDER_HANDLE__
#include "../../UIHandle.h" #include "../../UIHandle.h"
#include <wx/gdicmn.h>
class wxMouseEvent; class wxMouseEvent;
class LWSlider; class LWSlider;
@@ -56,7 +57,11 @@ protected:
// Derived track is expected to set these two before Click(): // Derived track is expected to set these two before Click():
Track *mpTrack {}; 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 {}; float mStartingValue {};
}; };