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