Slowly replacing Common UI

This commit is contained in:
2026-07-22 23:27:33 +02:00
parent 677e885780
commit 52a26d8f0d
48 changed files with 394 additions and 186 deletions

View File

@@ -28,7 +28,7 @@ AppliedDefaultGraphicsPerformance=Scalable
[/Script/Engine.Engine] [/Script/Engine.Engine]
+ActiveGameNameRedirects=(OldGameName="TP_ThirdPersonBP",NewGameName="/Script/ProjectEleri") +ActiveGameNameRedirects=(OldGameName="TP_ThirdPersonBP",NewGameName="/Script/ProjectEleri")
+ActiveGameNameRedirects=(OldGameName="/Script/TP_ThirdPersonBP",NewGameName="/Script/ProjectEleri") +ActiveGameNameRedirects=(OldGameName="/Script/TP_ThirdPersonBP",NewGameName="/Script/ProjectEleri")
GameViewportClientClassName=/Script/CommonUI.CommonGameViewportClient GameViewportClientClassName=/Script/StevesUEHelpers.StevesGameViewportClientBase
SmoothedFrameRateRange=(LowerBound=(Type=Inclusive,Value=0.000000),UpperBound=(Type=Exclusive,Value=200.000000)) SmoothedFrameRateRange=(LowerBound=(Type=Inclusive,Value=0.000000),UpperBound=(Type=Exclusive,Value=200.000000))
[/Script/Engine.RendererSettings] [/Script/Engine.RendererSettings]
@@ -419,3 +419,4 @@ pcg.GlobalDisableRefresh=True
[/Script/Engine.WorldPartitionSettings] [/Script/Engine.WorldPartitionSettings]
bNewMapsEnableWorldPartition=True bNewMapsEnableWorldPartition=True

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -14,6 +14,7 @@
#include "Kismet/GameplayStatics.h" #include "Kismet/GameplayStatics.h"
#include "BookOfAlchemyManager.h" #include "BookOfAlchemyManager.h"
#include "AlchemyManager.h" #include "AlchemyManager.h"
#include "TimerManager.h"
#include "ProjectEleri/UI/CalendarScreen.h" #include "ProjectEleri/UI/CalendarScreen.h"
#include "ProjectEleri/UI/InteractionWidget.h" #include "ProjectEleri/UI/InteractionWidget.h"
#include "UI/AlchemyWidget.h" #include "UI/AlchemyWidget.h"
@@ -81,11 +82,11 @@ void AEleriPlayerController::Tick(float DeltaTime)
i--; i--;
} }
} }
if (!InMenu && !bIsInteractionMenuVisible) if (!IsInMenu() && !bIsInteractionMenuVisible)
{ {
ToggleInteractionMenu(true); ToggleInteractionMenu(true);
} }
else if (InMenu && bIsInteractionMenuVisible) else if (IsInMenu() && bIsInteractionMenuVisible)
{ {
ToggleInteractionMenu(false); ToggleInteractionMenu(false);
} }
@@ -327,7 +328,7 @@ void AEleriPlayerController::ClientRestart_Implementation(APawn *NewPawn)
void AEleriPlayerController::OnMove(const FInputActionValue &Value) void AEleriPlayerController::OnMove(const FInputActionValue &Value)
{ {
if (InMenu) if (IsInMenu())
return; return;
FVector2D AnalogueValue = Value.Get<FInputActionValue::Axis2D>(); FVector2D AnalogueValue = Value.Get<FInputActionValue::Axis2D>();
@@ -351,7 +352,7 @@ void AEleriPlayerController::OnMove(const FInputActionValue &Value)
void AEleriPlayerController::OnSprint(const FInputActionValue &Value) void AEleriPlayerController::OnSprint(const FInputActionValue &Value)
{ {
if (InMenu || Watering) if (IsInMenu() || Watering)
return; return;
ACharacter *Char = GetCharacter(); ACharacter *Char = GetCharacter();
@@ -380,7 +381,7 @@ void AEleriPlayerController::OnStopSprint(const FInputActionValue &Value)
void AEleriPlayerController::OnJump(const FInputActionValue &Value) void AEleriPlayerController::OnJump(const FInputActionValue &Value)
{ {
if (InMenu || Watering) if (IsInMenu() || Watering)
return; return;
ACharacter *Char = GetCharacter(); ACharacter *Char = GetCharacter();
@@ -401,7 +402,7 @@ void AEleriPlayerController::OnStopJump(const FInputActionValue &Value)
void AEleriPlayerController::OnLook(const FInputActionValue &Value) void AEleriPlayerController::OnLook(const FInputActionValue &Value)
{ {
if (InMenu) if (IsInMenu())
return; return;
FVector2D AnalogueValue = Value.Get<FInputActionValue::Axis2D>(); FVector2D AnalogueValue = Value.Get<FInputActionValue::Axis2D>();
@@ -415,7 +416,7 @@ void AEleriPlayerController::OnLook(const FInputActionValue &Value)
void AEleriPlayerController::OnLookEnable(const FInputActionValue &Value) void AEleriPlayerController::OnLookEnable(const FInputActionValue &Value)
{ {
if (InMenu) if (IsInMenu())
return; return;
AMyCharacter *Char = Cast<AMyCharacter>(GetCharacter()); AMyCharacter *Char = Cast<AMyCharacter>(GetCharacter());
@@ -427,7 +428,7 @@ void AEleriPlayerController::OnLookEnable(const FInputActionValue &Value)
void AEleriPlayerController::OnLookDisable(const FInputActionValue &Value) void AEleriPlayerController::OnLookDisable(const FInputActionValue &Value)
{ {
if (InMenu) if (IsInMenu())
return; return;
AMyCharacter *Char = Cast<AMyCharacter>(GetCharacter()); AMyCharacter *Char = Cast<AMyCharacter>(GetCharacter());
@@ -550,7 +551,7 @@ void AEleriPlayerController::OnStartObjectRemovalAction(const FInputActionValue
return; return;
} }
if (InMenu || Paused) if (IsInMenu() || Paused)
return; return;
MoveActorsComp->StartObjectRemoval(!MoveActorsComp->IsRemovingMode()); MoveActorsComp->StartObjectRemoval(!MoveActorsComp->IsRemovingMode());
@@ -789,7 +790,7 @@ void AEleriPlayerController::OnInteractionMenuDownAction(const FInputActionValue
void AEleriPlayerController::OnControllerUpAction(const FInputActionValue &Value) void AEleriPlayerController::OnControllerUpAction(const FInputActionValue &Value)
{ {
if (InMenu) if (IsInMenu())
{ {
OnUiButtonPressed.Broadcast(UiInputType::UP); OnUiButtonPressed.Broadcast(UiInputType::UP);
} }
@@ -797,7 +798,7 @@ void AEleriPlayerController::OnControllerUpAction(const FInputActionValue &Value
void AEleriPlayerController::OnControllerDownAction(const FInputActionValue &Value) void AEleriPlayerController::OnControllerDownAction(const FInputActionValue &Value)
{ {
if (InMenu) if (IsInMenu())
{ {
OnUiButtonPressed.Broadcast(UiInputType::DOWN); OnUiButtonPressed.Broadcast(UiInputType::DOWN);
} }
@@ -805,7 +806,7 @@ void AEleriPlayerController::OnControllerDownAction(const FInputActionValue &Val
void AEleriPlayerController::OnControllerLeftAction(const FInputActionValue &Value) void AEleriPlayerController::OnControllerLeftAction(const FInputActionValue &Value)
{ {
if (InMenu) if (IsInMenu())
{ {
OnUiButtonPressed.Broadcast(UiInputType::LEFT); OnUiButtonPressed.Broadcast(UiInputType::LEFT);
} }
@@ -813,7 +814,7 @@ void AEleriPlayerController::OnControllerLeftAction(const FInputActionValue &Val
void AEleriPlayerController::OnControllerRightAction(const FInputActionValue &Value) void AEleriPlayerController::OnControllerRightAction(const FInputActionValue &Value)
{ {
if (InMenu) if (IsInMenu())
{ {
OnUiButtonPressed.Broadcast(UiInputType::RIGHT); OnUiButtonPressed.Broadcast(UiInputType::RIGHT);
} }
@@ -821,34 +822,43 @@ void AEleriPlayerController::OnControllerRightAction(const FInputActionValue &Va
void AEleriPlayerController::OnControllerConfirmAction(const FInputActionValue &Value) void AEleriPlayerController::OnControllerConfirmAction(const FInputActionValue &Value)
{ {
if (InMenu) if (MainGameUI->GetWidgetStack().IsEmpty())
{ {
OnUiButtonPressed.Broadcast(UiInputType::SELECT); return;
} }
MainGameUI->GetWidgetStack()[MainGameUI->GetWidgetStack().Num() - 1]->HandleUiInputAction(EEleriUIInputAction::Select);
} }
void AEleriPlayerController::OnControllerBackAction(const FInputActionValue &Value) void AEleriPlayerController::OnControllerBackAction(const FInputActionValue &Value)
{
if (InMenu)
{ {
OnUiButtonPressed.Broadcast(UiInputType::BACK); OnUiButtonPressed.Broadcast(UiInputType::BACK);
if (MainGameUI->GetWidgetStack().IsEmpty())
{
return;
} }
MainGameUI->GetWidgetStack()[MainGameUI->GetWidgetStack().Num() - 1]->HandleUiInputAction(EEleriUIInputAction::Back);
} }
void AEleriPlayerController::OnControllerTabLeftAction(const FInputActionValue &Value) void AEleriPlayerController::OnControllerTabLeftAction(const FInputActionValue &Value)
{ {
if (InMenu) if (MainGameUI->GetWidgetStack().IsEmpty())
{ {
OnUiButtonPressed.Broadcast(UiInputType::TABLEFT); return;
} }
MainGameUI->GetWidgetStack()[MainGameUI->GetWidgetStack().Num() - 1]->HandleUiInputAction(EEleriUIInputAction::TabLeft);
} }
void AEleriPlayerController::OnControllerTabRightAction(const FInputActionValue &Value) void AEleriPlayerController::OnControllerTabRightAction(const FInputActionValue &Value)
{ {
if (InMenu) if (MainGameUI->GetWidgetStack().IsEmpty())
{ {
OnUiButtonPressed.Broadcast(UiInputType::TABRIGHT); return;
} }
MainGameUI->GetWidgetStack()[MainGameUI->GetWidgetStack().Num() - 1]->HandleUiInputAction(EEleriUIInputAction::TabRight);
} }
// UI BIND // UI BIND
@@ -870,39 +880,23 @@ void AEleriPlayerController::OnMainMenuToggle(const FInputActionValue &Value)
void AEleriPlayerController::OnInventoryToggle(const FInputActionValue &Value) void AEleriPlayerController::OnInventoryToggle(const FInputActionValue &Value)
{ {
if (Paused || IsDialogueOpen() || !MoveActorsComp || MoveActorsComp->IsRemovingMode()) if (Paused || (IsInMenu() && !MainGameUI->IsInventoryOpen()) || !MoveActorsComp || MoveActorsComp->IsRemovingMode())
return; return;
if (!MainGameUI->IsInventoryOpen())
{
// Open inventory
OpenInventory(false, false, nullptr, TArray<EInventoryTabType>()); OpenInventory(false, false, nullptr, TArray<EInventoryTabType>());
} }
else
{
// Closing inventory
CloseInventory();
}
}
void AEleriPlayerController::OnBookToggle(const FInputActionValue &Value) void AEleriPlayerController::OnBookToggle(const FInputActionValue &Value)
{ {
if (Paused || IsDialogueOpen() || (InMenu && !MainGameUI->IsBookOpen()) || !MoveActorsComp || MoveActorsComp->IsRemovingMode()) if (Paused || IsDialogueOpen() || (IsInMenu() && !MainGameUI->IsBookOpen()) || !MoveActorsComp || MoveActorsComp->IsRemovingMode())
return; return;
if (!MainGameUI->IsBookOpen())
{
OpenBookOfAlchemy(nullptr); OpenBookOfAlchemy(nullptr);
} }
else
{
CloseBookOfAlchemy();
}
}
void AEleriPlayerController::OnOrdersToggle(const FInputActionValue &Value) void AEleriPlayerController::OnOrdersToggle(const FInputActionValue &Value)
{ {
if (Paused || IsDialogueOpen() || InMenu || !MoveActorsComp || MoveActorsComp->IsRemovingMode()) if (Paused || IsDialogueOpen() || IsInMenu() || !MoveActorsComp || MoveActorsComp->IsRemovingMode())
return; return;
if (OrdersOpen) if (OrdersOpen)
@@ -925,7 +919,7 @@ void AEleriPlayerController::OnOrdersToggle(const FInputActionValue &Value)
void AEleriPlayerController::OnCalendarToggle(const FInputActionValue &Value) void AEleriPlayerController::OnCalendarToggle(const FInputActionValue &Value)
{ {
if (Paused || IsDialogueOpen() || (InMenu && !MainGameUI->IsBookOpen()) || !MoveActorsComp || MoveActorsComp->IsRemovingMode()) if (Paused || IsDialogueOpen() || (IsInMenu() && !MainGameUI->IsBookOpen()) || !MoveActorsComp || MoveActorsComp->IsRemovingMode())
return; return;
if (!MainGameUI->IsCalendarOpen()) if (!MainGameUI->IsCalendarOpen())
@@ -1017,31 +1011,16 @@ UUserWidget *AEleriPlayerController::OpenInventory(bool JustSelecting, bool Shop
// If we pass something we're opening a shop/trade and the other inventory is the npc inventory // If we pass something we're opening a shop/trade and the other inventory is the npc inventory
UInventoryComponent *MainInv = PlayerInventory; UInventoryComponent *MainInv = PlayerInventory;
UInventoryComponent *OtherInv = IsValid(Inventory) ? Inventory : nullptr; UInventoryComponent *OtherInv = IsValid(Inventory) ? Inventory : nullptr;
MainGameUI->ToggleInventoryWidget(true); MainGameUI->OpenWidget(MainGameUI->GetInventoryWidget());
MainGameUI->GetInventoryWidget()->ToggleWidget(true); MainGameUI->GetInventoryWidget()->ToggleWidget(true);
MainGameUI->GetInventoryWidget()->Setup(MainInv, OtherInv, Shop, JustSelecting, RestrictTabs, bSelectMultiple, bShowDescription, bShowPropertyMap); MainGameUI->GetInventoryWidget()->Setup(MainInv, OtherInv, Shop, JustSelecting, RestrictTabs, bSelectMultiple, bShowDescription, bShowPropertyMap);
AddToMenuStack(MainGameUI->GetInventoryWidget());
SetShowMouseCursor(true);
SetInputMode(FInputModeGameAndUI());
InMenu = true;
// Get the Enhanced Input Local Player Subsystem from the Local Player related to our Player Controller.
if (UEnhancedInputLocalPlayerSubsystem *Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer()))
{
// If for whatever reason...
Subsystem->RemoveMappingContext(MainUiContext);
// Add each mapping context, along with their priority values. Higher values outprioritize lower values.
Subsystem->AddMappingContext(MainUiContext, 98);
}
// SetPause(true);
return MainGameUI->GetInventoryWidget(); return MainGameUI->GetInventoryWidget();
} }
void AEleriPlayerController::CloseInventory() void AEleriPlayerController::CloseInventory()
{ {
MainGameUI->ToggleInventoryWidget(false); MainGameUI->CloseWidget(MainGameUI->GetInventoryWidget());
CloseGenericMenu(MainGameUI->GetInventoryWidget());
} }
UUserWidget *AEleriPlayerController::OpenBookOfAlchemy(UItemDataAsset *ItemToPresent) UUserWidget *AEleriPlayerController::OpenBookOfAlchemy(UItemDataAsset *ItemToPresent)
@@ -1052,11 +1031,7 @@ UUserWidget *AEleriPlayerController::OpenBookOfAlchemy(UItemDataAsset *ItemToPre
bBookAnimating = true; bBookAnimating = true;
MainGameUI->GetBookWidget()->Setup(ItemToPresent, false); MainGameUI->GetBookWidget()->Setup(ItemToPresent, false);
PlayerCharacter->ToggleBook(true); PlayerCharacter->ToggleBook(true);
AddToMenuStack(MainGameUI->GetBookWidget());
SetShowMouseCursor(true);
SetInputMode(FInputModeGameAndUI());
MainGameUI->ToggleBookWidget(true); MainGameUI->ToggleBookWidget(true);
InMenu = true;
MainGameUI->ToggleGameMenu(false); MainGameUI->ToggleGameMenu(false);
@@ -1070,7 +1045,6 @@ UUserWidget *AEleriPlayerController::OpenBookOfAlchemy(UItemDataAsset *ItemToPre
} }
TickBookAnimating = true; TickBookAnimating = true;
SetPause(true);
return MainGameUI->GetBookWidget(); return MainGameUI->GetBookWidget();
} }
@@ -1081,14 +1055,13 @@ void AEleriPlayerController::CloseBookOfAlchemy()
return; return;
bBookAnimating = true; bBookAnimating = true;
MainGameUI->ToggleBookWidget(false);
CloseGenericMenu(MainGameUI->GetBookWidget());
// for the animation of closing // for the animation of closing
FTimerHandle TimerHandle; FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, FTimerDelegate::CreateLambda([this]() GetWorld()->GetTimerManager().SetTimer(TimerHandle, FTimerDelegate::CreateLambda([this]()
{ MainGameUI->ToggleGameMenu(true); }), {
0.5f, false); MainGameUI->ToggleGameMenu(true);
}), 0.5f, false);
// Get the Enhanced Input Local Player Subsystem from the Local Player related to our Player Controller. // Get the Enhanced Input Local Player Subsystem from the Local Player related to our Player Controller.
if (UEnhancedInputLocalPlayerSubsystem *Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer())) if (UEnhancedInputLocalPlayerSubsystem *Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer()))
@@ -1172,8 +1145,6 @@ UEleriBaseWidget *AEleriPlayerController::ToggleAlchemyMenu(bool bOpen)
SetShowMouseCursor(bOpen); SetShowMouseCursor(bOpen);
MainGameUI->ToggleAlchemyWidget(bOpen); MainGameUI->ToggleAlchemyWidget(bOpen);
InMenu = bOpen;
// SetPause(bOpen);
return MainGameUI->GetAlchemyWidget(); return MainGameUI->GetAlchemyWidget();
} }
@@ -1185,7 +1156,6 @@ UEleriBaseWidget *AEleriPlayerController::ToggleDialogueWindow(bool bOpen)
MainGameUI->ToggleDialogueWidget(bOpen); MainGameUI->ToggleDialogueWidget(bOpen);
MainGameUI->GetDialogueWidget()->ToggleWidget(bOpen); MainGameUI->GetDialogueWidget()->ToggleWidget(bOpen);
InMenu = bOpen;
if (bOpen) if (bOpen)
{ {
@@ -1207,7 +1177,6 @@ UEleriBaseWidget *AEleriPlayerController::ToggleNotificationWindow(bool bOpen)
return nullptr; return nullptr;
MainGameUI->ToggleBigNotificationWidget(bOpen); MainGameUI->ToggleBigNotificationWidget(bOpen);
InMenu = bOpen;
if (bOpen) if (bOpen)
{ {
@@ -1307,7 +1276,7 @@ void AEleriPlayerController::RemoveFromMenuStack(UUserWidget *Widget)
bool AEleriPlayerController::OpenGenericMenu(UUserWidget *Widget, bool CloseOthers = false, bool IgnoreInMenu = false) bool AEleriPlayerController::OpenGenericMenu(UUserWidget *Widget, bool CloseOthers = false, bool IgnoreInMenu = false)
{ {
if (!IgnoreInMenu && InMenu) if (!IgnoreInMenu && IsInMenu())
return false; return false;
for (const UUserWidget *StackWidget : MenuStack) for (const UUserWidget *StackWidget : MenuStack)
@@ -1316,8 +1285,6 @@ bool AEleriPlayerController::OpenGenericMenu(UUserWidget *Widget, bool CloseOthe
return false; return false;
} }
InMenu = true;
if (CloseOthers) if (CloseOthers)
{ {
for (UUserWidget *StackWidget : MenuStack) for (UUserWidget *StackWidget : MenuStack)
@@ -1344,12 +1311,6 @@ void AEleriPlayerController::CloseGenericMenu(UEleriBaseWidget *Widget)
{ {
SetShowMouseCursor(false); SetShowMouseCursor(false);
SetInputMode(FInputModeGameOnly()); SetInputMode(FInputModeGameOnly());
InMenu = false;
// Get the Enhanced Input Local Player Subsystem from the Local Player related to our Player Controller.
if (UEnhancedInputLocalPlayerSubsystem *Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer()))
{
Subsystem->RemoveMappingContext(MainUiContext);
}
SetPause(false); SetPause(false);
} }
else else

View File

@@ -3,11 +3,25 @@
#include "UI/EleriBaseWidget.h" #include "UI/EleriBaseWidget.h"
#include "EleriPlayerController.h"
#include "Kismet/GameplayStatics.h"
void UEleriBaseWidget::ToggleWidget_Implementation(bool bActive) { void UEleriBaseWidget::ToggleWidget_Implementation(bool bActive) {
if (bActive) { if (bActive) {
ActivateWidget(); //ActivateWidget();
} }
else { else {
DeactivateWidget(); //DeactivateWidget();
}
}
void UEleriBaseWidget::HandleUiInputAction_Implementation(EEleriUIInputAction InputAction)
{
if (InputAction == EEleriUIInputAction::Back)
{
if (AEleriPlayerController* EleriPlayerController = Cast<AEleriPlayerController>(UGameplayStatics::GetPlayerController(this, 0)))
{
EleriPlayerController->GetMainGameWidget()->CloseWidget(this);
}
} }
} }

View File

@@ -2,4 +2,65 @@
#include "UI/EleriTextBlock.h" #include "UI/EleriTextBlock.h"
#include "UObject/ConstructorHelpers.h"
UEleriTextBlock::UEleriTextBlock(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
static ConstructorHelpers::FObjectFinder<UDataTable> Finder(
TEXT("/Game/UI/Styles/Text/DT_EleriTextStyles.DT_EleriTextStyles"));
if (Finder.Succeeded())
{
StyleTable = Finder.Object;
}
}
void UEleriTextBlock::SynchronizeProperties()
{
Super::SynchronizeProperties();
ApplyStyle();
}
TArray<FString> UEleriTextBlock::GetStyleNames() const
{
TArray<FString> Names;
if (StyleTable)
{
for (const auto& Pair : StyleTable->GetRowMap())
{
Names.Add(Pair.Key.ToString());
}
}
return Names;
}
void UEleriTextBlock::ApplyStyle()
{
if (!StyleTable)
{
return;
}
static const FString Context(TEXT("EleriTextBlock Style Lookup"));
if (const FEleriTextStyleRow* Row = StyleTable->FindRow<FEleriTextStyleRow>(StyleName, Context, /*bWarnIfMissing*/ false))
{
FSlateFontInfo FinalFont = Row->Font;
if (FontSizeOverride != INDEX_NONE)
{
FinalFont.Size = FontSizeOverride;
}
SetFont(FinalFont);
const FLinearColor FinalColor = (ColorOverride.A > 0.f) ? ColorOverride : Row->Color;
SetColorAndOpacity(FSlateColor(FinalColor));
SetShadowOffset(Row->ShadowOffset);
SetShadowColorAndOpacity(Row->ShadowColor);
SetLineHeightPercentage(Row->LineHeightPercentage);
}
else
{
UE_LOG(LogTemp, Warning, TEXT("EleriTextBlock '%s': style row '%s' not found in %s"),
*GetName(), *StyleName.ToString(), *StyleTable->GetName());
}
}

View File

@@ -1,6 +1,10 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#include "UI/MainGameWidget.h" #include "UI/MainGameWidget.h"
#include "EleriPlayerController.h"
#include "EnhancedInputSubsystems.h"
#include "Kismet/GameplayStatics.h"
#include "UI/InventoryWidget.h" #include "UI/InventoryWidget.h"
#include "UI/MainMenuWidget.h" #include "UI/MainMenuWidget.h"
#include "UI/TradeWidget.h" #include "UI/TradeWidget.h"
@@ -16,14 +20,37 @@ void UMainGameWidget::SwitchKeybindsDisplay(int32 Index)
KeybindsSwitcher->SetActiveWidgetIndex(Index); KeybindsSwitcher->SetActiveWidgetIndex(Index);
} }
void UMainGameWidget::ToggleBookWidget(bool bActive) void UMainGameWidget::CloseLastWidget()
{ {
BookOpen = bActive; if (WidgetStack.IsEmpty()) return;
CloseWidget(WidgetStack[WidgetStack.Num() - 1]);
} }
void UMainGameWidget::ToggleInventoryWidget(bool bActive) void UMainGameWidget::OpenWidget(UEleriBaseWidget* Widget)
{ {
InventoryOpen = bActive; if (!Widget) return;
Widget->ToggleWidget(true);
WidgetStack.AddUnique(Widget);
CheckOpenWidgets();
}
void UMainGameWidget::CloseWidget(UEleriBaseWidget* Widget)
{
if (!Widget) return;
Widget->ToggleWidget(false);
WidgetStack.Remove(Widget);
CheckOpenWidgets();
}
void UMainGameWidget::ToggleBookWidget(bool bActive)
{
if (bActive)
WidgetStack.AddUnique(GetBookWidget());
CheckOpenWidgets();
} }
void UMainGameWidget::ToggleAlchemyWidget(bool bActive) void UMainGameWidget::ToggleAlchemyWidget(bool bActive)
@@ -77,15 +104,68 @@ void UMainGameWidget::CloseTradeWidget()
{ {
TradeOpen = false; TradeOpen = false;
Trade_Widget->ToggleWidget(false); Trade_Widget->ToggleWidget(false);
CheckOpenWidgets();
} }
void UMainGameWidget::ToggleCalendarWidget(bool bActive) void UMainGameWidget::ToggleCalendarWidget(bool bActive)
{ {
CalendarOpen = bActive; CalendarOpen = bActive;
Calendar_Widget->ToggleWidget(CalendarOpen); Calendar_Widget->ToggleWidget(CalendarOpen);
CheckOpenWidgets();
} }
void UMainGameWidget::ToggleBazarWidget(bool bActive) { void UMainGameWidget::ToggleBazarWidget(bool bActive) {
BazarWidgetOpen = bActive; BazarWidgetOpen = bActive;
Bazar_Widget->ToggleWidget(BazarWidgetOpen); Bazar_Widget->ToggleWidget(BazarWidgetOpen);
CheckOpenWidgets();
}
void UMainGameWidget::CheckOpenWidgets()
{
if (!PlayerController)
{
PlayerController = UGameplayStatics::GetPlayerController(this, 0);
}
//const bool bAnyOpenWidgets = IsAlchemyOpen() || IsAnyMinigameOpen() || IsBazarWidgetOpen() || IsBigNotificationOpen() ||
// IsBookOpen() || IsCalendarOpen() || IsDialogueOpen() || IsInventoryOpen() || IsMainMenuOpen() || IsTradeOpen();
const bool bAnyOpenWidgets = AnyWidgetOpen();
const bool bShouldBePaused = WidgetStack.Contains(GetBookWidget());
if (bAnyOpenWidgets)
{
PlayerController->SetInputMode(FInputModeGameAndUI());
}
else
{
PlayerController->SetInputMode(FInputModeGameOnly());
}
PlayerController->SetShowMouseCursor(bAnyOpenWidgets);
PlayerController->SetPause(bShouldBePaused);
// Get the Enhanced Input Local Player Subsystem from the Local Player related to our Player Controller.
if (UEnhancedInputLocalPlayerSubsystem *Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer()))
{
if (const AEleriPlayerController* EleriPC = Cast<AEleriPlayerController>(PlayerController))
{
if (bAnyOpenWidgets)
{
if (!Subsystem->HasMappingContext(EleriPC->MainUiContext))
{
Subsystem->AddMappingContext(EleriPC->MainUiContext, 98);
}
}
else
{
if (Subsystem->HasMappingContext(EleriPC->MainUiContext))
{
Subsystem->RemoveMappingContext(EleriPC->MainUiContext);
}
}
}
}
} }

View File

@@ -33,7 +33,7 @@ public class ProjectEleri : ModuleRules
"InteractionSystem" "InteractionSystem"
}); });
PrivateDependencyModuleNames.AddRange(new string[] { "OnlineSubsystem", "OnlineSubsystemUtils" }); PrivateDependencyModuleNames.AddRange(new string[] { "OnlineSubsystem", "OnlineSubsystemUtils", "UMGEditor" });
// Uncomment if you are using Slate UI // Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });

View File

@@ -125,9 +125,6 @@ public:
UPROPERTY(BlueprintReadOnly) UPROPERTY(BlueprintReadOnly)
AMyCharacter* PlayerCharacter; AMyCharacter* PlayerCharacter;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
bool InMenu;
UPROPERTY(EditAnywhere, BlueprintReadWrite) UPROPERTY(EditAnywhere, BlueprintReadWrite)
bool Paused; bool Paused;
@@ -269,7 +266,7 @@ public:
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
UMainGameWidget* GetMainGameWidget() { return MainGameUI; } UMainGameWidget* GetMainGameWidget() { return MainGameUI; }
const inline bool IsInMenu() { return InMenu; } const inline bool IsInMenu() { return MainGameUI->AnyWidgetOpen(); }
const inline bool IsSprinting() { return Sprinting; } const inline bool IsSprinting() { return Sprinting; }
const inline bool IsPaused() { return Paused; } const inline bool IsPaused() { return Paused; }
const inline bool IsDialogueOpen() { return MainGameUI ? MainGameUI->IsDialogueOpen() : false; } const inline bool IsDialogueOpen() { return MainGameUI ? MainGameUI->IsDialogueOpen() : false; }

View File

@@ -3,15 +3,24 @@
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "CommonActivatableWidget.h" #include "Blueprint/UserWidget.h"
#include "EleriBaseWidget.generated.h" #include "EleriBaseWidget.generated.h"
UENUM(BlueprintType)
enum class EEleriUIInputAction : uint8
{
Select,
Back,
TabLeft,
TabRight
};
/** /**
* *
*/ */
UCLASS() UCLASS()
class PROJECTELERI_API UEleriBaseWidget : public UCommonActivatableWidget class PROJECTELERI_API UEleriBaseWidget : public UUserWidget
{ {
GENERATED_BODY() GENERATED_BODY()
@@ -21,9 +30,7 @@ public:
void ToggleWidget(bool bActive); void ToggleWidget(bool bActive);
virtual void ToggleWidget_Implementation(bool bActive); virtual void ToggleWidget_Implementation(bool bActive);
UFUNCTION(BlueprintCallable, Category = "Eleri Base Widget") UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
void LockWidget() { bIsBackHandler = false; } void HandleUiInputAction(EEleriUIInputAction InputAction);
virtual void HandleUiInputAction_Implementation(EEleriUIInputAction InputAction);
UFUNCTION(BlueprintCallable, Category = "Eleri Base Widget")
void UnlockWidget() { bIsBackHandler = true; }
}; };

View File

@@ -4,10 +4,32 @@
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "Components/TextBlock.h" #include "Components/TextBlock.h"
#include "Engine/DataTable.h"
#include "Math/Color.h" #include "Math/Color.h"
#include "EleriTextBlock.generated.h" #include "EleriTextBlock.generated.h"
USTRUCT(BlueprintType)
struct FEleriTextStyleRow : public FTableRowBase
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Style")
FSlateFontInfo Font;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Style")
FLinearColor Color = FLinearColor::White;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Style")
FVector2D ShadowOffset = FVector2D::ZeroVector;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Style")
FLinearColor ShadowColor = FLinearColor(0.f, 0.f, 0.f, 0.f);
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Style")
float LineHeightPercentage = 1.f;
};
/** /**
* *
*/ */
@@ -17,10 +39,26 @@ class PROJECTELERI_API UEleriTextBlock : public UTextBlock
GENERATED_BODY() GENERATED_BODY()
public: public:
UEleriTextBlock(const FObjectInitializer& ObjectInitializer);
virtual void SynchronizeProperties() override;
UPROPERTY(EditAnywhere, BlueprintReadWrite) UPROPERTY(EditAnywhere, BlueprintReadWrite)
FLinearColor ColorOverride; FLinearColor ColorOverride =FLinearColor(0.f, 0.f, 0.f, 0.f);
UPROPERTY(EditAnywhere, BlueprintReadWrite) UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 FontSizeOverride; int32 FontSizeOverride = INDEX_NONE;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Style", meta = (GetOptions = "GetStyleNames"))
FName StyleName = "Normal";
protected:
UFUNCTION()
TArray<FString> GetStyleNames() const;
private:
UPROPERTY()
TObjectPtr<UDataTable> StyleTable;
void ApplyStyle();
}; };

View File

@@ -52,21 +52,32 @@ public:
UFUNCTION(BlueprintCallable, BlueprintPure) UFUNCTION(BlueprintCallable, BlueprintPure)
UInteractionWidget *GetInteractionWidget() { return WBP_InteractionWidget; } UInteractionWidget *GetInteractionWidget() { return WBP_InteractionWidget; }
void CloseLastWidget();
UFUNCTION(BlueprintCallable, Category = "Eleri|UI")
void OpenWidget(UEleriBaseWidget* Widget);
UFUNCTION(BlueprintCallable, Category = "Eleri|UI")
void CloseWidget(UEleriBaseWidget* Widget);
UFUNCTION(BlueprintPure, Category = "Eleri|UI")
bool AnyWidgetOpen() const { return !WidgetStack.IsEmpty(); }
TArray<UEleriBaseWidget*>& GetWidgetStack() { return WidgetStack; }
// Book widget // Book widget
UFUNCTION(BlueprintCallable, BlueprintPure) UFUNCTION(BlueprintCallable, BlueprintPure)
UBookOfAlchemyWidget *GetBookWidget() { return Book_Widget; } UBookOfAlchemyWidget *GetBookWidget() { return Book_Widget; }
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void ToggleBookWidget(bool bActive); void ToggleBookWidget(bool bActive);
UFUNCTION(BlueprintCallable, BlueprintPure) UFUNCTION(BlueprintCallable, BlueprintPure)
bool IsBookOpen() const { return BookOpen; } bool IsBookOpen() const { return WidgetStack.Contains(Book_Widget); }
// Inventory widget // Inventory widget
UFUNCTION(BlueprintCallable, BlueprintPure) UFUNCTION(BlueprintCallable, BlueprintPure)
UInventoryWidget *GetInventoryWidget() { return Inventory_Widget; } UInventoryWidget *GetInventoryWidget() { return Inventory_Widget; }
UFUNCTION(BlueprintCallable)
void ToggleInventoryWidget(bool bActive);
UFUNCTION(BlueprintCallable, BlueprintPure) UFUNCTION(BlueprintCallable, BlueprintPure)
bool IsInventoryOpen() const { return InventoryOpen; } bool IsInventoryOpen() const { return WidgetStack.Contains(Inventory_Widget); }
// Alchemy widget // Alchemy widget
UFUNCTION(BlueprintCallable, BlueprintPure) UFUNCTION(BlueprintCallable, BlueprintPure)
@@ -228,4 +239,12 @@ protected:
UMainMenuWidget *MainMenuScreenUI_Widget; UMainMenuWidget *MainMenuScreenUI_Widget;
UPROPERTY() UPROPERTY()
bool MainMenuOpen = false; bool MainMenuOpen = false;
UPROPERTY()
APlayerController* PlayerController;
UPROPERTY()
TArray<UEleriBaseWidget*> WidgetStack;
void CheckOpenWidgets();
}; };

View File

@@ -85,4 +85,10 @@ public:
// MATH // MATH
UFUNCTION(BlueprintPure, Category = "Eleri|Math") UFUNCTION(BlueprintPure, Category = "Eleri|Math")
static float NegateFloat(const float& Value) { return Value * -1.f; } static float NegateFloat(const float& Value) { return Value * -1.f; }
#if WITH_EDITOR
// Editor shit
UFUNCTION(BlueprintCallable, Category = "Eleri|Audit")
static void LogAssetsUsingCommonUI();
#endif
}; };

View File

@@ -208,4 +208,49 @@ void UMainBlueprintFunctionLibrary::ModifyExp(const UObject* WorldContext, const
StatForgeComponent->ApplyGameplayStatEffect(ExpIncreaseEffect, DataValueMap); StatForgeComponent->ApplyGameplayStatEffect(ExpIncreaseEffect, DataValueMap);
} }
#if WITH_EDITOR
#include "AssetRegistry/AssetRegistryModule.h"
#include "AssetRegistry/IAssetRegistry.h"
#include "WidgetBlueprint.h"
void UMainBlueprintFunctionLibrary::LogAssetsUsingCommonUI()
{
IAssetRegistry& AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry").Get();
TArray<FAssetData> WidgetBlueprintAssets;
AssetRegistry.GetAssetsByClass(UWidgetBlueprint::StaticClass()->GetClassPathName(), WidgetBlueprintAssets, /*bSearchSubClasses*/ true);
TArray<FString> MatchedPaths;
for (const FAssetData& AssetData : WidgetBlueprintAssets)
{
UWidgetBlueprint* WidgetBP = Cast<UWidgetBlueprint>(AssetData.GetAsset());
if (!WidgetBP || !WidgetBP->GeneratedClass)
{
continue;
}
bool bUsesCommonUI = false;
for (const UClass* Test = WidgetBP->GeneratedClass; Test; Test = Test->GetSuperClass())
{
if (Test->GetName().Contains(TEXT("Common")))
{
bUsesCommonUI = true;
break;
}
}
if (bUsesCommonUI)
{
MatchedPaths.Add(AssetData.GetObjectPathString());
}
}
UE_LOG(LogTemp, Log, TEXT("Found %d widget asset(s) referencing a CommonUI class in their inheritance chain:"), MatchedPaths.Num());
for (const FString& Path : MatchedPaths)
{
UE_LOG(LogTemp, Log, TEXT(" %s"), *Path);
}
}
#endif