I’m trying to make an inventory item management widget that should appear when you right click on an item. I create this widget and set the mouse position to the widget. The problem is that the widget does not appear near the cursor but somewhere below.
Code.
// EContext_Menu_Actions
//-------------------------------------------------------------------------------------
UENUM() enum class EContext_Menu_Actions: int32
{
- Use,*
- Drop,*
};
//-------------------------------------------------------------------------------------
// UContext_Menu_Widget
//-------------------------------------------------------------------------------------
UCLASS(Abstract) class UContext_Menu_Widget : public UUserWidget
{
- GENERATED_BODY()*
public:
- virtual void NativeConstruct();*
- void Create_Action_Button(const EContext_Menu_Actions &action);*
protected:
- UPROPERTY(meta = (BindWidget) ) UVerticalBox *Action_List; *
private:
- UFUNCTION() void On_Action_Use();*
- UFUNCTION() void On_Action_Drop();*
};
//-------------------------------------------------------------------------------------
// UContext_Menu_Widget
//------------------------------------------------------------------------------------------------------------
void UContext_Menu_Widget::NativeConstruct()
{
}
//------------------------------------------------------------------------------------------------------------
void UContext_Menu_Widget::Create_Action_Button(const EContext_Menu_Actions &action)
{
-
UButton new_button_widget = NewObject(this);
-
UTextBlock button_text_widget = NewObject(this);
-
switch(action)*
-
{*
-
case EContext_Menu_Actions::Use:*
-
button_text_widget->SetText(FText::FromString(TEXT("USE") ) );*
-
new_button_widget->OnClicked.AddDynamic(this, &UContext_Menu_Widget::On_Action_Use);*
-
break;*
-
case EContext_Menu_Actions::Drop:*
-
button_text_widget->SetText(FText::FromString(TEXT("Drop") ) );*
-
new_button_widget->OnClicked.AddDynamic(this, &UContext_Menu_Widget::On_Action_Drop);*
-
break;*
-
default:*
-
AsToolkit::Throw();*
-
}*
-
new_button_widget->AddChild(button_text_widget);*
-
Action_List->AddChild(new_button_widget);*
}
//----------------------------------------------------------------------------------------------------
void UContext_Menu_Widget::On_Action_Use()
{ -
UE_LOG(LogTemp, Log, TEXT(“Use Item!!!”) );*
}
//----------------------------------------------------------------------------------------------------
void UContext_Menu_Widget::On_Action_Drop()
{ -
UE_LOG(LogTemp, Log, TEXT(“Drop Item!!!”) );*
}
//----------------------------------------------------------------------------------------------------
FReply UInventory_Item_Widget::NativeOnMouseButtonDown(const FGeometry &in_geometry, const FPointerEvent &in_mouse_event)
{
-
FVector2D screen_mouse_pos;*
-
FKey key = in_mouse_event.GetEffectingButton();*
-
FReply reply = Super::NativeOnMouseButtonDown(in_geometry, in_mouse_event);*
-
if (key == EKeys::LeftMouseButton)*
-
return reply.Handled().DetectDrag(TakeWidget(), EKeys::LeftMouseButton);*
-
else*
-
if (key == EKeys::RightMouseButton)*
-
{*
-
screen_mouse_pos = in_mouse_event.GetScreenSpacePosition();*
-
Show_Item_Context_Menu(screen_mouse_pos);*
-
return reply.Handled();*
-
}*
-
return reply.Unhandled();*
}
//----------------------------------------------------------------------------------------------------
void UInventory_Item_Widget::Show_Item_Context_Menu(FVector2D &screen_pos)
{ -
UContext_Menu_Widget context_menu_widget = CreateWidget<UContext_Menu_Widget>(GetWorld(), Context_Menu_Widget_Class);
-
if (context_menu_widget == 0)*
-
AsToolkit::Throw();*
-
context_menu_widget->Create_Action_Button(EContext_Menu_Actions::Drop);*
-
context_menu_widget->Create_Action_Button(EContext_Menu_Actions::Use);*
-
context_menu_widget->AddToViewport();*
-
context_menu_widget->SetVisibility(ESlateVisibility::Visible);*
-
context_menu_widget->SetPositionInViewport(screen_pos);*
}
//----------------------------------------------------------------------------------------------------