journal-bot/tools/JournalBot.Tray/App.xaml.cs

89 lines
2.9 KiB
C#

using System.IO;
using System.Windows;
using Hardcodet.Wpf.TaskbarNotification;
using JournalBot.Shared;
using Microsoft.Extensions.Configuration;
namespace JournalBot.Tray;
public partial class App : Application
{
private TaskbarIcon? _tray;
private MainWindow? _window;
private BotRunner _runner = null!;
private RuntimeReader _reader = null!;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var config = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false)
.Build();
var py = config["JournalBot:PythonExe"]!;
var workingDir = config["JournalBot:WorkingDir"]!;
var runtimePath = config["JournalBot:RuntimePath"]!;
_runner = new BotRunner(py, workingDir);
_reader = new RuntimeReader(runtimePath);
_window = new MainWindow(_runner, _reader);
_tray = new TaskbarIcon { ToolTipText = "JournalBot" };
try
{
// icon.ico is embedded as a WPF Resource (see .csproj), so load it
// from the resource stream — not the filesystem, which would fail
// because no icon.ico is copied next to the EXE.
var uri = new Uri("pack://application:,,,/icon.ico", UriKind.Absolute);
using var stream = Application.GetResourceStream(uri).Stream;
_tray.Icon = new System.Drawing.Icon(stream);
}
catch (Exception ex)
{
// Missing/corrupt icon must not prevent startup; tray still works.
// Don't swallow silently — a blank tray icon is otherwise a mystery.
System.Diagnostics.Debug.WriteLine($"Tray icon load failed: {ex}");
}
_tray.TrayLeftMouseUp += (_, _) => ToggleWindow();
_tray.ContextMenu = BuildMenu();
}
private System.Windows.Controls.ContextMenu BuildMenu()
{
var menu = new System.Windows.Controls.ContextMenu();
void Add(string header, Action onClick)
{
var mi = new System.Windows.Controls.MenuItem { Header = header };
mi.Click += (_, _) => onClick();
menu.Items.Add(mi);
}
Add("Ingest", () => _window!.TriggerCommand("ingest"));
Add("Process", () => _window!.TriggerCommand("process"));
Add("Both", () => _window!.TriggerCommand("both"));
menu.Items.Add(new System.Windows.Controls.Separator());
Add("Fenster öffnen", ShowWindow);
Add("Beenden", () => Shutdown());
return menu;
}
private void ToggleWindow()
{
if (_window!.IsVisible) _window.Hide();
else ShowWindow();
}
private void ShowWindow()
{
_window!.Show();
_window.Activate();
}
protected override void OnExit(ExitEventArgs e)
{
_tray?.Dispose();
base.OnExit(e);
}
}