- 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>
175 lines
4.8 KiB
C#
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;
|
|
}
|
|
}
|