SoraV2Utils/SoraV2Utils_Agent/TrayIconForm.cs

95 lines
3.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
using System.Threading;
namespace SoraV2Utils_Agent
{
public class TrayIconForm
{
public TrayIconForm()
{
// Create a NotifyIcon instance
using (NotifyIcon trayIcon = new NotifyIcon())
{
// Set up the tray icon properties
trayIcon.Icon = new Icon(DynamicIcon.CreateIcon("##",Color.Red, SystemFonts.IconTitleFont), 40, 40); // Choose your own icon
trayIcon.Visible = true;
// Create a context menu
var contextMenu = new ContextMenu();
// Add a non-clickable dynamic text item
var batteryLevelItem = new MenuItem("Battery Level: Loading...");
var batteryRuntimeItem = new MenuItem("Battery Runtime: Loading...");
batteryLevelItem.Enabled = false;
batteryRuntimeItem.Enabled = false;
contextMenu.MenuItems.Add("Exit", (sender, e) => ServiceIPC.Instance.Exit());
contextMenu.MenuItems.Add("Check for Update ", (sender, e) => UpdateCheck.CheckUpdate());
contextMenu.MenuItems.Add(batteryLevelItem);
contextMenu.MenuItems.Add(batteryRuntimeItem);
trayIcon.ContextMenu = contextMenu;
// Update the dynamic text in the context menu
ThreadPool.QueueUserWorkItem(state =>
{
while (true)
{
// Format battery level with charging status
string batteryLevelText = ServiceIPC.DeviceStatus.Charging == 1
? $"Battery Level: {ServiceIPC.DeviceStatus.Battery} (Charging...)"
: $"Battery Level: {ServiceIPC.DeviceStatus.Battery}";
// Format battery runtime (convert minutes to hours and minutes)
string batteryRuntimeText = FormatBatteryRuntime(ServiceIPC.BatteryRuntime);
// Update the context menu items
batteryLevelItem.Text = batteryLevelText;
batteryRuntimeItem.Text = $"Battery Runtime: {batteryRuntimeText}";
batteryRuntimeItem.Text = $"Battery Runtime: {batteryRuntimeText}";
trayIcon.Icon = new Icon(DynamicIcon.CreateIcon(ServiceIPC.DeviceStatus.Battery.ToString(), Color.White, new Font("Arial",32)), 32, 32);
// Update every second
Thread.Sleep(1000);
}
});
Application.Run();
}
}
// Formats the runtime in hours and minutes.
private string FormatBatteryRuntime(double runtimeInMinutes)
{
if(runtimeInMinutes < 0)
{
return "No data yet";
}
int hours = (int)(runtimeInMinutes / 60);
int minutes = (int)(runtimeInMinutes % 60);
// If runtime is greater than 1 hour, display hours and minutes
if (hours > 0)
{
return $"{hours} hour{(hours > 1 ? "s" : "")} {minutes} minute{(minutes > 1 ? "s" : "")}";
}
else
{
return $"{minutes} minute{(minutes > 1 ? "s" : "")}";
}
}
public void Display()
{
}
}
}