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:
committed by
Paul Licameli
parent
781ea13cf2
commit
6b79a5eccb
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user