Skip to content

Commit

Permalink
Save app toolbar position and toggled options in save game
Browse files Browse the repository at this point in the history
  • Loading branch information
rockfactory committed Feb 18, 2024
1 parent c85c90a commit 22bf730
Show file tree
Hide file tree
Showing 7 changed files with 101 additions and 10 deletions.
3 changes: 3 additions & 0 deletions src/CommNext/CommNextPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ public override void OnInitialized()
// UI
MainUIManager.Instance.Initialize();

// Save
SaveManager.Instance.Register();

// Load Assets
ConnectionsRenderer.RulerSpherePrefab = AssetManager.GetAsset<GameObject>(
$"{ModGuid}/commnext_ui/meshes/rulersphere.prefab");
Expand Down
11 changes: 11 additions & 0 deletions src/CommNext/Data/SaveData.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using CommNext.Rendering;
using UnityEngine;

namespace CommNext.Data;

public class SaveData
{
public Vector3? MapToolbarPosition;
public ConnectionsDisplayMode? ConnectionsDisplayMode;
public bool? ShowRulers;
}
3 changes: 3 additions & 0 deletions src/CommNext/Managers/MessageListener.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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 _)
Expand Down
53 changes: 53 additions & 0 deletions src/CommNext/Managers/SaveManager.cs
Original file line number Diff line number Diff line change
@@ -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<SaveData>(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");
}

/// <summary>
/// Called when the UI is built, to load the saved data into the UI.
/// </summary>
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;
}
}
2 changes: 1 addition & 1 deletion src/CommNext/UI/MainUIManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
36 changes: 28 additions & 8 deletions src/CommNext/UI/MapToolbarWindowController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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",
Expand All @@ -75,18 +90,20 @@ public void UpdateButtonState()
};
_linesButton.AddToClassList(selectedClassName);

_linesTooltip.TooltipText = ConnectionsRenderer.Instance.ConnectionsDisplayMode switch
_linesTooltip.TooltipText = currentDisplayMode switch
{
ConnectionsDisplayMode.None => LocalizedStrings.ConnectionsDisplayModeNone,
ConnectionsDisplayMode.Lines => LocalizedStrings.ConnectionsDisplayModeLines,
ConnectionsDisplayMode.Active => LocalizedStrings.ConnectionsDisplayModeActive,
_ => "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");
}

Expand All @@ -99,10 +116,13 @@ private void OnEnable()
_window = GetComponent<UIDocument>();

_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<Button>("lines-button");
Expand Down
3 changes: 2 additions & 1 deletion src/CommNext/UI/VesselReportWindowController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ public VesselComponent? Vessel
set
{
_vessel = value;
ConnectionsRenderer.Instance.ReportVessel = _vessel;
var instance = ConnectionsRenderer.Instance;
if (instance != null) instance.ReportVessel = _vessel;
}
}

Expand Down

0 comments on commit 22bf730

Please sign in to comment.