1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-23 07:58:05 +02:00

Implement classes SpectrumVZoomHandle, WaveformVZoomHandle

This commit is contained in:
Paul Licameli 2019-07-06 19:25:08 -04:00
parent f7dc21436d
commit d991295efb
7 changed files with 399 additions and 47 deletions

View File

@ -0,0 +1,19 @@
/**********************************************************************
Audacity: A Digital Audio Editor
SpectrumVZoomHandle.cpp
Paul Licameli split from WaveTrackVZoomHandle.cpp
**********************************************************************/
#include "SpectrumVZoomHandle.h"
SpectrumVZoomHandle::SpectrumVZoomHandle
(const std::shared_ptr<WaveTrack> &pTrack, const wxRect &rect, int y)
: mpTrack{ pTrack } , mZoomStart(y), mZoomEnd(y), mRect(rect)
{
}
SpectrumVZoomHandle::~SpectrumVZoomHandle() = default;

View File

@ -0,0 +1,73 @@
/**********************************************************************
Audacity: A Digital Audio Editor
SpectrumVZoomHandle.h
Paul Licameli split from WaveTrackVZoomHandle.h
**********************************************************************/
#ifndef __AUDACITY_SPECTRUM_VZOOM_HANDLE__
#define __AUDACITY_SPECTRUM_VZOOM_HANDLE__
#include "../../../../UIHandle.h" // to inherit
#include "WaveTrackViewConstants.h"
class WaveTrack;
class SpectrumVZoomHandle final : public UIHandle
{
SpectrumVZoomHandle(const SpectrumVZoomHandle&);
public:
explicit SpectrumVZoomHandle
(const std::shared_ptr<WaveTrack> &pTrack, const wxRect &rect, int y);
SpectrumVZoomHandle &operator=(const SpectrumVZoomHandle&) = default;
static void DoZoom(
AudacityProject *pProject, WaveTrack *pTrack,
WaveTrackViewConstants::ZoomActions ZoomKind,
const wxRect &rect, int zoomStart, int zoomEnd,
bool fixedMousePoint);
~SpectrumVZoomHandle() override;
std::shared_ptr<WaveTrack> GetTrack() const { return mpTrack.lock(); }
void Enter(bool forward) override;
Result Click
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
Result Drag
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
HitTestPreview Preview
(const TrackPanelMouseState &state, const AudacityProject *pProject)
override;
Result Release
(const TrackPanelMouseEvent &event, AudacityProject *pProject,
wxWindow *pParent) override;
Result Cancel(AudacityProject *pProject) override;
private:
// TrackPanelDrawable implementation
void Draw(
TrackPanelDrawingContext &context,
const wxRect &rect, unsigned iPass ) override;
wxRect DrawingArea(
const wxRect &rect, const wxRect &panelRect, unsigned iPass ) override;
std::weak_ptr<WaveTrack> mpTrack;
int mZoomStart{}, mZoomEnd{};
wxRect mRect{};
};
#endif

View File

