* Adds a new slider to the misc tab in options that lets the player set chat window transparency
* Tweaked variable names
* Fixed order to match UI
* Renamed set chat window transparency function
* Changed and refactored to opacity instead of transparency
* Remove unnecessary int to float conversions
Slider used to be 0-100 while the CCVar was 0.0-1.0f. This is confusing and was only used for rounding to 2 decimal points.
* Round the value to two decimal points
* Remove rounding for now
* Rename
* Unhardcode chat color by moving to stylesheet
* Fix indent
* Make opacity slider only change opacity
---------
Co-authored-by: Your Name <you@example.com>
Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com>
<CheckBox Name="ReducedMotionCheckBox" Text="{Loc 'ui-options-reduced-motion'}" />
<CheckBox Name="EnableColorNameCheckBox" Text="{Loc 'ui-options-enable-color-name'}" />
<CheckBox Name="ColorblindFriendlyCheckBox" Text="{Loc 'ui-options-colorblind-friendly'}" />
+ <BoxContainer Orientation="Horizontal">
+ <Label Text="{Loc 'ui-options-chat-window-opacity'}" Margin="8 0" />
+ <Slider Name="ChatWindowOpacitySlider"
+ MinValue="0"
+ MaxValue="1"
+ MinWidth="200" />
+ <Label Name="ChatWindowOpacityLabel" Margin="8 0" />
+ </BoxContainer>
<BoxContainer Orientation="Horizontal">
<Label Text="{Loc 'ui-options-screen-shake-intensity'}" Margin="8 0" />
<Slider Name="ScreenShakeIntensitySlider"
</controls:StripeBack>
</BoxContainer>
</tabs:MiscTab>
-
-
-
EnableColorNameCheckBox.OnToggled += OnCheckBoxToggled;
ColorblindFriendlyCheckBox.OnToggled += OnCheckBoxToggled;
ReducedMotionCheckBox.OnToggled += OnCheckBoxToggled;
+ ChatWindowOpacitySlider.OnValueChanged += OnChatWindowOpacitySliderChanged;
ScreenShakeIntensitySlider.OnValueChanged += OnScreenShakeIntensitySliderChanged;
// ToggleWalk.OnToggled += OnCheckBoxToggled;
StaticStorageUI.OnToggled += OnCheckBoxToggled;
EnableColorNameCheckBox.Pressed = _cfg.GetCVar(CCVars.ChatEnableColorName);
ColorblindFriendlyCheckBox.Pressed = _cfg.GetCVar(CCVars.AccessibilityColorblindFriendly);
ReducedMotionCheckBox.Pressed = _cfg.GetCVar(CCVars.ReducedMotion);
+ ChatWindowOpacitySlider.Value = _cfg.GetCVar(CCVars.ChatWindowOpacity);
ScreenShakeIntensitySlider.Value = _cfg.GetCVar(CCVars.ScreenShakeIntensity) * 100f;
// ToggleWalk.Pressed = _cfg.GetCVar(CCVars.ToggleWalk);
StaticStorageUI.Pressed = _cfg.GetCVar(CCVars.StaticStorageUI);
UpdateApplyButton();
}
+ private void OnChatWindowOpacitySliderChanged(Range range)
+ {
+ ChatWindowOpacityLabel.Text = Loc.GetString("ui-options-chat-window-opacity-percent",
+ ("opacity", range.Value));
+ UpdateApplyButton();
+ }
+
private void OnScreenShakeIntensitySliderChanged(Range obj)
{
ScreenShakeIntensityLabel.Text = Loc.GetString("ui-options-screen-shake-percent", ("intensity", ScreenShakeIntensitySlider.Value / 100f));
_cfg.SetCVar(CCVars.ChatEnableColorName, EnableColorNameCheckBox.Pressed);
_cfg.SetCVar(CCVars.AccessibilityColorblindFriendly, ColorblindFriendlyCheckBox.Pressed);
_cfg.SetCVar(CCVars.ReducedMotion, ReducedMotionCheckBox.Pressed);
+ _cfg.SetCVar(CCVars.ChatWindowOpacity, ChatWindowOpacitySlider.Value);
_cfg.SetCVar(CCVars.ScreenShakeIntensity, ScreenShakeIntensitySlider.Value / 100f);
// _cfg.SetCVar(CCVars.ToggleWalk, ToggleWalk.Pressed);
_cfg.SetCVar(CCVars.StaticStorageUI, StaticStorageUI.Pressed);
var isEnableColorNameSame = EnableColorNameCheckBox.Pressed == _cfg.GetCVar(CCVars.ChatEnableColorName);
var isColorblindFriendly = ColorblindFriendlyCheckBox.Pressed == _cfg.GetCVar(CCVars.AccessibilityColorblindFriendly);
var isReducedMotionSame = ReducedMotionCheckBox.Pressed == _cfg.GetCVar(CCVars.ReducedMotion);
+ var isChatWindowOpacitySame = Math.Abs(ChatWindowOpacitySlider.Value - _cfg.GetCVar(CCVars.ChatWindowOpacity)) < 0.01f;
var isScreenShakeIntensitySame = Math.Abs(ScreenShakeIntensitySlider.Value / 100f - _cfg.GetCVar(CCVars.ScreenShakeIntensity)) < 0.01f;
// var isToggleWalkSame = ToggleWalk.Pressed == _cfg.GetCVar(CCVars.ToggleWalk);
var isStaticStorageUISame = StaticStorageUI.Pressed == _cfg.GetCVar(CCVars.StaticStorageUI);
isEnableColorNameSame &&
isColorblindFriendly &&
isReducedMotionSame &&
+ isChatWindowOpacitySame &&
isScreenShakeIntensitySame &&
// isToggleWalkSame &&
isStaticStorageUISame;
public const string StyleClassBorderedWindowPanel = "BorderedWindowPanel";
public const string StyleClassInventorySlotBackground = "InventorySlotBackground";
public const string StyleClassHandSlotHighlight = "HandSlotHighlight";
+ public const string StyleClassChatPanel = "ChatPanel";
public const string StyleClassChatSubPanel = "ChatSubPanel";
public const string StyleClassTransparentBorderedWindowPanel = "TransparentBorderedWindowPanel";
public const string StyleClassHotbarPanel = "HotbarPanel";
public const string StyleClassButtonColorRed = "ButtonColorRed";
public const string StyleClassButtonColorGreen = "ButtonColorGreen";
+ public static readonly Color ChatBackgroundColor = Color.FromHex("#25252ADD");
+
public override Stylesheet Stylesheet { get; }
public StyleNano(IResourceCache resCache) : base(resCache)
lineEdit.SetPatchMargin(StyleBox.Margin.All, 3);
lineEdit.SetContentMarginOverride(StyleBox.Margin.Horizontal, 5);
- var chatSubBGTex = resCache.GetTexture("/Textures/Interface/Nano/chat_sub_background.png");
- var chatSubBG = new StyleBoxTexture
+ var chatBg = new StyleBoxFlat
+ {
+ BackgroundColor = ChatBackgroundColor
+ };
+
+ var chatSubBg = new StyleBoxFlat
{
- Texture = chatSubBGTex,
+ BackgroundColor = ChatBackgroundColor,
};
- chatSubBG.SetPatchMargin(StyleBox.Margin.All, 2);
+ chatSubBg.SetContentMarginOverride(StyleBox.Margin.All, 2);
var actionSearchBoxTex = resCache.GetTexture("/Textures/Interface/Nano/black_panel_dark_thin_border.png");
var actionSearchBox = new StyleBoxTexture
Element<TextEdit>().Pseudo(TextEdit.StylePseudoClassPlaceholder)
.Prop("font-color", Color.Gray),
- // Chat lineedit - we don't actually draw a stylebox around the lineedit itself, we put it around the
- // input + other buttons, so we must clear the default stylebox
- new StyleRule(new SelectorElement(typeof(LineEdit), new[] {StyleClassChatLineEdit}, null, null),
+ // chat subpanels (chat lineedit backing, popup backings)
+ new StyleRule(new SelectorElement(typeof(PanelContainer), new[] {StyleClassChatPanel}, null, null),
new[]
{
- new StyleProperty(LineEdit.StylePropertyStyleBox, new StyleBoxEmpty()),
+ new StyleProperty(PanelContainer.StylePropertyPanel, chatBg),
}),
- // chat subpanels (chat lineedit backing, popup backings)
- new StyleRule(new SelectorElement(typeof(PanelContainer), new[] {StyleClassChatSubPanel}, null, null),
+ // Chat lineedit - we don't actually draw a stylebox around the lineedit itself, we put it around the
+ // input + other buttons, so we must clear the default stylebox
+ new StyleRule(new SelectorElement(typeof(LineEdit), new[] {StyleClassChatLineEdit}, null, null),
new[]
{
- new StyleProperty(PanelContainer.StylePropertyPanel, chatSubBG),
+ new StyleProperty(LineEdit.StylePropertyStyleBox, new StyleBoxEmpty()),
}),
// Action searchbox lineedit
using Content.Client.Examine;
using Content.Client.Gameplay;
using Content.Client.Ghost;
+using Content.Client.Stylesheets;
using Content.Client.UserInterface.Screens;
using Content.Client.UserInterface.Systems.Chat.Widgets;
using Content.Client.UserInterface.Systems.Gameplay;
[Dependency] private readonly IStateManager _state = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IReplayRecordingManager _replayRecording = default!;
- [Dependency] private readonly IConfigurationManager _cfg = default!;
[UISystemDependency] private readonly ExamineSystem? _examine = default;
[UISystemDependency] private readonly GhostSystem? _ghost = default;
_net.RegisterNetMessage<MsgChatMessage>(OnChatMessage);
_net.RegisterNetMessage<MsgDeleteChatMessagesBy>(OnDeleteChatMessagesBy);
SubscribeNetworkEvent<DamageForceSayEvent>(OnDamageForceSay);
- _cfg.OnValueChanged(CCVars.ChatEnableColorName, (value) => { _chatNameColorsEnabled = value; });
- _chatNameColorsEnabled = _cfg.GetCVar(CCVars.ChatEnableColorName);
+ _config.OnValueChanged(CCVars.ChatEnableColorName, (value) => { _chatNameColorsEnabled = value; });
+ _chatNameColorsEnabled = _config.GetCVar(CCVars.ChatEnableColorName);
_speechBubbleRoot = new LayoutContainer();
{
_chatNameColors[i] = nameColors[i].ToHex();
}
+
+ _config.OnValueChanged(CCVars.ChatWindowOpacity, OnChatWindowOpacityChanged);
+
}
public void OnScreenLoad()
var viewportContainer = UIManager.ActiveScreen!.FindControl<LayoutContainer>("ViewportContainer");
SetSpeechBubbleRoot(viewportContainer);
+
+ SetChatWindowOpacity(_config.GetCVar(CCVars.ChatWindowOpacity));
}
public void OnScreenUnload()
SetMainChat(false);
}
+ private void OnChatWindowOpacityChanged(float opacity)
+ {
+ SetChatWindowOpacity(opacity);
+ }
+
+ private void SetChatWindowOpacity(float opacity)
+ {
+ var chatBox = UIManager.ActiveScreen?.GetWidget<ChatBox>() ?? UIManager.ActiveScreen?.GetWidget<ResizableChatBox>();
+
+ var panel = chatBox?.ChatWindowPanel;
+ if (panel is null)
+ return;
+
+ Color color;
+ if (panel.PanelOverride is StyleBoxFlat styleBoxFlat)
+ color = styleBoxFlat.BackgroundColor;
+ else if (panel.TryGetStyleProperty<StyleBox>(PanelContainer.StylePropertyPanel, out var style)
+ && style is StyleBoxFlat propStyleBoxFlat)
+ color = propStyleBoxFlat.BackgroundColor;
+ else
+ color = StyleNano.ChatBackgroundColor;
+
+ panel.PanelOverride = new StyleBoxFlat
+ {
+ BackgroundColor = color.WithAlpha(opacity)
+ };
+ }
+
public void SetMainChat(bool setting)
{
if (UIManager.ActiveScreen == null)
ProcessChatMessage(msg);
if ((msg.Channel & ChatChannel.AdminRelated) == 0 ||
- _cfg.GetCVar(CCVars.ReplayRecordAdminChat))
+ _config.GetCVar(CCVars.ReplayRecordAdminChat))
{
_replayRecording.RecordClientMessage(msg);
}
break;
case ChatChannel.LOOC:
- if (_cfg.GetCVar(CCVars.LoocAboveHeadShow))
+ if (_config.GetCVar(CCVars.LoocAboveHeadShow))
AddSpeechBubble(msg, SpeechBubble.SpeechType.Looc);
break;
}
-using Content.Shared.Chat;
+using Content.Client.Stylesheets;
+using Content.Shared.Chat;
using Content.Shared.Input;
using Robust.Client.UserInterface.Controls;
StyleClasses = {"chatFilterOptionButton"}
};
Container.AddChild(FilterButton);
+ AddStyleClass(StyleNano.StyleClassChatSubPanel);
ChannelSelector.OnChannelSelect += UpdateActiveChannel;
}
HorizontalExpand="True"
VerticalExpand="True"
MinSize="465 225">
- <PanelContainer HorizontalExpand="True" VerticalExpand="True">
- <PanelContainer.PanelOverride>
- <graphics:StyleBoxFlat BackgroundColor="#25252ADD" />
- </PanelContainer.PanelOverride>
-
+ <PanelContainer Name="ChatWindowPanel" Access="Public" HorizontalExpand="True" VerticalExpand="True"
+ StyleClasses="StyleNano.StyleClassChatPanel">
<BoxContainer Orientation="Vertical" SeparationOverride="4" HorizontalExpand="True" VerticalExpand="True">
<OutputPanel Name="Contents" HorizontalExpand="True" VerticalExpand="True" Margin="8 8 8 4" />
<controls:ChatInputBox HorizontalExpand="True" Name="ChatInput" Access="Public" Margin="2"/>
* Accessibility
*/
+ /// <summary>
+ /// Chat window opacity slider, controlling the alpha of the chat window background.
+ /// Goes from to 0 (completely transparent) to 1 (completely opaque)
+ /// </summary>
+ public static readonly CVarDef<float> ChatWindowOpacity =
+ CVarDef.Create("accessibility.chat_window_transparency", 0.85f, CVar.CLIENTONLY | CVar.ARCHIVE);
+
/// <summary>
/// Toggle for visual effects that may potentially cause motion sickness.
/// Where reasonable, effects affected by this CVar should use an alternate effect.
ui-options-enable-color-name = Add colors to character names
ui-options-colorblind-friendly = Colorblind friendly mode
ui-options-reduced-motion = Reduce motion of visual effects
+ui-options-chat-window-opacity = Chat window opacity
+ui-options-chat-window-opacity-percent = { TOSTRING($opacity, "P0") }
ui-options-screen-shake-intensity = Screen shake intensity
ui-options-screen-shake-percent = { TOSTRING($intensity, "P0") }
ui-options-vsync = VSync