Audacity 3.2.0
Classes | Public Member Functions | Static Public Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | List of all members
WaveClipTrimHandle Class Reference

#include <WaveClipTrimHandle.h>

Inheritance diagram for WaveClipTrimHandle:
[legend]
Collaboration diagram for WaveClipTrimHandle:
[legend]

Classes

class  AdjustBetweenBorders
 
class  AdjustBorder
 
class  ClipTrimPolicy
 

Public Member Functions

 WaveClipTrimHandle (std::unique_ptr< ClipTrimPolicy > &clipTrimPolicy)
 
HitTestPreview Preview (const TrackPanelMouseState &mouseState, AudacityProject *pProject) override
 
Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override
 
Result Drag (const TrackPanelMouseEvent &event, AudacityProject *pProject) override
 
Result Release (const TrackPanelMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override
 
Result Cancel (AudacityProject *pProject) override
 
void Draw (TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
 
wxRect DrawingArea (TrackPanelDrawingContext &, const wxRect &rect, const wxRect &panelRect, unsigned iPass) override
 
- Public Member Functions inherited from UIHandle
virtual ~UIHandle ()=0
 
virtual void Enter (bool forward, AudacityProject *pProject)
 
virtual bool HasRotation () const
 
virtual bool Rotate (bool forward)
 
virtual bool HasEscape (AudacityProject *pProject) const
 
virtual bool Escape (AudacityProject *pProject)
 
virtual bool HandlesRightClick ()
 Whether the handle has any special right-button handling. More...
 
virtual Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject)=0
 
virtual Result Drag (const TrackPanelMouseEvent &event, AudacityProject *pProject)=0
 
virtual HitTestPreview Preview (const TrackPanelMouseState &state, AudacityProject *pProject)=0
 
virtual Result Release (const TrackPanelMouseEvent &event, AudacityProject *pProject, wxWindow *pParent)=0
 
virtual Result Cancel (AudacityProject *pProject)=0
 
virtual bool StopsOnKeystroke ()
 
virtual void OnProjectChange (AudacityProject *pProject)
 
Result GetChangeHighlight () const
 
void SetChangeHighlight (Result val)
 
- Public Member Functions inherited from TrackPanelDrawable
virtual ~TrackPanelDrawable ()=0
 
virtual void Draw (TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass)
 
virtual wxRect DrawingArea (TrackPanelDrawingContext &context, const wxRect &rect, const wxRect &panelRect, unsigned iPass)
 

Static Public Member Functions

static UIHandlePtr HitAnywhere (std::weak_ptr< WaveClipTrimHandle > &holder, const std::shared_ptr< WaveTrack > &waveTrack, const AudacityProject *pProject, const TrackPanelMouseState &state)
 
static UIHandlePtr HitTest (std::weak_ptr< WaveClipTrimHandle > &holder, WaveChannelView &view, const AudacityProject *pProject, const TrackPanelMouseState &state)
 
- Static Public Member Functions inherited from UIHandle
static UIHandle::Result NeedChangeHighlight (const UIHandle &, const UIHandle &)
 
- Static Public Member Functions inherited from TrackPanelDrawable
static wxRect MaximizeWidth (const wxRect &rect, const wxRect &panelRect)
 
static wxRect MaximizeHeight (const wxRect &rect, const wxRect &panelRect)
 

Static Private Member Functions

static HitTestPreview HitPreview (const AudacityProject *, bool unsafe)
 

Private Attributes

std::unique_ptr< ClipTrimPolicymClipTrimPolicy {}
 

Static Private Attributes

static constexpr int BoundaryThreshold = 5
 

Additional Inherited Members

- Public Types inherited from UIHandle
using Result = unsigned
 
using Cell = TrackPanelCell
 
- Protected Attributes inherited from UIHandle
Result mChangeHighlight { 0 }
 

Detailed Description

Definition at line 19 of file WaveClipTrimHandle.h.

Constructor & Destructor Documentation

◆ WaveClipTrimHandle()

WaveClipTrimHandle::WaveClipTrimHandle ( std::unique_ptr< ClipTrimPolicy > &  clipTrimPolicy)

Definition at line 373 of file WaveClipTrimHandle.cpp.

374 : mClipTrimPolicy{ std::move(clipTrimPolicy) }
375{
376
377}
std::unique_ptr< ClipTrimPolicy > mClipTrimPolicy

Member Function Documentation

◆ Cancel()

UIHandle::Result WaveClipTrimHandle::Cancel ( AudacityProject pProject)
overridevirtual

Implements UIHandle.

Definition at line 508 of file WaveClipTrimHandle.cpp.

509{
510 mClipTrimPolicy->Cancel();
512}

References mClipTrimPolicy, and RefreshCode::RefreshAll.

◆ Click()

UIHandle::Result WaveClipTrimHandle::Click ( const TrackPanelMouseEvent event,
AudacityProject pProject 
)
overridevirtual

Implements UIHandle.

Definition at line 483 of file WaveClipTrimHandle.cpp.

485{
486 if (!ProjectAudioIO::Get(*pProject).IsAudioActive())
487 {
488 if (mClipTrimPolicy->Init(event))
490 }
492}
bool IsAudioActive() const
static ProjectAudioIO & Get(AudacityProject &project)

References RefreshCode::Cancelled, ProjectAudioIO::Get(), ProjectAudioIO::IsAudioActive(), mClipTrimPolicy, and RefreshCode::RefreshNone.

Here is the call graph for this function:

◆ Drag()

UIHandle::Result WaveClipTrimHandle::Drag ( const TrackPanelMouseEvent event,
AudacityProject pProject 
)
overridevirtual

Implements UIHandle.

Definition at line 494 of file WaveClipTrimHandle.cpp.

496{
497 return mClipTrimPolicy->Trim(event, *project);
498}
const auto project

References mClipTrimPolicy, and project.

◆ Draw()

void WaveClipTrimHandle::Draw ( TrackPanelDrawingContext context,
const wxRect &  rect,
unsigned  iPass 
)
overridevirtual

Reimplemented from TrackPanelDrawable.

Definition at line 514 of file WaveClipTrimHandle.cpp.

515{
516 mClipTrimPolicy->Draw(context, rect, iPass);
517}

References mClipTrimPolicy.

◆ DrawingArea()

wxRect WaveClipTrimHandle::DrawingArea ( TrackPanelDrawingContext context,
const wxRect &  rect,
const wxRect &  panelRect,
unsigned  iPass 
)
overridevirtual

Reimplemented from TrackPanelDrawable.

Definition at line 519 of file WaveClipTrimHandle.cpp.

521{
522 return mClipTrimPolicy->DrawingArea(context, rect, panelRect, iPass);
523}

References mClipTrimPolicy.

◆ HitAnywhere()

UIHandlePtr WaveClipTrimHandle::HitAnywhere ( std::weak_ptr< WaveClipTrimHandle > &  holder,
const std::shared_ptr< WaveTrack > &  waveTrack,
const AudacityProject pProject,
const TrackPanelMouseState state 
)
static

Definition at line 386 of file WaveClipTrimHandle.cpp.

391{
392 const auto rect = state.rect;
393
394 auto px = state.state.m_x;
395
396 auto& zoomInfo = ViewInfo::Get(*pProject);
397
398 std::shared_ptr<WaveClip> leftClip;
399 std::shared_ptr<WaveClip> rightClip;
400
401 //Test left and right boundaries of each clip
402 //to determine which type of trimming should be applied
403 //and input for the policy
404 for (auto& clip : waveTrack->GetClips())
405 {
406 if (!WaveChannelView::ClipDetailsVisible(*clip, zoomInfo, rect))
407 continue;
408
409 auto clipRect = ClipParameters::GetClipRect(*clip.get(), zoomInfo, rect);
410
411 //double the hit testing area in case if clip are close to each other
412 if (std::abs(px - clipRect.GetLeft()) <= BoundaryThreshold * 2)
413 rightClip = clip;
414 else if (std::abs(px - clipRect.GetRight()) <= BoundaryThreshold * 2)
415 leftClip = clip;
416 }
417
418 std::unique_ptr<ClipTrimPolicy> clipTrimPolicy;
419 if (leftClip && rightClip)
420 {
421 //between adjacent clips
422 if(ClipParameters::GetClipRect(*leftClip, zoomInfo, rect).GetRight() > px)
423 clipTrimPolicy = std::make_unique<AdjustBorder>(waveTrack, leftClip, false, zoomInfo);//right border
424 else
425 clipTrimPolicy = std::make_unique<AdjustBorder>(waveTrack, rightClip, true, zoomInfo);//left border
426 }
427 else
428 {
429 auto clip = leftClip ? leftClip : rightClip;
430 if (clip)
431 {
432 //single clip case, determine the border,
433 //hit testing area differs from one
434 //used for general case
435 auto clipRect = ClipParameters::GetClipRect(*clip.get(), zoomInfo, rect);
436 if (std::abs(px - clipRect.GetLeft()) <= BoundaryThreshold)
437 clipTrimPolicy = std::make_unique<AdjustBorder>(waveTrack, clip, true, zoomInfo);
438 else if (std::abs(px - clipRect.GetRight()) <= BoundaryThreshold)
439 clipTrimPolicy = std::make_unique<AdjustBorder>(waveTrack, clip, false, zoomInfo);
440 }
441 }
442
443 if(clipTrimPolicy)
444 return AssignUIHandlePtr(
445 holder,
446 std::make_shared<WaveClipTrimHandle>(clipTrimPolicy)
447 );
448 return { };
449}
std::shared_ptr< Subclass > AssignUIHandlePtr(std::weak_ptr< Subclass > &holder, const std::shared_ptr< Subclass > &pNew)
Definition: UIHandle.h:151
static ViewInfo & Get(AudacityProject &project)
Definition: ViewInfo.cpp:235
static bool ClipDetailsVisible(const WaveClip &clip, const ZoomInfo &zoomInfo, const wxRect &viewRect)
static constexpr int BoundaryThreshold
static wxRect GetClipRect(const WaveClip &clip, const ZoomInfo &zoomInfo, const wxRect &viewRect, bool *outShowSamples=nullptr)

References AssignUIHandlePtr(), BoundaryThreshold, WaveChannelView::ClipDetailsVisible(), ViewInfo::Get(), ClipParameters::GetClipRect(), TrackPanelMouseState::rect, and TrackPanelMouseState::state.

Referenced by WaveTrackAffordanceControls::HitTest(), and HitTest().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HitPreview()

HitTestPreview WaveClipTrimHandle::HitPreview ( const AudacityProject ,
bool  unsafe 
)
staticprivate

Definition at line 356 of file WaveClipTrimHandle.cpp.

357{
358 static auto disabledCursor =
359 ::MakeCursor(wxCURSOR_NO_ENTRY, DisabledCursorXpm, 16, 16);
360 static auto slideCursor =
361 MakeCursor(wxCURSOR_SIZEWE, TimeCursorXpm, 16, 16);
362 auto message = XO("Click and drag to move clip boundary in time");
363
364 return {
365 message,
366 (unsafe
367 ? &*disabledCursor
368 : &*slideCursor)
369 };
370}
XO("Cut/Copy/Paste")
std::unique_ptr< wxCursor > MakeCursor(int WXUNUSED(CursorId), const char *const pXpm[36], int HotX, int HotY)
Definition: TrackPanel.cpp:186

References MakeCursor(), and XO().

Referenced by Preview().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HitTest()

UIHandlePtr WaveClipTrimHandle::HitTest ( std::weak_ptr< WaveClipTrimHandle > &  holder,
WaveChannelView view,
const AudacityProject pProject,
const TrackPanelMouseState state 
)
static

Definition at line 451 of file WaveClipTrimHandle.cpp.

454{
455 auto waveTrack = std::dynamic_pointer_cast<WaveTrack>(view.FindTrack());
456 //For multichannel tracks, show trim handle only for the leader track
457 if (!waveTrack->IsLeader() && waveTrack->IsAlignedWithLeader())
458 return {};
459
460 std::vector<UIHandlePtr> results;
461
462 const auto rect = state.rect;
463
464 auto px = state.state.m_x;
465 auto py = state.state.m_y;
466
467 if (py >= rect.GetTop() &&
468 py <= (rect.GetTop() + static_cast<int>(rect.GetHeight() * 0.3)))
469 {
470 return HitAnywhere(holder, waveTrack, pProject, state);
471 }
472 return {};
473}
std::shared_ptr< Track > FindTrack()
static UIHandlePtr HitAnywhere(std::weak_ptr< WaveClipTrimHandle > &holder, const std::shared_ptr< WaveTrack > &waveTrack, const AudacityProject *pProject, const TrackPanelMouseState &state)

References CommonTrackPanelCell::FindTrack(), HitAnywhere(), TrackPanelMouseState::rect, and TrackPanelMouseState::state.

Referenced by WaveChannelSubView::DoDetailedHitTest().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Preview()

HitTestPreview WaveClipTrimHandle::Preview ( const TrackPanelMouseState mouseState,
AudacityProject pProject 
)
overridevirtual

Implements UIHandle.

Definition at line 477 of file WaveClipTrimHandle.cpp.

478{
479 const bool unsafe = ProjectAudioIO::Get(*pProject).IsAudioActive();
480 return HitPreview(pProject, unsafe);
481}
static HitTestPreview HitPreview(const AudacityProject *, bool unsafe)

References ProjectAudioIO::Get(), HitPreview(), and ProjectAudioIO::IsAudioActive().

Here is the call graph for this function:

◆ Release()

UIHandle::Result WaveClipTrimHandle::Release ( const TrackPanelMouseEvent event,
AudacityProject pProject,
wxWindow *  pParent 
)
overridevirtual

Implements UIHandle.

Definition at line 500 of file WaveClipTrimHandle.cpp.

503{
504 mClipTrimPolicy->Finish(*project);
506}

References mClipTrimPolicy, project, and RefreshCode::RefreshAll.

Member Data Documentation

◆ BoundaryThreshold

constexpr int WaveClipTrimHandle::BoundaryThreshold = 5
staticconstexprprivate

Definition at line 21 of file WaveClipTrimHandle.h.

Referenced by HitAnywhere().

◆ mClipTrimPolicy

std::unique_ptr<ClipTrimPolicy> WaveClipTrimHandle::mClipTrimPolicy {}
private

Definition at line 50 of file WaveClipTrimHandle.h.

Referenced by Cancel(), Click(), Drag(), Draw(), DrawingArea(), and Release().


The documentation for this class was generated from the following files: