1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-02 08:59:28 +02:00

TrackPanel still draws Gain and Pan, but no longer handles clicks on them...

... also implemented ESC key for those drags
This commit is contained in:
Paul Licameli 2015-07-18 15:35:26 -04:00 committed by Paul Licameli
parent 5ee73f944d
commit a569476e79
9 changed files with 288 additions and 135 deletions

View File

@ -1229,6 +1229,7 @@
5E73964A1DAFD91D00BA0A4D /* CutlineHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E7396481DAFD91D00BA0A4D /* CutlineHandle.cpp */; };
5E73964D1DAFD95B00BA0A4D /* ButtonHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E73964B1DAFD95B00BA0A4D /* ButtonHandle.cpp */; };
5E7396501DAFD98400BA0A4D /* SliderHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E73964E1DAFD98400BA0A4D /* SliderHandle.cpp */; };
5E7396561DAFDA0000BA0A4D /* WaveTrackSliderHandles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E7396541DAFDA0000BA0A4D /* WaveTrackSliderHandles.cpp */; };
5E74D2E31CC4429700D88B0B /* EditCursorOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E74D2DD1CC4429700D88B0B /* EditCursorOverlay.cpp */; };
5E74D2E41CC4429700D88B0B /* PlayIndicatorOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E74D2DF1CC4429700D88B0B /* PlayIndicatorOverlay.cpp */; };
5E74D2E51CC4429700D88B0B /* Scrubbing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E74D2E11CC4429700D88B0B /* Scrubbing.cpp */; };
@ -3058,6 +3059,8 @@
5E73964C1DAFD95B00BA0A4D /* ButtonHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ButtonHandle.h; sourceTree = "<group>"; };
5E73964E1DAFD98400BA0A4D /* SliderHandle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SliderHandle.cpp; sourceTree = "<group>"; };
5E73964F1DAFD98400BA0A4D /* SliderHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SliderHandle.h; sourceTree = "<group>"; };
5E7396541DAFDA0000BA0A4D /* WaveTrackSliderHandles.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WaveTrackSliderHandles.cpp; sourceTree = "<group>"; };
5E7396551DAFDA0000BA0A4D /* WaveTrackSliderHandles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WaveTrackSliderHandles.h; sourceTree = "<group>"; };
5E74D2D91CC4427B00D88B0B /* TrackPanelCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelCell.h; sourceTree = "<group>"; };
5E74D2DA1CC4427B00D88B0B /* TrackPanelCellIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelCellIterator.h; sourceTree = "<group>"; };
5E74D2DD1CC4429700D88B0B /* EditCursorOverlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EditCursorOverlay.cpp; sourceTree = "<group>"; };
@ -5826,11 +5829,13 @@
5E7396481DAFD91D00BA0A4D /* CutlineHandle.cpp */,
5E000A1F1EC7B5D500E8FD93 /* SampleHandle.cpp */,
5EA018231EC7B226001F2996 /* WaveTrackControls.cpp */,
5E7396541DAFDA0000BA0A4D /* WaveTrackSliderHandles.cpp */,
5EA018251EC7B226001F2996 /* WaveTrackUI.cpp */,
5EA018261EC7B226001F2996 /* WaveTrackVRulerControls.cpp */,
5E7396491DAFD91D00BA0A4D /* CutlineHandle.h */,
5E000A201EC7B5D500E8FD93 /* SampleHandle.h */,
5EA018241EC7B226001F2996 /* WaveTrackControls.h */,
5E7396551DAFDA0000BA0A4D /* WaveTrackSliderHandles.h */,
5EA018271EC7B226001F2996 /* WaveTrackVRulerControls.h */,
);
path = ui;
@ -7749,6 +7754,7 @@
28501EAA0CEED0670029ABAA /* LoadVamp.cpp in Sources */,
5ED1D0AD1CDE55BD00471E3C /* Overlay.cpp in Sources */,
28501EAB0CEED0680029ABAA /* VampEffect.cpp in Sources */,
5E7396561DAFDA0000BA0A4D /* WaveTrackSliderHandles.cpp in Sources */,
288052C20DEA73F500671EA4 /* NonGuiThread.cpp in Sources */,
28530C4C0DF2105200555C94 /* HtmlWindow.cpp in Sources */,
28530C4D0DF2105200555C94 /* ProgressDialog.cpp in Sources */,

View File

@ -567,6 +567,8 @@ audacity_SOURCES = \
tracks/playabletrack/wavetrack/ui/SampleHandle.h \
tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp \
tracks/playabletrack/wavetrack/ui/WaveTrackControls.h \
tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.cpp \
tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.h \
tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.cpp \
tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.h \
tracks/playabletrack/wavetrack/ui/WaveTrackUI.cpp \

View File

