emo-client/Saradomin/View/Windows/NotificationBox.axaml.cs

87 lines
2.5 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Avalonia;
using Avalonia.Controls;
using Glitonea.Controls;
using Glitonea.Extensions;
using PropertyChanged;
using Saradomin.Infrastructure;
namespace Saradomin.View.Windows
{
[DoNotNotify]
public partial class NotificationBox : WindowEx
{
private static Queue<NotificationBox> _notificationQueue = new();
public static NotificationBox Current { get; private set; }
public static readonly StyledProperty<string> MessageProperty = AvaloniaProperty.Register<NotificationBox, string>(
nameof(Message),
"This is supposed to be a message.\n" +
"Someone messed up, though, so have this placeholder instead."
);
public string Message
{
get => GetValue(MessageProperty);
set => SetValue(MessageProperty, value);
}
public NotificationBox()
{
InitializeComponent();
}
private NotificationBox(string title, string message)
: this()
{
Title = title;
Message = message;
}
public static void DisplayNotification(string message)
=> DisplayNotification("Notification", message);
public static void DisplayNotification(string title, string message)
=> DisplayNotification(title, message, Application.Current.GetMainWindow());
public static void DisplayNotification(string title, string message, Window owner)
{
var box = new NotificationBox(title, message) { Owner = owner };
if (Current != null)
{
_notificationQueue.Enqueue(box);
Current.Activate();
}
else
{
Current = box;
Current.ShowDialog(owner);
new NotificationBoxStateChangedMessage(true)
.Broadcast();
}
}
public new void Close()
{
if (Current != null)
{
Current = null;
base.Close();
new NotificationBoxStateChangedMessage(false)
.Broadcast();
}
if (_notificationQueue.Any())
{
Current = _notificationQueue.Dequeue();
Current.ShowDialog(Current.Owner as Window);
new NotificationBoxStateChangedMessage(true)
.Broadcast();
}
}
}
}