55 lines
1.8 KiB
C++
55 lines
1.8 KiB
C++
// RadialSliceWidget.h
|
|
// A single wedge of the radial menu. One of these exists per entry, each with
|
|
// its own dynamic material instance. It knows its own angular span and whether
|
|
// it is currently the hovered slice — nothing about its neighbours.
|
|
|
|
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "Blueprint/UserWidget.h"
|
|
#include "RadialSliceWidget.generated.h"
|
|
|
|
class UImage;
|
|
class UMaterialInstanceDynamic;
|
|
|
|
UCLASS(Abstract)
|
|
class URadialSliceWidget : public UUserWidget
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
// Called once when the slice is created. StartAngle/AngleSize are degrees,
|
|
// clockwise from 12 o'clock; the material uses them to draw just this wedge.
|
|
void Setup(UMaterialInterface* InSliceMaterial, float StartAngleDeg,
|
|
float AngleSizeDeg, UTexture2D* Icon, bool bEnabled);
|
|
|
|
// Smoothly animate this slice's highlight toward target (0 = off, 1 = on).
|
|
// Called every tick by the container with the *undilated* delta.
|
|
void UpdateHighlight(bool bIsHovered, float UndilatedDelta);
|
|
|
|
protected:
|
|
virtual void NativeConstruct() override;
|
|
|
|
UPROPERTY(meta = (BindWidget))
|
|
TObjectPtr<UImage> WedgeImage = nullptr;
|
|
|
|
UPROPERTY(meta = (BindWidget))
|
|
TObjectPtr<UImage> IconImage = nullptr;
|
|
|
|
// Speed of the highlight ease. Higher = snappier.
|
|
UPROPERTY(EditDefaultsOnly, Category = "Radial Menu")
|
|
float HighlightInterpSpeed = 16.f;
|
|
|
|
// Distance in px from the menu center to the icon, placing it on the slice's
|
|
// centerline. Should sit between the material's InnerRadius and OuterRadius:
|
|
// roughly (InnerRadius + OuterRadius) * 0.5 * MenuDiameter.
|
|
UPROPERTY(EditDefaultsOnly, Category = "Radial Menu")
|
|
float IconRadius = 164.f;
|
|
|
|
private:
|
|
UPROPERTY(Transient)
|
|
TObjectPtr<UMaterialInstanceDynamic> WedgeMID = nullptr;
|
|
|
|
bool bSliceEnabled = true;
|
|
float CurrentHighlight = 0.f;
|
|
}; |