Files
orderPRO/clients/windows/OrderPROPrint/TrayApplicationContext.cs
Jacek Pyziak 5fef42ba12 feat(20-windows-client): aplikacja C# WinForms do zdalnego druku etykiet
- System tray app z NotifyIcon + ContextMenuStrip
- Polling API orderPRO (GET /api/print/jobs/pending)
- Pobieranie etykiet PDF i druk przez PdfiumViewer
- Formularz ustawień: URL API, klucz, drukarka, interwał
- Okno logów z historią (ciemny motyw, Consolas)
- Self-contained .NET 8 publish (win-x64)
- Milestone v0.7 Zdalne drukowanie etykiet — COMPLETE

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 22:49:28 +01:00

175 lines
4.8 KiB
C#

using OrderPROPrint.Forms;
using OrderPROPrint.Models;
using OrderPROPrint.Services;
namespace OrderPROPrint;
public class TrayApplicationContext : ApplicationContext
{
private readonly NotifyIcon _trayIcon;
private readonly ToolStripMenuItem _pauseMenuItem;
private readonly SynchronizationContext _syncContext;
private PollingService? _pollingService;
private AppSettings _settings;
private bool _isPaused;
private bool _isDisposed;
public TrayApplicationContext()
{
_syncContext = SynchronizationContext.Current ?? new SynchronizationContext();
_settings = AppSettings.Load();
_pauseMenuItem = new ToolStripMenuItem("Wstrzymaj", null, OnPauseToggle);
var contextMenu = new ContextMenuStrip();
contextMenu.Items.Add("Ustawienia", null, OnSettings);
contextMenu.Items.Add("Logi", null, OnLogs);
contextMenu.Items.Add(_pauseMenuItem);
contextMenu.Items.Add(new ToolStripSeparator());
contextMenu.Items.Add("O programie", null, OnAbout);
contextMenu.Items.Add("Zamknij", null, OnExit);
_trayIcon = new NotifyIcon
{
Icon = SystemIcons.Application,
Text = "OrderPRO Print — Oczekiwanie",
ContextMenuStrip = contextMenu,
Visible = true
};
_trayIcon.DoubleClick += OnSettings;
if (_settings.IsConfigured)
{
StartPolling();
}
else
{
_trayIcon.ShowBalloonTip(3000, "OrderPRO Print", "Skonfiguruj połączenie w Ustawieniach.", ToolTipIcon.Info);
}
}
private void StartPolling()
{
_pollingService?.Stop();
var apiClient = new PrintApiClient(_settings.ApiUrl, _settings.ApiKey);
var printService = new PrintService();
_pollingService = new PollingService(
apiClient,
printService,
_settings.PrinterName,
_settings.PollIntervalSeconds,
OnStatusUpdate,
OnError
);
_pollingService.Start();
_isPaused = false;
_pauseMenuItem.Text = "Wstrzymaj";
SetNormalState();
}
private void OnStatusUpdate(string message)
{
LogForm.Log(message);
if (_isDisposed) return;
_syncContext.Post(_ =>
{
if (_isDisposed) return;
_trayIcon.Text = TruncateTooltip($"OrderPRO Print — {message}");
_trayIcon.Icon = SystemIcons.Application;
}, null);
}
private void OnError(string message)
{
LogForm.Log($"BŁĄD: {message}");
if (_isDisposed) return;
_syncContext.Post(_ =>
{
if (_isDisposed) return;
_trayIcon.Text = TruncateTooltip($"OrderPRO Print — Błąd: {message}");
_trayIcon.Icon = SystemIcons.Error;
}, null);
}
private void OnLogs(object? sender, EventArgs e)
{
LogForm.ShowInstance();
}
private void SetNormalState()
{
_trayIcon.Icon = SystemIcons.Application;
_trayIcon.Text = "OrderPRO Print — Aktywne";
}
private void OnSettings(object? sender, EventArgs e)
{
using var form = new SettingsForm(_settings);
if (form.ShowDialog() == DialogResult.OK)
{
_settings = AppSettings.Load();
if (_settings.IsConfigured)
{
StartPolling();
}
}
}
private void OnPauseToggle(object? sender, EventArgs e)
{
if (_pollingService == null) return;
if (_isPaused)
{
_pollingService.Start();
_isPaused = false;
_pauseMenuItem.Text = "Wstrzymaj";
SetNormalState();
}
else
{
_pollingService.Stop();
_isPaused = true;
_pauseMenuItem.Text = "Wznów";
_trayIcon.Text = "OrderPRO Print — Wstrzymane";
}
}
private void OnAbout(object? sender, EventArgs e)
{
MessageBox.Show(
"OrderPRO Print v1.0\n\nKlient zdalnego drukowania etykiet.\nPobiera zlecenia z orderPRO i drukuje na drukarce termicznej.",
"O programie",
MessageBoxButtons.OK,
MessageBoxIcon.Information
);
}
private void OnExit(object? sender, EventArgs e)
{
_pollingService?.Stop();
_trayIcon.Visible = false;
_trayIcon.Dispose();
Application.Exit();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_isDisposed = true;
_pollingService?.Stop();
_trayIcon.Visible = false;
_trayIcon.Dispose();
}
base.Dispose(disposing);
}
private static string TruncateTooltip(string text)
{
return text.Length > 63 ? text[..63] : text;
}
}