diff --git a/Content.Client/Options/UI/Tabs/GraphicsTab.xaml b/Content.Client/Options/UI/Tabs/GraphicsTab.xaml
index 74a0c78c52..118b85b87b 100644
--- a/Content.Client/Options/UI/Tabs/GraphicsTab.xaml
+++ b/Content.Client/Options/UI/Tabs/GraphicsTab.xaml
@@ -15,11 +15,6 @@
-
-
-
-
-
@@ -38,11 +33,6 @@
Rounded="True"
MinWidth="200" />
-
-
-
-
-
diff --git a/Content.Client/Options/UI/Tabs/GraphicsTab.xaml.cs b/Content.Client/Options/UI/Tabs/GraphicsTab.xaml.cs
index 1773b2abe5..3113e644ba 100644
--- a/Content.Client/Options/UI/Tabs/GraphicsTab.xaml.cs
+++ b/Content.Client/Options/UI/Tabs/GraphicsTab.xaml.cs
@@ -1,6 +1,4 @@
-using Content.Client.UserInterface.Screens;
using Content.Shared.CCVar;
-using Content.Shared.HUD;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.UserInterface;
@@ -8,7 +6,6 @@ using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared;
using Robust.Shared.Configuration;
-using Robust.Shared.Prototypes;
namespace Content.Client.Options.UI.Tabs
{
@@ -26,10 +23,7 @@ namespace Content.Client.Options.UI.Tabs
2f
};
- private Dictionary hudThemeIdToIndex = new();
-
[Dependency] private readonly IConfigurationManager _cfg = default!;
- [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
public GraphicsTab()
{
@@ -55,34 +49,6 @@ namespace Content.Client.Options.UI.Tabs
UIScaleOption.AddItem(Loc.GetString("ui-options-scale-200"));
UIScaleOption.OnItemSelected += OnUIScaleChanged;
- foreach (var gear in _prototypeManager.EnumeratePrototypes())
- {
- HudThemeOption.AddItem(Loc.GetString(gear.Name));
- hudThemeIdToIndex.Add(gear.ID, HudThemeOption.GetItemId(HudThemeOption.ItemCount - 1));
- }
- HudThemeOption.OnItemSelected += OnHudThemeChanged;
-
- var hudLayout = _cfg.GetCVar(CCVars.UILayout);
- var id = 0;
- foreach (var layout in Enum.GetValues(typeof(ScreenType)))
- {
- var name = layout.ToString()!;
- HudLayoutOption.AddItem(name, id);
- if (name == hudLayout)
- {
- HudLayoutOption.SelectId(id);
- }
- HudLayoutOption.SetItemMetadata(id, name);
-
- id++;
- }
-
- HudLayoutOption.OnItemSelected += args =>
- {
- HudLayoutOption.SelectId(args.Id);
- UpdateApplyButton();
- };
-
ViewportStretchCheckBox.OnToggled += _ =>
{
UpdateViewportScale();
@@ -110,7 +76,6 @@ namespace Content.Client.Options.UI.Tabs
FullscreenCheckBox.Pressed = ConfigIsFullscreen;
LightingPresetOption.SelectId(GetConfigLightingQuality());
UIScaleOption.SelectId(GetConfigUIScalePreset(ConfigUIScale));
- HudThemeOption.SelectId(hudThemeIdToIndex.GetValueOrDefault(_cfg.GetCVar(CVars.InterfaceTheme), 0));
ViewportScaleSlider.Value = _cfg.GetCVar(CCVars.ViewportFixedScaleFactor);
ViewportStretchCheckBox.Pressed = _cfg.GetCVar(CCVars.ViewportStretch);
IntegerScalingCheckBox.Pressed = _cfg.GetCVar(CCVars.ViewportSnapToleranceMargin) != 0;
@@ -134,25 +99,11 @@ namespace Content.Client.Options.UI.Tabs
UpdateApplyButton();
}
- private void OnHudThemeChanged(OptionButton.ItemSelectedEventArgs args)
- {
- HudThemeOption.SelectId(args.Id);
- UpdateApplyButton();
- }
-
private void OnApplyButtonPressed(BaseButton.ButtonEventArgs args)
{
_cfg.SetCVar(CVars.DisplayVSync, VSyncCheckBox.Pressed);
SetConfigLightingQuality(LightingPresetOption.SelectedId);
- foreach (var theme in _prototypeManager.EnumeratePrototypes())
- {
- if (hudThemeIdToIndex[theme.ID] != HudThemeOption.SelectedId)
- continue;
- _cfg.SetCVar(CVars.InterfaceTheme, theme.ID);
- break;
- }
-
_cfg.SetCVar(CVars.DisplayWindowMode,
(int) (FullscreenCheckBox.Pressed ? WindowMode.Fullscreen : WindowMode.Windowed));
_cfg.SetCVar(CVars.DisplayUIScale, UIScaleOptions[UIScaleOption.SelectedId]);
@@ -165,11 +116,6 @@ namespace Content.Client.Options.UI.Tabs
_cfg.SetCVar(CCVars.HudFpsCounterVisible, FpsCounterCheckBox.Pressed);
_cfg.SetCVar(CCVars.ViewportWidth, (int) ViewportWidthSlider.Value);
- if (HudLayoutOption.SelectedMetadata is string opt)
- {
- _cfg.SetCVar(CCVars.UILayout, opt);
- }
-
_cfg.SaveToFile();
UpdateApplyButton();
}
@@ -190,7 +136,6 @@ namespace Content.Client.Options.UI.Tabs
var isVSyncSame = VSyncCheckBox.Pressed == _cfg.GetCVar(CVars.DisplayVSync);
var isFullscreenSame = FullscreenCheckBox.Pressed == ConfigIsFullscreen;
var isLightingQualitySame = LightingPresetOption.SelectedId == GetConfigLightingQuality();
- var isHudThemeSame = HudThemeOption.SelectedId == hudThemeIdToIndex.GetValueOrDefault(_cfg.GetCVar(CVars.InterfaceTheme), 0);
var isUIScaleSame = MathHelper.CloseToPercent(UIScaleOptions[UIScaleOption.SelectedId], ConfigUIScale);
var isVPStretchSame = ViewportStretchCheckBox.Pressed == _cfg.GetCVar(CCVars.ViewportStretch);
var isVPScaleSame = (int) ViewportScaleSlider.Value == _cfg.GetCVar(CCVars.ViewportFixedScaleFactor);
@@ -199,7 +144,6 @@ namespace Content.Client.Options.UI.Tabs
var isPLQSame = ParallaxLowQualityCheckBox.Pressed == _cfg.GetCVar(CCVars.ParallaxLowQuality);
var isFpsCounterVisibleSame = FpsCounterCheckBox.Pressed == _cfg.GetCVar(CCVars.HudFpsCounterVisible);
var isWidthSame = (int) ViewportWidthSlider.Value == _cfg.GetCVar(CCVars.ViewportWidth);
- var isLayoutSame = HudLayoutOption.SelectedMetadata is string opt && opt == _cfg.GetCVar(CCVars.UILayout);
ApplyButton.Disabled = isVSyncSame &&
isFullscreenSame &&
@@ -210,10 +154,8 @@ namespace Content.Client.Options.UI.Tabs
isIntegerScalingSame &&
isVPResSame &&
isPLQSame &&
- isHudThemeSame &&
isFpsCounterVisibleSame &&
- isWidthSame &&
- isLayoutSame;
+ isWidthSame;
}
private bool ConfigIsFullscreen =>
diff --git a/Content.Client/Options/UI/Tabs/MiscTab.xaml b/Content.Client/Options/UI/Tabs/MiscTab.xaml
index 8097578d8e..34712e5e2f 100644
--- a/Content.Client/Options/UI/Tabs/MiscTab.xaml
+++ b/Content.Client/Options/UI/Tabs/MiscTab.xaml
@@ -5,6 +5,19 @@
xmlns:s="clr-namespace:Content.Client.Stylesheets">
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Content.Client/Options/UI/Tabs/MiscTab.xaml.cs b/Content.Client/Options/UI/Tabs/MiscTab.xaml.cs
index e870bcb622..cdf8df4ee7 100644
--- a/Content.Client/Options/UI/Tabs/MiscTab.xaml.cs
+++ b/Content.Client/Options/UI/Tabs/MiscTab.xaml.cs
@@ -1,25 +1,60 @@
-using Content.Shared.CCVar;
+using System.Linq;
+using Content.Client.UserInterface.Screens;
+using Content.Shared.CCVar;
+using Content.Shared.HUD;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared;
using Robust.Shared.Configuration;
-using Robust.Shared.Input;
+using Robust.Shared.Prototypes;
namespace Content.Client.Options.UI.Tabs
{
[GenerateTypedNameReferences]
public sealed partial class MiscTab : Control
{
-
[Dependency] private readonly IConfigurationManager _cfg = default!;
+ [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
+
+ private readonly Dictionary _hudThemeIdToIndex = new();
public MiscTab()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
+ var themes = _prototypeManager.EnumeratePrototypes().ToList();
+ themes.Sort();
+ foreach (var gear in themes)
+ {
+ HudThemeOption.AddItem(Loc.GetString(gear.Name));
+ _hudThemeIdToIndex.Add(gear.ID, HudThemeOption.GetItemId(HudThemeOption.ItemCount - 1));
+ }
+
+ var hudLayout = _cfg.GetCVar(CCVars.UILayout);
+ var id = 0;
+ foreach (var layout in Enum.GetValues(typeof(ScreenType)))
+ {
+ var name = layout.ToString()!;
+ HudLayoutOption.AddItem(name, id);
+ if (name == hudLayout)
+ {
+ HudLayoutOption.SelectId(id);
+ }
+ HudLayoutOption.SetItemMetadata(id, name);
+
+ id++;
+ }
+
+ HudLayoutOption.OnItemSelected += args =>
+ {
+ HudLayoutOption.SelectId(args.Id);
+ UpdateApplyButton();
+ };
+
+ HudThemeOption.OnItemSelected += OnHudThemeChanged;
DiscordRich.OnToggled += OnCheckBoxToggled;
ShowLoocAboveHeadCheckBox.OnToggled += OnCheckBoxToggled;
ShowHeldItemCheckBox.OnToggled += OnCheckBoxToggled;
@@ -30,6 +65,7 @@ namespace Content.Client.Options.UI.Tabs
// ToggleWalk.OnToggled += OnCheckBoxToggled;
StaticStorageUI.OnToggled += OnCheckBoxToggled;
+ HudThemeOption.SelectId(_hudThemeIdToIndex.GetValueOrDefault(_cfg.GetCVar(CVars.InterfaceTheme), 0));
DiscordRich.Pressed = _cfg.GetCVar(CVars.DiscordEnabled);
ShowLoocAboveHeadCheckBox.Pressed = _cfg.GetCVar(CCVars.LoocAboveHeadShow);
ShowHeldItemCheckBox.Pressed = _cfg.GetCVar(CCVars.HudHeldItemShow);
@@ -50,8 +86,22 @@ namespace Content.Client.Options.UI.Tabs
UpdateApplyButton();
}
+ private void OnHudThemeChanged(OptionButton.ItemSelectedEventArgs args)
+ {
+ HudThemeOption.SelectId(args.Id);
+ UpdateApplyButton();
+ }
+
private void OnApplyButtonPressed(BaseButton.ButtonEventArgs args)
{
+ foreach (var theme in _prototypeManager.EnumeratePrototypes())
+ {
+ if (_hudThemeIdToIndex[theme.ID] != HudThemeOption.SelectedId)
+ continue;
+ _cfg.SetCVar(CVars.InterfaceTheme, theme.ID);
+ break;
+ }
+
_cfg.SetCVar(CVars.DiscordEnabled, DiscordRich.Pressed);
_cfg.SetCVar(CCVars.HudHeldItemShow, ShowHeldItemCheckBox.Pressed);
_cfg.SetCVar(CCVars.CombatModeIndicatorsPointShow, ShowCombatModeIndicatorsCheckBox.Pressed);
@@ -62,12 +112,19 @@ namespace Content.Client.Options.UI.Tabs
// _cfg.SetCVar(CCVars.ToggleWalk, ToggleWalk.Pressed);
_cfg.SetCVar(CCVars.StaticStorageUI, StaticStorageUI.Pressed);
+ if (HudLayoutOption.SelectedMetadata is string opt)
+ {
+ _cfg.SetCVar(CCVars.UILayout, opt);
+ }
+
_cfg.SaveToFile();
UpdateApplyButton();
}
private void UpdateApplyButton()
{
+ var isHudThemeSame = HudThemeOption.SelectedId == _hudThemeIdToIndex.GetValueOrDefault(_cfg.GetCVar(CVars.InterfaceTheme), 0);
+ var isLayoutSame = HudLayoutOption.SelectedMetadata is string opt && opt == _cfg.GetCVar(CCVars.UILayout);
var isDiscordSame = DiscordRich.Pressed == _cfg.GetCVar(CVars.DiscordEnabled);
var isShowHeldItemSame = ShowHeldItemCheckBox.Pressed == _cfg.GetCVar(CCVars.HudHeldItemShow);
var isCombatModeIndicatorsSame = ShowCombatModeIndicatorsCheckBox.Pressed == _cfg.GetCVar(CCVars.CombatModeIndicatorsPointShow);
@@ -78,7 +135,9 @@ namespace Content.Client.Options.UI.Tabs
// var isToggleWalkSame = ToggleWalk.Pressed == _cfg.GetCVar(CCVars.ToggleWalk);
var isStaticStorageUISame = StaticStorageUI.Pressed == _cfg.GetCVar(CCVars.StaticStorageUI);
- ApplyButton.Disabled = isDiscordSame &&
+ ApplyButton.Disabled = isHudThemeSame &&
+ isLayoutSame &&
+ isDiscordSame &&
isShowHeldItemSame &&
isCombatModeIndicatorsSame &&
isOpaqueStorageWindow &&
diff --git a/Content.Shared/HUD/HudThemePrototype.cs b/Content.Shared/HUD/HudThemePrototype.cs
index deb62c9b66..22fc8a8e71 100644
--- a/Content.Shared/HUD/HudThemePrototype.cs
+++ b/Content.Shared/HUD/HudThemePrototype.cs
@@ -3,7 +3,7 @@
namespace Content.Shared.HUD
{
[Prototype("hudTheme")]
- public sealed partial class HudThemePrototype : IPrototype
+ public sealed partial class HudThemePrototype : IPrototype, IComparable
{
[DataField("name", required: true)]
public string Name { get; private set; } = string.Empty;
@@ -13,5 +13,16 @@ namespace Content.Shared.HUD
[DataField("path", required: true)]
public string Path { get; private set; } = string.Empty;
+
+ ///
+ /// An order for the themes to be displayed in the UI
+ ///
+ [DataField]
+ public int Order = 0;
+
+ public int CompareTo(HudThemePrototype? other)
+ {
+ return Order.CompareTo(other?.Order);
+ }
}
}
diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl
index d68e6f2e76..b850d29b4c 100644
--- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl
+++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl
@@ -14,6 +14,7 @@ ui-options-default = Default
# Misc/General menu
ui-options-discordrich = Enable Discord Rich Presence
+ui-options-general-ui-style = UI Style
ui-options-general-discord = Discord
ui-options-general-cursor = Cursor
ui-options-general-speech = Speech
@@ -38,7 +39,7 @@ ui-options-volume-percent = { TOSTRING($volume, "P0") }
ui-options-show-held-item = Show held item next to cursor
ui-options-show-combat-mode-indicators = Show combat mode indicators with cursor
-ui-options-opaque-storage-window = Enable opaque storage window
+ui-options-opaque-storage-window = Opaque storage window
ui-options-show-looc-on-head = Show LOOC chat above characters head
ui-options-fancy-speech = Show names in speech bubbles
ui-options-fancy-name-background = Add background to speech bubble names
@@ -57,7 +58,7 @@ ui-options-scale-125 = 125%
ui-options-scale-150 = 150%
ui-options-scale-175 = 175%
ui-options-scale-200 = 200%
-ui-options-hud-theme = HUD Theme:
+ui-options-hud-theme = HUD theme:
ui-options-hud-theme-default = Default
ui-options-hud-theme-plasmafire = Plasmafire
ui-options-hud-theme-slimecore = Slimecore
@@ -127,7 +128,7 @@ ui-options-function-examine-entity = Examine
ui-options-function-swap-hands = Swap hands
ui-options-function-move-stored-item = Move stored item
ui-options-function-rotate-stored-item = Rotate stored item
-ui-options-static-storage-ui = Static storage UI
+ui-options-static-storage-ui = Lock storage window to hotbar
ui-options-function-smart-equip-backpack = Smart-equip to backpack
ui-options-function-smart-equip-belt = Smart-equip to belt
diff --git a/Resources/Prototypes/hud.yml b/Resources/Prototypes/hud.yml
index d88bebe6c7..977c3c5f31 100644
--- a/Resources/Prototypes/hud.yml
+++ b/Resources/Prototypes/hud.yml
@@ -2,33 +2,40 @@
id: SS14DefaultTheme
name: ui-options-hud-theme-default
path: Default
+ order: -1
- type: hudTheme
id: SS14PlasmafireTheme
name: ui-options-hud-theme-plasmafire
path: Plasmafire
-
+ order: 3
+
- type: hudTheme
id: SS14SlimecoreTheme
name: ui-options-hud-theme-slimecore
path: Slimecore
+ order: 2
- type: hudTheme
id: SS14ClockworkTheme
name: ui-options-hud-theme-clockwork
path: Clockwork
+ order: 4
- type: hudTheme
id: SS14RetroTheme
name: ui-options-hud-theme-retro
path: Retro
+ order: 6
- type: hudTheme
id: SS14MinimalistTheme
name: ui-options-hud-theme-minimalist
path: Minimalist
+ order: 1
- type: hudTheme
id: SS14ErisTheme
name: ui-options-hud-theme-eris
path: Eris
+ order: 5