UI Slice 5: Menueleiste (Fenster nebeneinander), sicheres Beenden, Modul-Aktivierung
- 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>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
886de3a85b
commit
039bc240f8
@@ -0,0 +1,62 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user