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 ) )
|
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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {};
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user