1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-21 16:37:12 +01:00

AffordanceHandle refactoring avoids TypeSwitch

This commit is contained in:
Vitaly Sverchinsky
2021-07-20 00:40:57 +03:00
committed by Paul Licameli
parent 781ea13cf2
commit 6b79a5eccb
4 changed files with 73 additions and 44 deletions

View File

@@ -24,6 +24,37 @@
#include "../lib-src/header-substitutes/allegro.h" #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>& track) : AffordanceHandle(track) { }
static UIHandlePtr HitAnywhere(std::weak_ptr<AffordanceHandle>& holder, const std::shared_ptr<Track>& pTrack)
{
auto result = std::static_pointer_cast<AffordanceHandle>(std::make_shared<NoteTrackAffordanceHandle>(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<Track>(GetTrack());
SelectionState::SelectTrackLength(viewInfo, *track, settings.IsSyncLocked());
ProjectHistory::Get(*pProject).ModifyState(false);
return RefreshCode::RefreshAll | RefreshCode::Cancelled;
}
};
NoteTrackAffordanceControls::NoteTrackAffordanceControls(const std::shared_ptr<Track>& pTrack) NoteTrackAffordanceControls::NoteTrackAffordanceControls(const std::shared_ptr<Track>& pTrack)
: CommonTrackCell(pTrack) : CommonTrackCell(pTrack)
{ {
@@ -50,7 +81,7 @@ std::vector<UIHandlePtr> NoteTrackAffordanceControls::HitTest(const TrackPanelMo
if (px >= headerRect.GetLeft() && px <= headerRect.GetRight() && if (px >= headerRect.GetLeft() && px <= headerRect.GetRight() &&
py >= headerRect.GetTop() && py <= headerRect.GetBottom()) py >= headerRect.GetTop() && py <= headerRect.GetBottom())
{ {
results.push_back(AffordanceHandle::HitAnywhere(mAffordanceHandle, track)); results.push_back(NoteTrackAffordanceHandle::HitAnywhere(mAffordanceHandle, track));
} }
return results; return results;

View File

@@ -22,6 +22,40 @@
#include "../../../ui/AffordanceHandle.h" #include "../../../ui/AffordanceHandle.h"
#include "WaveTrackView.h"//need only ClipParameters #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>& track) : AffordanceHandle(track) { }
static UIHandlePtr HitAnywhere(std::weak_ptr<AffordanceHandle>& holder, const std::shared_ptr<Track>& pTrack)
{
auto result = std::static_pointer_cast<AffordanceHandle>(std::make_shared<WaveTrackAffordanceHandle>(pTrack));
result = AssignUIHandlePtr(holder, result);
return result;
}
UIHandle::Result SelectAt(const TrackPanelMouseEvent& event, AudacityProject* pProject) override
{
const auto track = std::dynamic_pointer_cast<WaveTrack>(TrackList::Get(*pProject).Lock<Track>(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<Track>& pTrack) WaveTrackAffordanceControls::WaveTrackAffordanceControls(const std::shared_ptr<Track>& pTrack)
: CommonTrackCell(pTrack) : CommonTrackCell(pTrack)
@@ -50,7 +84,7 @@ std::vector<UIHandlePtr> WaveTrackAffordanceControls::HitTest(const TrackPanelMo
if (affordanceRect.Contains(px, py)) if (affordanceRect.Contains(px, py))
{ {
results.push_back(AffordanceHandle::HitAnywhere(mAffordanceHandle, track)); results.push_back(WaveTrackAffordanceHandle::HitAnywhere(mAffordanceHandle, track));
mFocusClip = clip; mFocusClip = clip;
break; break;
} }

View File

@@ -15,21 +15,12 @@
#include "../../RefreshCode.h" #include "../../RefreshCode.h"
#include "../../ViewInfo.h" #include "../../ViewInfo.h"
#include "../../SelectionState.h" #include "../../SelectionState.h"
#include "../../ProjectSettings.h"
#include "../../TrackPanelMouseEvent.h" #include "../../TrackPanelMouseEvent.h"
#include "../../WaveClip.h" #include "../../WaveClip.h"
#include "../../ProjectHistory.h"
#include "../../Track.h" #include "../../Track.h"
#include "../../WaveTrack.h" #include "../../WaveTrack.h"
#include "../../../images/Cursors.h" #include "../../../images/Cursors.h"
UIHandlePtr AffordanceHandle::HitAnywhere(std::weak_ptr<AffordanceHandle>& holder, const std::shared_ptr<Track>& pTrack)
{
auto result = std::make_shared<AffordanceHandle>(pTrack);
result = AssignUIHandlePtr(holder, result);
return result;
}
HitTestPreview AffordanceHandle::HitPreview(const AudacityProject*, bool unsafe, bool moving) HitTestPreview AffordanceHandle::HitPreview(const AudacityProject*, bool unsafe, bool moving)
{ {
static auto disabledCursor = static auto disabledCursor =
@@ -80,42 +71,14 @@ UIHandle::Result AffordanceHandle::Release(const TrackPanelMouseEvent& event, Au
//Clip was not moved //Clip was not moved
if (!TimeShiftHandle::WasMoved()) if (!TimeShiftHandle::WasMoved())
{ {
//almost the same behaviour as provided by SelectHandle const auto track = TrackList::Get(*pProject).Lock<Track>(GetTrack());
auto& viewInfo = ViewInfo::Get(*pProject);
const auto& settings = ProjectSettings::Get(*pProject);
const auto sTrack = TrackList::Get(*pProject).Lock<Track>(GetTrack());
const auto pTrack = sTrack.get();
auto& selectionState = SelectionState::Get(*pProject); auto& selectionState = SelectionState::Get(*pProject);
auto& trackList = TrackList::Get(*pProject); auto& trackList = TrackList::Get(*pProject);
// Deselect all other tracks and select this one.
selectionState.SelectNone(trackList); selectionState.SelectNone(trackList);
selectionState.SelectTrack(*pTrack, true, true); selectionState.SelectTrack(*track, true, true);
pTrack->TypeSwitch( result |= SelectAt(event, pProject);
[&](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;
} }
return result; return result;
} }

View File

@@ -17,8 +17,6 @@ class AUDACITY_DLL_API AffordanceHandle : public TimeShiftHandle
static HitTestPreview HitPreview(const AudacityProject*, bool unsafe, bool moving); static HitTestPreview HitPreview(const AudacityProject*, bool unsafe, bool moving);
public: public:
static UIHandlePtr HitAnywhere(std::weak_ptr<AffordanceHandle>& holder, const std::shared_ptr<Track>& pTrack);
void Enter(bool forward, AudacityProject* pProject) override; void Enter(bool forward, AudacityProject* pProject) override;
HitTestPreview Preview(const TrackPanelMouseState& mouseState, 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 Click(const TrackPanelMouseEvent& evt, AudacityProject* pProject) override;
Result Release(const TrackPanelMouseEvent& event, AudacityProject* pProject, wxWindow* pParent) override; Result Release(const TrackPanelMouseEvent& event, AudacityProject* pProject, wxWindow* pParent) override;
protected:
virtual Result SelectAt(const TrackPanelMouseEvent& event, AudacityProject* pProject) = 0;
}; };