You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Lidarr/src/NzbDrone/SysTray/SysTrayApp.cs

137 lines
3.5 KiB

using System;
using System.ComponentModel;
using System.Windows.Forms;
using NLog;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Processes;
using NzbDrone.Host;
namespace NzbDrone.SysTray
{
public interface ISystemTrayApp
{
void Start();
}
public class SystemTrayApp : Form, ISystemTrayApp
{
private readonly IBrowserService _browserService;
private readonly IRuntimeInfo _runtimeInfo;
private readonly IProcessProvider _processProvider;
private readonly NotifyIcon _trayIcon = new NotifyIcon();
private readonly ContextMenuStrip _trayMenu = new ContextMenuStrip();
public SystemTrayApp(IBrowserService browserService, IRuntimeInfo runtimeInfo, IProcessProvider processProvider)
{
_browserService = browserService;
_runtimeInfo = runtimeInfo;
_processProvider = processProvider;
}
public void Start()
{
Application.ThreadException += OnThreadException;
Application.ApplicationExit += OnApplicationExit;
_trayMenu.Items.Add(new ToolStripMenuItem("Launch Browser", null, LaunchBrowser));
_trayMenu.Items.Add(new ToolStripMenuItem("-"));
_trayMenu.Items.Add(new ToolStripMenuItem("Exit", null, OnExit));
_trayIcon.Text = string.Format("Lidarr - {0}", BuildInfo.Version);
_trayIcon.Icon = Properties.Resources.NzbDroneIcon;
_trayIcon.ContextMenuStrip = _trayMenu;
_trayIcon.Visible = true;
_trayIcon.DoubleClick += LaunchBrowser;
Application.Run(this);
}
protected override void OnClosing(CancelEventArgs e)
{
DisposeTrayIcon();
}
protected override void OnClosed(EventArgs e)
{
Console.WriteLine("Closing");
base.OnClosed(e);
}
protected override void OnLoad(EventArgs e)
{
Visible = false;
ShowInTaskbar = false;
base.OnLoad(e);
}
protected override void Dispose(bool isDisposing)
{
if (isDisposing)
{
_trayIcon.Dispose();
}
if (InvokeRequired)
{
base.Invoke(new MethodInvoker(() => Dispose(isDisposing)));
}
else
{
base.Dispose(isDisposing);
}
}
private void OnExit(object sender, EventArgs e)
{
LogManager.Configuration = null;
Environment.Exit(0);
}
private void LaunchBrowser(object sender, EventArgs e)
{
try
{
_browserService.LaunchWebUI();
}
catch (Exception)
{
}
}
private void OnApplicationExit(object sender, EventArgs e)
{
if (_runtimeInfo.RestartPending)
{
_processProvider.SpawnNewProcess(_runtimeInfo.ExecutingApplication, "--restart --nobrowser");
}
DisposeTrayIcon();
}
private void OnThreadException(object sender, EventArgs e)
{
DisposeTrayIcon();
}
private void DisposeTrayIcon()
{
try
{
_trayIcon.Visible = false;
_trayIcon.Icon = null;
_trayIcon.Visible = false;
_trayIcon.Dispose();
}
catch (Exception)
{
}
}
}
}