- Implement ThemeManager for dynamic light/dark theme switching in the application. - Create Wait class for cancellable delays without exceptions for smoother user experience. - Introduce WatchedProductsStore to manage and persist watched products in JSON format. - Add WindowsNotifier for system notifications to inform users of important events. - Develop ProductViewModel to encapsulate product data and manage UI interactions effectively.
79 lines
3.4 KiB
C#
79 lines
3.4 KiB
C#
using System;
|
|
using System.Windows;
|
|
using AutoBidder.Utilities;
|
|
|
|
namespace AutoBidder
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for App.xaml
|
|
/// </summary>
|
|
public partial class App : Application
|
|
{
|
|
protected override void OnStartup(StartupEventArgs e)
|
|
{
|
|
base.OnStartup(e);
|
|
|
|
// Le descrizioni delle impostazioni vivono nei suggerimenti invece che stampate
|
|
// sotto ogni campo. Quello predefinito di Windows sparisce dopo cinque secondi:
|
|
// per un paragrafo di tre righe significa doverlo rincorrere.
|
|
System.Windows.Controls.ToolTipService.ShowDurationProperty.OverrideMetadata(
|
|
typeof(DependencyObject), new FrameworkPropertyMetadata(60000));
|
|
|
|
// I percorsi vanno decisi per primi: da qui in poi ogni archivio li usa.
|
|
// Le impostazioni stanno nella radice fissa, quindi si possono leggere anche
|
|
// prima di sapere dove finiranno gli altri dati.
|
|
var settings = SettingsManager.Load();
|
|
AppPaths.Configure(settings.DataFolder, settings.StatsFolder, settings.LogFolder);
|
|
AppPaths.EnsureFolders();
|
|
|
|
// Le versioni precedenti scrivevano parte dei dati in Roaming e parte in Local,
|
|
// senza sottocartelle: senza questo passaggio storico e aste sparirebbero.
|
|
AppPaths.MigrateLegacyFiles();
|
|
|
|
// I registri su file partono subito: quello che succede durante l'avvio è
|
|
// proprio ciò che non si riesce a leggere a video.
|
|
TextLogService.SessionStarted(AppInfo.Version);
|
|
TextLogService.PurgeOldLogs();
|
|
|
|
// Le righe di registro delle aste confluiscono nei rispettivi dossier.
|
|
AuctionDossier.CaptureAuctionLogs();
|
|
|
|
// Lo storico e' cresciuto per mesi con versioni diverse dell'applicazione:
|
|
// alcuni record hanno campi che allora non esistevano. Quelli deducibili si
|
|
// ricalcolano qui, una volta, prima che qualcuno li legga. Quelli NON
|
|
// deducibili non si toccano: se ne occupa la pulizia, che chiede all'utente.
|
|
try
|
|
{
|
|
var repair = CompletedAuctionsStore.RepairOnStartup();
|
|
if (repair.AnythingDone)
|
|
{
|
|
TextLogService.App("INFO", $"[STORICO] Riparati {repair.Total} campi mancanti " +
|
|
$"(chiavi prodotto {repair.ProductKeys}, esiti {repair.Outcomes}, " +
|
|
$"nomi {repair.Names})");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TextLogService.App("WARN", $"[STORICO] Riparazione non riuscita: {ex.Message}");
|
|
}
|
|
|
|
// Applica il tema salvato (chiaro/scuro) prima di mostrare la finestra
|
|
ThemeManager.ApplyFromSettings();
|
|
}
|
|
|
|
protected override void OnExit(ExitEventArgs e)
|
|
{
|
|
// Quello che è ancora in coda va sul disco adesso: un registro che perde
|
|
// proprio le ultime righe è inutile esattamente quando serve di più.
|
|
TextLogService.SessionEnded();
|
|
FileLogWriter.DisposeAll();
|
|
|
|
// L'icona di notifica sopravvive al processo se non la si rimuove:
|
|
// resterebbe nell'area di notifica come icona fantasma.
|
|
WindowsNotifier.Dispose();
|
|
|
|
base.OnExit(e);
|
|
}
|
|
}
|
|
}
|