mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-02-15 03:30:53 +01:00
This is intended for content-side settings menus, so we can show users a "does this look correct" prompt after changing sensitive settings like graphics or UI, without risking an untimely config save *storing* broken CVar config.
96 lines
2.4 KiB
C#
96 lines
2.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Nett;
|
|
|
|
namespace Robust.Shared.Configuration;
|
|
|
|
internal partial class ConfigurationManager
|
|
{
|
|
public void MarkForRollback(params CVarDef[] cVars)
|
|
{
|
|
MarkForRollback(cVars.Select(c => c.Name).ToArray());
|
|
}
|
|
|
|
public void MarkForRollback(params string[] cVars)
|
|
{
|
|
var alreadyPending = LoadPendingRollbackTable() ?? [];
|
|
|
|
foreach (var cVar in cVars)
|
|
{
|
|
alreadyPending[cVar] = GetCVar(cVar);
|
|
}
|
|
|
|
SavePendingRollbackTable(alreadyPending);
|
|
}
|
|
|
|
public void UnmarkForRollback(params CVarDef[] cVars)
|
|
{
|
|
UnmarkForRollback(cVars.Select(c => c.Name).ToArray());
|
|
}
|
|
|
|
public void UnmarkForRollback(params string[] cVars)
|
|
{
|
|
var alreadyPending = LoadPendingRollbackTable() ?? [];
|
|
|
|
foreach (var cVar in cVars)
|
|
{
|
|
alreadyPending.Remove(cVar);
|
|
}
|
|
|
|
SavePendingRollbackTable(alreadyPending);
|
|
}
|
|
|
|
private void SavePendingRollbackTable(Dictionary<string, object> pending)
|
|
{
|
|
var tbl = SaveToTomlTable(pending.Keys, cVar => pending[cVar]);
|
|
var str = Toml.WriteString(tbl);
|
|
SetCVar(CVars.CfgRollbackData, str);
|
|
}
|
|
|
|
public void ApplyRollback()
|
|
{
|
|
var rollbackValue = GetCVar(CVars.CfgRollbackData);
|
|
|
|
if (string.IsNullOrWhiteSpace(rollbackValue))
|
|
return;
|
|
|
|
_sawmill.Debug("We have CVars to roll back!");
|
|
|
|
try
|
|
{
|
|
var tblRoot = Toml.ReadString(rollbackValue);
|
|
var loaded = LoadFromTomlTable(tblRoot);
|
|
_sawmill.Info($"Rolled back CVars: {string.Join(", ", loaded)}");
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
_sawmill.Error($"Failed to load rollback data:\n{e}");
|
|
}
|
|
finally
|
|
{
|
|
SetCVar(CVars.CfgRollbackData, "");
|
|
SaveToFile();
|
|
}
|
|
}
|
|
|
|
private Dictionary<string, object>? LoadPendingRollbackTable()
|
|
{
|
|
var rollbackValue = GetCVar(CVars.CfgRollbackData);
|
|
|
|
if (string.IsNullOrWhiteSpace(rollbackValue))
|
|
return null;
|
|
|
|
try
|
|
{
|
|
var tblRoot = Toml.ReadString(rollbackValue);
|
|
return ParseCVarValuesFromToml(tblRoot).ToDictionary();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
_sawmill.Error($"Failed to load rollback data:\n{e}");
|
|
return null;
|
|
}
|
|
}
|
|
}
|