void CEditorRoot::SetEditTool( const CString &sEditToolName,bool bStopCurrentTool/*=true */ ) { CEditTool *pTool = GetEditTool(); if (pTool && pTool->GetClassDesc()) { if (stricmp(pTool->GetClassDesc()->ClassName(),sEditToolName) == 0) return; } IClassDesc *pClass = this->GetClassFactory()->FindClass( sEditToolName ); if (!pClass) { //Warning( "Editor Tool %s not registered.",(const char*)sEditToolName ); return; } if (pClass->SystemClassID() != ESYSTEM_CLASS_EDITTOOL) { //Warning( "Class name %s is not a valid Edit Tool class.",(const char*)sEditToolName ); return; } CRuntimeClass *pRtClass = pClass->GetRuntimeClass(); if (pRtClass && pRtClass->IsDerivedFrom(RUNTIME_CLASS(CEditTool))) { CEditTool *pEditTool = (CEditTool*)pRtClass->CreateObject(); this->SetEditTool(pEditTool); return; } else { //Warning( "Class name %s is not a valid Edit Tool class.",(const char*)sEditToolName ); return; } }
void SSequencerTrackArea::OnMouseCaptureLost() { auto SequencerPin = SequencerWidget.Pin(); if (SequencerPin.IsValid()) { SequencerPin->GetEditTool().OnMouseCaptureLost(); } }
void SSequencerTrackArea::OnMouseLeave(const FPointerEvent& MouseEvent) { auto SequencerPin = SequencerWidget.Pin(); if (SequencerPin.IsValid()) { SequencerPin->GetEditTool().OnMouseLeave(*this, MouseEvent); } }
FReply SSequencerTrackArea::OnMouseButtonUp( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) { auto SequencerPin = SequencerWidget.Pin(); if (SequencerPin.IsValid()) { FReply Reply = SequencerPin->GetEditTool().OnMouseButtonUp(*this, MyGeometry, MouseEvent); if (Reply.IsEventHandled()) { return Reply; } } return TimeSliderController->OnMouseButtonUp( SharedThis(this), MyGeometry, MouseEvent ); }
FCursorReply SSequencerTrackArea::OnCursorQuery( const FGeometry& MyGeometry, const FPointerEvent& CursorEvent ) const { if (CursorEvent.IsMouseButtonDown(EKeys::RightMouseButton) && HasMouseCapture()) { return FCursorReply::Cursor(EMouseCursor::GrabHandClosed); } auto SequencerPin = SequencerWidget.Pin(); if (SequencerPin.IsValid()) { return SequencerPin->GetEditTool().OnCursorQuery(MyGeometry, CursorEvent); } return FCursorReply::Unhandled(); }
FReply SSequencerTrackArea::OnMouseMove( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) { auto SequencerPin = SequencerWidget.Pin(); if (SequencerPin.IsValid()) { FReply Reply = SequencerPin->GetEditTool().OnMouseMove(*this, MyGeometry, MouseEvent); if (Reply.IsEventHandled()) { return Reply; } } if (MouseEvent.IsMouseButtonDown(EKeys::RightMouseButton) && HasMouseCapture()) { TreeView.Pin()->ScrollByDelta( -MouseEvent.GetCursorDelta().Y ); } return TimeSliderController->OnMouseMove( SharedThis(this), MyGeometry, MouseEvent ); }
void SSequencerTrackArea::Tick( const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime ) { CachedGeometry = AllottedGeometry; auto SequencerPin = SequencerWidget.Pin(); if (SequencerPin.IsValid()) { SequencerPin->GetEditTool().Tick(AllottedGeometry, InCurrentTime, InDeltaTime); } FVector2D Size = AllottedGeometry.GetLocalSize(); if (!bLockInOutToStartEndRange.Get()) { if (SizeLastFrame.IsSet() && Size.X != SizeLastFrame->X) { // Zoom by the difference in horizontal size const float Difference = Size.X - SizeLastFrame->X; TRange<float> OldRange = TimeSliderController->GetViewRange().GetAnimationTarget(); TimeSliderController->SetViewRange( OldRange.GetLowerBoundValue(), OldRange.GetUpperBoundValue() + (Difference * OldRange.Size<float>() / SizeLastFrame->X), EViewRangeInterpolation::Immediate ); } } SizeLastFrame = Size; for (int32 Index = 0; Index < Children.Num(); ) { if (!StaticCastSharedRef<SWeakWidget>(Children[Index].GetWidget())->ChildWidgetIsValid()) { Children.RemoveAt(Index); } else { ++Index; } } }
int32 SSequencerTrackArea::OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyClippingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled ) const { FArrangedChildren ArrangedChildren(EVisibility::Visible); ArrangeChildren(AllottedGeometry, ArrangedChildren); for (int32 ChildIndex = 0; ChildIndex < ArrangedChildren.Num(); ++ChildIndex) { FArrangedWidget& CurWidget = ArrangedChildren[ChildIndex]; FSlateRect ChildClipRect = MyClippingRect.IntersectionWith( CurWidget.Geometry.GetClippingRect() ); const int32 ThisWidgetLayerId = CurWidget.Widget->Paint( Args.WithNewParent(this), CurWidget.Geometry, ChildClipRect, OutDrawElements, LayerId + 1, InWidgetStyle, ShouldBeEnabled( bParentEnabled ) ); LayerId = FMath::Max(LayerId, ThisWidgetLayerId); } auto SequencerPin = SequencerWidget.Pin(); if (SequencerPin.IsValid()) { return SequencerPin->GetEditTool().OnPaint(AllottedGeometry, MyClippingRect, OutDrawElements, LayerId + 1); } return LayerId; }
FReply SSequencerTrackArea::OnMouseWheel( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) { // First try the edit tool auto SequencerPin = SequencerWidget.Pin(); if (SequencerPin.IsValid()) { FReply Reply = SequencerPin->GetEditTool().OnMouseWheel(*this, MyGeometry, MouseEvent); if (Reply.IsEventHandled()) { return Reply; } } // Then the time slider FReply Reply = TimeSliderController->OnMouseWheel( SharedThis(this), MyGeometry, MouseEvent ); if (Reply.IsEventHandled()) { return Reply; } // Failing that, we'll just scroll vertically TreeView.Pin()->ScrollByDelta(WheelScrollAmount * -MouseEvent.GetWheelDelta()); return FReply::Handled(); }