1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-04 09:39:42 +02:00

Skeletal hit test and handle objects for quick play and scrubbing

This commit is contained in:
Paul Licameli 2018-07-06 19:43:48 -04:00
parent bccb135e30
commit a853b7a3b4
2 changed files with 211 additions and 2 deletions

View File

@ -92,6 +92,7 @@ array of Ruler::Label.
#include "../NumberScale.h"
#include "../Prefs.h"
#include "../Snap.h"
#include "../UIHandle.h"
#include "../tracks/ui/Scrubbing.h"
#include "../prefs/PlaybackPrefs.h"
#include "../prefs/TracksPrefs.h"
@ -1998,6 +1999,8 @@ void AdornedRulerPanel::QuickPlayIndicatorOverlay::Draw(
#include "../ViewInfo.h"
#include "../AColor.h"
#include "../RefreshCode.h"
#include "../TrackPanelMouseEvent.h"
enum {
OnToggleQuickPlayID = 7000,
@ -2052,6 +2055,74 @@ protected:
const MenuChoice mMenuChoice;
};
class AdornedRulerPanel::CommonRulerHandle : public UIHandle
{
public:
explicit
CommonRulerHandle( AdornedRulerPanel *pParent )
: mParent(pParent)
{}
bool Clicked() const { return mClicked != Button::None; }
protected:
Result Click
(const TrackPanelMouseEvent &event, AudacityProject *) override
{
mClicked = event.event.LeftDown() ? Button::Left : Button::Right;
return 0;
}
Result Drag
(const TrackPanelMouseEvent &, AudacityProject *) override
{
return 0;
}
Result Release
(const TrackPanelMouseEvent &event, AudacityProject *,
wxWindow *) override
{
return 0;
}
Result Cancel(AudacityProject *pProject) override
{
return 0;
}
wxWeakRef<AdornedRulerPanel> mParent;
enum class Button { None, Left, Right };
Button mClicked{ Button::None };
};
class AdornedRulerPanel::QPHandle final : public CommonRulerHandle
{
public:
explicit
QPHandle( AdornedRulerPanel *pParent )
: CommonRulerHandle( pParent )
{}
private:
Result Click
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
Result Drag
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
HitTestPreview Preview
(const TrackPanelMouseState &state, const AudacityProject *pProject)
override;
Result Release
(const TrackPanelMouseEvent &event, AudacityProject *pProject,
wxWindow *pParent) override;
Result Cancel(AudacityProject *pProject) override;
};
class AdornedRulerPanel::QPCell final : public CommonCell
{
public:
@ -2067,6 +2138,15 @@ public:
// Return shared_ptr to self, stored in parent
std::shared_ptr<TrackPanelCell> ContextMenuDelegate() override
{ return mParent->mQPCell; }
bool Hit() const { return !mHolder.expired(); }
bool Clicked() const {
if (auto ptr = mHolder.lock())
return ptr->Clicked();
return false;
}
std::weak_ptr<QPHandle> mHolder;
};
std::vector<UIHandlePtr> AdornedRulerPanel::QPCell::HitTest
@ -2076,9 +2156,65 @@ std::vector<UIHandlePtr> AdornedRulerPanel::QPCell::HitTest
// Creation of overlays on demand here -- constructor of AdornedRulerPanel
// is too early to do it
mParent->CreateOverlays();
return {};
std::vector<UIHandlePtr> results;
if (false) {
auto result = std::make_shared<QPHandle>( mParent );
result = AssignUIHandlePtr( mHolder, result );
results.push_back( result );
}
return results;
}
class AdornedRulerPanel::ScrubbingHandle final : public CommonRulerHandle
{
public:
explicit
ScrubbingHandle( AdornedRulerPanel *pParent )
: CommonRulerHandle( pParent )
{}
private:
Result Click
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override {
auto result = CommonRulerHandle::Click(event, pProject);
if (!( result & RefreshCode::Cancelled )) {
}
return result;
}
Result Drag
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override
{
auto result = CommonRulerHandle::Drag(event, pProject);
if (!( result & RefreshCode::Cancelled )) {
}
return result;
}
HitTestPreview Preview
(const TrackPanelMouseState &state, const AudacityProject *pProject)
override;
Result Release
(const TrackPanelMouseEvent &event, AudacityProject *pProject,
wxWindow *pParent) override {
auto result = CommonRulerHandle::Release(event, pProject, pParent);
if (!( result & RefreshCode::Cancelled )) {
}
return result;
}
Result Cancel(AudacityProject *pProject) override {
auto result = CommonRulerHandle::Cancel(pProject);
return result;
}
};
class AdornedRulerPanel::ScrubbingCell final : public CommonCell
{
public:
@ -2094,6 +2230,16 @@ public:
// Return shared_ptr to self, stored in parent
std::shared_ptr<TrackPanelCell> ContextMenuDelegate() override
{ return mParent->mScrubbingCell; }
bool Hit() const { return !mHolder.expired(); }
bool Clicked() const {
if (auto ptr = mHolder.lock())
return ptr->Clicked();
return false;
}
private:
std::weak_ptr<ScrubbingHandle> mHolder;
};
std::vector<UIHandlePtr> AdornedRulerPanel::ScrubbingCell::HitTest
@ -2103,7 +2249,18 @@ std::vector<UIHandlePtr> AdornedRulerPanel::ScrubbingCell::HitTest
// Creation of overlays on demand here -- constructor of AdornedRulerPanel
// is too early to do it
mParent->CreateOverlays();
return {};
std::vector<UIHandlePtr> results;
if (false) {
auto result = std::make_shared<ScrubbingHandle>( mParent );
result = AssignUIHandlePtr( mHolder, result );
results.push_back( result );
}
return results;
}
AdornedRulerPanel::AdornedRulerPanel(AudacityProject* project,
@ -2721,6 +2878,15 @@ void AdornedRulerPanel::OnMouseEvents(wxMouseEvent &evt)
}
}
auto AdornedRulerPanel::QPHandle::Click
(const TrackPanelMouseEvent &event, AudacityProject *pProject) -> Result
{
auto result = CommonRulerHandle::Click(event, pProject);
if (!( result & RefreshCode::Cancelled )) {
}
return result;
}
void AdornedRulerPanel::HandleQPClick(wxMouseEvent &evt, wxCoord mousePosX)
{
// Temporarily unlock locked play region
@ -2762,6 +2928,15 @@ void AdornedRulerPanel::HandleQPClick(wxMouseEvent &evt, wxCoord mousePosX)
CaptureMouse();
}
auto AdornedRulerPanel::QPHandle::Drag
(const TrackPanelMouseEvent &event, AudacityProject *pProject) -> Result
{
auto result = CommonRulerHandle::Drag(event, pProject);
if (!( result & RefreshCode::Cancelled )) {
}
return result;
}
void AdornedRulerPanel::HandleQPDrag(wxMouseEvent &/*event*/, wxCoord mousePosX)
{
bool isWithinClick =
@ -2844,6 +3019,28 @@ void AdornedRulerPanel::HandleQPDrag(wxMouseEvent &/*event*/, wxCoord mousePosX)
Update();
}
auto AdornedRulerPanel::ScrubbingHandle::Preview
(const TrackPanelMouseState &state, const AudacityProject *pProject)
-> HitTestPreview
{
return {};
}
auto AdornedRulerPanel::QPHandle::Preview
(const TrackPanelMouseState &state, const AudacityProject *pProject)
-> HitTestPreview
{ return {}; }
auto AdornedRulerPanel::QPHandle::Release
(const TrackPanelMouseEvent &event, AudacityProject *pProject,
wxWindow *pParent) -> Result
{
auto result = CommonRulerHandle::Release(event, pProject, pParent);
if (!( result & RefreshCode::Cancelled )) {
}
return result;
}
void AdornedRulerPanel::HandleQPRelease(wxMouseEvent &evt)
{
if (HasCapture())
@ -2901,6 +3098,13 @@ void AdornedRulerPanel::HandleQPRelease(wxMouseEvent &evt)
StartQPPlay(evt.ShiftDown(), evt.ControlDown());
}
auto AdornedRulerPanel::QPHandle::Cancel
(AudacityProject *pProject) -> Result
{
auto result = CommonRulerHandle::Cancel(pProject);
return result;
}
void AdornedRulerPanel::StartQPPlay(bool looped, bool cutPreview)
{
const double t0 = mTracks->GetStartTime();

View File

@ -506,6 +506,11 @@ private:
class QuickPlayRulerOverlay;
private:
class CommonRulerHandle;
class QPHandle;
class ScrubbingHandle;
class CommonCell;
class QPCell;