@ -1147,8 +1147,6 @@ void TrackPanel::HandleInterruptedDrag()
IsClosing,
IsAdjustingLabel,
IsRearranging,
IsGainSliding,
IsPanSliding,
IsStretching,
IsVelocitySliding
*/
@ -3576,77 +3574,6 @@ void TrackPanel::HandleMinimizing(wxMouseEvent & event)
}
}
void TrackPanel::HandleSliders(wxMouseEvent &event, bool pan)
{
LWSlider *slider;
#ifdef EXPERIMENTAL_OUTPUT_DISPLAY
bool panZero = false;
#endif
wxASSERT(mCapturedTrack->GetKind() == Track::Wave);
// On the Mac, we'll lose track capture if the slider dialog
// is displayed, but it doesn't hurt to do this for all plats.
WaveTrack *capturedTrack = (WaveTrack *) mCapturedTrack;
auto rect = FindTrackRect( capturedTrack, true );
if (pan) {
wxRect sliderRect;
TrackInfo::GetPanRect(rect.GetTopLeft(), sliderRect);
slider = mTrackInfo.PanSlider(sliderRect, capturedTrack, true, this);
}
else {
wxRect sliderRect;
TrackInfo::GetGainRect(rect.GetTopLeft(), sliderRect);
slider = mTrackInfo.GainSlider(sliderRect, capturedTrack, true, this);
}
slider->OnMouseEvent(event);
//If we have a double-click, do this...
if (event.LeftDClick())
mMouseCapture = IsUncaptured;
float newValue = slider->Get();
MixerBoard* pMixerBoard = this->GetMixerBoard(); // Update mixer board, too.
// Assume linked track is wave or null
const auto link = static_cast<WaveTrack *>(capturedTrack->GetLink());
if (pan) {
#ifdef EXPERIMENTAL_OUTPUT_DISPLAY
panZero = capturedTrack->SetPan(newValue);
#else
capturedTrack->SetPan(newValue);
#endif
if (link)
link->SetPan(newValue);
#ifdef EXPERIMENTAL_OUTPUT_DISPLAY
if(panZero) MakeParentRedrawScrollbars();
#endif
if (pMixerBoard)
pMixerBoard->UpdatePan(capturedTrack);
}
else {
capturedTrack->SetGain(newValue);
if (link)
link->SetGain(newValue);
if (pMixerBoard)
pMixerBoard->UpdateGain(capturedTrack);
}
RefreshTrack(capturedTrack);
if (event.ButtonUp()) {
MakeParentPushState(pan ? _("Moved pan slider") : _("Moved gain slider"),
pan ? _("Pan") : _("Gain"),
UndoPush::CONSOLIDATE);
SetCapturedTrack( NULL );
}
}
#ifdef EXPERIMENTAL_MIDI_OUT
void TrackPanel::HandleVelocitySlider(wxMouseEvent &event)
{
@ -3950,14 +3877,6 @@ void TrackPanel::HandleLabelClick(wxMouseEvent & event)
if (isleft && MinimizeFunc(t, rect, event.m_x, event.m_y))
return;
if (isleft && t->GetKind() == Track::Wave)
{
if (GainFunc(t, rect, event, event.m_x, event.m_y))
return;
if (PanFunc(t, rect, event, event.m_x, event.m_y))
return;
}
#ifdef USE_MIDI
// DM: If it's a NoteTrack, it has special controls
else if (t->GetKind() == Track::Note)
@ -4076,40 +3995,6 @@ void TrackPanel::CalculateRearrangingThresholds(wxMouseEvent & event)
mMoveDownThreshold = INT_MAX;
}
bool TrackPanel::GainFunc(Track * t, wxRect rect, wxMouseEvent &event,
int x, int y)
{
wxRect sliderRect;
mTrackInfo.GetGainRect(rect.GetTopLeft(), sliderRect);
if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) )
return false;
if (!sliderRect.Contains(x, y))
return false;
SetCapturedTrack( t, IsGainSliding);
mCapturedRect = rect;
HandleSliders(event, false);
return true;
}
bool TrackPanel::PanFunc(Track * t, wxRect rect, wxMouseEvent &event,
int x, int y)
{
wxRect sliderRect;
mTrackInfo.GetPanRect(rect.GetTopLeft(), sliderRect);
if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) )
return false;
if (!sliderRect.Contains(x, y))
return false;
SetCapturedTrack( t, IsPanSliding);
mCapturedRect = rect;
HandleSliders(event, true);
return true;
}
#ifdef EXPERIMENTAL_MIDI_OUT
bool TrackPanel::VelocityFunc(Track * t, wxRect rect, wxMouseEvent &event,
int x, int y)
@ -4969,13 +4854,6 @@ try
if (event.Leaving())
{
// PRL: was this test really needed? It interfered with my refactoring
// that tried to eliminate those enum values.
// I think it was never true, that mouse capture was pan or gain sliding,
// but no mouse button was down.
// if (mMouseCapture != IsPanSliding && mMouseCapture != IsGainSliding)
auto buttons =
// Bug 1325: button state in Leaving events is unreliable on Mac.
// Poll the global state instead.
@ -5058,12 +4936,6 @@ try
case IsRearranging:
HandleRearrange(event);
break;
case IsGainSliding:
HandleSliders(event, false);
break;
case IsPanSliding:
HandleSliders(event, true);
break;
#ifdef EXPERIMENTAL_MIDI_OUT
case IsVelocitySliding:
HandleVelocitySlider(event);

View File

@ -494,7 +494,6 @@ protected:
virtual void HandleClosing(wxMouseEvent & event);
virtual void HandlePopping(wxMouseEvent & event);
virtual void HandleMinimizing(wxMouseEvent & event);
virtual void HandleSliders(wxMouseEvent &event, bool pan);
#ifdef EXPERIMENTAL_MIDI_OUT
virtual void HandleVelocitySlider(wxMouseEvent &event);
#endif
@ -507,10 +506,6 @@ protected:
virtual bool PopupFunc(Track * t, wxRect rect, int x, int y);
virtual bool MinimizeFunc(Track *t, wxRect rect, int x, int f);
virtual bool GainFunc(Track * t, wxRect rect, wxMouseEvent &event,
int x, int y);
virtual bool PanFunc(Track * t, wxRect rect, wxMouseEvent &event,
int x, int y);
#ifdef EXPERIMENTAL_MIDI_OUT
virtual bool VelocityFunc(Track * t, wxRect rect, wxMouseEvent &event,
int x, int y);
@ -806,8 +801,6 @@ public:
IsRearranging,
IsMuting,
IsSoloing,
IsGainSliding,
IsPanSliding,
IsMinimizing,
IsPopping,
#ifdef EXPERIMENTAL_MIDI_OUT

View File

@ -11,6 +11,7 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../../Audacity.h"
#include "WaveTrackControls.h"
#include "../../ui/PlayableTrackButtonHandles.h"
#include "WaveTrackSliderHandles.h"
#include "../../../../HitTestResult.h"
#include "../../../../Track.h"
@ -51,6 +52,14 @@ HitTestResult WaveTrackControls::HitTest
(result = SoloButtonHandle::HitTest
(event, rect, pProject, track)).handle)
return result;
if (NULL != (result =
GainSliderHandle::HitTest(event, rect, pProject, mpTrack)).handle)
return result;
if (NULL != (result =
PanSliderHandle::HitTest(event, rect, pProject, mpTrack)).handle)
return result;
}
}

