mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-04 17:49:45 +02:00
A single UIHandle can define multiple rotation states
This commit is contained in:
parent
4eece4b0b1
commit
b7ae012ece
@ -950,8 +950,8 @@ void TrackPanel::HandleMotion
|
|||||||
// Did not move cell to cell, but did change the target
|
// Did not move cell to cell, but did change the target
|
||||||
refreshCode = updateFlags;
|
refreshCode = updateFlags;
|
||||||
|
|
||||||
if (handle)
|
if (handle != oldHandle)
|
||||||
handle->Enter();
|
handle->Enter(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// UIHANDLE PREVIEW
|
// UIHANDLE PREVIEW
|
||||||
@ -977,15 +977,30 @@ void TrackPanel::HandleMotion
|
|||||||
this, GetRuler(), newTrack.get(), newTrack.get(), refreshCode);
|
this, GetRuler(), newTrack.get(), newTrack.get(), refreshCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TrackPanel::HasRotation() const
|
bool TrackPanel::HasRotation()
|
||||||
{
|
{
|
||||||
// Is there a nontrivial TAB key rotation?
|
// Is there a nontrivial TAB key rotation?
|
||||||
return !mUIHandle && mTargets.size() > 1;
|
if ( mTargets.size() > 1 )
|
||||||
|
return true;
|
||||||
|
auto target = Target();
|
||||||
|
return target && target->HasRotation();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrackPanel::RotateTarget(bool forward)
|
void TrackPanel::RotateTarget(bool forward)
|
||||||
{
|
{
|
||||||
auto size = mTargets.size();
|
auto size = mTargets.size();
|
||||||
|
|
||||||
|
auto target = Target();
|
||||||
|
if (target && target->HasRotation()) {
|
||||||
|
if(target->Rotate(forward))
|
||||||
|
return;
|
||||||
|
else if (size == 1 || IsMouseCaptured()) {
|
||||||
|
// Rotate through the states of this target only.
|
||||||
|
target->Enter(forward);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (size > 1) {
|
if (size > 1) {
|
||||||
if (forward)
|
if (forward)
|
||||||
++mTarget;
|
++mTarget;
|
||||||
@ -993,7 +1008,7 @@ void TrackPanel::RotateTarget(bool forward)
|
|||||||
mTarget += size - 1;
|
mTarget += size - 1;
|
||||||
mTarget %= size;
|
mTarget %= size;
|
||||||
if (Target())
|
if (Target())
|
||||||
Target()->Enter();
|
Target()->Enter(forward);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -549,7 +549,7 @@ protected:
|
|||||||
mMouseOverUpdateFlags = 0;
|
mMouseOverUpdateFlags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HasRotation() const;
|
bool HasRotation();
|
||||||
|
|
||||||
void RotateTarget(bool forward);
|
void RotateTarget(bool forward);
|
||||||
|
|
||||||
|
@ -15,10 +15,20 @@ UIHandle::~UIHandle()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIHandle::Enter()
|
void UIHandle::Enter(bool)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool UIHandle::HasRotation() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UIHandle::Rotate(bool)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void UIHandle::DrawExtras
|
void UIHandle::DrawExtras
|
||||||
(DrawingPass, wxDC *, const wxRegion &, const wxRect &)
|
(DrawingPass, wxDC *, const wxRegion &, const wxRect &)
|
||||||
{
|
{
|
||||||
|
@ -48,8 +48,19 @@ public:
|
|||||||
virtual ~UIHandle() = 0;
|
virtual ~UIHandle() = 0;
|
||||||
|
|
||||||
// Before clicking, the handle is notified that it has been "hit"
|
// Before clicking, the handle is notified that it has been "hit"
|
||||||
|
// This might put the handle into its first rotated state
|
||||||
|
// (or last, if forward is false) or mark itself as needing a highlight.
|
||||||
// Default does nothing.
|
// Default does nothing.
|
||||||
virtual void Enter();
|
virtual void Enter(bool forward);
|
||||||
|
|
||||||
|
// Tell whether the handle has more than one TAB key rotation state.
|
||||||
|
// Default is always false.
|
||||||
|
virtual bool HasRotation() const;
|
||||||
|
|
||||||
|
// If not previously in the last rotation state (or first if !forward),
|
||||||
|
// change rotation state and return true; else return false
|
||||||
|
// Default does nothing and returns false
|
||||||
|
virtual bool Rotate(bool forward);
|
||||||
|
|
||||||
// Assume hit test (implemented in other classes) was positive.
|
// Assume hit test (implemented in other classes) was positive.
|
||||||
// May return Cancelled, overriding the hit test decision and stopping drag.
|
// May return Cancelled, overriding the hit test decision and stopping drag.
|
||||||
|
@ -32,7 +32,7 @@ LabelGlyphHandle::LabelGlyphHandle
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void LabelGlyphHandle::Enter()
|
void LabelGlyphHandle::Enter(bool)
|
||||||
{
|
{
|
||||||
mChangeHighlight = RefreshCode::RefreshCell;
|
mChangeHighlight = RefreshCode::RefreshCell;
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ public:
|
|||||||
|
|
||||||
virtual ~LabelGlyphHandle();
|
virtual ~LabelGlyphHandle();
|
||||||
|
|
||||||
void Enter() override;
|
void Enter(bool forward) override;
|
||||||
|
|
||||||
Result Click
|
Result Click
|
||||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
||||||
|
@ -26,7 +26,7 @@ LabelTextHandle::LabelTextHandle
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void LabelTextHandle::Enter()
|
void LabelTextHandle::Enter(bool)
|
||||||
{
|
{
|
||||||
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
||||||
mChangeHighlight = RefreshCode::RefreshCell;
|
mChangeHighlight = RefreshCode::RefreshCell;
|
||||||
|
@ -38,7 +38,7 @@ public:
|
|||||||
std::shared_ptr<LabelTrack> GetTrack() const { return mpLT.lock(); }
|
std::shared_ptr<LabelTrack> GetTrack() const { return mpLT.lock(); }
|
||||||
int GetLabelNum() const { return mLabelNum; }
|
int GetLabelNum() const { return mLabelNum; }
|
||||||
|
|
||||||
void Enter() override;
|
void Enter(bool forward) override;
|
||||||
|
|
||||||
Result Click
|
Result Click
|
||||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
||||||
|
@ -27,7 +27,7 @@ NoteTrackButtonHandle::NoteTrackButtonHandle
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void NoteTrackButtonHandle::Enter()
|
void NoteTrackButtonHandle::Enter(bool)
|
||||||
{
|
{
|
||||||
mChangeHighlight = RefreshCode::RefreshCell;
|
mChangeHighlight = RefreshCode::RefreshCell;
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ public:
|
|||||||
const NoteTrackButtonHandle &newState);
|
const NoteTrackButtonHandle &newState);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void Enter() override;
|
void Enter(bool forward) override;
|
||||||
|
|
||||||
Result Click
|
Result Click
|
||||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
||||||
|
@ -42,7 +42,7 @@ NoteTrackVZoomHandle::NoteTrackVZoomHandle
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void NoteTrackVZoomHandle::Enter()
|
void NoteTrackVZoomHandle::Enter(bool)
|
||||||
{
|
{
|
||||||
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
||||||
mChangeHighlight = RefreshCode::RefreshCell;
|
mChangeHighlight = RefreshCode::RefreshCell;
|
||||||
|
@ -38,7 +38,7 @@ public:
|
|||||||
|
|
||||||
std::shared_ptr<NoteTrack> GetTrack() const { return mpTrack.lock(); }
|
std::shared_ptr<NoteTrack> GetTrack() const { return mpTrack.lock(); }
|
||||||
|
|
||||||
void Enter() override;
|
void Enter(bool forward) override;
|
||||||
|
|
||||||
Result Click
|
Result Click
|
||||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
||||||
|
@ -30,7 +30,7 @@ CutlineHandle::CutlineHandle
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void CutlineHandle::Enter()
|
void CutlineHandle::Enter(bool)
|
||||||
{
|
{
|
||||||
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
||||||
mChangeHighlight = RefreshCode::RefreshCell;
|
mChangeHighlight = RefreshCode::RefreshCell;
|
||||||
|
@ -45,7 +45,7 @@ public:
|
|||||||
const WaveTrackLocation &GetLocation() { return mLocation; }
|
const WaveTrackLocation &GetLocation() { return mLocation; }
|
||||||
std::shared_ptr<WaveTrack> GetTrack() { return mpTrack; }
|
std::shared_ptr<WaveTrack> GetTrack() { return mpTrack; }
|
||||||
|
|
||||||
void Enter() override;
|
void Enter(bool forward) override;
|
||||||
|
|
||||||
Result Click
|
Result Click
|
||||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
||||||
|
@ -40,7 +40,7 @@ SampleHandle::SampleHandle( const std::shared_ptr<WaveTrack> &pTrack )
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void SampleHandle::Enter()
|
void SampleHandle::Enter(bool)
|
||||||
{
|
{
|
||||||
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
||||||
mChangeHighlight = RefreshCode::RefreshCell;
|
mChangeHighlight = RefreshCode::RefreshCell;
|
||||||
|
@ -46,7 +46,7 @@ public:
|
|||||||
|
|
||||||
std::shared_ptr<WaveTrack> GetTrack() const { return mClickedTrack; }
|
std::shared_ptr<WaveTrack> GetTrack() const { return mClickedTrack; }
|
||||||
|
|
||||||
void Enter() override;
|
void Enter(bool forward) override;
|
||||||
|
|
||||||
Result Click
|
Result Click
|
||||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
||||||
|
@ -51,7 +51,7 @@ WaveTrackVZoomHandle::WaveTrackVZoomHandle
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaveTrackVZoomHandle::Enter()
|
void WaveTrackVZoomHandle::Enter(bool)
|
||||||
{
|
{
|
||||||
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
||||||
mChangeHighlight = RefreshCode::RefreshCell;
|
mChangeHighlight = RefreshCode::RefreshCell;
|
||||||
|
@ -38,7 +38,7 @@ public:
|
|||||||
|
|
||||||
std::shared_ptr<WaveTrack> GetTrack() const { return mpTrack.lock(); }
|
std::shared_ptr<WaveTrack> GetTrack() const { return mpTrack.lock(); }
|
||||||
|
|
||||||
void Enter() override;
|
void Enter(bool forward) override;
|
||||||
|
|
||||||
Result Click
|
Result Click
|
||||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
||||||
|
@ -31,7 +31,7 @@ ButtonHandle::~ButtonHandle()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ButtonHandle::Enter()
|
void ButtonHandle::Enter(bool)
|
||||||
{
|
{
|
||||||
mChangeHighlight = RefreshCode::RefreshCell;
|
mChangeHighlight = RefreshCode::RefreshCell;
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ protected:
|
|||||||
virtual Result CommitChanges
|
virtual Result CommitChanges
|
||||||
(const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) = 0;
|
(const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) = 0;
|
||||||
|
|
||||||
void Enter() override;
|
void Enter(bool forward) override;
|
||||||
|
|
||||||
Result Click
|
Result Click
|
||||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
||||||
|
@ -32,7 +32,7 @@ EnvelopeHandle::EnvelopeHandle( Envelope *pEnvelope )
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnvelopeHandle::Enter()
|
void EnvelopeHandle::Enter(bool)
|
||||||
{
|
{
|
||||||
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
||||||
mChangeHighlight = RefreshCode::RefreshCell;
|
mChangeHighlight = RefreshCode::RefreshCell;
|
||||||
|
@ -56,7 +56,7 @@ public:
|
|||||||
|
|
||||||
Envelope *GetEnvelope() const { return mEnvelope; }
|
Envelope *GetEnvelope() const { return mEnvelope; }
|
||||||
|
|
||||||
void Enter() override;
|
void Enter(bool forward) override;
|
||||||
|
|
||||||
Result Click
|
Result Click
|
||||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
||||||
|
@ -24,7 +24,7 @@ SliderHandle::SliderHandle
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void SliderHandle::Enter()
|
void SliderHandle::Enter(bool)
|
||||||
{
|
{
|
||||||
mChangeHighlight = RefreshCode::RefreshCell;
|
mChangeHighlight = RefreshCode::RefreshCell;
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ protected:
|
|||||||
virtual Result CommitChanges
|
virtual Result CommitChanges
|
||||||
(const wxMouseEvent &event, AudacityProject *pProject) = 0;
|
(const wxMouseEvent &event, AudacityProject *pProject) = 0;
|
||||||
|
|
||||||
void Enter() override;
|
void Enter(bool forward) override;
|
||||||
|
|
||||||
Result Click
|
Result Click
|
||||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
||||||
|
@ -30,7 +30,7 @@ TimeShiftHandle::TimeShiftHandle
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimeShiftHandle::Enter()
|
void TimeShiftHandle::Enter(bool)
|
||||||
{
|
{
|
||||||
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
|
||||||
mChangeHighlight = RefreshCode::RefreshCell;
|
mChangeHighlight = RefreshCode::RefreshCell;
|
||||||
|
@ -75,7 +75,7 @@ public:
|
|||||||
|
|
||||||
virtual ~TimeShiftHandle();
|
virtual ~TimeShiftHandle();
|
||||||
|
|
||||||
void Enter() override;
|
void Enter(bool forward) override;
|
||||||
|
|
||||||
Result Click
|
Result Click
|
||||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user