using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Client.Stylesheets.Stylesheets; using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; using Robust.Shared.Reflection; namespace Content.Client.Stylesheets { public sealed class StylesheetManager : IStylesheetManager { [Dependency] private readonly ILogManager _logManager = default!; [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!; [Dependency] private readonly IReflectionManager _reflection = default!; [Dependency] private readonly IResourceCache _resCache = default!; // TODO: REMOVE (obsolete; used to construct StyleNano/StyleSpace) public Stylesheet SheetNanotrasen { get; private set; } = default!; public Stylesheet SheetSystem { get; private set; } = default!; [Obsolete("Update to use SheetNanotrasen instead")] public Stylesheet SheetNano { get; private set; } = default!; [Obsolete("Update to use SheetSystem instead")] public Stylesheet SheetSpace { get; private set; } = default!; private Dictionary Stylesheets { get; set; } = default!; public bool TryGetStylesheet(string name, [MaybeNullWhen(false)] out Stylesheet stylesheet) { return Stylesheets.TryGetValue(name, out stylesheet); } public HashSet UnusedSheetlets { get; private set; } = []; public void Initialize() { var sawmill = _logManager.GetSawmill("style"); sawmill.Debug("Initializing Stylesheets..."); var sw = Stopwatch.StartNew(); // add all sheetlets to the hashset var tys = _reflection.FindTypesWithAttribute(); UnusedSheetlets = [..tys]; Stylesheets = new Dictionary(); SheetNanotrasen = Init(new NanotrasenStylesheet(new BaseStylesheet.NoConfig(), this)); SheetSystem = Init(new SystemStylesheet(new BaseStylesheet.NoConfig(), this)); SheetNano = new StyleNano(_resCache).Stylesheet; // TODO: REMOVE (obsolete) SheetSpace = new StyleSpace(_resCache).Stylesheet; // TODO: REMOVE (obsolete) _userInterfaceManager.Stylesheet = SheetNanotrasen; // warn about unused sheetlets if (UnusedSheetlets.Count > 0) { var sheetlets = UnusedSheetlets.AsEnumerable() .Take(5) .Select(t => t.FullName ?? "") .ToArray(); sawmill.Error($"There are unloaded sheetlets: {string.Join(", ", sheetlets)}"); } sawmill.Debug($"Initialized {_styleRuleCount} style rules in {sw.Elapsed}"); } private int _styleRuleCount; private Stylesheet Init(BaseStylesheet baseSheet) { Stylesheets.Add(baseSheet.StylesheetName, baseSheet.Stylesheet); _styleRuleCount += baseSheet.Stylesheet.Rules.Count; return baseSheet.Stylesheet; } } }