using SkiaSharp; using System; using System.Collections.Generic; using System.Linq; using Ryujinx.Graphics.Gpu.Image; using Ryujinx.Graphics.Gpu; namespace Ryujinx.UI.Overlay { /// /// Manages multiple overlays and handles rendering /// public class OverlayManager : IOverlayManager { private readonly List _overlays = new(); private readonly object _lock = new(); /// /// Add an overlay to the manager /// public void AddOverlay(IOverlay overlay) { lock (_lock) { _overlays.Add(overlay); SortOverlays(); } } /// /// Remove an overlay from the manager /// public void RemoveOverlay(Overlay overlay) { lock (_lock) { _overlays.Remove(overlay); } } /// /// Remove overlay by name /// public void RemoveOverlay(string name) { lock (_lock) { var overlay = _overlays.FirstOrDefault(o => o.Name == name); if (overlay != null) { _overlays.Remove(overlay); overlay.Dispose(); } } } /// /// Find overlay by name /// public IOverlay FindOverlay(string name) { lock (_lock) { return _overlays.FirstOrDefault(o => o.Name == name); } } /// /// Get all overlays /// public IReadOnlyList GetOverlays() { lock (_lock) { return _overlays.AsReadOnly(); } } /// /// Clear all overlays /// public void Clear() { lock (_lock) { foreach (var overlay in _overlays) { overlay.Dispose(); } _overlays.Clear(); } } /// /// Update all overlays (for animations) /// public void Update(float deltaTime, SKSize screenSize = default) { lock (_lock) { foreach (var overlay in _overlays.Where(o => o.IsVisible)) { overlay.Update(deltaTime, screenSize); } } } /// /// Render all visible overlays /// public void Render(SKCanvas canvas) { lock (_lock) { foreach (var overlay in _overlays.Where(o => o.IsVisible && o.Opacity > 0.0f)) { overlay.Render(canvas); } } } /// /// Sort overlays by Z-index /// private void SortOverlays() { _overlays.Sort((a, b) => a.ZIndex.CompareTo(b.ZIndex)); } /// /// Show overlay /// public void ShowOverlay(string name) { var overlay = FindOverlay(name); if (overlay != null) { overlay.IsVisible = true; overlay.Opacity = 1.0f; } } /// /// Hide overlay /// public void HideOverlay(string name) { var overlay = FindOverlay(name); if (overlay != null) { overlay.IsVisible = false; overlay.Opacity = 0.0f; } } public void Dispose() { Clear(); } } }