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:
@@ -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,
|
||||
const_cast<TrackPanel*>(pProject->GetTrackPanel()));
|
||||
Instance().mpSlider = slider;
|
||||
Instance().mpTrack = notetrack;
|
||||
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
|
||||
|
||||
@@ -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,
|
||||
const_cast<TrackPanel*>(pProject->GetTrackPanel()));
|
||||
Instance().mpSlider = slider;
|
||||
Instance().mpTrack = wavetrack;
|
||||
|
||||
Instance().mSliderFn =
|
||||
[]( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
|
||||
return TrackInfo::GainSlider
|
||||
(sliderRect, static_cast<WaveTrack*>( pTrack ), true,
|
||||
const_cast<TrackPanel*>(pProject->GetTrackPanel()));
|
||||
};
|
||||
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,
|
||||
const_cast<TrackPanel*>(pProject->GetTrackPanel()));
|
||||
Instance().mpSlider = slider;
|
||||
Instance().mpTrack = wavetrack;
|
||||
Instance().mSliderFn =
|
||||
[]( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
|
||||
return TrackInfo::PanSlider
|
||||
(sliderRect, static_cast<WaveTrack*>( pTrack ), true,
|
||||
const_cast<TrackPanel*>(pProject->GetTrackPanel()));
|
||||
};
|
||||
Instance().mRect = sliderRect;
|
||||
Instance().mpTrack = pTrack;
|
||||
|
||||
return {
|
||||
HitPreview(),
|
||||
&Instance()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 {};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user