diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 21a759a1b..c4a7e280e 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -950,8 +950,8 @@ void TrackPanel::HandleMotion // Did not move cell to cell, but did change the target refreshCode = updateFlags; - if (handle) - handle->Enter(); + if (handle != oldHandle) + handle->Enter(true); } // UIHANDLE PREVIEW @@ -977,15 +977,30 @@ void TrackPanel::HandleMotion this, GetRuler(), newTrack.get(), newTrack.get(), refreshCode); } -bool TrackPanel::HasRotation() const +bool TrackPanel::HasRotation() { // 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) { 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 (forward) ++mTarget; @@ -993,7 +1008,7 @@ void TrackPanel::RotateTarget(bool forward) mTarget += size - 1; mTarget %= size; if (Target()) - Target()->Enter(); + Target()->Enter(forward); } } diff --git a/src/TrackPanel.h b/src/TrackPanel.h index bfefabba4..b6f14faff 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -549,7 +549,7 @@ protected: mMouseOverUpdateFlags = 0; } - bool HasRotation() const; + bool HasRotation(); void RotateTarget(bool forward); diff --git a/src/UIHandle.cpp b/src/UIHandle.cpp index 7311cb18a..f5a7db581 100644 --- a/src/UIHandle.cpp +++ b/src/UIHandle.cpp @@ -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 (DrawingPass, wxDC *, const wxRegion &, const wxRect &) { diff --git a/src/UIHandle.h b/src/UIHandle.h index 28d3eda22..ea6cddaf9 100644 --- a/src/UIHandle.h +++ b/src/UIHandle.h @@ -48,8 +48,19 @@ public: virtual ~UIHandle() = 0; // 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. - 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. // May return Cancelled, overriding the hit test decision and stopping drag. diff --git a/src/tracks/labeltrack/ui/LabelGlyphHandle.cpp b/src/tracks/labeltrack/ui/LabelGlyphHandle.cpp index 114787d89..a4d7516f0 100644 --- a/src/tracks/labeltrack/ui/LabelGlyphHandle.cpp +++ b/src/tracks/labeltrack/ui/LabelGlyphHandle.cpp @@ -32,7 +32,7 @@ LabelGlyphHandle::LabelGlyphHandle { } -void LabelGlyphHandle::Enter() +void LabelGlyphHandle::Enter(bool) { mChangeHighlight = RefreshCode::RefreshCell; } diff --git a/src/tracks/labeltrack/ui/LabelGlyphHandle.h b/src/tracks/labeltrack/ui/LabelGlyphHandle.h index ca939359a..3f2702496 100644 --- a/src/tracks/labeltrack/ui/LabelGlyphHandle.h +++ b/src/tracks/labeltrack/ui/LabelGlyphHandle.h @@ -54,7 +54,7 @@ public: virtual ~LabelGlyphHandle(); - void Enter() override; + void Enter(bool forward) override; Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override; diff --git a/src/tracks/labeltrack/ui/LabelTextHandle.cpp b/src/tracks/labeltrack/ui/LabelTextHandle.cpp index e2bbb5f7f..5b8ad85e8 100644 --- a/src/tracks/labeltrack/ui/LabelTextHandle.cpp +++ b/src/tracks/labeltrack/ui/LabelTextHandle.cpp @@ -26,7 +26,7 @@ LabelTextHandle::LabelTextHandle { } -void LabelTextHandle::Enter() +void LabelTextHandle::Enter(bool) { #ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING mChangeHighlight = RefreshCode::RefreshCell; diff --git a/src/tracks/labeltrack/ui/LabelTextHandle.h b/src/tracks/labeltrack/ui/LabelTextHandle.h index 6ea2eab00..1df1835e2 100644 --- a/src/tracks/labeltrack/ui/LabelTextHandle.h +++ b/src/tracks/labeltrack/ui/LabelTextHandle.h @@ -38,7 +38,7 @@ public: std::shared_ptr GetTrack() const { return mpLT.lock(); } int GetLabelNum() const { return mLabelNum; } - void Enter() override; + void Enter(bool forward) override; Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override; diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.cpp index 47f9cd48a..da6555c1f 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.cpp @@ -27,7 +27,7 @@ NoteTrackButtonHandle::NoteTrackButtonHandle { } -void NoteTrackButtonHandle::Enter() +void NoteTrackButtonHandle::Enter(bool) { mChangeHighlight = RefreshCode::RefreshCell; } diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.h b/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.h index 1078faa04..2a814c8de 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.h +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.h @@ -47,7 +47,7 @@ public: const NoteTrackButtonHandle &newState); protected: - void Enter() override; + void Enter(bool forward) override; Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override; diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp index 287615db7..df6849d06 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp @@ -42,7 +42,7 @@ NoteTrackVZoomHandle::NoteTrackVZoomHandle { } -void NoteTrackVZoomHandle::Enter() +void NoteTrackVZoomHandle::Enter(bool) { #ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING mChangeHighlight = RefreshCode::RefreshCell; diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.h b/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.h index 7f5702cc8..531760f61 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.h +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.h @@ -38,7 +38,7 @@ public: std::shared_ptr GetTrack() const { return mpTrack.lock(); } - void Enter() override; + void Enter(bool forward) override; Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override; diff --git a/src/tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp b/src/tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp index 35542e307..53c122991 100644 --- a/src/tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp @@ -30,7 +30,7 @@ CutlineHandle::CutlineHandle { } -void CutlineHandle::Enter() +void CutlineHandle::Enter(bool) { #ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING mChangeHighlight = RefreshCode::RefreshCell; diff --git a/src/tracks/playabletrack/wavetrack/ui/CutlineHandle.h b/src/tracks/playabletrack/wavetrack/ui/CutlineHandle.h index cb2048bf0..00c9167c5 100644 --- a/src/tracks/playabletrack/wavetrack/ui/CutlineHandle.h +++ b/src/tracks/playabletrack/wavetrack/ui/CutlineHandle.h @@ -45,7 +45,7 @@ public: const WaveTrackLocation &GetLocation() { return mLocation; } std::shared_ptr GetTrack() { return mpTrack; } - void Enter() override; + void Enter(bool forward) override; Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override; diff --git a/src/tracks/playabletrack/wavetrack/ui/SampleHandle.cpp b/src/tracks/playabletrack/wavetrack/ui/SampleHandle.cpp index fd0044138..99dbf6946 100644 --- a/src/tracks/playabletrack/wavetrack/ui/SampleHandle.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/SampleHandle.cpp @@ -40,7 +40,7 @@ SampleHandle::SampleHandle( const std::shared_ptr &pTrack ) { } -void SampleHandle::Enter() +void SampleHandle::Enter(bool) { #ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING mChangeHighlight = RefreshCode::RefreshCell; diff --git a/src/tracks/playabletrack/wavetrack/ui/SampleHandle.h b/src/tracks/playabletrack/wavetrack/ui/SampleHandle.h index fa0a308af..7bb1fe325 100644 --- a/src/tracks/playabletrack/wavetrack/ui/SampleHandle.h +++ b/src/tracks/playabletrack/wavetrack/ui/SampleHandle.h @@ -46,7 +46,7 @@ public: std::shared_ptr GetTrack() const { return mClickedTrack; } - void Enter() override; + void Enter(bool forward) override; Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override; diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.cpp index 186669979..822c88fa0 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.cpp @@ -51,7 +51,7 @@ WaveTrackVZoomHandle::WaveTrackVZoomHandle { } -void WaveTrackVZoomHandle::Enter() +void WaveTrackVZoomHandle::Enter(bool) { #ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING mChangeHighlight = RefreshCode::RefreshCell; diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.h b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.h index c7767d054..1daef22fb 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.h @@ -38,7 +38,7 @@ public: std::shared_ptr GetTrack() const { return mpTrack.lock(); } - void Enter() override; + void Enter(bool forward) override; Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override; diff --git a/src/tracks/ui/ButtonHandle.cpp b/src/tracks/ui/ButtonHandle.cpp index df2889458..964d07651 100644 --- a/src/tracks/ui/ButtonHandle.cpp +++ b/src/tracks/ui/ButtonHandle.cpp @@ -31,7 +31,7 @@ ButtonHandle::~ButtonHandle() { } -void ButtonHandle::Enter() +void ButtonHandle::Enter(bool) { mChangeHighlight = RefreshCode::RefreshCell; } diff --git a/src/tracks/ui/ButtonHandle.h b/src/tracks/ui/ButtonHandle.h index bf207e6d8..9413e7336 100644 --- a/src/tracks/ui/ButtonHandle.h +++ b/src/tracks/ui/ButtonHandle.h @@ -42,7 +42,7 @@ protected: virtual Result CommitChanges (const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) = 0; - void Enter() override; + void Enter(bool forward) override; Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override; diff --git a/src/tracks/ui/EnvelopeHandle.cpp b/src/tracks/ui/EnvelopeHandle.cpp index 7160800fc..525a70831 100644 --- a/src/tracks/ui/EnvelopeHandle.cpp +++ b/src/tracks/ui/EnvelopeHandle.cpp @@ -32,7 +32,7 @@ EnvelopeHandle::EnvelopeHandle( Envelope *pEnvelope ) { } -void EnvelopeHandle::Enter() +void EnvelopeHandle::Enter(bool) { #ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING mChangeHighlight = RefreshCode::RefreshCell; diff --git a/src/tracks/ui/EnvelopeHandle.h b/src/tracks/ui/EnvelopeHandle.h index d0ab09cea..205851439 100644 --- a/src/tracks/ui/EnvelopeHandle.h +++ b/src/tracks/ui/EnvelopeHandle.h @@ -56,7 +56,7 @@ public: Envelope *GetEnvelope() const { return mEnvelope; } - void Enter() override; + void Enter(bool forward) override; Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override; diff --git a/src/tracks/ui/SliderHandle.cpp b/src/tracks/ui/SliderHandle.cpp index 0a63dc5c6..cd6a6e688 100644 --- a/src/tracks/ui/SliderHandle.cpp +++ b/src/tracks/ui/SliderHandle.cpp @@ -24,7 +24,7 @@ SliderHandle::SliderHandle { } -void SliderHandle::Enter() +void SliderHandle::Enter(bool) { mChangeHighlight = RefreshCode::RefreshCell; } diff --git a/src/tracks/ui/SliderHandle.h b/src/tracks/ui/SliderHandle.h index dd94809be..44a3be3c4 100644 --- a/src/tracks/ui/SliderHandle.h +++ b/src/tracks/ui/SliderHandle.h @@ -47,7 +47,7 @@ protected: virtual Result CommitChanges (const wxMouseEvent &event, AudacityProject *pProject) = 0; - void Enter() override; + void Enter(bool forward) override; Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override; diff --git a/src/tracks/ui/TimeShiftHandle.cpp b/src/tracks/ui/TimeShiftHandle.cpp index ea375dd17..e64677681 100644 --- a/src/tracks/ui/TimeShiftHandle.cpp +++ b/src/tracks/ui/TimeShiftHandle.cpp @@ -30,7 +30,7 @@ TimeShiftHandle::TimeShiftHandle { } -void TimeShiftHandle::Enter() +void TimeShiftHandle::Enter(bool) { #ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING mChangeHighlight = RefreshCode::RefreshCell; diff --git a/src/tracks/ui/TimeShiftHandle.h b/src/tracks/ui/TimeShiftHandle.h index a49eb5c87..0a81acfce 100644 --- a/src/tracks/ui/TimeShiftHandle.h +++ b/src/tracks/ui/TimeShiftHandle.h @@ -75,7 +75,7 @@ public: virtual ~TimeShiftHandle(); - void Enter() override; + void Enter(bool forward) override; Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override;