- Fenster-Menue: WindowMenu fuellt die oberste MenuStrip mit Top-Level-Eintraegen nebeneinander (mit Icon) statt Untermenue "Fenster"; ModuleView.Icon zentral in der App zugewiesen (AssignMenuIcons). Kein miFenster mehr im Launcher-Designer. - Sicheres Beenden: ShutdownConfirmDialog (10s-Timer sperrt "Jetzt beenden", Abbrechen jederzeit) via IModuleUiHost.RequestShutdown(). Nur der Launcher (Hauptprozess) bietet "Beenden"; andere Fenster nur "Fenster schliessen" (kein App-Shutdown, Module laufen weiter). Launcher-Schliessen-X routet ueber dieselbe Abfrage. - Modul-Aktivierung (restart-basiert): ServerSettings.DisabledModules, in Program.Main vor der DI-Registrierung gefiltert -> deaktivierte Module werden nicht geladen. Dashboard-Tab "Module" zeigt Status + schaltet um (Hinweis: greift nach Neustart). Optionaler IPolyTraderModule.GetActivationBlocker fuer "nicht aktivierbar"-Info. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
63 lines
2.0 KiB
C#
63 lines
2.0 KiB
C#
using System;
|
||
using System.Windows.Forms;
|
||
|
||
namespace PolyTraderSharp.Ui
|
||
{
|
||
/// <summary>
|
||
/// Sicherheitsabfrage vor dem Herunterfahren. Die Beenden-Schaltfläche ist erst nach Ablauf eines
|
||
/// kurzen Timers klickbar (verhindert versehentliches Beenden, z.B. während auf eine API-Antwort
|
||
/// gewartet wird); „Abbrechen" ist jederzeit möglich. Bei Bestätigung liefert der Dialog
|
||
/// <see cref="DialogResult.OK"/> – das eigentliche geordnete Herunterfahren übernimmt der Aufrufer.
|
||
/// </summary>
|
||
public partial class ShutdownConfirmDialog : Form
|
||
{
|
||
private int _remaining;
|
||
|
||
/// <param name="delaySeconds">Sekunden, bis „Beenden" freigeschaltet wird (Standard 10).</param>
|
||
public ShutdownConfirmDialog(int delaySeconds = 10)
|
||
{
|
||
InitializeComponent();
|
||
_remaining = Math.Max(0, delaySeconds);
|
||
UpdateCountdownUi();
|
||
}
|
||
|
||
protected override void OnShown(EventArgs e)
|
||
{
|
||
base.OnShown(e);
|
||
if (_remaining <= 0)
|
||
{
|
||
EnableConfirm();
|
||
return;
|
||
}
|
||
countdownTimer.Start();
|
||
}
|
||
|
||
private void CountdownTimer_Tick(object? sender, EventArgs e)
|
||
{
|
||
_remaining--;
|
||
if (_remaining <= 0)
|
||
{
|
||
countdownTimer.Stop();
|
||
EnableConfirm();
|
||
return;
|
||
}
|
||
UpdateCountdownUi();
|
||
}
|
||
|
||
private void UpdateCountdownUi()
|
||
{
|
||
lblCountdown.Text = $"Beenden möglich in {_remaining} s …";
|
||
btnConfirm.Text = $"Beenden ({_remaining} s)";
|
||
}
|
||
|
||
private void EnableConfirm()
|
||
{
|
||
btnConfirm.Enabled = true;
|
||
btnConfirm.Text = "Jetzt beenden";
|
||
lblCountdown.Text = "PolyTrader kann jetzt beendet werden.";
|
||
lblCountdown.ForeColor = System.Drawing.Color.ForestGreen;
|
||
btnConfirm.Focus();
|
||
}
|
||
}
|
||
}
|