更新 ui拖拽时 可以进行旋转

This commit is contained in:
997146918 2025-11-02 18:11:38 +08:00
parent 253df874a3
commit cb74c13494
94 changed files with 141 additions and 102 deletions

View File

@ -2,7 +2,7 @@
"BuildId": "37670630", "BuildId": "37670630",
"Modules": "Modules":
{ {
"ProjectFish": "UnrealEditor-ProjectFish-0027.dll", "ProjectFish": "UnrealEditor-ProjectFish.dll",
"ProjectFishEditor": "UnrealEditor-ProjectFishEditor-0027.dll" "ProjectFishEditor": "UnrealEditor-ProjectFishEditor.dll"
} }
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -2,6 +2,6 @@
"BuildId": "37670630", "BuildId": "37670630",
"Modules": "Modules":
{ {
"DeskMode": "UnrealEditor-DeskMode-0027.dll" "DeskMode": "UnrealEditor-DeskMode.dll"
} }
} }

View File

@ -3,14 +3,51 @@
#include "UIManagerSubsystem.h" #include "UIManagerSubsystem.h"
#include "ProjectFish/Widget/DragableUserWidget.h" #include "ProjectFish/Widget/DragableUserWidget.h"
#include "Framework/Application/SlateApplication.h"
#include "Components/CanvasPanelSlot.h"
void UUIManagerSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
FSlateApplication& SlateApp = FSlateApplication::Get();
SlateApp.OnApplicationMousePreInputButtonDownListener().AddUObject(this, &UUIManagerSubsystem::OnMouseButtonDown);
}
void UUIManagerSubsystem::AddDragWidget(UDragableUserWidget* UserWidget) void UUIManagerSubsystem::AddDragWidget(UDragableUserWidget* UserWidget)
{ {
UserWidget->AddToViewport();
UserWidget->SetVisibility(ESlateVisibility::HitTestInvisible);
DragDropWidget = MakeWeakObjectPtr(UserWidget); DragDropWidget = MakeWeakObjectPtr(UserWidget);
} }
void UUIManagerSubsystem::RemoveDragWidget() void UUIManagerSubsystem::RemoveDragWidget()
{ {
if (DragDropWidget.IsValid())
{
DragDropWidget->RemoveFromViewport();
}
DragDropWidget.Reset(); DragDropWidget.Reset();
} }
UDragableUserWidget* UUIManagerSubsystem::GetDragWidget()
{
if (DragDropWidget.IsValid())
{
return DragDropWidget.Get();
}
return nullptr;
}
void UUIManagerSubsystem::OnMouseButtonDown(const FPointerEvent& PointerEvent)
{
if (DragDropWidget.IsValid())
{
if (PointerEvent.GetEffectingButton() == EKeys::RightMouseButton)
{
DragDropWidget->OnMouseButtonDownWhenDragging(PointerEvent);
}
}
}

View File

