Files
UnrealEngine/Engine/Plugins/Experimental/MeshModelingToolsetExp/Source/ModelingUI/Public/ModelingWidgets/SDraggableBox.h
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

140 lines
5.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/SCompoundWidget.h"
/**
* Class that can be used to place a draggable box into a viewport or some other large widget as an
* overlay. Just place the widget that you want to be draggable as the contents of SDraggableBoxOverlay.
*/
class UE_DEPRECATED(5.6, "Use UE::ToolWidgets::SDraggableBoxOverlay instead.") SDraggableBoxOverlay : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SDraggableBoxOverlay) {}
// When true, the positioning of the box is relative to the bottom of the widget rather than the top,
// so the VerticalPosition in SetBoxPosition is interpreted as distance from the bottom of the
// containing widget. The choice here depends on how your widget is generally positioned, for instance
// if it is near the bottom, you want this to be true so that making the window smaller does not
// immediately clip your box.
SLATE_ARGUMENT(bool, bPositionRelativeToBottom)
SLATE_DEFAULT_SLOT(FArguments, Content)
SLATE_END_ARGS()
MODELINGUI_API void Construct(const FArguments& InArgs);
/**
* Sets the box position in the overlay. Horizontal position is distance from left, and vertical position
* is distance from bottom or from top depending on whether bPositionRelativeToBottom == true.
*/
MODELINGUI_API void SetBoxPosition(float HorizontalPosition, float VerticalPosition);
protected:
TSharedPtr<SWidget> DraggableBox;
TSharedPtr<SWidget> ContainingBox;
float DraggableBoxPaddingHorizontal = 0;
float DraggableBoxPaddingVertical = 0;
};
/**
* A widget for the draggable box itself, which requires its parent to handle its positioning in
* response to the drag.
*
* Users probably shouldn't use this class directly; rather, they should use SDraggableBoxOverlay,
* which will put its contents into a draggable box and properly handle the dragging without the
* user having to set it up.
*/
class UE_DEPRECATED(5.6, "SDraggableBox is now private. Use UE::ToolWidgets::SDraggableBoxOverlay instead.") SDraggableBox : public SCompoundWidget
{
public:
DECLARE_DELEGATE_OneParam(FOnDragComplete, const FVector2D& /*ScreenSpacePosition*/);
SLATE_BEGIN_ARGS(SDraggableBox) {}
SLATE_EVENT(FOnDragComplete, OnDragComplete)
SLATE_DEFAULT_SLOT(FArguments, Content)
SLATE_END_ARGS()
MODELINGUI_API void Construct(const FArguments& InArgs);
// SWidget overrides necessary for box to be draggable
MODELINGUI_API FReply OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
MODELINGUI_API FReply OnDragDetected(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
protected:
TSharedPtr<SWidget> InnerWidget;
FOnDragComplete OnDragComplete;
// Remembers the point in the box that we grabbed (on click, rather than when the
// drag was confirmed)
FVector2D ScreenSpaceOffsetOfGrab;
};
/**
* A drag/drop operation used by SDraggableBox, largely modeled on FInViewportUIDragOperation, except
* instead of requiring the drop location to be able to handle that particular class to trigger the
* OnDragComplete delegate, it just triggers on any drop. This makes it possible to use it in any
* viewports, not just the level editor.
*/
class UE_DEPRECATED(5.6, "FDraggableBoxUIDragOperation is now private. Use UE::ToolWidgets::SDraggableBoxOverlay instead.") FDraggableBoxUIDragOperation : public FDragDropOperation
{
public:
DRAG_DROP_OPERATOR_TYPE(FDraggableBoxUIDragOperation, FDragDropOperation)
// FDragDropOperation
MODELINGUI_API virtual void OnDrop(bool bDropWasHandled, const FPointerEvent& MouseEvent) override;
MODELINGUI_API virtual void OnDragged(const FDragDropEvent& DragDropEvent) override;
/**
* Create this Drag and Drop Content
*
* @param InUIToBeDragged The UI being dragged
* @param InDecoratorOffset Where within the UI we grabbed, so we're not dragging by the upper left of the UI.
* @param OwnerAreaSize Size of the DockArea at the time when we start dragging.
* @param OnDragComplete Delegate to call when dropped. Gets passed in the screen space location of the top left corner.
*
* @return a new FDockingDragOperation
*/
PRAGMA_DISABLE_DEPRECATION_WARNINGS
MODELINGUI_API static TSharedRef<FDraggableBoxUIDragOperation> New(const TSharedRef<class SWidget>& InUIToBeDragged, const FVector2D InDecoratorOffset,
const FVector2D& OwnerAreaSize, SDraggableBox::FOnDragComplete& OnDragComplete);
PRAGMA_ENABLE_DEPRECATION_WARNINGS
PRAGMA_DISABLE_DEPRECATION_WARNINGS
virtual ~FDraggableBoxUIDragOperation() {}
PRAGMA_ENABLE_DEPRECATION_WARNINGS
protected:
/** The constructor is protected, so that this class can only be instantiated as a shared pointer. */
PRAGMA_DISABLE_DEPRECATION_WARNINGS
MODELINGUI_API FDraggableBoxUIDragOperation(const TSharedRef<class SWidget>& InUIToBeDragged, const FVector2D InDecoratorOffsetFromCursor,
const FVector2D& OwnerAreaSize, SDraggableBox::FOnDragComplete& OnDragCompletee);
PRAGMA_ENABLE_DEPRECATION_WARNINGS
/**
* Shared pointer to our contents, which are a weak pointer.
*/
TSharedPtr<class SWidget> UIBeingDragged;
// Screen space offset of grab location from the top left corner of the rectangle being dragged.
FVector2D DecoratorOffsetFromCursor;
// Size of rectangle being dragged
FVector2D LastContentSize;
PRAGMA_DISABLE_DEPRECATION_WARNINGS
SDraggableBox::FOnDragComplete OnDragComplete;
PRAGMA_ENABLE_DEPRECATION_WARNINGS
};