Skip to content

Commit

Permalink
Add presets
Browse files Browse the repository at this point in the history
Solves #52
  • Loading branch information
cooolbros committed Jul 1, 2021
1 parent aef62e2 commit 5e3d2ad
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 39 deletions.
4 changes: 3 additions & 1 deletion src/TF2HUD.Editor/Classes/HUD/HUD.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ namespace HUDEditor.Classes
{
public partial class HUD
{
private readonly Grid controls = new();
private Grid controls = new();
private HUDBackground hudBackground;
private bool isRendered;
private string[][] layout;
Expand All @@ -27,6 +27,8 @@ public partial class HUD
public double Opacity;
public bool Maximize;

public event EventHandler<Classes.HUDSettingsPreset> PresetChanged;

/// <summary>
/// Initialize the HUD object with values from the JSON schema.
/// </summary>
Expand Down
63 changes: 56 additions & 7 deletions src/TF2HUD.Editor/Classes/HUD/HUDPage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,13 @@ public Grid GetControls()

// Define the container that will hold the title and content.
var container = new Grid();
var titleRow = new RowDefinition
{
Height = GridLength.Auto
};

var titleContainer = new Grid {VerticalAlignment = VerticalAlignment.Center};
for (int i = 0; i < 3; i++)
titleContainer.ColumnDefinitions.Add(new ColumnDefinition());

var titleRow = new RowDefinition {Height = GridLength.Auto};

var contentRow = new RowDefinition();
if (layout != null) contentRow.Height = GridLength.Auto;
container.RowDefinitions.Add(titleRow);
Expand All @@ -48,8 +51,54 @@ public Grid GetControls()
Style = (Style) Application.Current.Resources["PageTitle"],
Content = Name
};
Grid.SetRow(title, 0);
container.Children.Add(title);
Grid.SetColumn(title, 0);

titleContainer.Children.Add(title);

// Create preset buttons
var presetsContainer = new WrapPanel
{
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center
};

foreach (var preset in Enum.GetValues<Classes.HUDSettingsPreset>())
{
var presetButton = new Button
{
Style = (Style) Application.Current.Resources["Button"],
Content = preset,
Name = $"{Name.Replace('-', '_')}_{preset}",
FontSize = 25,
Width = 35,
Height = 35,
Margin = new Thickness(1),
};

if (Settings.Preset == preset)
{
// LighterRed
var colors = Array.ConvertAll("220 100 80 255".Split(' '), byte.Parse);
presetButton.Background = new SolidColorBrush(Color.FromArgb(colors[^1], colors[0], colors[1], colors[2]));
}

presetButton.Click += (_, _) =>
{
// Settings.Preset = Enum.Parse<Classes.HUDSettingsPreset>(presetButton.Name.Split('_')[^1]);
Settings.Preset = preset;
MainWindow.Logger.Info($"Changed preset for {Name} to HUDSettingsPreset.{Settings.Preset}");
isRendered = false;
controls = new();
PresetChanged.Invoke(this, Settings.Preset);
};
presetsContainer.Children.Add(presetButton);
}

Grid.SetColumn(presetsContainer, 1);
titleContainer.Children.Add(presetsContainer);

container.Children.Add(titleContainer);

// Create the preview modal
var preview = new ChildWindow
Expand Down Expand Up @@ -612,7 +661,7 @@ public Grid GetControls()
{
Name = id,
Width = 270,
Text = controlItem.Value ?? string.Empty,
Text = Settings.GetSetting<string>(controlItem.Name) ?? string.Empty,
ToolTip = tooltip
};

Expand Down
67 changes: 37 additions & 30 deletions src/TF2HUD.Editor/Classes/HUD/HUDSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,40 +8,59 @@

namespace HUDEditor.Classes
{
public enum HUDSettingsPreset
{
A,
B,
C,
D,
}

public class HUDSettings
{
public static readonly string UserFile = System.Threading.Tasks.Task.Run(() =>
{
Directory.CreateDirectory($"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}\\TF2HUD.Editor");
return $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}\\TF2HUD.Editor\\settings.json";
}).Result;
public static readonly string UserFile = $"{Directory.CreateDirectory($"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}\\TF2HUD.Editor").FullName}\\settings.json";

private static readonly UserJson Json = File.Exists(UserFile)
? JsonConvert.DeserializeObject<UserJson>(File.ReadAllText(UserFile))
: new();

private static readonly List<Setting> UserSettings = File.Exists(UserFile)
? JsonConvert.DeserializeObject<Dictionary<string, List<Setting>>>(File.ReadAllText(UserFile))?["Settings"]
: new List<Setting>();
private static readonly Dictionary<string, HUDSettingsPreset> Presets = HUDSettings.Json.Presets;

private static readonly List<Setting> UserSettings = HUDSettings.Json.Settings;

public string HUDName;

private HUDSettingsPreset _Preset;

public HUDSettingsPreset Preset
{
get { return _Preset; }
set { _Preset = HUDSettings.Presets[HUDName] = value; }
}

public HUDSettings(string name)
{
HUDName = name;

// Write empty settings object to file as creating without Settings key causes a null reference if settings are not saved by next application start
if (!File.Exists(UserFile)) File.WriteAllText(UserFile, "{ \"Settings\": [] }");
if (!HUDSettings.Presets.ContainsKey(name))
{
Preset = HUDSettingsPreset.A;
}
}

/// <summary>
/// Add a new setting to user settings.
/// </summary>
public void AddSetting(string name, Controls control)
{
if (UserSettings.FirstOrDefault(x => x.Name == name) == null)
if (UserSettings.FirstOrDefault(x => x.Name == name && x.Preset == Preset) == null)
UserSettings.Add(new Setting
{
HUD = HUDName,
Name = name,
Type = control.Type,
Value = control.Value
Value = control.Value,
Preset = Preset
});
}

Expand All @@ -51,20 +70,7 @@ public void AddSetting(string name, Controls control)
/// <param name="name">Name of the setting to retrieve.</param>
public Setting GetSetting(string name)
{
return UserSettings.First(x => x.Name == name);
}

/// <summary>
/// Retrieve a specific user setting or just the value, by name.
/// </summary>
/// <param name="name">Name of the setting to retrieve.</param>
/// <param name="returnVal">
/// Indicate if you want to retrieve just the setting value (true) or the whole setting object (false).
/// </param>
public dynamic GetSetting(string name, bool returnVal)
{
var setting = UserSettings.First(x => x.Name == name);
return returnVal ? setting.Value : setting;
return UserSettings.First(x => x.Name == name && x.Preset == Preset);
}

/// <summary>
Expand All @@ -73,7 +79,7 @@ public dynamic GetSetting(string name, bool returnVal)
/// <param name="name">Name of the setting to retrieve.</param>
public T GetSetting<T>(string name)
{
var setting = UserSettings.First(x => x.Name == name);
var setting = UserSettings.First(x => x.Name == name && x.Preset == Preset);
var value = setting.Value;

switch (typeof(T).Name)
Expand All @@ -100,17 +106,18 @@ public T GetSetting<T>(string name)
/// <param name="value">New value for updating setting.</param>
public void SetSetting(string name, string value)
{
UserSettings.First(x => x.Name == name).Value = value;
UserSettings.First(x => x.Name == name && x.Preset == Preset).Value = value;
}

/// <summary>
/// Save a user setting value to file.
/// </summary>
public void SaveSettings()
{
var settings = new Dictionary<string, List<Setting>>
var settings = new UserJson
{
["Settings"] = UserSettings
Presets = Presets,
Settings = UserSettings
};
File.WriteAllText(UserFile, JsonConvert.SerializeObject(settings, Formatting.Indented));
MainWindow.Logger.Info($"Saved user settings to: {UserFile}");
Expand Down
6 changes: 6 additions & 0 deletions src/TF2HUD.Editor/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,12 @@ private void SetPageView()
Logger.Info($"Changing page view to: {selection.Name}.");
EditorContainer.Children.Add(selection.GetControls());

selection.PresetChanged += (object sender, Classes.HUDSettingsPreset Preset) =>
{
EditorContainer.Children.Clear();
EditorContainer.Children.Add(selection.GetControls());
};

// Maximize the application window if a given HUD schema requests it.
Application.Current.MainWindow.WindowState =
selection.Maximize ? WindowState.Maximized : WindowState.Normal;
Expand Down
4 changes: 3 additions & 1 deletion src/TF2HUD.Editor/Models/UserJson.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ namespace HUDEditor.Models
{
public class UserJson
{
[JsonPropertyName("Settings")] public List<Setting> Settings { get; set; }
[JsonPropertyName("Presets")] public Dictionary<string, Classes.HUDSettingsPreset> Presets { get; set; } = new();
[JsonPropertyName("Settings")] public List<Setting> Settings { get; set; } = new();
}

public class Setting
Expand All @@ -14,5 +15,6 @@ public class Setting
[JsonPropertyName("Name")] public string Name { get; set; }
[JsonPropertyName("Type")] public string Type { get; set; }
[JsonPropertyName("Value")] public string Value { get; set; }
[JsonPropertyName("Preset")] public Classes.HUDSettingsPreset Preset { get; set; }
}
}

0 comments on commit 5e3d2ad

Please sign in to comment.