Files
PolyTraderSharp/src/PolyTrader.App.Avalonia/Controls/SettingsEditor.axaml
T
RichardandClaude Opus 5 28b3aedec7 Vier Befunde der Sichtpruefung behoben: Farbschema, Grids, Diagramme, Kontrast
#383 Farbschema "System" kehrte sein Versprechen um. ThemeManager.IsDark verglich
ActualThemeVariant der Anwendung mit Dark; bei "System" steht dort Default, waehrend
die Fenster selbst nach hell oder dunkel aufloesen. IsDark war damit im
Auslieferungszustand immer false - Symbol, Beschriftung und Toggle() haengen alle an
diesem Wert. Gelesen wird jetzt die angeforderte Variante, bei "System" die
Betriebssystem-Einstellung. Derselbe Fehler steckte in Brush(): die Methode suchte bei
"System" in den hellen Farben, waehrend dunkel gezeichnet wurde - betroffen war genau
das, wofuer es sie gibt (Zeilenfarben, KPI-Vorzeichen). Neu ist ausserdem, dass eine
Umstellung am Betriebssystem ThemeChanged ausloest, solange "System" gilt.

#384 Sternspalten quetschten die Endspalten weg. Der Merksatz aus #56 galt bisher nur
fuer gridTraders. Angewandt auf gridOpen und gridClosed sowie auf die uebrigen Grids,
deren Spaltensumme den sichtbaren Bereich uebersteigt (gridTrades, gridJobs, gridLedger,
gridCandidates, gridPositions, gridHistory). Auto statt Stern, dazu MaxWidth 360 - anders
als "Name" in #56 traegt "Markt" ganze Fragesaetze und wuerde die Zahlenspalten sonst aus
dem Blick schieben. Grids mit weniger Spalten als Platz behalten ihre Sternspalte.

#385 Gewinntage wurden rot gezeichnet. Eine ColumnSeries hat genau ein Fill fuer alle
ihre Balken; gefaerbt wurde deshalb nach der Summe ueber alle Tage. Jetzt zwei Reihen an
denselben Positionen - Gewinne in der einen, Verluste in der anderen, Luecken als null.
"PnL je Modul" faerbt ebenfalls nach Vorzeichen: zwei Diagramme nebeneinander mit
verschiedenen Leseweisen waeren schlechter als beide ohne.

#386 Drei Kleinigkeiten. Die Equity-Achse beschriftete zehn Teilstriche mit zwei Daten -
unter drei Tagen kommt jetzt die Uhrzeit dazu, darueber gilt hoechstens ein Teilstrich je
Tag. "Deaktivierte Module" sah aus, als fehle das Bedienelement: leere Nur-Lese-Felder
zeigen jetzt "—" in einer abgesetzten Flaeche. Die Abschnittsbeschriftungen der
Seitenleiste lagen bei 3,65:1 statt der geforderten 4,5:1 (im Bild sogar 1,83:1, weil
10 px mit Sperrung ausduennen) - AppCaptionTextBrush erreicht 4,61:1 hell und 6,21:1
dunkel und bleibt deutlich leiser als die Eintraege darunter.

Build gruen, 486 Tests gruen. Die Sichtpruefung auf der Linux-VM steht noch aus; die
drei rein visuellen Punkte sind aus dem Quelltext begruendet, nicht im Bild belegt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 10:17:49 +02:00

164 lines
10 KiB
XML

