From 22bf730e3c27b3e0db744416fbeba285de6f0e50 Mon Sep 17 00:00:00 2001 From: Leonardo Ascione <112330494+rockfactory@users.noreply.github.com> Date: Sun, 18 Feb 2024 03:10:00 +0100 Subject: [PATCH] Save app toolbar position and toggled options in save game --- src/CommNext/CommNextPlugin.cs | 3 ++ src/CommNext/Data/SaveData.cs | 11 ++++ src/CommNext/Managers/MessageListener.cs | 3 ++ src/CommNext/Managers/SaveManager.cs | 53 +++++++++++++++++++ src/CommNext/UI/MainUIManager.cs | 2 +- src/CommNext/UI/MapToolbarWindowController.cs | 36 ++++++++++--- .../UI/VesselReportWindowController.cs | 3 +- 7 files changed, 101 insertions(+), 10 deletions(-) create mode 100644 src/CommNext/Data/SaveData.cs create mode 100644 src/CommNext/Managers/SaveManager.cs diff --git a/src/CommNext/CommNextPlugin.cs b/src/CommNext/CommNextPlugin.cs index 7f4d0ae..b9332f7 100644 --- a/src/CommNext/CommNextPlugin.cs +++ b/src/CommNext/CommNextPlugin.cs @@ -75,6 +75,9 @@ public override void OnInitialized() // UI MainUIManager.Instance.Initialize(); + // Save + SaveManager.Instance.Register(); + // Load Assets ConnectionsRenderer.RulerSpherePrefab = AssetManager.GetAsset( $"{ModGuid}/commnext_ui/meshes/rulersphere.prefab"); diff --git a/src/CommNext/Data/SaveData.cs b/src/CommNext/Data/SaveData.cs new file mode 100644 index 0000000..1d6ddb1 --- /dev/null +++ b/src/CommNext/Data/SaveData.cs @@ -0,0 +1,11 @@ +using CommNext.Rendering; +using UnityEngine; + +namespace CommNext.Data; + +public class SaveData +{ + public Vector3? MapToolbarPosition; + public ConnectionsDisplayMode? ConnectionsDisplayMode; + public bool? ShowRulers; +} \ No newline at end of file diff --git a/src/CommNext/Managers/MessageListener.cs b/src/CommNext/Managers/MessageListener.cs index a8f0151..896a888 100644 --- a/src/CommNext/Managers/MessageListener.cs +++ b/src/CommNext/Managers/MessageListener.cs @@ -31,6 +31,9 @@ private static void OnGameLoadFinished(MessageCenterMessage _) // Delete previous connections ConnectionsRenderer.Instance.Initialize(); + + // Load game data + SaveManager.Instance.LoadDataIntoUI(); } private static void OnMapInitialized(MessageCenterMessage _) diff --git a/src/CommNext/Managers/SaveManager.cs b/src/CommNext/Managers/SaveManager.cs new file mode 100644 index 0000000..b6ff34f --- /dev/null +++ b/src/CommNext/Managers/SaveManager.cs @@ -0,0 +1,53 @@ +using BepInEx.Logging; +using CommNext.Data; +using CommNext.Rendering; +using CommNext.UI; +using KSP.Game; +using SpaceWarp.API.SaveGameManager; + +namespace CommNext.Managers; + +public class SaveManager +{ + public static SaveManager Instance { get; private set; } = new(); + private static readonly ManualLogSource Logger = BepInEx.Logging.Logger.CreateLogSource("CommNext.SaveManager"); + + private SaveData? _loadedSaveData; + + public void Register() + { + ModSaves.RegisterSaveLoadGameData(CommNextPlugin.ModGuid, SaveGameData, LoadGameData); + } + + private static void SaveGameData(SaveData dataToSave) + { + dataToSave.MapToolbarPosition = MainUIManager.Instance.MapToolbarWindow!.Position; + dataToSave.ConnectionsDisplayMode = ConnectionsRenderer.Instance.ConnectionsDisplayMode; + dataToSave.ShowRulers = ConnectionsRenderer.Instance.IsRulersEnabled; + } + + private void LoadGameData(SaveData dataToLoad) + { + _loadedSaveData = dataToLoad; + Logger.LogInfo("Loaded game data"); + } + + /// + /// Called when the UI is built, to load the saved data into the UI. + /// + public void LoadDataIntoUI() + { + if (_loadedSaveData == null) return; + + if (_loadedSaveData.MapToolbarPosition.HasValue) + MainUIManager.Instance.MapToolbarWindow.Position = _loadedSaveData.MapToolbarPosition.Value; + + if (_loadedSaveData.ShowRulers != null) + ConnectionsRenderer.Instance.IsRulersEnabled = _loadedSaveData.ShowRulers.Value; + if (_loadedSaveData.ConnectionsDisplayMode != null) + ConnectionsRenderer.Instance.ConnectionsDisplayMode = _loadedSaveData.ConnectionsDisplayMode.Value; + + MainUIManager.Instance.MapToolbarWindow.UpdateButtonState(); + _loadedSaveData = null; + } +} \ No newline at end of file diff --git a/src/CommNext/UI/MainUIManager.cs b/src/CommNext/UI/MainUIManager.cs index ae70c33..09cc938 100644 --- a/src/CommNext/UI/MainUIManager.cs +++ b/src/CommNext/UI/MainUIManager.cs @@ -12,7 +12,7 @@ public class MainUIManager private static readonly ManualLogSource Logger = BepInEx.Logging.Logger.CreateLogSource("CommNext.MainUIManager"); - public MapToolbarWindowController? MapToolbarWindow { get; set; } + public MapToolbarWindowController MapToolbarWindow { get; set; } = null!; private UIDocument _mapToolbarDocument = null!; public VesselReportWindowController? VesselReportWindow { get; set; } diff --git a/src/CommNext/UI/MapToolbarWindowController.cs b/src/CommNext/UI/MapToolbarWindowController.cs index ae75cf3..5eb5fdf 100644 --- a/src/CommNext/UI/MapToolbarWindowController.cs +++ b/src/CommNext/UI/MapToolbarWindowController.cs @@ -47,6 +47,18 @@ public class MapToolbarWindowController : MonoBehaviour public float Width => _root.resolvedStyle.width; public float Height => _root.resolvedStyle.height; + private bool _isWindowPositionInitialized; + + public Vector3 Position + { + get => _root.transform.position; + set + { + _isWindowPositionInitialized = true; + _root.transform.position = value; + } + } + private bool _isWindowOpen; public bool IsWindowOpen @@ -63,10 +75,13 @@ public bool IsWindowOpen public void UpdateButtonState() { + // TODO Move the _state_ inside a separate object like `ConnectionsRenderState`, which is not tied to MonoBehaviour lifecycle. + var currentDisplayMode = ConnectionsRenderer.Instance?.ConnectionsDisplayMode ?? ConnectionsDisplayMode.None; + _linesButton.RemoveFromClassList("toolbar__icon--comm-none"); _linesButton.RemoveFromClassList("toolbar__icon--comm-lines"); _linesButton.RemoveFromClassList("toolbar__icon--comm-active"); - var selectedClassName = ConnectionsRenderer.Instance.ConnectionsDisplayMode switch + var selectedClassName = currentDisplayMode switch { ConnectionsDisplayMode.None => "toolbar__icon--comm-none", ConnectionsDisplayMode.Lines => "toolbar__icon--comm-lines", @@ -75,7 +90,7 @@ public void UpdateButtonState() }; _linesButton.AddToClassList(selectedClassName); - _linesTooltip.TooltipText = ConnectionsRenderer.Instance.ConnectionsDisplayMode switch + _linesTooltip.TooltipText = currentDisplayMode switch { ConnectionsDisplayMode.None => LocalizedStrings.ConnectionsDisplayModeNone, ConnectionsDisplayMode.Lines => LocalizedStrings.ConnectionsDisplayModeLines, @@ -83,10 +98,12 @@ public void UpdateButtonState() _ => "N/A" }; - if (ConnectionsRenderer.Instance.IsRulersEnabled) _rulersButton.AddToClassList("toggled"); + if (ConnectionsRenderer.Instance?.IsRulersEnabled == true) _rulersButton.AddToClassList("toggled"); else _rulersButton.RemoveFromClassList("toggled"); - if (MainUIManager.Instance.VesselReportWindow!.IsWindowOpen) _vesselReportButton.AddToClassList("toggled"); + // ReSharper disable once Unity.NoNullPropagation + if (MainUIManager.Instance.VesselReportWindow?.IsWindowOpen == true) + _vesselReportButton.AddToClassList("toggled"); else _vesselReportButton.RemoveFromClassList("toggled"); } @@ -99,10 +116,13 @@ private void OnEnable() _window = GetComponent(); _root = _window.rootVisualElement[0]; - _root.SetDefaultPosition(size => new Vector2( - UIScreenUtils.GetReferenceScreenScaledWidth() - size.x - UIScreenUtils.GetScaledReferenceCoordinate(28f), - UIScreenUtils.GetScaledReferenceCoordinate(300f) - )); + _root.SetDefaultPosition(size => _isWindowPositionInitialized + ? _root.transform.position + : new Vector2( + UIScreenUtils.GetReferenceScreenScaledWidth() - size.x - + UIScreenUtils.GetScaledReferenceCoordinate(28f), + UIScreenUtils.GetScaledReferenceCoordinate(300f) + )); // Content _linesButton = _root.Q