@ -16,11 +16,15 @@ class PROJECTFISH_API UUIManagerSubsystem : public UGameInstanceSubsystem
{ {
GENERATED_BODY() GENERATED_BODY()
public: public:
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
UFUNCTION(BlueprintCallable, Category = "UIManagerSubsystem") UFUNCTION(BlueprintCallable, Category = "UIManagerSubsystem")
void AddDragWidget(class UDragableUserWidget* UserWidget); void AddDragWidget(class UDragableUserWidget* UserWidget);
UFUNCTION(BlueprintCallable, Category = "UIManagerSubsystem") UFUNCTION(BlueprintCallable, Category = "UIManagerSubsystem")
void RemoveDragWidget(); void RemoveDragWidget();
UFUNCTION(BlueprintPure, Category = "UIManagerSubsystem")
UDragableUserWidget* GetDragWidget();
void OnMouseButtonDown(const FPointerEvent& PointerEvent);
protected: protected:
TWeakObjectPtr<class UDragableUserWidget> DragDropWidget; TWeakObjectPtr<class UDragableUserWidget> DragDropWidget;

View File

@ -15,9 +15,10 @@ void UDragableUserWidget::SetWidgetDragable(bool Dragable)
void UDragableUserWidget::BeginDrag(const FGeometry& InGeometry) void UDragableUserWidget::BeginDrag(const FGeometry& InGeometry)
{ {
bDraging = true; bDraging = true;
OriginWidgetScreenPos = InGeometry.GetAbsolutePosition(); //OriginWidgetScreenPos = InGeometry.GetAbsolutePosition();
UUIManagerSubsystem* UIManager = GetGameInstance()->GetSubsystem<UUIManagerSubsystem>(); UUIManagerSubsystem* UIManager = GetGameInstance()->GetSubsystem<UUIManagerSubsystem>();
UIManager->AddDragWidget(this); UIManager->AddDragWidget(this);
} }
void UDragableUserWidget::EndDrag() void UDragableUserWidget::EndDrag()
@ -28,93 +29,88 @@ void UDragableUserWidget::EndDrag()
UIManager->RemoveDragWidget(); UIManager->RemoveDragWidget();
} }
FReply UDragableUserWidget::NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) // FReply UDragableUserWidget::NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)
{ // {
if (bDragable && InMouseEvent.GetEffectingButton() == EKeys::LeftMouseButton) // if (bDragable && InMouseEvent.GetEffectingButton() == EKeys::LeftMouseButton)
{ // {
if (bDraging) // if (!bDraging)
{ // {
EndDrag(); // BeginDrag(InGeometry);
return FReply::Unhandled(); // return FReply::Unhandled();
} // }
else // }
{ // else
BeginDrag(InGeometry); // {
return FReply::Handled(); // return Super::NativeOnMouseButtonDown(InGeometry, InMouseEvent);
} // }
} // return FReply::Unhandled();
else // }
{ //
return Super::NativeOnMouseButtonDown(InGeometry, InMouseEvent); // FReply UDragableUserWidget::NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)
} // {
// return Super::NativeOnMouseButtonUp(InGeometry, InMouseEvent);
} // }
//
FReply UDragableUserWidget::NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) // FReply UDragableUserWidget::NativeOnMouseMove(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)
{ // {
return Super::NativeOnMouseButtonUp(InGeometry, InMouseEvent); // if (bDraging)
} // {
// Super::NativeOnMouseMove(InGeometry, InMouseEvent);
FReply UDragableUserWidget::NativeOnMouseMove(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) //
{ // // 获取鼠标在屏幕空间的绝对坐标
if (bDraging) // FVector2D MouseScreenPos = InMouseEvent.GetScreenSpacePosition();
{ //
Super::NativeOnMouseMove(InGeometry, InMouseEvent); // // 获取Widget在屏幕上的实际渲染尺寸
//
// 获取鼠标在屏幕空间的绝对坐标 // FVector2D WidgetAbsoluteSize = InGeometry.GetDrawSize();
FVector2D MouseScreenPos = InMouseEvent.GetScreenSpacePosition(); //
// // 计算Widget中心点应对应的屏幕位置
// 获取Widget在屏幕上的实际渲染尺寸 // FVector2D DesiredCenter = MouseScreenPos;
//
FVector2D WidgetAbsoluteSize = InGeometry.GetDrawSize(); // // 计算新的左上角位置(让中心点对准鼠标)
// FVector2D NewTopLeft =FVector2D(DesiredCenter.X - WidgetAbsoluteSize.X * 0.5f, DesiredCenter.Y - WidgetAbsoluteSize.Y* 0.5f ); ;
// 计算Widget中心点应对应的屏幕位置 //
FVector2D DesiredCenter = MouseScreenPos; // // 边界检查
// FVector2D ViewportSize;
// 计算新的左上角位置(让中心点对准鼠标) // if (GEngine && GEngine->GameViewport)
FVector2D NewTopLeft =FVector2D(DesiredCenter.X - WidgetAbsoluteSize.X * 0.5f, DesiredCenter.Y - WidgetAbsoluteSize.Y* 0.5f ); ; // {
// GEngine->GameViewport->GetViewportSize(ViewportSize);
// 边界检查 // }
FVector2D ViewportSize; // else
if (GEngine && GEngine->GameViewport) // {
{ // ViewportSize = FVector2D(1920, 1080);
GEngine->GameViewport->GetViewportSize(ViewportSize); // }
} //
else // // 确保Widget不会完全移出屏幕
{ // NewTopLeft.X = FMath::Clamp(NewTopLeft.X, 0.0f, ViewportSize.X - WidgetAbsoluteSize.X);
ViewportSize = FVector2D(1920, 1080); // NewTopLeft.Y = FMath::Clamp(NewTopLeft.Y, 0.0f, ViewportSize.Y - WidgetAbsoluteSize.Y);
} //
// // // 计算相对于原始位置的偏移量
// 确保Widget不会完全移出屏幕 // // FVector2D ParentAbsolutePosition = FVector2D::ZeroVector;
NewTopLeft.X = FMath::Clamp(NewTopLeft.X, 0.0f, ViewportSize.X - WidgetAbsoluteSize.X); // // if (InGeometry.GetParentGeometry().IsValid())
NewTopLeft.Y = FMath::Clamp(NewTopLeft.Y, 0.0f, ViewportSize.Y - WidgetAbsoluteSize.Y); // // {
// // ParentAbsolutePosition = InGeometry.GetParentGeometry().GetAbsolutePosition();
// // 计算相对于原始位置的偏移量 // // }
// FVector2D ParentAbsolutePosition = FVector2D::ZeroVector; // //
// if (InGeometry.GetParentGeometry().IsValid()) // FVector2D LocalOffset = NewTopLeft - OriginWidgetScreenPos;
// { //
// ParentAbsolutePosition = InGeometry.GetParentGeometry().GetAbsolutePosition(); // // 应用变换
// } // FWidgetTransform WidgetTransform = GetRenderTransform();
// // WidgetTransform.Translation = LocalOffset/InGeometry.Scale;
FVector2D LocalOffset = NewTopLeft - OriginWidgetScreenPos; // SetRenderTransform(WidgetTransform);
//
// 应用变换 // // FString Scale = FString::Printf(TEXT("%.0f"), InGeometry.Scale);
FWidgetTransform WidgetTransform = GetRenderTransform(); // // UE_LOG(LogTemp, Warning, TEXT("Mouse: %s, CurrentWidgetScreenPos: %s, WidgetAbsoluteSize: %s NewTopLeft : %s LocalOffset : %s Scale = %s"),
WidgetTransform.Translation = LocalOffset/InGeometry.Scale; // // *MouseScreenPos.ToString(),
SetRenderTransform(WidgetTransform); // // *OriginWidgetScreenPos.ToString(),
// // *WidgetAbsoluteSize.ToString(),
// FString Scale = FString::Printf(TEXT("%.0f"), InGeometry.Scale); // // *NewTopLeft.ToString(),
// UE_LOG(LogTemp, Warning, TEXT("Mouse: %s, CurrentWidgetScreenPos: %s, WidgetAbsoluteSize: %s NewTopLeft : %s LocalOffset : %s Scale = %s"), // // *LocalOffset.ToString(),
// *MouseScreenPos.ToString(), // // *Scale
// *OriginWidgetScreenPos.ToString(), // // );
// *WidgetAbsoluteSize.ToString(), //
// *NewTopLeft.ToString(), // return FReply::Unhandled();
// *LocalOffset.ToString(), // }
// *Scale // else
// ); // return Super::NativeOnMouseMove(InGeometry, InMouseEvent);
// }
return FReply::Handled();
}
else
return Super::NativeOnMouseMove(InGeometry, InMouseEvent);
}

