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 "../../../../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)
|
||||
: CommonTrackCell(pTrack)
|
||||
{
|
||||
@@ -50,7 +81,7 @@ std::vector<UIHandlePtr> 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;
|
||||
|
||||
@@ -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>& 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)
|
||||
: CommonTrackCell(pTrack)
|
||||
@@ -50,7 +84,7 @@ std::vector<UIHandlePtr> 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;
|
||||
}
|
||||
|
||||
@@ -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<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)
|
||||
{
|
||||
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<Track>(GetTrack());
|
||||
const auto pTrack = sTrack.get();
|
||||
const auto track = TrackList::Get(*pProject).Lock<Track>(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;
|
||||
}
|
||||
|
||||
@@ -17,8 +17,6 @@ class AUDACITY_DLL_API AffordanceHandle : public TimeShiftHandle
|
||||
static HitTestPreview HitPreview(const AudacityProject*, bool unsafe, bool moving);
|
||||
public:
|
||||
|
||||
static UIHandlePtr HitAnywhere(std::weak_ptr<AffordanceHandle>& holder, const std::shared_ptr<Track>& 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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user