using Dalamud.Interface; using Dalamud.Interface.ImGuiFileDialog; using Dalamud.Interface.Windowing; using MareSynchronos.MareConfiguration; using MareSynchronos.Services.Mediator; using MareSynchronos.UI; using MareSynchronos.UI.Components.Popup; using Microsoft.Extensions.Logging; namespace MareSynchronos.Services; public sealed class UiService : DisposableMediatorSubscriberBase { private readonly List _createdWindows = []; private readonly IUiBuilder _uiBuilder; private readonly FileDialogManager _fileDialogManager; private readonly ILogger _logger; private readonly MareConfigService _mareConfigService; private readonly WindowSystem _windowSystem; private readonly UiFactory _uiFactory; public UiService(ILogger logger, IUiBuilder uiBuilder, MareConfigService mareConfigService, WindowSystem windowSystem, IEnumerable windows, UiFactory uiFactory, FileDialogManager fileDialogManager, MareMediator mareMediator) : base(logger, mareMediator) { _logger = logger; _logger.LogTrace("Creating {type}", GetType().Name); _uiBuilder = uiBuilder; _mareConfigService = mareConfigService; _windowSystem = windowSystem; _uiFactory = uiFactory; _fileDialogManager = fileDialogManager; _uiBuilder.DisableGposeUiHide = true; _uiBuilder.Draw += Draw; _uiBuilder.OpenConfigUi += ToggleUi; _uiBuilder.OpenMainUi += ToggleMainUi; foreach (var window in windows) { _windowSystem.AddWindow(window); } Mediator.Subscribe(this, (msg) => { if (!_createdWindows.Exists(p => p is StandaloneProfileUi ui && string.Equals(ui.Pair.UserData.AliasOrUID, msg.Pair.UserData.AliasOrUID, StringComparison.Ordinal))) { var window = _uiFactory.CreateStandaloneProfileUi(msg.Pair); _createdWindows.Add(window); _windowSystem.AddWindow(window); } }); Mediator.Subscribe(this, (msg) => { if (!_createdWindows.Exists(p => p is SyncshellAdminUI ui && string.Equals(ui.GroupFullInfo.GID, msg.GroupInfo.GID, StringComparison.Ordinal))) { var window = _uiFactory.CreateSyncshellAdminUi(msg.GroupInfo); _createdWindows.Add(window); _windowSystem.AddWindow(window); } }); Mediator.Subscribe(this, (msg) => { if (!_createdWindows.Exists(p => p is PermissionWindowUI ui && msg.Pair == ui.Pair)) { var window = _uiFactory.CreatePermissionPopupUi(msg.Pair); _createdWindows.Add(window); _windowSystem.AddWindow(window); } }); Mediator.Subscribe(this, (msg) => { if (!_createdWindows.Exists(p => p is PlayerAnalysisUI ui && msg.Pair == ui.Pair)) { var window = _uiFactory.CreatePlayerAnalysisUi(msg.Pair); _createdWindows.Add(window); _windowSystem.AddWindow(window); } }); Mediator.Subscribe(this, (msg) => { _windowSystem.RemoveWindow(msg.Window); _createdWindows.Remove(msg.Window); msg.Window.Dispose(); }); } public void ToggleMainUi() { if (_mareConfigService.Current.HasValidSetup()) Mediator.Publish(new UiToggleMessage(typeof(CompactUi))); else Mediator.Publish(new UiToggleMessage(typeof(IntroUi))); } public void ToggleUi() { if (_mareConfigService.Current.HasValidSetup()) Mediator.Publish(new UiToggleMessage(typeof(SettingsUi))); else Mediator.Publish(new UiToggleMessage(typeof(IntroUi))); } protected override void Dispose(bool disposing) { base.Dispose(disposing); _logger.LogTrace("Disposing {type}", GetType().Name); _windowSystem.RemoveAllWindows(); foreach (var window in _createdWindows) { window.Dispose(); } _uiBuilder.Draw -= Draw; _uiBuilder.OpenConfigUi -= ToggleUi; _uiBuilder.OpenMainUi -= ToggleMainUi; } private void Draw() { _windowSystem.Draw(); _fileDialogManager.Draw(); } }