-
Notifications
You must be signed in to change notification settings - Fork 473
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added a language selector to the chat ui (kmp)
- Loading branch information
1 parent
1f5dc56
commit cd7e250
Showing
6 changed files
with
280 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
95 changes: 95 additions & 0 deletions
95
Content.Client/_NF/Language/Systems/Chat/Controls/LanguageSelectorButton.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
using System.Linq; | ||
using System.Numerics; | ||
using Content.Client.UserInterface.Systems.Chat.Controls; | ||
using Content.Shared.Language; | ||
using Robust.Shared.Utility; | ||
|
||
namespace Content.Client._NF.Language.Systems.Chat.Controls; | ||
|
||
// Mostly copied from ChannelSelectorButton | ||
public sealed class LanguageSelectorButton : ChatPopupButton<LanguageSelectorPopup> | ||
{ | ||
public event Action<LanguagePrototype>? OnLanguageSelect; | ||
|
||
public LanguagePrototype? SelectedLanguage { get; private set; } | ||
|
||
private const int SelectorDropdownOffset = 38; | ||
|
||
public LanguageSelectorButton() | ||
{ | ||
Name = "LanguageSelector"; | ||
|
||
Popup.Selected += OnLanguageSelected; | ||
|
||
if (Popup.FirstLanguage is { } firstSelector) | ||
{ | ||
Select(firstSelector); | ||
} | ||
} | ||
|
||
protected override UIBox2 GetPopupPosition() | ||
{ | ||
var globalLeft = GlobalPosition.X; | ||
var globalBot = GlobalPosition.Y + Height; | ||
return UIBox2.FromDimensions( | ||
new Vector2(globalLeft, globalBot), | ||
new Vector2(SizeBox.Width, SelectorDropdownOffset)); | ||
} | ||
|
||
private void OnLanguageSelected(LanguagePrototype channel) | ||
{ | ||
Select(channel); | ||
} | ||
|
||
public void Select(LanguagePrototype language) | ||
{ | ||
if (Popup.Visible) | ||
{ | ||
Popup.Close(); | ||
} | ||
|
||
if (SelectedLanguage == language) | ||
return; | ||
SelectedLanguage = language; | ||
OnLanguageSelect?.Invoke(language); | ||
|
||
Text = LanguageSelectorName(language); | ||
} | ||
|
||
public static string LanguageSelectorName(LanguagePrototype language, bool full = false) | ||
{ | ||
var name = language.LocalizedName; | ||
|
||
// if the language name is short enough, just return it | ||
if (full || name.Length < 5) | ||
return name; | ||
|
||
// If the language name is multi-word, collect first letters and capitalize them | ||
if (name.Contains(' ')) | ||
{ | ||
var result = name | ||
.Split(" ") | ||
.Select(it => it.FirstOrNull()) | ||
.Where(it => it != null) | ||
.Select(it => char.ToUpper(it!.Value)); | ||
|
||
return new string(result.ToArray()); | ||
} | ||
|
||
// Alternatively, take the first 5 letters | ||
return name[..5]; | ||
} | ||
|
||
// public Color ChannelSelectColor(ChatSelectChannel channel) | ||
// { | ||
// return channel switch | ||
// { | ||
// ChatSelectChannel.Radio => Color.LimeGreen, | ||
// ChatSelectChannel.LOOC => Color.MediumTurquoise, | ||
// ChatSelectChannel.OOC => Color.LightSkyBlue, | ||
// ChatSelectChannel.Dead => Color.MediumPurple, | ||
// ChatSelectChannel.Admin => Color.HotPink, | ||
// _ => Color.DarkGray | ||
// }; | ||
// } | ||
} |
28 changes: 28 additions & 0 deletions
28
Content.Client/_NF/Language/Systems/Chat/Controls/LanguageSelectorItemButton.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
using Content.Client.Stylesheets; | ||
using Content.Client.UserInterface.Systems.Chat; | ||
using Content.Client.UserInterface.Systems.Chat.Controls; | ||
using Content.Shared.Chat; | ||
using Content.Shared.Language; | ||
using Robust.Client.UserInterface.Controls; | ||
|
||
namespace Content.Client._NF.Language.Systems.Chat.Controls; | ||
|
||
// Mostly copied from ChannelSelectorItemButton | ||
public sealed class LanguageSelectorItemButton : Button | ||
{ | ||
public readonly LanguagePrototype Language; | ||
|
||
public bool IsHidden => Parent == null; | ||
|
||
public LanguageSelectorItemButton(LanguagePrototype language) | ||
{ | ||
Language = language; | ||
AddStyleClass(StyleNano.StyleClassChatChannelSelectorButton); | ||
|
||
Text = LanguageSelectorButton.LanguageSelectorName(language, full: true); | ||
|
||
// var prefix = ChatUIController.ChannelPrefixes[selector]; | ||
// if (prefix != default) | ||
// Text = Loc.GetString("hud-chatbox-select-name-prefixed", ("name", Text), ("prefix", prefix)); | ||
} | ||
} |
109 changes: 109 additions & 0 deletions
109
Content.Client/_NF/Language/Systems/Chat/Controls/LanguageSelectorPopup.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
using System.Reflection.Metadata.Ecma335; | ||
using Content.Client.Language.Systems; | ||
using Content.Client.UserInterface.Systems.Chat.Controls; | ||
using Content.Client.UserInterface.Systems.Language; | ||
using Content.Shared.Chat; | ||
using Content.Shared.Language; | ||
using Content.Shared.Language.Systems; | ||
using Robust.Client.UserInterface.Controls; | ||
using static Robust.Client.UserInterface.Controls.BaseButton; | ||
|
||
namespace Content.Client._NF.Language.Systems.Chat.Controls; | ||
|
||
// Mostly copied from LanguageSelectorPopup | ||
public sealed class LanguageSelectorPopup : Popup | ||
{ | ||
private readonly BoxContainer _channelSelectorHBox; | ||
private readonly Dictionary<string, LanguageSelectorItemButton> _selectorStates = new(); | ||
private readonly LanguageMenuUIController _languageMenuController; | ||
|
||
public event Action<LanguagePrototype>? Selected; | ||
|
||
public LanguageSelectorPopup() | ||
{ | ||
_channelSelectorHBox = new BoxContainer | ||
{ | ||
Orientation = BoxContainer.LayoutOrientation.Horizontal, | ||
SeparationOverride = 1 | ||
}; | ||
|
||
_languageMenuController = UserInterfaceManager.GetUIController<LanguageMenuUIController>(); | ||
_languageMenuController.LanguagesChanged += SetLanguages; | ||
|
||
AddChild(_channelSelectorHBox); | ||
} | ||
|
||
public LanguagePrototype? FirstLanguage | ||
{ | ||
get | ||
{ | ||
foreach (var selector in _selectorStates.Values) | ||
{ | ||
if (!selector.IsHidden) | ||
return selector.Language; | ||
} | ||
|
||
return null; | ||
} | ||
} | ||
|
||
private bool IsPreferredAvailable() | ||
{ | ||
var preferred = _languageMenuController.LastPreferredLanguage; | ||
return preferred != null && _selectorStates.TryGetValue(preferred, out var selector) && !selector.IsHidden; | ||
} | ||
|
||
public void SetLanguages(List<string> languages) | ||
{ | ||
var languageSystem = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<LanguageSystem>(); | ||
_channelSelectorHBox.RemoveAllChildren(); | ||
|
||
foreach (var language in languages) | ||
{ | ||
if (!_selectorStates.TryGetValue(language, out var selector)) | ||
{ | ||
var proto = languageSystem.GetLanguage(language); | ||
if (proto == null) | ||
continue; | ||
|
||
selector = new LanguageSelectorItemButton(proto); | ||
_selectorStates[language] = selector; | ||
selector.OnPressed += OnSelectorPressed; | ||
} | ||
|
||
if (selector.IsHidden) | ||
{ | ||
_channelSelectorHBox.AddChild(selector); | ||
} | ||
} | ||
|
||
var isPreferredAvailable = IsPreferredAvailable(); | ||
if (!isPreferredAvailable) | ||
{ | ||
var first = FirstLanguage; | ||
if (first != null) | ||
Select(first); | ||
} | ||
} | ||
|
||
private void OnSelectorPressed(ButtonEventArgs args) | ||
{ | ||
var button = (LanguageSelectorItemButton) args.Button; | ||
Select(button.Language); | ||
} | ||
|
||
private void Select(LanguagePrototype language) | ||
{ | ||
Selected?.Invoke(language); | ||
} | ||
|
||
protected override void Dispose(bool disposing) | ||
{ | ||
base.Dispose(disposing); | ||
|
||
if (!disposing) | ||
return; | ||
|
||
_languageMenuController.LanguagesChanged -= SetLanguages; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters