Phase 5-UI: Launcher auf Toolstrip-Modell + SettingsView (Designer-first)

- LauncherForm: lstView-Ansatz entfernt (lstViews/colName/pnlBottom/btnOpen raus).
  Fenster werden ueber toolstrip_windows-Buttons geoeffnet/fokussiert:
  btn_settings -> Settings, btn_terminal -> Terminal (Bindung per stabiler View-ID).
- statusStrip_info: Live-Status (Trading, Modul-Anzahl, API WSS/Polling) via 1s-Timer.
- toolstrip_quickbar bleibt fuer Schnellaktionen (Trading an/aus) reserviert.
- Neue SettingsView (UserControl + Designer): ServerSettings-PropertyGrid +
  Speichern/Neu laden; Verhalten wie bisheriger Settings-Tab. In Program.cs registriert.
- Build 0 Fehler.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-07-02 11:44:47 +02:00
co-authored by Claude Opus 4.8
parent 1781d71983
commit f112668147
9 changed files with 378 additions and 147 deletions
+18
View File
@@ -143,6 +143,24 @@ internal static class Program
return view; return view;
} }
}); });
uiHost.RegisterView(new PolyTrader.Core.Modularity.ModuleView
{
Id = "core.settings",
Title = "Server Settings",
Group = "Core",
Order = 20,
PreferredWidth = 720,
PreferredHeight = 720,
CreateControl = () =>
{
var view = new PolyTraderSharp.Ui.Views.SettingsView();
view.Initialize(
viewServices.GetRequiredService<ThreemaService>(),
viewServices.GetRequiredService<MullvadVpnService>(),
viewServices.GetRequiredService<TerminalLogger>());
return view;
}
});
// TODO Phase 5-UI: registrierte IPolyTraderModule durchlaufen und module.RegisterUi(uiHost) aufrufen. // TODO Phase 5-UI: registrierte IPolyTraderModule durchlaufen und module.RegisterUi(uiHost) aufrufen.
var launcher = AppHost.Services.GetRequiredService<PolyTraderSharp.Ui.LauncherForm>(); var launcher = AppHost.Services.GetRequiredService<PolyTraderSharp.Ui.LauncherForm>();
+17 -9
View File
@@ -1,11 +1,9 @@
using MongoDB.Driver; //------------------------------------------------------------------------------
using PolyTraderSharp.Extensions;
//------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// Dieser Code wurde von einem Tool generiert. // Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000 // Laufzeitversion:4.0.30319.42000
// //
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird. // der Code erneut generiert wird.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@@ -18,10 +16,10 @@ namespace PolyTraderSharp.Properties {
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// </summary> /// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
// -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
// mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources { internal class Resources {
@@ -35,7 +33,7 @@ namespace PolyTraderSharp.Properties {
} }
/// <summary> /// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager { internal static global::System.Resources.ResourceManager ResourceManager {
@@ -49,7 +47,7 @@ namespace PolyTraderSharp.Properties {
} }
/// <summary> /// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
@@ -172,6 +170,16 @@ namespace PolyTraderSharp.Properties {
} }
} }
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap setting_tools {
get {
object obj = ResourceManager.GetObject("setting_tools", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary> /// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary> /// </summary>
+5 -2
View File
@@ -118,6 +118,9 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="stop" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\stop.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="diskette" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="diskette" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\diskette.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\diskette.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
@@ -163,7 +166,7 @@
<data name="accept_button" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="accept_button" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\accept_button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\accept_button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="stop" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="setting_tools" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\stop.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\setting_tools.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
</root> </root>
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

+119 -77
View File
@@ -17,102 +17,140 @@ namespace PolyTraderSharp.Ui
private void InitializeComponent() private void InitializeComponent()
{ {
this.menuStrip = new System.Windows.Forms.MenuStrip(); menuStrip = new MenuStrip();
this.miDatei = new System.Windows.Forms.ToolStripMenuItem(); miDatei = new ToolStripMenuItem();
this.miLegacy = new System.Windows.Forms.ToolStripMenuItem(); miLegacy = new ToolStripMenuItem();
this.miBeenden = new System.Windows.Forms.ToolStripMenuItem(); miBeenden = new ToolStripMenuItem();
this.lstViews = new System.Windows.Forms.ListView(); toolstrip_windows = new ToolStrip();
this.colName = new System.Windows.Forms.ColumnHeader(); btn_settings = new ToolStripButton();
this.pnlBottom = new System.Windows.Forms.Panel(); btn_terminal = new ToolStripButton();
this.btnOpen = new System.Windows.Forms.Button(); toolstrip_quickbar = new ToolStrip();
this.menuStrip.SuspendLayout(); statusStrip_info = new StatusStrip();
this.pnlBottom.SuspendLayout(); lbl_trading = new ToolStripStatusLabel();
this.SuspendLayout(); lbl_modules = new ToolStripStatusLabel();
lbl_ratelimit = new ToolStripStatusLabel();
menuStrip.SuspendLayout();
toolstrip_windows.SuspendLayout();
statusStrip_info.SuspendLayout();
SuspendLayout();
// //
// menuStrip // menuStrip
// //
this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { menuStrip.ImageScalingSize = new Size(24, 24);
this.miDatei}); menuStrip.Items.AddRange(new ToolStripItem[] { miDatei });
this.menuStrip.Location = new System.Drawing.Point(0, 0); menuStrip.Location = new Point(0, 0);
this.menuStrip.Name = "menuStrip"; menuStrip.Name = "menuStrip";
this.menuStrip.Size = new System.Drawing.Size(360, 24); menuStrip.Padding = new Padding(9, 3, 0, 3);
this.menuStrip.TabIndex = 0; menuStrip.Size = new Size(2599, 35);
menuStrip.TabIndex = 0;
// //
// miDatei // miDatei
// //
this.miDatei.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { miDatei.DropDownItems.AddRange(new ToolStripItem[] { miLegacy, miBeenden });
this.miLegacy, miDatei.Name = "miDatei";
this.miBeenden}); miDatei.Size = new Size(69, 29);
this.miDatei.Name = "miDatei"; miDatei.Text = "Datei";
this.miDatei.Text = "Datei";
// //
// miLegacy // miLegacy
// //
this.miLegacy.Name = "miLegacy"; miLegacy.Name = "miLegacy";
this.miLegacy.Text = "Legacy-UI (alte Tabs)"; miLegacy.Size = new Size(275, 34);
miLegacy.Text = "Legacy-UI (alte Tabs)";
// //
// miBeenden // miBeenden
// //
this.miBeenden.Name = "miBeenden"; miBeenden.Name = "miBeenden";
this.miBeenden.Text = "Beenden"; miBeenden.Size = new Size(275, 34);
miBeenden.Text = "Beenden";
// //
// lstViews // toolstrip_windows
// //
this.lstViews.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { toolstrip_windows.AutoSize = false;
this.colName}); toolstrip_windows.ImageScalingSize = new Size(64, 64);
this.lstViews.Dock = System.Windows.Forms.DockStyle.Fill; toolstrip_windows.Items.AddRange(new ToolStripItem[] { btn_settings, btn_terminal });
this.lstViews.FullRowSelect = true; toolstrip_windows.Location = new Point(0, 35);
this.lstViews.HideSelection = false; toolstrip_windows.Name = "toolstrip_windows";
this.lstViews.Location = new System.Drawing.Point(0, 24); toolstrip_windows.Size = new Size(2599, 70);
this.lstViews.MultiSelect = false; toolstrip_windows.TabIndex = 3;
this.lstViews.Name = "lstViews"; toolstrip_windows.Text = "toolStrip1";
this.lstViews.Size = new System.Drawing.Size(360, 420);
this.lstViews.TabIndex = 1;
this.lstViews.UseCompatibleStateImageBehavior = false;
this.lstViews.View = System.Windows.Forms.View.Details;
// //
// colName // btn_settings
// //
this.colName.Text = "Ansicht"; btn_settings.BackColor = SystemColors.Control;
this.colName.Width = 330; btn_settings.Image = Properties.Resources.setting_tools;
btn_settings.ImageScaling = ToolStripItemImageScaling.None;
btn_settings.ImageTransparentColor = Color.Magenta;
btn_settings.Name = "btn_settings";
btn_settings.Size = new Size(112, 65);
btn_settings.Text = "Settings";
btn_settings.TextImageRelation = TextImageRelation.ImageAboveText;
// //
// pnlBottom // btn_terminal
// //
this.pnlBottom.Controls.Add(this.btnOpen); btn_terminal.DisplayStyle = ToolStripItemDisplayStyle.Text;
this.pnlBottom.Dock = System.Windows.Forms.DockStyle.Bottom; btn_terminal.Name = "btn_terminal";
this.pnlBottom.Location = new System.Drawing.Point(0, 444); btn_terminal.Size = new Size(112, 65);
this.pnlBottom.Name = "pnlBottom"; btn_terminal.Text = "Terminal";
this.pnlBottom.Size = new System.Drawing.Size(360, 44);
this.pnlBottom.TabIndex = 2;
// //
// btnOpen // toolstrip_quickbar
// //
this.btnOpen.Location = new System.Drawing.Point(12, 8); toolstrip_quickbar.ImageScalingSize = new Size(24, 24);
this.btnOpen.Name = "btnOpen"; toolstrip_quickbar.Location = new Point(0, 105);
this.btnOpen.Size = new System.Drawing.Size(336, 30); toolstrip_quickbar.Name = "toolstrip_quickbar";
this.btnOpen.TabIndex = 0; toolstrip_quickbar.Size = new Size(2599, 25);
this.btnOpen.Text = "Öffnen"; toolstrip_quickbar.TabIndex = 4;
this.btnOpen.UseVisualStyleBackColor = true; toolstrip_quickbar.Text = "toolStrip2";
//
// statusStrip_info
//
statusStrip_info.ImageScalingSize = new Size(24, 24);
statusStrip_info.Items.AddRange(new ToolStripItem[] { lbl_trading, lbl_modules, lbl_ratelimit });
statusStrip_info.Location = new Point(0, 924);
statusStrip_info.Name = "statusStrip_info";
statusStrip_info.Size = new Size(2599, 22);
statusStrip_info.TabIndex = 5;
statusStrip_info.Text = "statusStrip1";
//
// lbl_trading
//
lbl_trading.Name = "lbl_trading";
lbl_trading.Size = new Size(100, 16);
lbl_trading.Text = "Trading: —";
//
// lbl_modules
//
lbl_modules.Name = "lbl_modules";
lbl_modules.Size = new Size(90, 16);
lbl_modules.Text = "Module: —";
//
// lbl_ratelimit
//
lbl_ratelimit.Name = "lbl_ratelimit";
lbl_ratelimit.Size = new Size(80, 16);
lbl_ratelimit.Text = "API: —";
// //
// LauncherForm // LauncherForm
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); AutoScaleDimensions = new SizeF(10F, 25F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(360, 488); ClientSize = new Size(2599, 946);
this.Controls.Add(this.lstViews); Controls.Add(statusStrip_info);
this.Controls.Add(this.pnlBottom); Controls.Add(toolstrip_quickbar);
this.Controls.Add(this.menuStrip); Controls.Add(toolstrip_windows);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; Controls.Add(menuStrip);
this.MainMenuStrip = this.menuStrip; MainMenuStrip = menuStrip;
this.MaximizeBox = false; Margin = new Padding(4, 5, 4, 5);
this.Name = "LauncherForm"; Name = "LauncherForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; StartPosition = FormStartPosition.CenterScreen;
this.Text = "PolyTrader"; Text = "PolyTrader";
this.menuStrip.ResumeLayout(false); menuStrip.ResumeLayout(false);
this.menuStrip.PerformLayout(); menuStrip.PerformLayout();
this.pnlBottom.ResumeLayout(false); toolstrip_windows.ResumeLayout(false);
this.ResumeLayout(false); toolstrip_windows.PerformLayout();
this.PerformLayout(); statusStrip_info.ResumeLayout(false);
statusStrip_info.PerformLayout();
ResumeLayout(false);
PerformLayout();
} }
#endregion #endregion
@@ -121,9 +159,13 @@ namespace PolyTraderSharp.Ui
private System.Windows.Forms.ToolStripMenuItem miDatei; private System.Windows.Forms.ToolStripMenuItem miDatei;
private System.Windows.Forms.ToolStripMenuItem miLegacy; private System.Windows.Forms.ToolStripMenuItem miLegacy;
private System.Windows.Forms.ToolStripMenuItem miBeenden; private System.Windows.Forms.ToolStripMenuItem miBeenden;
private System.Windows.Forms.ListView lstViews; private ToolStrip toolstrip_windows;
private System.Windows.Forms.ColumnHeader colName; private ToolStripButton btn_settings;
private System.Windows.Forms.Panel pnlBottom; private ToolStripButton btn_terminal;
private System.Windows.Forms.Button btnOpen; private ToolStrip toolstrip_quickbar;
private StatusStrip statusStrip_info;
private ToolStripStatusLabel lbl_trading;
private ToolStripStatusLabel lbl_modules;
private ToolStripStatusLabel lbl_ratelimit;
} }
} }
+34 -32
View File
@@ -7,58 +7,60 @@ using PolyTrader.Core.Modularity;
namespace PolyTraderSharp.Ui namespace PolyTraderSharp.Ui
{ {
/// <summary> /// <summary>
/// Schlanke „Startleiste" der PolyTrader.App. Das Layout (ListView, Menü, Button) liegt /// „Startleiste" der PolyTrader.App. Fenster werden über die im Designer platzierten
/// im Designer (LauncherForm.Designer.cs). Zur Laufzeit werden ausschließlich die /// Buttons in <c>toolstrip_windows</c> geöffnet bzw. in den Vordergrund geholt.
/// Listeneinträge (Daten) aus den registrierten Views befüllt — keine Steuerelemente. /// <c>toolstrip_quickbar</c> ist für Schnellaktionen (z.B. Trading an/aus) reserviert,
/// Kennt selbst kein Modul. /// <c>statusStrip_info</c> zeigt Kernkennzahlen. Der Launcher kennt selbst kein Modul
/// Buttons werden per stabiler View-ID an registrierte Views gebunden.
/// </summary> /// </summary>
public partial class LauncherForm : Form public partial class LauncherForm : Form
{ {
private readonly ShellUiHost _uiHost; private readonly ShellUiHost _uiHost;
private readonly IServiceProvider _services; private readonly IServiceProvider _services;
private readonly TradingState _state;
private readonly System.Windows.Forms.Timer _statusTimer = new() { Interval = 1000 };
private frm_main? _legacyForm; private frm_main? _legacyForm;
public LauncherForm(ShellUiHost uiHost, IServiceProvider services) public LauncherForm(ShellUiHost uiHost, IServiceProvider services)
{ {
_uiHost = uiHost; _uiHost = uiHost;
_services = services; _services = services;
_state = services.GetRequiredService<TradingState>();
InitializeComponent(); InitializeComponent();
PopulateViews(); btn_settings.Click += (_, _) => OpenView("core.settings");
lstViews.DoubleClick += (_, _) => OpenSelected(); btn_terminal.Click += (_, _) => OpenView("core.terminal");
btnOpen.Click += (_, _) => OpenSelected();
miLegacy.Click += (_, _) => OpenLegacy(); miLegacy.Click += (_, _) => OpenLegacy();
miBeenden.Click += (_, _) => Close(); miBeenden.Click += (_, _) => Close();
_statusTimer.Tick += (_, _) => UpdateStatus();
_statusTimer.Start();
UpdateStatus();
} }
private void PopulateViews() /// <summary>Öffnet die Ansicht mit der angegebenen ID (bzw. fokussiert das offene Fenster).</summary>
private void OpenView(string viewId)
{ {
lstViews.BeginUpdate(); var view = _uiHost.Views.FirstOrDefault(v => v.Id == viewId);
lstViews.Groups.Clear(); if (view != null)
lstViews.Items.Clear();
foreach (var group in _uiHost.Views
.GroupBy(v => string.IsNullOrEmpty(v.Group) ? "Allgemein" : v.Group!)
.OrderBy(g => g.Key))
{
var lvGroup = new ListViewGroup(group.Key) { Header = group.Key };
lstViews.Groups.Add(lvGroup);
foreach (var view in group.OrderBy(v => v.Order).ThenBy(v => v.Title))
{
lstViews.Items.Add(new ListViewItem(view.Title, lvGroup) { Tag = view });
}
}
lstViews.EndUpdate();
}
private void OpenSelected()
{
if (lstViews.SelectedItems.Count == 0) return;
if (lstViews.SelectedItems[0].Tag is ModuleView view)
_uiHost.OpenView(view); _uiHost.OpenView(view);
else
MessageBox.Show($"Ansicht '{viewId}' ist (noch) nicht registriert.", "Hinweis",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void UpdateStatus()
{
string trading = _state.GlobalTradingPaused
? "Pausiert"
: $"Live={_state.LiveTradingMode} / Demo={_state.DemoTradingMode}";
lbl_trading.Text = $"Trading: {trading}";
int moduleCount = _services.GetServices<IPolyTraderModule>().Count();
lbl_modules.Text = $"Module: {moduleCount}";
lbl_ratelimit.Text = $"API: {(_state.IsAlchemyHealthy ? "WSS aktiv" : "Polling")}";
} }
private void OpenLegacy() private void OpenLegacy()
+15
View File
@@ -117,4 +117,19 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>585, 0</value>
</metadata>
<metadata name="toolstrip_windows.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>733, 0</value>
</metadata>
<metadata name="toolstrip_quickbar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>376, 0</value>
</metadata>
<metadata name="statusStrip_info.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>944, 0</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>25</value>
</metadata>
</root> </root>
+82
View File
@@ -0,0 +1,82 @@
namespace PolyTraderSharp.Ui.Views
{
partial class SettingsView
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Komponenten-Designer generierter Code
private void InitializeComponent()
{
this.pnlTop = new System.Windows.Forms.Panel();
this.btnReload = new System.Windows.Forms.Button();
this.btnSave = new System.Windows.Forms.Button();
this.propertyGrid = new System.Windows.Forms.PropertyGrid();
this.pnlTop.SuspendLayout();
this.SuspendLayout();
//
// pnlTop
//
this.pnlTop.Controls.Add(this.btnReload);
this.pnlTop.Controls.Add(this.btnSave);
this.pnlTop.Dock = System.Windows.Forms.DockStyle.Top;
this.pnlTop.Location = new System.Drawing.Point(0, 0);
this.pnlTop.Name = "pnlTop";
this.pnlTop.Size = new System.Drawing.Size(700, 44);
this.pnlTop.TabIndex = 0;
//
// btnReload
//
this.btnReload.Location = new System.Drawing.Point(140, 8);
this.btnReload.Name = "btnReload";
this.btnReload.Size = new System.Drawing.Size(120, 28);
this.btnReload.TabIndex = 1;
this.btnReload.Text = "Neu laden";
this.btnReload.UseVisualStyleBackColor = true;
//
// btnSave
//
this.btnSave.Location = new System.Drawing.Point(12, 8);
this.btnSave.Name = "btnSave";
this.btnSave.Size = new System.Drawing.Size(120, 28);
this.btnSave.TabIndex = 0;
this.btnSave.Text = "Speichern";
this.btnSave.UseVisualStyleBackColor = true;
//
// propertyGrid
//
this.propertyGrid.Dock = System.Windows.Forms.DockStyle.Fill;
this.propertyGrid.Location = new System.Drawing.Point(0, 44);
this.propertyGrid.Name = "propertyGrid";
this.propertyGrid.Size = new System.Drawing.Size(700, 556);
this.propertyGrid.TabIndex = 1;
//
// SettingsView
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.propertyGrid);
this.Controls.Add(this.pnlTop);
this.Name = "SettingsView";
this.Size = new System.Drawing.Size(700, 600);
this.pnlTop.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel pnlTop;
private System.Windows.Forms.Button btnSave;
private System.Windows.Forms.Button btnReload;
private System.Windows.Forms.PropertyGrid propertyGrid;
}
}
+61
View File
@@ -0,0 +1,61 @@
using System;
using System.Windows.Forms;
using PolyTraderSharp.Models;
using PolyTraderSharp.Services;
namespace PolyTraderSharp.Ui.Views
{
/// <summary>
/// Core-Settings-Ansicht: bearbeitet die ServerSettings über ein PropertyGrid.
/// Designbar (siehe SettingsView.Designer.cs); Laufzeit-Abhängigkeiten via Initialize.
/// Verhalten entspricht dem bisherigen Settings-Tab (Speichern -> XML + Services neu laden).
/// </summary>
public partial class SettingsView : UserControl
{
private const string SettingsPath = "server_settings.xml";
private ServerSettings _settings = new();
private ThreemaService? _threema;
private MullvadVpnService? _vpn;
private TerminalLogger? _logger;
public SettingsView()
{
InitializeComponent();
btnSave.Click += (_, _) => Save();
btnReload.Click += (_, _) => Reload();
}
public void Initialize(ThreemaService threema, MullvadVpnService vpn, TerminalLogger logger)
{
_threema = threema;
_vpn = vpn;
_logger = logger;
Reload();
}
private void Reload()
{
_settings = ServerSettings.Load(SettingsPath);
propertyGrid.SelectedObject = _settings;
}
private void Save()
{
try
{
_settings.Save(SettingsPath);
_threema?.ReloadSettings();
_vpn?.ReloadSettings();
_logger?.Info("Server-Einstellungen gespeichert und Services neu geladen.");
MessageBox.Show("Server-Einstellungen gespeichert.", "Erfolg",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show($"Fehler beim Speichern: {ex.Message}", "Fehler",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}