47 lines
1.6 KiB
C#
47 lines
1.6 KiB
C#
using System.Drawing.Drawing2D;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Zcbot.WindowsNode;
|
|
|
|
internal static class TrayIconFactory
|
|
{
|
|
internal static Icon Create(NodeState state)
|
|
{
|
|
var color = state switch
|
|
{
|
|
NodeState.Online => Color.FromArgb(34, 197, 94),
|
|
NodeState.Connecting => Color.FromArgb(245, 158, 11),
|
|
NodeState.NotRegistered or NodeState.AuthenticationRequired => Color.FromArgb(239, 68, 68),
|
|
_ => Color.FromArgb(107, 114, 128),
|
|
};
|
|
using var bitmap = new Bitmap(32, 32);
|
|
using var graphics = Graphics.FromImage(bitmap);
|
|
graphics.SmoothingMode = SmoothingMode.AntiAlias;
|
|
graphics.Clear(Color.Transparent);
|
|
using var background = new SolidBrush(Color.FromArgb(30, 41, 59));
|
|
using var badge = new SolidBrush(color);
|
|
using var textBrush = new SolidBrush(Color.White);
|
|
graphics.FillEllipse(background, 1, 1, 30, 30);
|
|
using var font = new Font("Segoe UI", 13, FontStyle.Bold, GraphicsUnit.Pixel);
|
|
graphics.DrawString("Z", font, textBrush, new PointF(8, 7));
|
|
graphics.FillEllipse(badge, 20, 20, 11, 11);
|
|
using var border = new Pen(Color.White, 2);
|
|
graphics.DrawEllipse(border, 20, 20, 11, 11);
|
|
|
|
var handle = bitmap.GetHicon();
|
|
try
|
|
{
|
|
using var icon = Icon.FromHandle(handle);
|
|
return (Icon)icon.Clone();
|
|
}
|
|
finally
|
|
{
|
|
DestroyIcon(handle);
|
|
}
|
|
}
|
|
|
|
[DllImport("user32.dll")]
|
|
[return: MarshalAs(UnmanagedType.Bool)]
|
|
private static extern bool DestroyIcon(nint handle);
|
|
}
|