<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:PolyTrader.App.Avalonia.ViewModels"
x:Class="PolyTrader.App.Avalonia.Controls.SettingsEditor">
<!--
Ersatz für das WinForms-PropertyGrid. Aufbau nach Vorgabe:
Kategorie-Überschrift (fett), darunter je Feld eine Zeile aus Beschriftung links und
Steuerelement rechts; ein etwaiger Erklärungstext steht klein unter dem Feld.
Vollständig deklarativ: WELCHE Felder es gibt, liefert das Datenmodell
(SettingsModelBuilder liest Category/DisplayName/Description/Browsable vom Einstellungs-
objekt). WIE ein Feld aussieht, steht hier — je Feldtyp ein DataTemplate. Damit bleibt die
Layout-Regel gewahrt und alle Einstellungsfenster sehen automatisch gleich aus.
-->
<UserControl.Resources>
<!-- Einheitliche Beschriftungsspalte: sorgt für die saubere Flucht aller Felder. -->
<x:Double x:Key="LabelWidth">210</x:Double>
</UserControl.Resources>
<UserControl.Styles>
<Style Selector="TextBlock.sectionTitle">
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Margin" Value="0,16,0,8" />
</Style>
<Style Selector="TextBlock.fieldLabel">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="0,0,12,0" />
</Style>
<Style Selector="TextBlock.fieldHint">
<Setter Property="FontSize" Value="11" />
<Setter Property="Foreground" Value="{DynamicResource AppMutedTextBrush}" />
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="Margin" Value="0,2,0,0" />
</Style>
<Style Selector="Grid.fieldRow">
<Setter Property="Margin" Value="0,0,0,8" />
</Style>
</UserControl.Styles>
<ScrollViewer>
<ItemsControl Name="sections" Margin="16,0,16,16">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:SettingsSection">
<StackPanel>
<TextBlock Classes="sectionTitle" Text="{Binding Title}" />
<ItemsControl ItemsSource="{Binding Fields}">
<ItemsControl.DataTemplates>
<!-- Freitext -->
<DataTemplate DataType="vm:TextSettingsField">
<Grid Classes="fieldRow" ColumnDefinitions="210,*">
<TextBlock Grid.Column="0" Classes="fieldLabel" Text="{Binding Label}" />
<StackPanel Grid.Column="1">
<TextBox Text="{Binding Value, Mode=TwoWay}" IsEnabled="{Binding IsEditable}" />
<TextBlock Classes="fieldHint" Text="{Binding Description}"
IsVisible="{Binding HasDescription}" />
</StackPanel>
</Grid>
</DataTemplate>
<!-- Freitext ueber mehrere Zeilen (Beschreibung, Begruendung).
Fest sechs Zeilen hoch und mit Umbruch - einzeilig zeigte das
Feld von 1000 moeglichen Zeichen nur einen Bruchteil (B-14). -->
<DataTemplate DataType="vm:MultilineTextSettingsField">
<Grid Classes="fieldRow" ColumnDefinitions="210,*">
<TextBlock Grid.Column="0" Classes="fieldLabel"
Text="{Binding Label}" VerticalAlignment="Top" Margin="0,6,12,0" />
<StackPanel Grid.Column="1">
<TextBox Text="{Binding Value, Mode=TwoWay}" IsEnabled="{Binding IsEditable}"
AcceptsReturn="True" TextWrapping="Wrap"
MinHeight="96" MaxHeight="200"
VerticalContentAlignment="Top"
ScrollViewer.VerticalScrollBarVisibility="Auto" />
<TextBlock Classes="fieldHint" Text="{Binding Description}"
IsVisible="{Binding HasDescription}" />
</StackPanel>
</Grid>
</DataTemplate>
<!-- Ganzzahl -->
<DataTemplate DataType="vm:IntSettingsField">
<Grid Classes="fieldRow" ColumnDefinitions="210,*">
<TextBlock Grid.Column="0" Classes="fieldLabel" Text="{Binding Label}" />
<StackPanel Grid.Column="1">
<TextBox Text="{Binding Value, Mode=TwoWay}" IsEnabled="{Binding IsEditable}"
MaxWidth="160" HorizontalAlignment="Left" />
<TextBlock Classes="fieldHint" Text="{Binding Description}"
IsVisible="{Binding HasDescription}" />
</StackPanel>
</Grid>
</DataTemplate>
<!-- Dezimalzahl (Betraege, Prozentschwellen, Preisgrenzen) -->
<DataTemplate DataType="vm:DecimalSettingsField">
<Grid Classes="fieldRow" ColumnDefinitions="210,*">
<TextBlock Grid.Column="0" Classes="fieldLabel" Text="{Binding Label}" />
<StackPanel Grid.Column="1">
<TextBox Text="{Binding Value, Mode=TwoWay}" IsEnabled="{Binding IsEditable}"
MaxWidth="160" HorizontalAlignment="Left" />
<TextBlock Classes="fieldHint" Text="{Binding Description}"
IsVisible="{Binding HasDescription}" />
</StackPanel>
</Grid>
</DataTemplate>
<!-- Ja/Nein -->
<DataTemplate DataType="vm:BoolSettingsField">
<Grid Classes="fieldRow" ColumnDefinitions="210,*">
<TextBlock Grid.Column="0" Classes="fieldLabel" Text="{Binding Label}" />
<StackPanel Grid.Column="1">
<CheckBox IsChecked="{Binding Value, Mode=TwoWay}" IsEnabled="{Binding IsEditable}" />
<TextBlock Classes="fieldHint" Text="{Binding Description}"
IsVisible="{Binding HasDescription}" />
</StackPanel>
</Grid>
</DataTemplate>
<!-- Auswahl -->
<DataTemplate DataType="vm:ChoiceSettingsField">
<Grid Classes="fieldRow" ColumnDefinitions="210,*">
<TextBlock Grid.Column="0" Classes="fieldLabel" Text="{Binding Label}" />
<StackPanel Grid.Column="1">
<ComboBox ItemsSource="{Binding Options}"
SelectedItem="{Binding Value, Mode=TwoWay}"
IsEnabled="{Binding IsEditable}"
HorizontalAlignment="Stretch" />
<TextBlock Classes="fieldHint" Text="{Binding Description}"
IsVisible="{Binding HasDescription}" />
</StackPanel>
</Grid>
</DataTemplate>
<!-- Reine Anzeige -->
<DataTemplate DataType="vm:ReadOnlySettingsField">
<Grid Classes="fieldRow" ColumnDefinitions="210,*">
<TextBlock Grid.Column="0" Classes="fieldLabel" Text="{Binding Label}" />
<StackPanel Grid.Column="1">
<!-- Abgesetzte Fläche mit Rahmen: sonst sieht die Zeile aus,
als fehle ihr das Bedienelement (Befund #386). -->
<Border Background="{DynamicResource AppSurfaceAltBrush}"
BorderBrush="{DynamicResource AppBorderBrush}"
BorderThickness="1" CornerRadius="3"
Padding="6,3" HorizontalAlignment="Left" MinWidth="160">
<SelectableTextBlock Text="{Binding DisplayValue}" VerticalAlignment="Center"
Foreground="{DynamicResource AppReadOnlyTextBrush}" />
</Border>
<TextBlock Classes="fieldHint" Text="{Binding Description}"
IsVisible="{Binding HasDescription}" />
</StackPanel>
</Grid>
</DataTemplate>
</ItemsControl.DataTemplates>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</UserControl>