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:
co-authored by
Claude Opus 4.8
parent
1781d71983
commit
f112668147
+18
@@ -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>();
|
||||||
|
|||||||
Generated
+17
-9
@@ -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>
|
||||||
|
|||||||
@@ -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 |
Generated
+119
-77
@@ -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
@@ -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()
|
||||||
|
|||||||
@@ -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>
|
||||||
Generated
+82
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user