@ -13,6 +13,9 @@ Paul Licameli split from TrackPanel.cpp
#include "WaveTrackVZoomHandle.h"
#include "SpectrumVZoomHandle.h"
#include "WaveformVZoomHandle.h"
#include "../../../../Experimental.h"
#include "../../../../HitTestResult.h"
@ -126,8 +129,8 @@ unsigned WaveTrackVRulerControls::HandleWheelRotation
else if (event.CmdDown() && !event.ShiftDown()) {
const int yy = event.m_y;
auto doZoom = (wt->GetDisplay() == Spectrum)
? WaveTrackVZoomHandle::DoSpectrumZoom
: WaveTrackVZoomHandle::DoWaveformZoom;
? SpectrumVZoomHandle::DoZoom
: WaveformVZoomHandle::DoZoom;
doZoom(
pProject, wt,
(steps < 0)

View File

@ -11,6 +11,9 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../../Audacity.h"
#include "WaveTrackVZoomHandle.h"
#include "SpectrumVZoomHandle.h"
#include "WaveformVZoomHandle.h"
#include "../../../../Experimental.h"
#include "../../../ui/TrackVRulerControls.h"
@ -42,7 +45,9 @@ public:
WaveTrackVZoomHandle::DoZoomFunction doZoom;
};
bool IsDragZooming(int zoomStart, int zoomEnd)
}
bool WaveTrackVZoomHandle::IsDragZooming(int zoomStart, int zoomEnd)
{
const int DragThreshold = 3;// Anything over 3 pixels is a drag, else a click.
bool bVZoom;
@ -50,14 +55,26 @@ bool IsDragZooming(int zoomStart, int zoomEnd)
return bVZoom && (abs(zoomEnd - zoomStart) > DragThreshold);
}
}
WaveTrackVZoomHandle::WaveTrackVZoomHandle
(const std::shared_ptr<WaveTrack> &pTrack, const wxRect &rect, int y)
: mpTrack{ pTrack } , mZoomStart(y), mZoomEnd(y), mRect(rect)
{
}
void SpectrumVZoomHandle::Enter(bool)
{
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
mChangeHighlight = RefreshCode::RefreshCell;
#endif
}
void WaveformVZoomHandle::Enter(bool)
{
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
mChangeHighlight = RefreshCode::RefreshCell;
#endif
}
void WaveTrackVZoomHandle::Enter(bool)
{
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
@ -68,7 +85,7 @@ void WaveTrackVZoomHandle::Enter(bool)
// ZoomKind says how to zoom.
// If ZoomStart and ZoomEnd are not equal, this may override
// the zoomKind and cause a drag-zoom-in.
void WaveTrackVZoomHandle::DoSpectrumZoom(
void SpectrumVZoomHandle::DoZoom(
AudacityProject *pProject,
WaveTrack *pTrack,
WaveTrackViewConstants::ZoomActions ZoomKind,
@ -95,7 +112,7 @@ void WaveTrackVZoomHandle::DoSpectrumZoom(
(pTrack->GetSpectrogramSettings().scaleType == SpectrogramSettings::stLinear);
bool bDragZoom = IsDragZooming(zoomStart, zoomEnd);
bool bDragZoom = WaveTrackVZoomHandle::IsDragZooming(zoomStart, zoomEnd);
// Add 100 if spectral to separate the kinds of zoom.
const int kSpectral = 100;
@ -228,7 +245,7 @@ void WaveTrackVZoomHandle::DoSpectrumZoom(
// ZoomKind says how to zoom.
// If ZoomStart and ZoomEnd are not equal, this may override
// the zoomKind and cause a drag-zoom-in.
void WaveTrackVZoomHandle::DoWaveformZoom(
void WaveformVZoomHandle::DoZoom(
AudacityProject *pProject,
WaveTrack *pTrack,
WaveTrackViewConstants::ZoomActions ZoomKind,
@ -252,7 +269,7 @@ void WaveTrackVZoomHandle::DoWaveformZoom(
const SpectrogramSettings &specSettings = pTrack->GetSpectrogramSettings();
NumberScale scale;
bool bDragZoom = IsDragZooming(zoomStart, zoomEnd);
bool bDragZoom = WaveTrackVZoomHandle::IsDragZooming(zoomStart, zoomEnd);
// Add 100 if spectral to separate the kinds of zoom.
// Possibly override the zoom kind.
@ -469,7 +486,7 @@ class WaveformVRulerMenuTable : public WaveTrackVRulerMenuTable
DECLARE_POPUP_MENU(WaveformVRulerMenuTable);
public:
static WaveformVRulerMenuTable &Instance();
static PopupMenuTable &Instance();
private:
virtual void InitMenu(Menu *pMenu, void *pUserData) override;
@ -477,7 +494,7 @@ private:
void OnWaveformScaleType(wxCommandEvent &evt);
};
WaveformVRulerMenuTable &WaveformVRulerMenuTable::Instance()
PopupMenuTable &WaveformVRulerMenuTable::Instance()
{
static WaveformVRulerMenuTable instance;
return instance;
@ -556,7 +573,7 @@ class SpectrumVRulerMenuTable : public WaveTrackVRulerMenuTable
DECLARE_POPUP_MENU(SpectrumVRulerMenuTable);
public:
static SpectrumVRulerMenuTable &Instance();
static PopupMenuTable &Instance();
private:
void InitMenu(Menu *pMenu, void *pUserData) override;
@ -564,7 +581,7 @@ private:
void OnSpectrumScaleType(wxCommandEvent &evt);
};
SpectrumVRulerMenuTable &SpectrumVRulerMenuTable::Instance()
PopupMenuTable &SpectrumVRulerMenuTable::Instance()
{
static SpectrumVRulerMenuTable instance;
return instance;
@ -645,12 +662,44 @@ WaveTrackVZoomHandle::~WaveTrackVZoomHandle()
{
}
UIHandle::Result SpectrumVZoomHandle::Click
(const TrackPanelMouseEvent &, AudacityProject *)
{
return RefreshCode::RefreshNone;
}
UIHandle::Result WaveformVZoomHandle::Click
(const TrackPanelMouseEvent &, AudacityProject *)
{
return RefreshCode::RefreshNone;
}
UIHandle::Result WaveTrackVZoomHandle::Click
(const TrackPanelMouseEvent &, AudacityProject *)
{
return RefreshCode::RefreshNone;
}
UIHandle::Result SpectrumVZoomHandle::Drag
(const TrackPanelMouseEvent &evt, AudacityProject *pProject)
{
using namespace RefreshCode;
auto pTrack = TrackList::Get( *pProject ).Lock(mpTrack);
if (!pTrack)
return Cancelled;
return WaveTrackVZoomHandle::DoDrag( evt, pProject, mZoomStart, mZoomEnd );
}
UIHandle::Result WaveformVZoomHandle::Drag
(const TrackPanelMouseEvent &evt, AudacityProject *pProject)
{
using namespace RefreshCode;
auto pTrack = TrackList::Get( *pProject ).Lock(mpTrack);
if (!pTrack)
return Cancelled;
return WaveTrackVZoomHandle::DoDrag( evt, pProject, mZoomStart, mZoomEnd );
}
UIHandle::Result WaveTrackVZoomHandle::Drag
(const TrackPanelMouseEvent &evt, AudacityProject *pProject)
{
@ -658,28 +707,88 @@ UIHandle::Result WaveTrackVZoomHandle::Drag
auto pTrack = TrackList::Get( *pProject ).Lock(mpTrack);
if (!pTrack)
return Cancelled;
return DoDrag( evt, pProject, mZoomStart, mZoomEnd );
}
UIHandle::Result WaveTrackVZoomHandle::DoDrag(
const TrackPanelMouseEvent &evt, AudacityProject *pProject,
const int zoomStart, int &zoomEnd)
{
using namespace RefreshCode;
const wxMouseEvent &event = evt.event;
if ( event.RightIsDown() )
return RefreshNone;
mZoomEnd = event.m_y;
if (IsDragZooming(mZoomStart, mZoomEnd))
zoomEnd = event.m_y;
if (IsDragZooming( zoomStart, zoomEnd ))
return RefreshAll;
return RefreshNone;
}
HitTestPreview SpectrumVZoomHandle::Preview
(const TrackPanelMouseState &st, const AudacityProject *)
{
return WaveTrackVZoomHandle::HitPreview(st.state);
}
HitTestPreview WaveformVZoomHandle::Preview
(const TrackPanelMouseState &st, const AudacityProject *)
{
return WaveTrackVZoomHandle::HitPreview(st.state);
}
HitTestPreview WaveTrackVZoomHandle::Preview
(const TrackPanelMouseState &st, const AudacityProject *)
{
return HitPreview(st.state);
}
UIHandle::Result SpectrumVZoomHandle::Release
(const TrackPanelMouseEvent &evt, AudacityProject *pProject,
wxWindow *pParent)
{
auto pTrack = TrackList::Get( *pProject ).Lock(mpTrack);
return WaveTrackVZoomHandle::DoRelease(
evt, pProject, pParent, pTrack.get(), mRect,
DoZoom, SpectrumVRulerMenuTable::Instance(),
mZoomStart, mZoomEnd );
}
UIHandle::Result WaveformVZoomHandle::Release
(const TrackPanelMouseEvent &evt, AudacityProject *pProject,
wxWindow *pParent)
{
auto pTrack = TrackList::Get( *pProject ).Lock(mpTrack);
return WaveTrackVZoomHandle::DoRelease(
evt, pProject, pParent, pTrack.get(), mRect,
DoZoom, WaveformVRulerMenuTable::Instance(),
mZoomStart, mZoomEnd );
}
UIHandle::Result WaveTrackVZoomHandle::Release
(const TrackPanelMouseEvent &evt, AudacityProject *pProject,
wxWindow *pParent)
{
using namespace RefreshCode;
auto pTrack = TrackList::Get( *pProject ).Lock(mpTrack);
auto doZoom = (pTrack->GetDisplay() == WaveTrackViewConstants::Spectrum)
? SpectrumVZoomHandle::DoZoom
: WaveformVZoomHandle::DoZoom;
return DoRelease(
evt, pProject, pParent, pTrack.get(), mRect,
doZoom,
(pTrack->GetDisplay() == WaveTrackViewConstants::Spectrum)
? SpectrumVRulerMenuTable::Instance()
: WaveformVRulerMenuTable::Instance(),
mZoomStart, mZoomEnd );
}
UIHandle::Result WaveTrackVZoomHandle::DoRelease(
const TrackPanelMouseEvent &evt, AudacityProject *pProject,
wxWindow *pParent, WaveTrack *pTrack, const wxRect &rect,
DoZoomFunction doZoom, PopupMenuTable &table,
int zoomStart, int zoomEnd )
{
using namespace RefreshCode;
if (!pTrack)
return RefreshNone;
@ -698,18 +807,10 @@ UIHandle::Result WaveTrackVZoomHandle::Release
!(event.ShiftDown() || event.CmdDown()))
{
InitMenuData data {
pTrack.get(), mRect, RefreshCode::RefreshNone, event.m_y,
(pTrack->GetDisplay() == Spectrum)
? WaveTrackVZoomHandle::DoSpectrumZoom
: WaveTrackVZoomHandle::DoWaveformZoom
};
pTrack, rect, RefreshCode::RefreshNone, event.m_y, doZoom };
PopupMenuTable *const pTable =
(pTrack->GetDisplay() == Spectrum)
? (PopupMenuTable *) &SpectrumVRulerMenuTable::Instance()
: (PopupMenuTable *) &WaveformVRulerMenuTable::Instance();
std::unique_ptr<PopupMenuTable::Menu>
pMenu(PopupMenuTable::BuildMenu(pParent, pTable, &data));
pMenu(PopupMenuTable::BuildMenu(pParent, &table, &data));
// Accelerators only if zooming enabled.
if( !bVZoom )
@ -739,21 +840,32 @@ UIHandle::Result WaveTrackVZoomHandle::Release
// F | - | In
if( bVZoom ) {
if( shiftDown )
mZoomStart = mZoomEnd;
auto doZoom = (pTrack->GetDisplay() == Spectrum)
? WaveTrackVZoomHandle::DoSpectrumZoom
: WaveTrackVZoomHandle::DoWaveformZoom;
doZoom(pProject, pTrack.get(),
zoomStart = zoomEnd;
doZoom(pProject, pTrack,
shiftDown
? (rightUp ? kZoom1to1 : kZoomOut)
: kZoomIn,
mRect, mZoomStart, mZoomEnd, !shiftDown);
rect, zoomStart, zoomEnd, !shiftDown);
}
}
return UpdateVRuler | RefreshAll;
}
UIHandle::Result SpectrumVZoomHandle::Cancel(AudacityProject*)
{
// Cancel is implemented! And there is no initial state to restore,
// so just return a code.
return RefreshCode::RefreshAll;
}
UIHandle::Result WaveformVZoomHandle::Cancel(AudacityProject*)
{
// Cancel is implemented! And there is no initial state to restore,
// so just return a code.
return RefreshCode::RefreshAll;
}
UIHandle::Result WaveTrackVZoomHandle::Cancel(AudacityProject*)
{
// Cancel is implemented! And there is no initial state to restore,
@ -761,22 +873,66 @@ UIHandle::Result WaveTrackVZoomHandle::Cancel(AudacityProject*)
return RefreshCode::RefreshAll;
}
void SpectrumVZoomHandle::Draw(
TrackPanelDrawingContext &context,
const wxRect &rect, unsigned iPass )
{
if (!mpTrack.lock()) //? TrackList::Lock()
return;
return WaveTrackVZoomHandle::DoDraw(
context, rect, iPass, mZoomStart, mZoomEnd );
}
void WaveformVZoomHandle::Draw(
TrackPanelDrawingContext &context,
const wxRect &rect, unsigned iPass )
{
if (!mpTrack.lock()) //? TrackList::Lock()
return;
return WaveTrackVZoomHandle::DoDraw(
context, rect, iPass, mZoomStart, mZoomEnd );
}
void WaveTrackVZoomHandle::Draw(
TrackPanelDrawingContext &context,
const wxRect &rect, unsigned iPass )
{
if (!mpTrack.lock()) //? TrackList::Lock()
return;
return DoDraw( context, rect, iPass, mZoomStart, mZoomEnd );
}
void WaveTrackVZoomHandle::DoDraw(
TrackPanelDrawingContext &context,
const wxRect &rect, unsigned iPass, const int zoomStart, const int zoomEnd )
{
if ( iPass == TrackArtist::PassZooming ) {
if (!mpTrack.lock()) //? TrackList::Lock()
return;
if ( IsDragZooming( mZoomStart, mZoomEnd ) )
if ( IsDragZooming( zoomStart, zoomEnd ) )
TrackVRulerControls::DrawZooming
( context, rect, mZoomStart, mZoomEnd );
( context, rect, zoomStart, zoomEnd );
}
}
wxRect SpectrumVZoomHandle::DrawingArea(
const wxRect &rect, const wxRect &panelRect, unsigned iPass )
{
return WaveTrackVZoomHandle::DoDrawingArea( rect, panelRect, iPass );
}
wxRect WaveformVZoomHandle::DrawingArea(
const wxRect &rect, const wxRect &panelRect, unsigned iPass )
{
return WaveTrackVZoomHandle::DoDrawingArea( rect, panelRect, iPass );
}
wxRect WaveTrackVZoomHandle::DrawingArea(
const wxRect &rect, const wxRect &panelRect, unsigned iPass )
{
return DoDrawingArea( rect, panelRect, iPass );
}
wxRect WaveTrackVZoomHandle::DoDrawingArea(
const wxRect &rect, const wxRect &panelRect, unsigned iPass )
{
if ( iPass == TrackArtist::PassZooming )
return TrackVRulerControls::ZoomingArea( rect, panelRect );

View File

@ -12,6 +12,7 @@ Paul Licameli split from TrackPanel.cpp
#define __AUDACITY_WAVE_TRACK_VZOOM_HANDLE__
class wxMouseState;
class PopupMenuTable;
class WaveTrack;
#include "WaveTrackViewConstants.h"
#include "../../../../UIHandle.h"
@ -28,21 +29,13 @@ public:
WaveTrackVZoomHandle &operator=(const WaveTrackVZoomHandle&) = default;
static bool IsDragZooming(int zoomStart, int zoomEnd);
using DoZoomFunction = void (*)( AudacityProject *pProject,
WaveTrack *pTrack,
WaveTrackViewConstants::ZoomActions ZoomKind,
const wxRect &rect, int zoomStart, int zoomEnd,
bool fixedMousePoint);
static void DoSpectrumZoom( AudacityProject *pProject,
WaveTrack *pTrack,
WaveTrackViewConstants::ZoomActions ZoomKind,
const wxRect &rect, int zoomStart, int zoomEnd,
bool fixedMousePoint);
static void DoWaveformZoom( AudacityProject *pProject,
WaveTrack *pTrack,
WaveTrackViewConstants::ZoomActions ZoomKind,
const wxRect &rect, int zoomStart, int zoomEnd,
bool fixedMousePoint);
virtual ~WaveTrackVZoomHandle();
@ -55,6 +48,9 @@ public:
Result Drag
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
static Result DoDrag(
const TrackPanelMouseEvent &event, AudacityProject *pProject,
int zoomStart, int &zoomEnd );
HitTestPreview Preview
(const TrackPanelMouseState &state, const AudacityProject *pProject)
@ -63,6 +59,11 @@ public:
Result Release
(const TrackPanelMouseEvent &event, AudacityProject *pProject,
wxWindow *pParent) override;
static Result DoRelease(
const TrackPanelMouseEvent &event, AudacityProject *pProject,
wxWindow *pParent, WaveTrack *pTrack, const wxRect &mRect,
DoZoomFunction doZoom, PopupMenuTable &table,
int zoomStart, int zoomEnd );
Result Cancel(AudacityProject *pProject) override;
@ -72,14 +73,22 @@ private:
void Draw(
TrackPanelDrawingContext &context,
const wxRect &rect, unsigned iPass ) override;
static void DoDraw(
TrackPanelDrawingContext &context,
const wxRect &rect, unsigned iPass, int zoomStart, int zoomEnd );
wxRect DrawingArea(
const wxRect &rect, const wxRect &panelRect, unsigned iPass ) override;
static wxRect DoDrawingArea(
const wxRect &rect, const wxRect &panelRect, unsigned iPass );
std::weak_ptr<WaveTrack> mpTrack;
int mZoomStart{}, mZoomEnd{};
wxRect mRect{};
friend class SpectrumVZoomHandle;
friend class WaveformVZoomHandle;
};
#endif

View File

@ -0,0 +1,19 @@
/**********************************************************************
Audacity: A Digital Audio Editor
WaveformVZoomHandle.cpp
Paul Licameli split from WaveTrackVZoomHandle.cpp
**********************************************************************/
#include "WaveformVZoomHandle.h"
WaveformVZoomHandle::WaveformVZoomHandle(
const std::shared_ptr<WaveTrack> &pTrack, const wxRect &rect, int y)
: mpTrack{ pTrack } , mZoomStart(y), mZoomEnd(y), mRect(rect)
{
}
WaveformVZoomHandle::~WaveformVZoomHandle() = default;

View File

@ -0,0 +1,73 @@
/**********************************************************************
Audacity: A Digital Audio Editor
WaveformVZoomHandle.h
Paul Licameli split from WaveTrackVZoomHandle.h
**********************************************************************/
#ifndef __AUDACITY_WAVEFORM_VZOOM_HANDLE__
#define __AUDACITY_WAVEFORM_VZOOM_HANDLE__
#include "../../../../UIHandle.h" // to inherit
#include "WaveTrackViewConstants.h"
class WaveTrack;
class WaveformVZoomHandle final : public UIHandle
{
WaveformVZoomHandle(const WaveformVZoomHandle&);
public:
explicit WaveformVZoomHandle
(const std::shared_ptr<WaveTrack> &pTrack, const wxRect &rect, int y);
WaveformVZoomHandle &operator=(const WaveformVZoomHandle&) = default;
static void DoZoom(
AudacityProject *pProject, WaveTrack *pTrack,
WaveTrackViewConstants::ZoomActions ZoomKind,
const wxRect &rect, int zoomStart, int zoomEnd,
bool fixedMousePoint);
~WaveformVZoomHandle() override;
std::shared_ptr<WaveTrack> GetTrack() const { return mpTrack.lock(); }
void Enter(bool forward) override;
Result Click
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
Result Drag
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
HitTestPreview Preview
(const TrackPanelMouseState &state, const AudacityProject *pProject)
override;
Result Release
(const TrackPanelMouseEvent &event, AudacityProject *pProject,
wxWindow *pParent) override;
Result Cancel(AudacityProject *pProject) override;
private:
// TrackPanelDrawable implementation
void Draw(
TrackPanelDrawingContext &context,
const wxRect &rect, unsigned iPass ) override;
wxRect DrawingArea(
const wxRect &rect, const wxRect &panelRect, unsigned iPass ) override;
std::weak_ptr<WaveTrack> mpTrack;
int mZoomStart{}, mZoomEnd{};
wxRect mRect{};
};
#endif