1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-14 17:14:07 +01: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

@@ -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