diff --git a/MareSynchronos/FileCache/CacheMonitor.cs b/MareSynchronos/FileCache/CacheMonitor.cs index 878e836..83f1b52 100644 --- a/MareSynchronos/FileCache/CacheMonitor.cs +++ b/MareSynchronos/FileCache/CacheMonitor.cs @@ -68,6 +68,11 @@ public sealed class CacheMonitor : DisposableMediatorSubscriberBase { try { + while (_dalamudUtil.IsOnFrameworkThread && !token.IsCancellationRequested) + { + await Task.Delay(1).ConfigureAwait(false); + } + RecalculateFileCacheSize(token); } catch @@ -272,18 +277,41 @@ public sealed class CacheMonitor : DisposableMediatorSubscriberBase } } - if (changes.Any(c => c.Value.ChangeType == WatcherChangeTypes.Deleted)) - { - lock (_fileDbManager) - { - foreach (var change in changes) - { - Logger.LogDebug("FSW Change: {change} = {val}", change.Key, change.Value); - _ = _fileDbManager.GetFileCacheByPath(change.Key); - } + HandleChanges(changes); + } - _fileDbManager.WriteOutFullCsv(); + private void HandleChanges(Dictionary changes) + { + lock (_fileDbManager) + { + var deletedEntries = changes.Where(c => c.Value.ChangeType == WatcherChangeTypes.Deleted).Select(c => c.Key); + var renamedEntries = changes.Where(c => c.Value.ChangeType == WatcherChangeTypes.Renamed); + var remainingEntries = changes.Where(c => c.Value.ChangeType != WatcherChangeTypes.Deleted).Select(c => c.Key); + + foreach (var entry in deletedEntries) + { + Logger.LogDebug("FSW Change: Deletion - {val}", entry); } + + foreach (var entry in renamedEntries) + { + Logger.LogDebug("FSW Change: Renamed - {oldVal} => {val}", entry.Value.OldPath, entry.Key); + } + + foreach (var entry in remainingEntries) + { + Logger.LogDebug("FSW Change: Creation or Change - {val}", entry); + } + + var allChanges = deletedEntries + .Concat(renamedEntries.Select(c => c.Value.OldPath!)) + .Concat(renamedEntries.Select(c => c.Key)) + .Concat(remainingEntries) + .ToArray(); + + _ = _fileDbManager.GetFileCachesByPaths(allChanges); + + _fileDbManager.WriteOutFullCsv(); } } @@ -315,24 +343,7 @@ public sealed class CacheMonitor : DisposableMediatorSubscriberBase } } - lock (_fileDbManager) - { - foreach (var change in changes) - { - Logger.LogDebug("FSW Change: {change} = {val}", change.Key, change.Value); - if (change.Value.ChangeType == WatcherChangeTypes.Deleted) - { - _fileDbManager.GetFileCacheByPath(change.Key); - } - else - { - if (change.Value.OldPath != null) _fileDbManager.GetFileCacheByPath(change.Value.OldPath); - _fileDbManager.CreateFileEntry(change.Key); - } - } - - _fileDbManager.WriteOutFullCsv(); - } + HandleChanges(changes); } public void InvokeScan() @@ -397,7 +408,7 @@ public sealed class CacheMonitor : DisposableMediatorSubscriberBase } FileCacheSize = Directory.EnumerateFiles(_configService.Current.CacheFolder) - .AsParallel().Sum(f => + .Sum(f => { token.ThrowIfCancellationRequested(); diff --git a/MareSynchronos/FileCache/FileCacheManager.cs b/MareSynchronos/FileCache/FileCacheManager.cs index eddce49..b34de42 100644 --- a/MareSynchronos/FileCache/FileCacheManager.cs +++ b/MareSynchronos/FileCache/FileCacheManager.cs @@ -20,6 +20,7 @@ public sealed class FileCacheManager : IHostedService private readonly MareMediator _mareMediator; private readonly string _csvPath; private readonly ConcurrentDictionary> _fileCaches = new(StringComparer.Ordinal); + private readonly SemaphoreSlim _getCachesByPathsSemaphore = new(1, 1); private readonly object _fileWriteLock = new(); private readonly IpcManager _ipcManager; private readonly ILogger _logger; @@ -64,9 +65,9 @@ public sealed class FileCacheManager : IHostedService List output = []; if (_fileCaches.TryGetValue(hash, out var fileCacheEntities)) { - foreach (var filecache in fileCacheEntities.ToList()) + foreach (var fileCache in fileCacheEntities.ToList()) { - var validated = GetValidatedFileCache(filecache); + var validated = GetValidatedFileCache(fileCache); if (validated != null) output.Add(validated); } } @@ -79,7 +80,7 @@ public sealed class FileCacheManager : IHostedService _mareMediator.Publish(new HaltScanMessage(nameof(ValidateLocalIntegrity))); _logger.LogInformation("Validating local storage"); var cacheEntries = _fileCaches.SelectMany(v => v.Value).Where(v => v.IsCacheEntry).ToList(); - List brokenEntities = new(); + List brokenEntities = []; int i = 0; foreach (var fileCache in cacheEntries) { @@ -161,32 +162,44 @@ public sealed class FileCacheManager : IHostedService public Dictionary GetFileCachesByPaths(string[] paths) { - var cleanedPaths = paths.Distinct(StringComparer.OrdinalIgnoreCase).ToDictionary(p => p, - p => p.Replace("/", "\\", StringComparison.OrdinalIgnoreCase) - .Replace(_ipcManager.PenumbraModDirectory!, - _ipcManager.PenumbraModDirectory!.EndsWith('\\') ? (PenumbraPrefix + "\\") : PenumbraPrefix, - StringComparison.OrdinalIgnoreCase), - StringComparer.OrdinalIgnoreCase); + _getCachesByPathsSemaphore.Wait(); - Dictionary result = new(StringComparer.OrdinalIgnoreCase); - - var dict = _fileCaches.SelectMany(f => f.Value).Where(f => f.PrefixedFilePath.StartsWith(PenumbraPrefix, StringComparison.Ordinal)) - .ToDictionary(d => d.PrefixedFilePath, d => d, StringComparer.Ordinal); - - foreach (var entry in cleanedPaths) + try { - if (dict.TryGetValue(entry.Value, out var entity)) - { - var validatedCache = GetValidatedFileCache(entity); - result.Add(entry.Key, validatedCache); - } - else - { - result.Add(entry.Key, CreateFileEntry(entry.Key)); - } - } + var cleanedPaths = paths.Distinct(StringComparer.OrdinalIgnoreCase).ToDictionary(p => p, + p => p.Replace("/", "\\", StringComparison.OrdinalIgnoreCase) + .Replace(_ipcManager.PenumbraModDirectory!, PenumbraPrefix, StringComparison.OrdinalIgnoreCase) + .Replace(_configService.Current.CacheFolder, CachePrefix, StringComparison.OrdinalIgnoreCase) + .Replace("\\\\", "\\", StringComparison.Ordinal), + StringComparer.OrdinalIgnoreCase); - return result; + Dictionary result = new(StringComparer.OrdinalIgnoreCase); + + var dict = _fileCaches.SelectMany(f => f.Value) + .ToDictionary(d => d.PrefixedFilePath, d => d, StringComparer.Ordinal); + + foreach (var entry in cleanedPaths) + { + if (dict.TryGetValue(entry.Value, out var entity)) + { + var validatedCache = GetValidatedFileCache(entity); + result.Add(entry.Key, validatedCache); + } + else + { + if (!entry.Value.Contains(CachePrefix, StringComparison.Ordinal)) + result.Add(entry.Key, CreateFileEntry(entry.Key)); + else + result.Add(entry.Key, CreateCacheEntry(entry.Key)); + } + } + + return result; + } + finally + { + _getCachesByPathsSemaphore.Release(); + } } public void RemoveHashedFile(string hash, string prefixedFilePath) @@ -266,8 +279,6 @@ public sealed class FileCacheManager : IHostedService try { RemoveHashedFile(fileCache.Hash, fileCache.PrefixedFilePath); - FileInfo fileInfo = new(fileCache.ResolvedFilepath); - FileInfo oldCache = fileInfo; var extensionPath = fileCache.ResolvedFilepath.ToUpper(CultureInfo.InvariantCulture) + "." + ext; File.Move(fileCache.ResolvedFilepath, extensionPath, overwrite: true); var newHashedEntity = new FileCacheEntity(fileCache.Hash, fileCache.PrefixedFilePath + "." + ext, DateTime.UtcNow.Ticks.ToString(CultureInfo.InvariantCulture)); @@ -314,9 +325,9 @@ public sealed class FileCacheManager : IHostedService private FileCacheEntity? GetValidatedFileCache(FileCacheEntity fileCache) { - var resulingFileCache = ReplacePathPrefixes(fileCache); - resulingFileCache = Validate(resulingFileCache); - return resulingFileCache; + var resultingFileCache = ReplacePathPrefixes(fileCache); + resultingFileCache = Validate(resultingFileCache); + return resultingFileCache; } private FileCacheEntity ReplacePathPrefixes(FileCacheEntity fileCache) diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index 59e6174..836f57d 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -115,7 +115,7 @@ public sealed class Plugin : IDalamudPlugin collection.AddScoped((s) => new EditProfileUi(s.GetRequiredService>(), s.GetRequiredService(), s.GetRequiredService(), pluginInterface.UiBuilder, s.GetRequiredService(), - s.GetRequiredService(), s.GetRequiredService())); + s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); collection.AddScoped(); collection.AddScoped(); collection.AddScoped(); diff --git a/MareSynchronos/Services/Mediator/WindowMediatorSubscriberBase.cs b/MareSynchronos/Services/Mediator/WindowMediatorSubscriberBase.cs index 9552d39..87a7b41 100644 --- a/MareSynchronos/Services/Mediator/WindowMediatorSubscriberBase.cs +++ b/MareSynchronos/Services/Mediator/WindowMediatorSubscriberBase.cs @@ -6,12 +6,14 @@ namespace MareSynchronos.Services.Mediator; public abstract class WindowMediatorSubscriberBase : Window, IMediatorSubscriber, IDisposable { protected readonly ILogger _logger; + private readonly PerformanceCollectorService _performanceCollectorService; - protected WindowMediatorSubscriberBase(ILogger logger, MareMediator mediator, string name) : base(name) + protected WindowMediatorSubscriberBase(ILogger logger, MareMediator mediator, string name, + PerformanceCollectorService performanceCollectorService) : base(name) { _logger = logger; Mediator = mediator; - + _performanceCollectorService = performanceCollectorService; _logger.LogTrace("Creating {type}", GetType()); Mediator.Subscribe(this, (msg) => @@ -31,6 +33,13 @@ public abstract class WindowMediatorSubscriberBase : Window, IMediatorSubscriber GC.SuppressFinalize(this); } + public override void Draw() + { + _performanceCollectorService.LogPerformance(this, "Draw", DrawInternal); + } + + protected abstract void DrawInternal(); + public virtual Task StopAsync(CancellationToken cancellationToken) { return Task.CompletedTask; diff --git a/MareSynchronos/Services/UiFactory.cs b/MareSynchronos/Services/UiFactory.cs index 7db5232..88f53ac 100644 --- a/MareSynchronos/Services/UiFactory.cs +++ b/MareSynchronos/Services/UiFactory.cs @@ -18,10 +18,11 @@ public class UiFactory private readonly PairManager _pairManager; private readonly ServerConfigurationManager _serverConfigManager; private readonly MareProfileManager _mareProfileManager; + private readonly PerformanceCollectorService _performanceCollectorService; public UiFactory(ILoggerFactory loggerFactory, MareMediator mareMediator, ApiController apiController, UiSharedService uiSharedService, PairManager pairManager, ServerConfigurationManager serverConfigManager, - MareProfileManager mareProfileManager) + MareProfileManager mareProfileManager, PerformanceCollectorService performanceCollectorService) { _loggerFactory = loggerFactory; _mareMediator = mareMediator; @@ -30,23 +31,24 @@ public class UiFactory _pairManager = pairManager; _serverConfigManager = serverConfigManager; _mareProfileManager = mareProfileManager; + _performanceCollectorService = performanceCollectorService; } public SyncshellAdminUI CreateSyncshellAdminUi(GroupFullInfoDto dto) { return new SyncshellAdminUI(_loggerFactory.CreateLogger(), _mareMediator, - _apiController, _uiSharedService, _pairManager, dto); + _apiController, _uiSharedService, _pairManager, dto, _performanceCollectorService); } public StandaloneProfileUi CreateStandaloneProfileUi(Pair pair) { return new StandaloneProfileUi(_loggerFactory.CreateLogger(), _mareMediator, - _uiSharedService, _serverConfigManager, _mareProfileManager, _pairManager, pair); + _uiSharedService, _serverConfigManager, _mareProfileManager, _pairManager, pair, _performanceCollectorService); } public PermissionWindowUI CreatePermissionPopupUi(Pair pair) { return new PermissionWindowUI(_loggerFactory.CreateLogger(), pair, - _mareMediator, _uiSharedService, _apiController); + _mareMediator, _uiSharedService, _apiController, _performanceCollectorService); } } diff --git a/MareSynchronos/UI/CompactUI.cs b/MareSynchronos/UI/CompactUI.cs index b465dae..89c1e94 100644 --- a/MareSynchronos/UI/CompactUI.cs +++ b/MareSynchronos/UI/CompactUI.cs @@ -9,6 +9,7 @@ using MareSynchronos.API.Dto.Group; using MareSynchronos.MareConfiguration; using MareSynchronos.PlayerData.Handlers; using MareSynchronos.PlayerData.Pairs; +using MareSynchronos.Services; using MareSynchronos.Services.Mediator; using MareSynchronos.Services.ServerConfiguration; using MareSynchronos.UI.Components; @@ -53,8 +54,9 @@ public class CompactUi : WindowMediatorSubscriberBase public CompactUi(ILogger logger, UiSharedService uiShared, MareConfigService configService, ApiController apiController, PairManager pairManager, ServerConfigurationManager serverManager, MareMediator mediator, FileUploadManager fileTransferManager, - TagHandler tagHandler, DrawEntityFactory drawEntityFactory, SelectTagForPairUi selectTagForPairUi, SelectPairForTagUi selectPairForTagUi) - : base(logger, mediator, "###MareSynchronosMainUI") + TagHandler tagHandler, DrawEntityFactory drawEntityFactory, SelectTagForPairUi selectTagForPairUi, SelectPairForTagUi selectPairForTagUi, + PerformanceCollectorService performanceCollectorService) + : base(logger, mediator, "###MareSynchronosMainUI", performanceCollectorService) { _uiShared = uiShared; _configService = configService; @@ -132,7 +134,7 @@ public class CompactUi : WindowMediatorSubscriberBase }; } - public override void Draw() + protected override void DrawInternal() { _windowContentWidth = UiSharedService.GetWindowContentRegionWidth(); if (!_apiController.IsCurrentVersion) diff --git a/MareSynchronos/UI/Components/Popup/PopupHandler.cs b/MareSynchronos/UI/Components/Popup/PopupHandler.cs index 484659b..417bab2 100644 --- a/MareSynchronos/UI/Components/Popup/PopupHandler.cs +++ b/MareSynchronos/UI/Components/Popup/PopupHandler.cs @@ -2,6 +2,7 @@ using Dalamud.Interface.Utility; using Dalamud.Interface.Utility.Raii; using ImGuiNET; +using MareSynchronos.Services; using MareSynchronos.Services.Mediator; using Microsoft.Extensions.Logging; using System.Numerics; @@ -14,8 +15,8 @@ public class PopupHandler : WindowMediatorSubscriberBase private readonly HashSet _handlers; private IPopupHandler? _currentHandler = null; - public PopupHandler(ILogger logger, MareMediator mediator, IEnumerable popupHandlers) - : base(logger, mediator, "MarePopupHandler") + public PopupHandler(ILogger logger, MareMediator mediator, IEnumerable popupHandlers, PerformanceCollectorService performanceCollectorService) + : base(logger, mediator, "MarePopupHandler", performanceCollectorService) { Flags = ImGuiWindowFlags.NoBringToFrontOnFocus | ImGuiWindowFlags.NoDecoration @@ -53,7 +54,7 @@ public class PopupHandler : WindowMediatorSubscriberBase }); } - public override void Draw() + protected override void DrawInternal() { if (_currentHandler == null) return; diff --git a/MareSynchronos/UI/CreateSyncshellUI.cs b/MareSynchronos/UI/CreateSyncshellUI.cs index f8a948b..5aaf094 100644 --- a/MareSynchronos/UI/CreateSyncshellUI.cs +++ b/MareSynchronos/UI/CreateSyncshellUI.cs @@ -4,6 +4,7 @@ using Dalamud.Interface.Utility.Raii; using ImGuiNET; using MareSynchronos.API.Data.Extensions; using MareSynchronos.API.Dto.Group; +using MareSynchronos.Services; using MareSynchronos.Services.Mediator; using MareSynchronos.WebAPI; using Microsoft.Extensions.Logging; @@ -18,8 +19,9 @@ public class CreateSyncshellUI : WindowMediatorSubscriberBase private bool _errorGroupCreate; private GroupJoinDto? _lastCreatedGroup; - public CreateSyncshellUI(ILogger logger, MareMediator mareMediator, ApiController apiController, UiSharedService uiSharedService) - : base(logger, mareMediator, "Create new Syncshell###MareSynchronosCreateSyncshell") + public CreateSyncshellUI(ILogger logger, MareMediator mareMediator, ApiController apiController, UiSharedService uiSharedService, + PerformanceCollectorService performanceCollectorService) + : base(logger, mareMediator, "Create new Syncshell###MareSynchronosCreateSyncshell", performanceCollectorService) { _apiController = apiController; _uiSharedService = uiSharedService; @@ -34,7 +36,7 @@ public class CreateSyncshellUI : WindowMediatorSubscriberBase Mediator.Subscribe(this, (_) => IsOpen = false); } - public override void Draw() + protected override void DrawInternal() { using (ImRaii.PushFont(_uiSharedService.UidFont)) ImGui.TextUnformatted("Create new Syncshell"); diff --git a/MareSynchronos/UI/DataAnalysisUi.cs b/MareSynchronos/UI/DataAnalysisUi.cs index 28a527e..13dd2f1 100644 --- a/MareSynchronos/UI/DataAnalysisUi.cs +++ b/MareSynchronos/UI/DataAnalysisUi.cs @@ -31,7 +31,8 @@ public class DataAnalysisUi : WindowMediatorSubscriberBase private ObjectKind _selectedObjectTab; private bool _showModal = false; - public DataAnalysisUi(ILogger logger, MareMediator mediator, CharacterAnalyzer characterAnalyzer, IpcManager ipcManager) : base(logger, mediator, "Mare Character Data Analysis") + public DataAnalysisUi(ILogger logger, MareMediator mediator, CharacterAnalyzer characterAnalyzer, IpcManager ipcManager, PerformanceCollectorService performanceCollectorService) + : base(logger, mediator, "Mare Character Data Analysis", performanceCollectorService) { _characterAnalyzer = characterAnalyzer; _ipcManager = ipcManager; @@ -56,7 +57,7 @@ public class DataAnalysisUi : WindowMediatorSubscriberBase _conversionProgress.ProgressChanged += ConversionProgress_ProgressChanged; } - public override void Draw() + protected override void DrawInternal() { if (_conversionTask != null && !_conversionTask.IsCompleted) { @@ -333,7 +334,7 @@ public class DataAnalysisUi : WindowMediatorSubscriberBase private void DrawTable(IGrouping fileGroup) { - using var table = ImRaii.Table("Analysis", string.Equals(fileGroup.Key, "tex", StringComparison.Ordinal) ? + using var table = ImRaii.Table("Analysis", string.Equals(fileGroup.Key, "tex", StringComparison.Ordinal) ? (_enableBc7ConversionMode ? 7 : 6) : 5, ImGuiTableFlags.Sortable | ImGuiTableFlags.RowBg | ImGuiTableFlags.ScrollY | ImGuiTableFlags.SizingFixedFit, new Vector2(0, 300)); if (!table.Success) return; diff --git a/MareSynchronos/UI/DownloadUi.cs b/MareSynchronos/UI/DownloadUi.cs index 227765a..d2060f2 100644 --- a/MareSynchronos/UI/DownloadUi.cs +++ b/MareSynchronos/UI/DownloadUi.cs @@ -22,7 +22,8 @@ public class DownloadUi : WindowMediatorSubscriberBase private readonly ConcurrentDictionary _uploadingPlayers = new(); public DownloadUi(ILogger logger, DalamudUtilService dalamudUtilService, MareConfigService configService, - FileUploadManager fileTransferManager, MareMediator mediator, UiSharedService uiShared) : base(logger, mediator, "Mare Synchronos Downloads") + FileUploadManager fileTransferManager, MareMediator mediator, UiSharedService uiShared, PerformanceCollectorService performanceCollectorService) + : base(logger, mediator, "Mare Synchronos Downloads", performanceCollectorService) { _dalamudUtilService = dalamudUtilService; _configService = configService; @@ -66,7 +67,7 @@ public class DownloadUi : WindowMediatorSubscriberBase }); } - public override void Draw() + protected override void DrawInternal() { if (_configService.Current.ShowTransferWindow) { diff --git a/MareSynchronos/UI/EditProfileUi.cs b/MareSynchronos/UI/EditProfileUi.cs index d3d03dc..60951da 100644 --- a/MareSynchronos/UI/EditProfileUi.cs +++ b/MareSynchronos/UI/EditProfileUi.cs @@ -32,7 +32,9 @@ public class EditProfileUi : WindowMediatorSubscriberBase public EditProfileUi(ILogger logger, MareMediator mediator, ApiController apiController, UiBuilder uiBuilder, UiSharedService uiSharedService, - FileDialogManager fileDialogManager, MareProfileManager mareProfileManager) : base(logger, mediator, "Mare Synchronos Edit Profile###MareSynchronosEditProfileUI") + FileDialogManager fileDialogManager, MareProfileManager mareProfileManager, + PerformanceCollectorService performanceCollectorService) + : base(logger, mediator, "Mare Synchronos Edit Profile###MareSynchronosEditProfileUI", performanceCollectorService) { IsOpen = false; this.SizeConstraints = new() @@ -59,7 +61,7 @@ public class EditProfileUi : WindowMediatorSubscriberBase }); } - public override void Draw() + protected override void DrawInternal() { _uiSharedService.BigText("Current Profile (as saved on server)"); diff --git a/MareSynchronos/UI/EventViewerUI.cs b/MareSynchronos/UI/EventViewerUI.cs index d94f1a9..0ccd88e 100644 --- a/MareSynchronos/UI/EventViewerUI.cs +++ b/MareSynchronos/UI/EventViewerUI.cs @@ -2,6 +2,7 @@ using Dalamud.Interface.Colors; using Dalamud.Interface.Utility.Raii; using ImGuiNET; +using MareSynchronos.Services; using MareSynchronos.Services.Events; using MareSynchronos.Services.Mediator; using Microsoft.Extensions.Logging; @@ -37,7 +38,8 @@ internal class EventViewerUI : WindowMediatorSubscriberBase } public EventViewerUI(ILogger logger, MareMediator mediator, - EventAggregator eventAggregator, UiSharedService uiSharedService) : base(logger, mediator, "Event Viewer") + EventAggregator eventAggregator, UiSharedService uiSharedService, PerformanceCollectorService performanceCollectorService) + : base(logger, mediator, "Event Viewer", performanceCollectorService) { _eventAggregator = eventAggregator; _uiSharedService = uiSharedService; @@ -94,7 +96,7 @@ internal class EventViewerUI : WindowMediatorSubscriberBase ClearFilters(); } - public override void Draw() + protected override void DrawInternal() { using (ImRaii.Disabled(!_eventAggregator.NewEventsAvailable)) { diff --git a/MareSynchronos/UI/GposeUi.cs b/MareSynchronos/UI/GposeUi.cs index 9c92b52..43b3042 100644 --- a/MareSynchronos/UI/GposeUi.cs +++ b/MareSynchronos/UI/GposeUi.cs @@ -20,7 +20,8 @@ public class GposeUi : WindowMediatorSubscriberBase public GposeUi(ILogger logger, MareCharaFileManager mareCharaFileManager, DalamudUtilService dalamudUtil, FileDialogManager fileDialogManager, MareConfigService configService, - MareMediator mediator) : base(logger, mediator, "Mare Synchronos Gpose Import UI###MareSynchronosGposeUI") + MareMediator mediator, PerformanceCollectorService performanceCollectorService) + : base(logger, mediator, "Mare Synchronos Gpose Import UI###MareSynchronosGposeUI", performanceCollectorService) { _mareCharaFileManager = mareCharaFileManager; _dalamudUtil = dalamudUtil; @@ -37,7 +38,7 @@ public class GposeUi : WindowMediatorSubscriberBase }; } - public override void Draw() + protected override void DrawInternal() { if (!_dalamudUtil.IsInGpose) IsOpen = false; diff --git a/MareSynchronos/UI/IntroUI.cs b/MareSynchronos/UI/IntroUI.cs index fe45c07..f87fb48 100644 --- a/MareSynchronos/UI/IntroUI.cs +++ b/MareSynchronos/UI/IntroUI.cs @@ -6,6 +6,7 @@ using MareSynchronos.FileCache; using MareSynchronos.Localization; using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration.Models; +using MareSynchronos.Services; using MareSynchronos.Services.Mediator; using MareSynchronos.Services.ServerConfiguration; using Microsoft.Extensions.Logging; @@ -29,7 +30,8 @@ public class IntroUi : WindowMediatorSubscriberBase private string[]? _tosParagraphs; public IntroUi(ILogger logger, UiSharedService uiShared, MareConfigService configService, - CacheMonitor fileCacheManager, ServerConfigurationManager serverConfigurationManager, MareMediator mareMediator) : base(logger, mareMediator, "Mare Synchronos Setup") + CacheMonitor fileCacheManager, ServerConfigurationManager serverConfigurationManager, MareMediator mareMediator, + PerformanceCollectorService performanceCollectorService) : base(logger, mareMediator, "Mare Synchronos Setup", performanceCollectorService) { _uiShared = uiShared; _configService = configService; @@ -56,7 +58,7 @@ public class IntroUi : WindowMediatorSubscriberBase }); } - public override void Draw() + protected override void DrawInternal() { if (_uiShared.IsInGpose) return; diff --git a/MareSynchronos/UI/JoinSyncshellUI.cs b/MareSynchronos/UI/JoinSyncshellUI.cs index 2aeb9d2..47d5b4d 100644 --- a/MareSynchronos/UI/JoinSyncshellUI.cs +++ b/MareSynchronos/UI/JoinSyncshellUI.cs @@ -6,6 +6,7 @@ using MareSynchronos.API.Data.Enum; using MareSynchronos.API.Data.Extensions; using MareSynchronos.API.Dto; using MareSynchronos.API.Dto.Group; +using MareSynchronos.Services; using MareSynchronos.Services.Mediator; using MareSynchronos.Utils; using MareSynchronos.WebAPI; @@ -24,7 +25,8 @@ internal class JoinSyncshellUI : WindowMediatorSubscriberBase private string _syncshellPassword = string.Empty; public JoinSyncshellUI(ILogger logger, MareMediator mediator, - UiSharedService uiSharedService, ApiController apiController) : base(logger, mediator, "Join existing Syncshell###MareSynchronosJoinSyncshell") + UiSharedService uiSharedService, ApiController apiController, PerformanceCollectorService performanceCollectorService) + : base(logger, mediator, "Join existing Syncshell###MareSynchronosJoinSyncshell", performanceCollectorService) { _uiSharedService = uiSharedService; _apiController = apiController; @@ -48,7 +50,7 @@ internal class JoinSyncshellUI : WindowMediatorSubscriberBase _ownPermissions = _apiController.DefaultPermissions.DeepClone()!; } - public override void Draw() + protected override void DrawInternal() { using (ImRaii.PushFont(_uiSharedService.UidFont)) ImGui.TextUnformatted(_groupJoinInfo == null || !_groupJoinInfo.Success ? "Join Syncshell" : "Finalize join Syncshell " + _groupJoinInfo.GroupAliasOrGID); diff --git a/MareSynchronos/UI/PermissionWindowUI.cs b/MareSynchronos/UI/PermissionWindowUI.cs index 99a5b99..992d656 100644 --- a/MareSynchronos/UI/PermissionWindowUI.cs +++ b/MareSynchronos/UI/PermissionWindowUI.cs @@ -4,6 +4,7 @@ using ImGuiNET; using MareSynchronos.API.Data.Enum; using MareSynchronos.API.Data.Extensions; using MareSynchronos.PlayerData.Pairs; +using MareSynchronos.Services; using MareSynchronos.Services.Mediator; using MareSynchronos.Utils; using MareSynchronos.WebAPI; @@ -20,7 +21,8 @@ public class PermissionWindowUI : WindowMediatorSubscriberBase private UserPermissions _ownPermissions; public PermissionWindowUI(ILogger logger, Pair pair, MareMediator mediator, UiSharedService uiSharedService, - ApiController apiController) : base(logger, mediator, "Permissions for " + pair.UserData.AliasOrUID + "###MareSynchronosPermissions" + pair.UserData.UID) + ApiController apiController, PerformanceCollectorService performanceCollectorService) + : base(logger, mediator, "Permissions for " + pair.UserData.AliasOrUID + "###MareSynchronosPermissions" + pair.UserData.UID, performanceCollectorService) { Pair = pair; _uiSharedService = uiSharedService; @@ -35,7 +37,7 @@ public class PermissionWindowUI : WindowMediatorSubscriberBase IsOpen = true; } - public override void Draw() + protected override void DrawInternal() { var sticky = _ownPermissions.IsSticky(); var paused = _ownPermissions.IsPaused(); diff --git a/MareSynchronos/UI/PopoutProfileUi.cs b/MareSynchronos/UI/PopoutProfileUi.cs index 48bcfd6..74c46b2 100644 --- a/MareSynchronos/UI/PopoutProfileUi.cs +++ b/MareSynchronos/UI/PopoutProfileUi.cs @@ -31,7 +31,7 @@ public class PopoutProfileUi : WindowMediatorSubscriberBase public PopoutProfileUi(ILogger logger, MareMediator mediator, UiSharedService uiBuilder, ServerConfigurationManager serverManager, MareConfigService mareConfigService, - MareProfileManager mareProfileManager, PairManager pairManager) : base(logger, mediator, "###MareSynchronosPopoutProfileUI") + MareProfileManager mareProfileManager, PairManager pairManager, PerformanceCollectorService performanceCollectorService) : base(logger, mediator, "###MareSynchronosPopoutProfileUI", performanceCollectorService) { _uiSharedService = uiBuilder; _serverManager = serverManager; @@ -79,7 +79,7 @@ public class PopoutProfileUi : WindowMediatorSubscriberBase IsOpen = false; } - public override void Draw() + protected override void DrawInternal() { if (_pair == null) return; diff --git a/MareSynchronos/UI/SettingsUi.cs b/MareSynchronos/UI/SettingsUi.cs index 12c451b..f951709 100644 --- a/MareSynchronos/UI/SettingsUi.cs +++ b/MareSynchronos/UI/SettingsUi.cs @@ -68,7 +68,7 @@ public class SettingsUi : WindowMediatorSubscriberBase FileTransferOrchestrator fileTransferOrchestrator, FileCacheManager fileCacheManager, FileCompactor fileCompactor, ApiController apiController, - IpcManager ipcManager, CacheMonitor cacheMonitor) : base(logger, mediator, "Mare Synchronos Settings") + IpcManager ipcManager, CacheMonitor cacheMonitor) : base(logger, mediator, "Mare Synchronos Settings", performanceCollector) { _configService = configService; _mareCharaFileManager = mareCharaFileManager; @@ -105,7 +105,7 @@ public class SettingsUi : WindowMediatorSubscriberBase public CharacterData? LastCreatedCharacterData { private get; set; } private ApiController ApiController => _uiShared.ApiController; - public override void Draw() + protected override void DrawInternal() { _ = _uiShared.DrawOtherPluginState(); diff --git a/MareSynchronos/UI/StandaloneProfileUi.cs b/MareSynchronos/UI/StandaloneProfileUi.cs index e84abb5..301e898 100644 --- a/MareSynchronos/UI/StandaloneProfileUi.cs +++ b/MareSynchronos/UI/StandaloneProfileUi.cs @@ -27,8 +27,9 @@ public class StandaloneProfileUi : WindowMediatorSubscriberBase private IDalamudTextureWrap? _textureWrap; public StandaloneProfileUi(ILogger logger, MareMediator mediator, UiSharedService uiBuilder, - ServerConfigurationManager serverManager, MareProfileManager mareProfileManager, PairManager pairManager, Pair pair) - : base(logger, mediator, "Mare Profile of " + pair.UserData.AliasOrUID + "##MareSynchronosStandaloneProfileUI" + pair.UserData.AliasOrUID) + ServerConfigurationManager serverManager, MareProfileManager mareProfileManager, PairManager pairManager, Pair pair, + PerformanceCollectorService performanceCollector) + : base(logger, mediator, "Mare Profile of " + pair.UserData.AliasOrUID + "##MareSynchronosStandaloneProfileUI" + pair.UserData.AliasOrUID, performanceCollector) { _uiSharedService = uiBuilder; _serverManager = serverManager; @@ -46,7 +47,7 @@ public class StandaloneProfileUi : WindowMediatorSubscriberBase public Pair Pair { get; init; } - public override void Draw() + protected override void DrawInternal() { try { diff --git a/MareSynchronos/UI/SyncshellAdminUI.cs b/MareSynchronos/UI/SyncshellAdminUI.cs index cf4ccad..211fb54 100644 --- a/MareSynchronos/UI/SyncshellAdminUI.cs +++ b/MareSynchronos/UI/SyncshellAdminUI.cs @@ -7,6 +7,7 @@ using MareSynchronos.API.Data.Enum; using MareSynchronos.API.Data.Extensions; using MareSynchronos.API.Dto.Group; using MareSynchronos.PlayerData.Pairs; +using MareSynchronos.Services; using MareSynchronos.Services.Mediator; using MareSynchronos.WebAPI; using Microsoft.Extensions.Logging; @@ -31,8 +32,8 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase private int _pruneDays = 14; public SyncshellAdminUI(ILogger logger, MareMediator mediator, ApiController apiController, - UiSharedService uiSharedService, PairManager pairManager, GroupFullInfoDto groupFullInfo) - : base(logger, mediator, "Syncshell Admin Panel (" + groupFullInfo.GroupAliasOrGID + ")") + UiSharedService uiSharedService, PairManager pairManager, GroupFullInfoDto groupFullInfo, PerformanceCollectorService performanceCollectorService) + : base(logger, mediator, "Syncshell Admin Panel (" + groupFullInfo.GroupAliasOrGID + ")", performanceCollectorService) { GroupFullInfo = groupFullInfo; _apiController = apiController; @@ -53,7 +54,7 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase public GroupFullInfoDto GroupFullInfo { get; private set; } - public override void Draw() + protected override void DrawInternal() { if (!_isModerator && !_isOwner) return;