#include "UnrealProject.h" #include "MenuSlider.h" #include "SizeBorder.h" void UMenuSliderButton::NativeConstruct() { m_button = Cast(WidgetTree->FindWidget("Button")); m_dragBorder = Cast(WidgetTree->FindWidget("DragBorder")); m_text = Cast(WidgetTree->FindWidget("Text")); m_button->OnPressed.AddDynamic(this, &UMenuSliderButton::m_OnPressed); m_panel = Cast(GetParent()); m_dragging = false; Super::NativeConstruct(); SetSelected(false); } void UMenuSliderButton::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) { UCanvasPanelSlot* canvasSlot = Cast(Slot); canvasSlot->SetAlignment(FVector2D(0.0f, 0.0f)); if(m_parent) { float totalPixelWidth = m_parent->m_sizeBorder->pixelSize.X; float totalWidth = m_parent->m_sizeBorder->viewportSize.X; float totalHeight = m_parent->m_sizeBorder->viewportSize.Y; float buttonSize = totalWidth * 0.2f; totalPixelWidth -= totalPixelWidth * 0.2f; totalWidth -= buttonSize; if(m_dragging) { float mouseX, mouseY; GetOwningPlayer()->GetMousePosition(mouseX, mouseY); float delta = (mouseX - m_dragStart.X) / (totalPixelWidth); m_parent->value = FMath::Clamp(m_dragStartValue + delta, 0.0f, 1.0f); if(!m_dragBorder->IsHovered() && !m_button->IsHovered()) { m_EndDrag(); } UpdateText(); } canvasSlot->SetPosition(FVector2D(m_parent->value * totalWidth, 0.0f)); canvasSlot->SetSize(FVector2D(buttonSize, totalHeight)); } Super::NativeTick(MyGeometry, InDeltaTime); } void UMenuSliderButton::UpdateText() { FString txt = FString::FromInt((int)(m_parent->value * 100)) + "%"; m_text->SetText(FText::FromString(txt)); } void UMenuSliderButton::SetSelected(bool selected) { if(selected) { m_button->SetBackgroundColor(FLinearColor(0.3f, 0.3f, 1.0f, 0.8f)); } else { m_button->SetBackgroundColor(FLinearColor(0.7f, 0.7f, 0.7f, 0.8f)); } } void UMenuSliderButton::m_OnPressed() { float mouseX, mouseY; if(m_parent) { GetOwningPlayer()->GetMousePosition(mouseX, mouseY); m_dragStart = FVector2D(mouseX, mouseY); m_dragStartValue = m_parent->value; m_dragging = true; m_dragBorder->SetVisibility(ESlateVisibility::Visible); } } void UMenuSliderButton::m_EndDrag() { m_dragging = false; m_dragBorder->SetVisibility(ESlateVisibility::SelfHitTestInvisible); } FReply UMenuSliderButton::NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) { m_EndDrag(); return FReply::Unhandled(); } UMenuSlider::UMenuSlider(const FObjectInitializer& init) : Super(init) { stepGranularity = 1.0f / 25; value = 0.5f; } void UMenuSlider::NativeConstruct() { Super::NativeConstruct(); m_sizeBorder = Cast(WidgetTree->FindWidget("SizeBorder")); m_sliderButton = Cast(WidgetTree->FindWidget("SliderButton")); m_sliderButton->m_parent = this; } void UMenuSlider::SetValue(float _value) { value = FMath::Clamp(_value, 0.0f, 1.0f); m_sliderButton->UpdateText(); } void UMenuSlider::NativeOnMenuAction(EMenuActionBinding binding) { switch(binding) { case EMenuActionBinding::Left: case EMenuActionBinding::Repeat_Left: SetValue(value - stepGranularity); break; case EMenuActionBinding::Right: case EMenuActionBinding::Repeat_Right: SetValue(value + stepGranularity); break; } Super::NativeOnMenuAction(binding); } void UMenuSlider::NativeOnSelectionChanged(bool selected, bool controller) { Super::NativeOnSelectionChanged(selected, controller); if(m_sliderButton) m_sliderButton->SetSelected(selected); }