View File

@ -0,0 +1,190 @@
#include "WaveTrackSliderHandles.h"
/**********************************************************************
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()
: SliderHandle()
{
}
GainSliderHandle::~GainSliderHandle()
{
}
GainSliderHandle &GainSliderHandle::Instance()
{
static GainSliderHandle instance;
return instance;
}
WaveTrack *GainSliderHandle::GetTrack()
{
return static_cast<WaveTrack*>(mpTrack);
}
float GainSliderHandle::GetValue()
{
return static_cast<WaveTrack*>(mpTrack)->GetGain();
}
UIHandle::Result GainSliderHandle::SetValue
(AudacityProject *pProject, float newValue)
{
GetTrack()->SetGain(newValue);
// Assume linked track is wave or null
const auto link = static_cast<WaveTrack*>(mpTrack->GetLink());
if (link)
link->SetGain(newValue);
MixerBoard *const pMixerBoard = pProject->GetMixerBoard();
if (pMixerBoard)
pMixerBoard->UpdateGain(GetTrack());
return RefreshCode::RefreshNone;
}
UIHandle::Result GainSliderHandle::CommitChanges
(const wxMouseEvent &, AudacityProject *pProject)
{
pProject->PushState(_("Moved gain slider"), _("Gain"), UndoPush::CONSOLIDATE);
return RefreshCode::RefreshCell;
}
HitTestResult GainSliderHandle::HitTest
(const wxMouseEvent &event, const wxRect &rect,
const AudacityProject *pProject, Track *pTrack)
{
if (!event.Button(wxMOUSE_BTN_LEFT))
return {};
wxRect sliderRect;
TrackInfo::GetGainRect(rect.GetTopLeft(), sliderRect);
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;
return {
HitPreview(),
&Instance()
};
}
else
return {};
}
////////////////////////////////////////////////////////////////////////////////
PanSliderHandle::PanSliderHandle()
: SliderHandle()
{
}
PanSliderHandle::~PanSliderHandle()
{
}
PanSliderHandle &PanSliderHandle::Instance()
{
static PanSliderHandle instance;
return instance;
}
WaveTrack *PanSliderHandle::GetTrack()
{
return static_cast<WaveTrack*>(mpTrack);
}
float PanSliderHandle::GetValue()
{
return GetTrack()->GetPan();
}
UIHandle::Result PanSliderHandle::SetValue(AudacityProject *pProject, float newValue)
{
#ifdef EXPERIMENTAL_OUTPUT_DISPLAY
bool panZero = false;
panZero = static_cast<WaveTrack*>(mpTrack)->SetPan(newValue);
#else
mpTrack->SetPan(newValue);
#endif
// Assume linked track is wave or null
const auto link = static_cast<WaveTrack*>(mpTrack->GetLink());
if (link)
link->SetPan(newValue);
MixerBoard *const pMixerBoard = pProject->GetMixerBoard();
if (pMixerBoard)
pMixerBoard->UpdatePan(GetTrack());
using namespace RefreshCode;
Result result = RefreshNone;
#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;
}
HitTestResult PanSliderHandle::HitTest
(const wxMouseEvent &event, const wxRect &rect,
const AudacityProject *pProject, Track *pTrack)
{
if (!event.Button(wxMOUSE_BTN_LEFT))
return {};
wxRect sliderRect;
TrackInfo::GetPanRect(rect.GetTopLeft(), sliderRect);
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;
return {
HitPreview(),
&Instance()
};
}
else
return {};
}

View File

@ -0,0 +1,73 @@
/**********************************************************************
Audacity: A Digital Audio Editor
WavelTrackSliderHandles.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_WAVE_TRACK_SLIDER_HANDLES__
#define __AUDACITY_WAVE_TRACK_SLIDER_HANDLES__
#include "../../../ui/SliderHandle.h"
class WaveTrack;
struct HitTestResult;
class GainSliderHandle final : public SliderHandle
{
GainSliderHandle(const GainSliderHandle&) = delete;
GainSliderHandle &operator=(const GainSliderHandle&) = delete;
GainSliderHandle();
virtual ~GainSliderHandle();
static GainSliderHandle& Instance();
WaveTrack *GetTrack();
protected:
float GetValue() override;
Result SetValue
(AudacityProject *pProject, float newValue) override;
Result CommitChanges
(const wxMouseEvent &event, AudacityProject *pProject) override;
bool StopsOnKeystroke () override { return true; }
public:
static HitTestResult HitTest
(const wxMouseEvent &event, const wxRect &rect,
const AudacityProject *pProject, Track *pTrack);
};
////////////////////////////////////////////////////////////////////////////////
class PanSliderHandle final : public SliderHandle
{
PanSliderHandle(const PanSliderHandle&) = delete;
PanSliderHandle &operator=(const PanSliderHandle&) = delete;
PanSliderHandle();
virtual ~PanSliderHandle();
static PanSliderHandle& Instance();
WaveTrack *GetTrack();
protected:
float GetValue() override;
Result SetValue(AudacityProject *pProject, float newValue) override;
Result CommitChanges
(const wxMouseEvent &event, AudacityProject *pProject) override;
bool StopsOnKeystroke () override { return true; }
public:
static HitTestResult HitTest
(const wxMouseEvent &event, const wxRect &rect,
const AudacityProject *pProject, Track *pTrack);
};
#endif

View File

@ -234,6 +234,7 @@
<ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\CutlineHandle.cpp" />
<ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\SampleHandle.cpp" />
<ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackControls.cpp" />
<ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackSliderHandles.cpp" />
<ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackUI.cpp" />
<ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackVRulerControls.cpp" />
<ClCompile Include="..\..\..\src\tracks\timetrack\ui\TimeTrackControls.cpp" />
@ -501,6 +502,7 @@
<ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\CutlineHandle.h" />
<ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\SampleHandle.h" />
<ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackControls.h" />
<ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackSliderHandles.h" />
<ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackVRulerControls.h" />
<ClInclude Include="..\..\..\src\tracks\ui\CommonTrackPanelCell.h" />
<ClInclude Include="..\..\..\src\tracks\labeltrack\ui\LabelTrackControls.h" />

View File

@ -1016,6 +1016,9 @@
<ClCompile Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackButtonHandles.cpp">
<Filter>src\tracks\playabletrack\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackSliderHandles.cpp">
<Filter>src\tracks\playabletrack\wavetrack\ui</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\src\AboutDialog.h">
@ -2023,6 +2026,9 @@
<ClInclude Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackButtonHandles.h">
<Filter>src\tracks\playabletrack\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackSliderHandles.h">
<Filter>src\tracks\playabletrack\wavetrack\ui</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Image Include="..\..\audacity.ico">