diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackAffordanceControls.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackAffordanceControls.cpp index 5c3c434fd..cde31948c 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackAffordanceControls.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackAffordanceControls.cpp @@ -24,6 +24,37 @@ #include "../lib-src/header-substitutes/allegro.h" +#include "../../../../ProjectHistory.h" +#include "../../../../SelectionState.h" +#include "../../../../ProjectSettings.h" +#include "../../../../RefreshCode.h" + +class NoteTrackAffordanceHandle final : public AffordanceHandle +{ +public: + NoteTrackAffordanceHandle(const std::shared_ptr& track) : AffordanceHandle(track) { } + + static UIHandlePtr HitAnywhere(std::weak_ptr& holder, const std::shared_ptr& pTrack) + { + auto result = std::static_pointer_cast(std::make_shared(pTrack)); + result = AssignUIHandlePtr(holder, result); + return result; + } + + UIHandle::Result SelectAt(const TrackPanelMouseEvent& event, AudacityProject* pProject) override + { + auto& viewInfo = ViewInfo::Get(*pProject); + const auto& settings = ProjectSettings::Get(*pProject); + const auto track = TrackList::Get(*pProject).Lock(GetTrack()); + + SelectionState::SelectTrackLength(viewInfo, *track, settings.IsSyncLocked()); + + ProjectHistory::Get(*pProject).ModifyState(false); + + return RefreshCode::RefreshAll | RefreshCode::Cancelled; + } +}; + NoteTrackAffordanceControls::NoteTrackAffordanceControls(const std::shared_ptr& pTrack) : CommonTrackCell(pTrack) { @@ -50,7 +81,7 @@ std::vector NoteTrackAffordanceControls::HitTest(const TrackPanelMo if (px >= headerRect.GetLeft() && px <= headerRect.GetRight() && py >= headerRect.GetTop() && py <= headerRect.GetBottom()) { - results.push_back(AffordanceHandle::HitAnywhere(mAffordanceHandle, track)); + results.push_back(NoteTrackAffordanceHandle::HitAnywhere(mAffordanceHandle, track)); } return results; diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackAffordanceControls.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackAffordanceControls.cpp index 8f846f6fe..63e10d418 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackAffordanceControls.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackAffordanceControls.cpp @@ -22,6 +22,40 @@ #include "../../../ui/AffordanceHandle.h" #include "WaveTrackView.h"//need only ClipParameters +#include "../../../../ProjectHistory.h" +#include "../../../../SelectionState.h" +#include "../../../../RefreshCode.h" + +class WaveTrackAffordanceHandle final : public AffordanceHandle +{ +public: + WaveTrackAffordanceHandle(const std::shared_ptr& track) : AffordanceHandle(track) { } + + static UIHandlePtr HitAnywhere(std::weak_ptr& holder, const std::shared_ptr& pTrack) + { + auto result = std::static_pointer_cast(std::make_shared(pTrack)); + result = AssignUIHandlePtr(holder, result); + return result; + } + + UIHandle::Result SelectAt(const TrackPanelMouseEvent& event, AudacityProject* pProject) override + { + const auto track = std::dynamic_pointer_cast(TrackList::Get(*pProject).Lock(GetTrack())); + + auto& viewInfo = ViewInfo::Get(*pProject); + + auto time = viewInfo.PositionToTime(event.event.m_x, event.rect.x); + + WaveClip* const selectedClip = track->GetClipAtTime(time); + if (selectedClip) { + viewInfo.selectedRegion.setTimes(selectedClip->GetOffset(), selectedClip->GetEndTime()); + } + + ProjectHistory::Get(*pProject).ModifyState(false); + + return RefreshCode::RefreshAll | RefreshCode::Cancelled; + } +}; WaveTrackAffordanceControls::WaveTrackAffordanceControls(const std::shared_ptr& pTrack) : CommonTrackCell(pTrack) @@ -50,7 +84,7 @@ std::vector WaveTrackAffordanceControls::HitTest(const TrackPanelMo if (affordanceRect.Contains(px, py)) { - results.push_back(AffordanceHandle::HitAnywhere(mAffordanceHandle, track)); + results.push_back(WaveTrackAffordanceHandle::HitAnywhere(mAffordanceHandle, track)); mFocusClip = clip; break; } diff --git a/src/tracks/ui/AffordanceHandle.cpp b/src/tracks/ui/AffordanceHandle.cpp index c8e35b014..7cb497e23 100644 --- a/src/tracks/ui/AffordanceHandle.cpp +++ b/src/tracks/ui/AffordanceHandle.cpp @@ -15,21 +15,12 @@ #include "../../RefreshCode.h" #include "../../ViewInfo.h" #include "../../SelectionState.h" -#include "../../ProjectSettings.h" #include "../../TrackPanelMouseEvent.h" #include "../../WaveClip.h" -#include "../../ProjectHistory.h" #include "../../Track.h" #include "../../WaveTrack.h" #include "../../../images/Cursors.h" -UIHandlePtr AffordanceHandle::HitAnywhere(std::weak_ptr& holder, const std::shared_ptr& pTrack) -{ - auto result = std::make_shared(pTrack); - result = AssignUIHandlePtr(holder, result); - return result; -} - HitTestPreview AffordanceHandle::HitPreview(const AudacityProject*, bool unsafe, bool moving) { static auto disabledCursor = @@ -80,42 +71,14 @@ UIHandle::Result AffordanceHandle::Release(const TrackPanelMouseEvent& event, Au //Clip was not moved if (!TimeShiftHandle::WasMoved()) { - //almost the same behaviour as provided by SelectHandle - auto& viewInfo = ViewInfo::Get(*pProject); - const auto& settings = ProjectSettings::Get(*pProject); - - const auto sTrack = TrackList::Get(*pProject).Lock(GetTrack()); - const auto pTrack = sTrack.get(); + const auto track = TrackList::Get(*pProject).Lock(GetTrack()); auto& selectionState = SelectionState::Get(*pProject); - auto& trackList = TrackList::Get(*pProject); - - // Deselect all other tracks and select this one. selectionState.SelectNone(trackList); - selectionState.SelectTrack(*pTrack, true, true); + selectionState.SelectTrack(*track, true, true); - pTrack->TypeSwitch( - [&](WaveTrack* wt) - { - auto time = viewInfo.PositionToTime(event.event.m_x, event.rect.x); - WaveClip* const selectedClip = wt->GetClipAtTime(time); - if (selectedClip) { - viewInfo.selectedRegion.setTimes( - selectedClip->GetOffset(), selectedClip->GetEndTime()); - } - }, - [&](Track* track) - { - // Default behavior: select whole track - SelectionState::SelectTrackLength(viewInfo, *track, settings.IsSyncLocked()); - } - ); - - ProjectHistory::Get(*pProject).ModifyState(false); - - // Do not start a drag - result |= RefreshCode::RefreshAll | RefreshCode::Cancelled; + result |= SelectAt(event, pProject); } return result; } diff --git a/src/tracks/ui/AffordanceHandle.h b/src/tracks/ui/AffordanceHandle.h index bcb78933b..f1dceded1 100644 --- a/src/tracks/ui/AffordanceHandle.h +++ b/src/tracks/ui/AffordanceHandle.h @@ -16,8 +16,6 @@ class AUDACITY_DLL_API AffordanceHandle : public TimeShiftHandle { static HitTestPreview HitPreview(const AudacityProject*, bool unsafe, bool moving); public: - - static UIHandlePtr HitAnywhere(std::weak_ptr& holder, const std::shared_ptr& pTrack); void Enter(bool forward, AudacityProject* pProject) override; HitTestPreview Preview(const TrackPanelMouseState& mouseState, AudacityProject* pProject) override; @@ -26,4 +24,7 @@ public: Result Click(const TrackPanelMouseEvent& evt, AudacityProject* pProject) override; Result Release(const TrackPanelMouseEvent& event, AudacityProject* pProject, wxWindow* pParent) override; + +protected: + virtual Result SelectAt(const TrackPanelMouseEvent& event, AudacityProject* pProject) = 0; };