View File

@ -22,12 +22,14 @@ public:
UFUNCTION(BlueprintCallable, Category = "Dragable Widget") UFUNCTION(BlueprintCallable, Category = "Dragable Widget")
void EndDrag(); void EndDrag();
UFUNCTION(BlueprintImplementableEvent, Category = "Dragable Widget")
void OnMouseButtonDownWhenDragging(const FPointerEvent& PointerEvent);
virtual FReply NativeOnMouseButtonDown( const FGeometry& InGeometry, const FPointerEvent& InMouseEvent ) override; // virtual FReply NativeOnMouseButtonDown( const FGeometry& InGeometry, const FPointerEvent& InMouseEvent ) override;
virtual FReply NativeOnMouseButtonUp( const FGeometry& InGeometry, const FPointerEvent& InMouseEvent ) override; // virtual FReply NativeOnMouseButtonUp( const FGeometry& InGeometry, const FPointerEvent& InMouseEvent ) override;
virtual FReply NativeOnMouseMove( const FGeometry& InGeometry, const FPointerEvent& InMouseEvent ) override; // virtual FReply NativeOnMouseMove( const FGeometry& InGeometry, const FPointerEvent& InMouseEvent ) override;
protected: protected:
UPROPERTY(BlueprintReadWrite, EditAnywhere) UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ExposeOnSpawn = true))
bool bDragable; bool bDragable;
UPROPERTY(BlueprintReadOnly) UPROPERTY(BlueprintReadOnly)