// Menu Clavier dans les reglages (MainMenu, liste SettingsScrollBox). // // Les touches du jeu sont les ActionMappings et AxisMappings de DefaultInput.ini, lus par BPs/PC. // Ce sous-systeme ajoute un bouton « Clavier » dans cette liste et ouvre un panneau pour les // changer. Le resultat est ecrit dans Saved/Config/Windows/LPKeyboard.ini de cette version, // pas dans GameSettings.sav : les sauvegardes et le jeu 4.27 ne sont pas touches. // Input.ini est le cache du moteur : il le supprime en quittant quand le diff est vide. // Aucun Blueprint n'est modifie. Sans la liste des reglages, le bouton n'est pas ajoute. #pragma once #include "CoreMinimal.h" #include "Containers/Ticker.h" #include "InputCoreTypes.h" #include "Subsystems/GameInstanceSubsystem.h" #include "Widgets/SWidget.h" #include "LPKeyboardSubsystem.generated.h" class UScrollBox; UCLASS() class LIFEPLAY_API ULPKeyboardSubsystem : public UGameInstanceSubsystem { GENERATED_BODY() public: virtual void Initialize(FSubsystemCollectionBase& Collection) override; virtual void Deinitialize() override; UFUNCTION() void OpenKeyboardMenu(); TSharedRef TakeEmbeddedPage(); void CloseKeyboardMenu(); void BeginWait(FName Name, bool bAxis, float Scale, FKey OldKey, bool bShift, bool bCtrl, bool bAlt, bool bCmd, bool bAdd); void CancelWait(); bool CommitKey(const FKey& Key, bool bShift, bool bCtrl, bool bAlt, bool bCmd); void RemoveBinding(FName Name, bool bAxis, float Scale, FKey Key, bool bShift, bool bCtrl, bool bAlt, bool bCmd); void ResetToDefault(); /** KEY2 (KEY2-SPEC-01 § 4) : prereglage QWERTY ou AZERTY du deplacement et d'ActionPanel, puis Layout enregistre. */ void ApplyLayout(const FString& LayoutName); /** KEY2 (§ 7) : clic gauche seul refuse pendant une capture (la capture continue). */ void RefuseLeftClick(); /** KEY2 (§ 7) : molette (MouseScrollUp, MouseScrollDown) pour les actions seulement. */ bool CommitWheel(bool bUp, bool bShift, bool bCtrl, bool bAlt, bool bCmd); /** KEY2 (§ 8b) : « Move couple with » ; vrai = Arrows only (CoupleDrag=Keys), lu par LPCameraModeSubsystem. */ bool IsCoupleDragByKeys() const { return bCoupleDragKeys; } void SetCoupleDragByKeys(bool bKeys); /** Disposition enregistree : QWERTY, AZERTY ou Custom. */ const FString& GetLayout() const { return Layout; } bool IsWaiting() const { return bWaiting; } bool IsMenuOpen() const; const FString& GetStatus() const { return Status; } void RefreshMenu(); private: bool Tick(float DeltaTime); void AttachButton(UScrollBox* Scroll); void ApplyToPlayer() const; bool LoadSaved(); void SaveSaved() const; bool LoadDefaults(TArray& Actions, TArray& Axes) const; /** KEY2 (§ 4, etapes 1 a 3, sans ApplyToPlayer) : retire le groupe et les memes touches ailleurs, ajoute le prereglage. */ void ApplyPreset(bool bAzerty, TArray& Cleared); /** Ligne d'etat a l'ouverture du panneau (ActionPanel sans touche : invite a choisir une disposition). */ FString IdleStatus() const; FTSTicker::FDelegateHandle TickHandle; bool bLoggedMissing = false; bool bWaiting = false; bool bWaitAdd = false; bool bWaitAxis = false; float WaitScale = 0.f; FName WaitName; FKey WaitOldKey; bool bWaitShift = false; bool bWaitCtrl = false; bool bWaitAlt = false; bool bWaitCmd = false; FString Status; /** Section [LPKeyboard] de LPKeyboard.ini (KEY2) : Layout=QWERTY|AZERTY|Custom, CoupleDrag=Mouse|Keys. */ FString Layout = TEXT("QWERTY"); bool bCoupleDragKeys = false; };