Files
Unreal_EmberWild/Source/Survival_projet/Private/SettingsGameplayWidget.cpp
T
2026-07-28 14:10:17 +02:00

279 lines
7.6 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "SettingsGameplayWidget.h"
#include "SettingRowWidget.h"
#include "SurvivalUserSettings.h"
#define LOCTEXT_NAMESPACE "Reglages"
namespace
{
/** Les deux seules listes de choix de cet onglet. */
TArray<FText> MakeNoYesLabels()
{
return { LOCTEXT("Non", "Non"), LOCTEXT("Oui", "Oui") };
}
TArray<FText> MakeHoldToggleLabels()
{
return { LOCTEXT("Maintien", "Maintien"), LOCTEXT("Bascule", "Bascule") };
}
}
void USettingsGameplayWidget::NativeConstruct()
{
Super::NativeConstruct();
// Les libelles et les bornes sont poses une seule fois ; seules les valeurs
// bougent ensuite, via RefreshFromSettings.
using namespace SurvivalSettingsRange;
if (SensitivityRow)
{
SensitivityRow->SetupAsNumber(LOCTEXT("Sensibilite", "Sensibilité"),
SensitivityMin, SensitivityMax, SensitivityStep, SensitivityMin, FText::GetEmpty());
SensitivityRow->OnIndexChanged.AddDynamic(this, &USettingsGameplayWidget::HandleSensitivityChanged);
}
if (SeparateVerticalRow)
{
SeparateVerticalRow->SetupAsChoice(LOCTEXT("SensibiliteSeparee", "Sensibilité verticale séparée"),
MakeNoYesLabels(), 0);
SeparateVerticalRow->OnIndexChanged.AddDynamic(this, &USettingsGameplayWidget::HandleSeparateVerticalChanged);
}
if (SensitivityVerticalRow)
{
SensitivityVerticalRow->SetupAsNumber(LOCTEXT("SensibiliteVerticale", "Sensibilité verticale"),
SensitivityMin, SensitivityMax, SensitivityStep, SensitivityMin, FText::GetEmpty());
SensitivityVerticalRow->OnIndexChanged.AddDynamic(this, &USettingsGameplayWidget::HandleSensitivityVerticalChanged);
}
if (InvertLookRow)
{
InvertLookRow->SetupAsChoice(LOCTEXT("InverserY", "Inverser l'axe vertical"), MakeNoYesLabels(), 0);
InvertLookRow->OnIndexChanged.AddDynamic(this, &USettingsGameplayWidget::HandleInvertLookChanged);
}
if (FieldOfViewRow)
{
FieldOfViewRow->SetupAsNumber(LOCTEXT("ChampDeVision", "Champ de vision"),
FieldOfViewMin, FieldOfViewMax, FieldOfViewStep, FieldOfViewMin, LOCTEXT("Degres", "°"));
FieldOfViewRow->OnIndexChanged.AddDynamic(this, &USettingsGameplayWidget::HandleFieldOfViewChanged);
}
if (CameraShakeRow)
{
CameraShakeRow->SetupAsNumber(LOCTEXT("BougeCamera", "Bougé de caméra"),
CameraShakeMin, CameraShakeMax, CameraShakeStep, CameraShakeMin, LOCTEXT("Pourcent", " %"));
CameraShakeRow->OnIndexChanged.AddDynamic(this, &USettingsGameplayWidget::HandleCameraShakeChanged);
}
if (SprintModeRow)
{
SprintModeRow->SetupAsChoice(LOCTEXT("Sprint", "Sprint"), MakeHoldToggleLabels(), 0);
SprintModeRow->OnIndexChanged.AddDynamic(this, &USettingsGameplayWidget::HandleSprintModeChanged);
}
if (CrouchModeRow)
{
CrouchModeRow->SetupAsChoice(LOCTEXT("Accroupi", "Accroupi"), MakeHoldToggleLabels(), 0);
CrouchModeRow->OnIndexChanged.AddDynamic(this, &USettingsGameplayWidget::HandleCrouchModeChanged);
}
RefreshFromSettings();
}
void USettingsGameplayWidget::RefreshFromSettings()
{
USurvivalUserSettings* Settings = USurvivalUserSettings::Get();
if (!Settings)
{
UE_LOG(LogTemp, Error, TEXT("USettingsGameplayWidget : GameUserSettingsClassName n'est pas configure dans DefaultEngine.ini, l'onglet restera inerte."));
return;
}
// SetNumericValueSilently et non un setter classique : diffuser ici ferait
// boucler l'onglet sur lui-meme.
if (SensitivityRow)
{
SensitivityRow->SetNumericValueSilently(Settings->GetLookSensitivity());
}
const bool bSeparate = Settings->GetSeparateVerticalSensitivity();
if (SeparateVerticalRow)
{
SeparateVerticalRow->SetIndexSilently(bSeparate ? 1 : 0);
}
if (SensitivityVerticalRow)
{
SensitivityVerticalRow->SetNumericValueSilently(Settings->GetLookSensitivityVertical());
}
UpdateVerticalRowVisibility(bSeparate);
if (InvertLookRow)
{
InvertLookRow->SetIndexSilently(Settings->GetInvertLookY() ? 1 : 0);
}
if (FieldOfViewRow)
{
FieldOfViewRow->SetNumericValueSilently(Settings->GetFieldOfView());
}
if (CameraShakeRow)
{
CameraShakeRow->SetNumericValueSilently(Settings->GetCameraShakeScale());
}
if (SprintModeRow)
{
SprintModeRow->SetIndexSilently(Settings->GetSprintToggle() ? 1 : 0);
}
if (CrouchModeRow)
{
CrouchModeRow->SetIndexSilently(Settings->GetCrouchToggle() ? 1 : 0);
}
}
void USettingsGameplayWidget::ResetToDefaults()
{
USurvivalUserSettings* Settings = USurvivalUserSettings::Get();
if (!Settings)
{
return;
}
Settings->SetSurvivalGameplayToDefaults();
PushToPawn(Settings);
RefreshFromSettings();
}
void USettingsGameplayWidget::UpdateVerticalRowVisibility(bool bSeparate)
{
if (SensitivityVerticalRow)
{
// Collapsed et non Hidden : la ligne ne doit pas laisser un trou dans la
// liste quand elle est inutile.
SensitivityVerticalRow->SetVisibility(bSeparate ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);
}
}
void USettingsGameplayWidget::PushToPawn(USurvivalUserSettings* Settings)
{
// Pas de SaveSettings ici : ecrire le .ini a chaque clic de fleche est du
// gaspillage. C'est l'ecran de reglages qui sauvegarde en se fermant.
Settings->ApplySurvivalSettings();
}
void USettingsGameplayWidget::HandleSensitivityChanged(int32 NewIndex)
{
USurvivalUserSettings* Settings = USurvivalUserSettings::Get();
if (!Settings || !SensitivityRow)
{
return;
}
Settings->SetLookSensitivity(SensitivityRow->GetNumericValue());
// Sans axe separe, le vertical suit : on garde les deux lignes coherentes
// pour que le joueur ne decouvre pas un ecart en activant la separation.
if (!Settings->GetSeparateVerticalSensitivity() && SensitivityVerticalRow)
{
SensitivityVerticalRow->SetNumericValueSilently(Settings->GetLookSensitivityVertical());
}
PushToPawn(Settings);
}
void USettingsGameplayWidget::HandleSeparateVerticalChanged(int32 NewIndex)
{
USurvivalUserSettings* Settings = USurvivalUserSettings::Get();
if (!Settings)
{
return;
}
const bool bSeparate = NewIndex == 1;
Settings->SetSeparateVerticalSensitivity(bSeparate);
if (SensitivityVerticalRow)
{
SensitivityVerticalRow->SetNumericValueSilently(Settings->GetLookSensitivityVertical());
}
UpdateVerticalRowVisibility(bSeparate);
PushToPawn(Settings);
}
void USettingsGameplayWidget::HandleSensitivityVerticalChanged(int32 NewIndex)
{
USurvivalUserSettings* Settings = USurvivalUserSettings::Get();
if (!Settings || !SensitivityVerticalRow)
{
return;
}
Settings->SetLookSensitivityVertical(SensitivityVerticalRow->GetNumericValue());
PushToPawn(Settings);
}
void USettingsGameplayWidget::HandleInvertLookChanged(int32 NewIndex)
{
if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
{
Settings->SetInvertLookY(NewIndex == 1);
PushToPawn(Settings);
}
}
void USettingsGameplayWidget::HandleFieldOfViewChanged(int32 NewIndex)
{
USurvivalUserSettings* Settings = USurvivalUserSettings::Get();
if (!Settings || !FieldOfViewRow)
{
return;
}
Settings->SetFieldOfView(FieldOfViewRow->GetNumericValue());
PushToPawn(Settings);
}
void USettingsGameplayWidget::HandleCameraShakeChanged(int32 NewIndex)
{
USurvivalUserSettings* Settings = USurvivalUserSettings::Get();
if (!Settings || !CameraShakeRow)
{
return;
}
Settings->SetCameraShakeScale(CameraShakeRow->GetNumericValue());
PushToPawn(Settings);
}
void USettingsGameplayWidget::HandleSprintModeChanged(int32 NewIndex)
{
if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
{
Settings->SetSprintToggle(NewIndex == 1);
PushToPawn(Settings);
}
}
void USettingsGameplayWidget::HandleCrouchModeChanged(int32 NewIndex)
{
if (USurvivalUserSettings* Settings = USurvivalUserSettings::Get())
{
Settings->SetCrouchToggle(NewIndex == 1);
PushToPawn(Settings);
}
}
#undef LOCTEXT_NAMESPACE