diff --git a/IBKRTrader.App.csproj b/IBKRTrader.App.csproj index 3cae826..2c4e752 100644 --- a/IBKRTrader.App.csproj +++ b/IBKRTrader.App.csproj @@ -27,6 +27,19 @@ + + + + True + True + Resources.resx + + + ResXFileCodeGenerator + Resources.Designer.cs + + + diff --git a/LauncherForm.cs b/LauncherForm.cs index 2136846..f0b85eb 100644 --- a/LauncherForm.cs +++ b/LauncherForm.cs @@ -21,11 +21,7 @@ public sealed class LauncherForm : Form private readonly WorkerEngine _workerEngine; private readonly IReadOnlyList _modules; - private readonly Dictionary _viewButtons = new(StringComparer.OrdinalIgnoreCase); - private readonly FlowLayoutPanel _buttonPanel = new() - { - Dock = DockStyle.Fill, Padding = new Padding(16), AutoScroll = true - }; + private readonly Dictionary _viewButtons = new(StringComparer.OrdinalIgnoreCase); private readonly ToolStripStatusLabel _status = new("Start..."); public LauncherForm(ShellUiHost uiHost, IServiceProvider services) @@ -52,26 +48,47 @@ public sealed class LauncherForm : Form var menu = new MenuStrip { Dock = DockStyle.Top, ImageScalingSize = new Size(24, 24) }; WindowMenu.Wire(menu, _uiHost, null); + // Fenster-Buttons in einem ToolStrip (Icon über Text) – wie im PolytraderSharp-Launcher. + var toolstrip = new ToolStrip + { + Dock = DockStyle.Top, + GripStyle = ToolStripGripStyle.Hidden, + ImageScalingSize = new Size(32, 32), + AutoSize = true, + Padding = new Padding(4) + }; + foreach (var view in _uiHost.Views.OrderBy(v => v.Order).ThenBy(v => v.Title)) { var id = view.Id; - var btn = new Button + var btn = new ToolStripButton(view.Title, view.Icon) { - Text = view.Title, Width = 210, Height = 48, Margin = new Padding(8), - TextAlign = ContentAlignment.MiddleLeft, Image = view.Icon, - ImageAlign = ContentAlignment.MiddleLeft, TextImageRelation = TextImageRelation.ImageBeforeText + DisplayStyle = ToolStripItemDisplayStyle.ImageAndText, + ImageScaling = ToolStripItemImageScaling.None, + TextImageRelation = TextImageRelation.ImageAboveText, + AutoSize = true, + Padding = new Padding(6, 2, 6, 2) }; btn.Click += (_, _) => _uiHost.OpenView(id); _viewButtons[id] = btn; - _buttonPanel.Controls.Add(btn); + toolstrip.Items.Add(btn); } + var content = new Panel { Dock = DockStyle.Fill, BackColor = SystemColors.ControlLightLight }; + content.Controls.Add(new Label + { + Text = "IBKRTrader — Launcher\nFenster über die Leiste oben öffnen.", + Dock = DockStyle.Fill, TextAlign = ContentAlignment.MiddleCenter, + ForeColor = SystemColors.GrayText, Font = new Font(Font.FontFamily, 11f) + }); + var statusStrip = new StatusStrip(); statusStrip.Items.Add(_status); - // Reihenfolge: Fill-Panel zuerst, dann Bottom, dann Top (WinForms Dock-Stacking). - Controls.Add(_buttonPanel); + // Dock-Stacking: zuletzt hinzugefügtes Top-Control liegt oben → Menü über ToolStrip. + Controls.Add(content); Controls.Add(statusStrip); + Controls.Add(toolstrip); Controls.Add(menu); MainMenuStrip = menu; } @@ -143,7 +160,7 @@ public sealed class LauncherForm : Form if (IsDisposed) return; if (InvokeRequired) { BeginInvoke((Action)UpdateButtonStates); return; } foreach (var (id, btn) in _viewButtons) - btn.Font = new Font(btn.Font, _uiHost.IsOpen(id) ? FontStyle.Bold : FontStyle.Regular); + btn.Checked = _uiHost.IsOpen(id); } private void SetStatus(string text) diff --git a/Program.cs b/Program.cs index f66da72..4b0f214 100644 --- a/Program.cs +++ b/Program.cs @@ -63,6 +63,7 @@ internal static class Program RegisterCoreViews(uiHost, AppHost.Services); foreach (var module in modules) module.RegisterUi(uiHost, AppHost.Services); + AssignViewIcons(uiHost); Application.Run(AppHost.Services.GetRequiredService()); AppHost.StopAsync().GetAwaiter().GetResult(); @@ -113,6 +114,25 @@ internal static class Program services.AddSingleton(); } + /// + /// Weist den registrierten Views ihr Button-/Menü-Icon aus den App-Ressourcen zu (über die stabile + /// View-ID). Icons stammen aus PolytraderSharp; nicht passende können später ausgetauscht werden. + /// Bereits gesetzte Icons bleiben erhalten. + /// + private static void AssignViewIcons(IModuleUiHost uiHost) + { + var map = new Dictionary + { + ["core.workers"] = Properties.Resources.system_time, + ["core.logs"] = Properties.Resources.error_log, + ["core.settings"] = Properties.Resources.setting_tools, + ["congresstrading.main"] = Properties.Resources.cross_reference, + }; + foreach (var view in uiHost.Views) + if (view.Icon is null && map.TryGetValue(view.Id, out var img)) + view.Icon = img; + } + /// Registriert die Core-Views (Logs, Settings, Workers) bei der Shell. private static void RegisterCoreViews(IModuleUiHost uiHost, IServiceProvider sp) { diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs new file mode 100644 index 0000000..5637a2e --- /dev/null +++ b/Properties/Resources.Designer.cs @@ -0,0 +1,303 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.42000 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +namespace IBKRTrader.Properties { + using System; + + + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + // Diese Klasse wurde von der StronglyTypedResourceBuilder 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 + // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("IBKRTrader.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap accept_button { + get { + object obj = ResourceManager.GetObject("accept_button", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap add { + get { + object obj = ResourceManager.GetObject("add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap cancel { + get { + object obj = ResourceManager.GetObject("cancel", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap coins_in_hand { + get { + object obj = ResourceManager.GetObject("coins_in_hand", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap cross_reference { + get { + object obj = ResourceManager.GetObject("cross_reference", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap dashboard { + get { + object obj = ResourceManager.GetObject("dashboard", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap delete { + get { + object obj = ResourceManager.GetObject("delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap diskette { + get { + object obj = ResourceManager.GetObject("diskette", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap emotion_batman { + get { + object obj = ResourceManager.GetObject("emotion_batman", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap error_log { + get { + object obj = ResourceManager.GetObject("error_log", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap file_start_workflow { + get { + object obj = ResourceManager.GetObject("file_start_workflow", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap money { + get { + object obj = ResourceManager.GetObject("money", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap money_add { + get { + object obj = ResourceManager.GetObject("money_add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap money_delete { + get { + object obj = ResourceManager.GetObject("money_delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap money_dollar { + get { + object obj = ResourceManager.GetObject("money_dollar", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap refresh_all { + get { + object obj = ResourceManager.GetObject("refresh_all", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap setting_tools { + get { + object obj = ResourceManager.GetObject("setting_tools", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap stop { + get { + object obj = ResourceManager.GetObject("stop", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap system_time { + get { + object obj = ResourceManager.GetObject("system_time", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap token_quantifier { + get { + object obj = ResourceManager.GetObject("token_quantifier", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap traffic_lights_green { + get { + object obj = ResourceManager.GetObject("traffic_lights_green", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap traffic_lights_red { + get { + object obj = ResourceManager.GetObject("traffic_lights_red", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap traffic_lights_yellow { + get { + object obj = ResourceManager.GetObject("traffic_lights_yellow", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap warning { + get { + object obj = ResourceManager.GetObject("warning", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Properties/Resources.resx b/Properties/Resources.resx new file mode 100644 index 0000000..18293c6 --- /dev/null +++ b/Properties/Resources.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\accept_button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\cancel.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\coins_in_hand.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\cross_reference.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\dashboard.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\diskette.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\emotion_batman.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\error_log.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\file_start_workflow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\money.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\money_add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\money_delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\money_dollar.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\refresh_all.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\setting_tools.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\stop.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\system_time.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\token_quantifier.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\traffic_lights_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\traffic_lights_red.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\traffic_lights_yellow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\warning.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + diff --git a/Resources/accept_button.png b/Resources/accept_button.png new file mode 100644 index 0000000..7786ac7 Binary files /dev/null and b/Resources/accept_button.png differ diff --git a/Resources/add.png b/Resources/add.png new file mode 100644 index 0000000..60a7a29 Binary files /dev/null and b/Resources/add.png differ diff --git a/Resources/cancel.png b/Resources/cancel.png new file mode 100644 index 0000000..1b20ae0 Binary files /dev/null and b/Resources/cancel.png differ diff --git a/Resources/coins_in_hand.png b/Resources/coins_in_hand.png new file mode 100644 index 0000000..aaceea1 Binary files /dev/null and b/Resources/coins_in_hand.png differ diff --git a/Resources/cross_reference.png b/Resources/cross_reference.png new file mode 100644 index 0000000..3576fa6 Binary files /dev/null and b/Resources/cross_reference.png differ diff --git a/Resources/dashboard.png b/Resources/dashboard.png new file mode 100644 index 0000000..12961f0 Binary files /dev/null and b/Resources/dashboard.png differ diff --git a/Resources/delete.png b/Resources/delete.png new file mode 100644 index 0000000..30a45b8 Binary files /dev/null and b/Resources/delete.png differ diff --git a/Resources/diskette.png b/Resources/diskette.png new file mode 100644 index 0000000..3a9dcf3 Binary files /dev/null and b/Resources/diskette.png differ diff --git a/Resources/emotion_batman.png b/Resources/emotion_batman.png new file mode 100644 index 0000000..17ddd8b Binary files /dev/null and b/Resources/emotion_batman.png differ diff --git a/Resources/error_log.png b/Resources/error_log.png new file mode 100644 index 0000000..041f8eb Binary files /dev/null and b/Resources/error_log.png differ diff --git a/Resources/file_start_workflow.png b/Resources/file_start_workflow.png new file mode 100644 index 0000000..a83e969 Binary files /dev/null and b/Resources/file_start_workflow.png differ diff --git a/Resources/money.png b/Resources/money.png new file mode 100644 index 0000000..c8c5a11 Binary files /dev/null and b/Resources/money.png differ diff --git a/Resources/money_add.png b/Resources/money_add.png new file mode 100644 index 0000000..62154f3 Binary files /dev/null and b/Resources/money_add.png differ diff --git a/Resources/money_delete.png b/Resources/money_delete.png new file mode 100644 index 0000000..d1a9cd0 Binary files /dev/null and b/Resources/money_delete.png differ diff --git a/Resources/money_dollar.png b/Resources/money_dollar.png new file mode 100644 index 0000000..bab8f07 Binary files /dev/null and b/Resources/money_dollar.png differ diff --git a/Resources/refresh_all.png b/Resources/refresh_all.png new file mode 100644 index 0000000..0f4d261 Binary files /dev/null and b/Resources/refresh_all.png differ diff --git a/Resources/setting_tools.png b/Resources/setting_tools.png new file mode 100644 index 0000000..2a1e727 Binary files /dev/null and b/Resources/setting_tools.png differ diff --git a/Resources/stop.png b/Resources/stop.png new file mode 100644 index 0000000..807117f Binary files /dev/null and b/Resources/stop.png differ diff --git a/Resources/system_time.png b/Resources/system_time.png new file mode 100644 index 0000000..957c526 Binary files /dev/null and b/Resources/system_time.png differ diff --git a/Resources/token_quantifier.png b/Resources/token_quantifier.png new file mode 100644 index 0000000..f598fa4 Binary files /dev/null and b/Resources/token_quantifier.png differ diff --git a/Resources/traffic_lights_green.png b/Resources/traffic_lights_green.png new file mode 100644 index 0000000..bd53d89 Binary files /dev/null and b/Resources/traffic_lights_green.png differ diff --git a/Resources/traffic_lights_red.png b/Resources/traffic_lights_red.png new file mode 100644 index 0000000..fd00be2 Binary files /dev/null and b/Resources/traffic_lights_red.png differ diff --git a/Resources/traffic_lights_yellow.png b/Resources/traffic_lights_yellow.png new file mode 100644 index 0000000..54034fc Binary files /dev/null and b/Resources/traffic_lights_yellow.png differ diff --git a/Resources/warning.png b/Resources/warning.png new file mode 100644 index 0000000..311e726 Binary files /dev/null and b/Resources/warning.png differ