FReply SDockingTabWell::StartDraggingTab( TSharedRef<SDockTab> TabToStartDragging, FVector2D InTabGrabOffsetFraction, const FPointerEvent& MouseEvent ) { Tabs.Remove(TabToStartDragging); // We just removed the foreground tab. ForegroundTabIndex = INDEX_NONE; ParentTabStackPtr.Pin()->OnTabRemoved(TabToStartDragging->GetLayoutIdentifier()); // Tha tab well keeps track of which tab we are dragging; we treat is specially during rendering and layout. TabBeingDraggedPtr = TabToStartDragging; TabGrabOffsetFraction = InTabGrabOffsetFraction; // We are about to start dragging a tab, so make sure its offset is correct this->ChildBeingDraggedOffset = ComputeDraggedTabOffset( MouseEvent.FindGeometry(SharedThis(this)), MouseEvent, InTabGrabOffsetFraction ); // Start dragging. TSharedRef<FDockingDragOperation> DragDropOperation = FDockingDragOperation::New( TabToStartDragging, InTabGrabOffsetFraction, GetDockArea().ToSharedRef(), ParentTabStackPtr.Pin()->GetTabStackGeometry().Size ); return FReply::Handled().BeginDragDrop( DragDropOperation ); }
FReply SDockingTabWell::OnMouseMove( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) { if (this->HasMouseCapture()) { // We are dragging the tab through a TabWell. // Update the position of the Tab that we are dragging in the panel. this->ChildBeingDraggedOffset = ComputeDraggedTabOffset(MyGeometry, MouseEvent, TabGrabOffsetFraction); return FReply::Handled(); } else { return FReply::Unhandled(); } }
FReply SDockingTabWell::OnDragOver( const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent ) { TSharedPtr<FDockingDragOperation> DragDropOperation = DragDropEvent.GetOperationAs<FDockingDragOperation>(); if ( DragDropOperation.IsValid() ) { if (DragDropOperation->CanDockInNode(ParentTabStackPtr.Pin().ToSharedRef(), FDockingDragOperation::DockingViaTabWell)) { // We are dragging the tab through a TabWell. // Update the position of the Tab that we are dragging in the panel. this->ChildBeingDraggedOffset = ComputeDraggedTabOffset(MyGeometry, DragDropEvent, TabGrabOffsetFraction); return FReply::Handled(); } } return FReply::Unhandled(); }
FReply SDockingTabWell::StartDraggingTab( TSharedRef<SDockTab> TabToStartDragging, FVector2D InTabGrabOffsetFraction, const FPointerEvent& MouseEvent ) { const bool bCanLeaveTabWell = TabToStartDragging->GetTabManager()->GetPrivateApi().CanTabLeaveTabWell( TabToStartDragging ); // We are about to start dragging a tab, so make sure its offset is correct this->ChildBeingDraggedOffset = ComputeDraggedTabOffset( MouseEvent.FindGeometry(SharedThis(this)), MouseEvent, InTabGrabOffsetFraction ); // Tha tab well keeps track of which tab we are dragging; we treat is specially during rendering and layout. TabBeingDraggedPtr = TabToStartDragging; TabGrabOffsetFraction = InTabGrabOffsetFraction; Tabs.Remove(TabToStartDragging); if (bCanLeaveTabWell) { // We just removed the foreground tab. ForegroundTabIndex = INDEX_NONE; ParentTabStackPtr.Pin()->OnTabRemoved(TabToStartDragging->GetLayoutIdentifier()); #if PLATFORM_MAC // On Mac we need to activate the app as we may be dragging a window that is set to be invisible if the app is inactive FPlatformMisc::ActivateApplication(); #endif // Start dragging. TSharedRef<FDockingDragOperation> DragDropOperation = FDockingDragOperation::New( TabToStartDragging, InTabGrabOffsetFraction, GetDockArea().ToSharedRef(), ParentTabStackPtr.Pin()->GetTabStackGeometry().Size ); return FReply::Handled().BeginDragDrop( DragDropOperation ); } else { return FReply::Handled().CaptureMouse(SharedThis(this)); } }