fix: Dashboard-Kachelraster - Luecken und falsche Margins bei ausgeblendeten Kacheln
ApplyCardLayout() zaehlte bisher IsVisible statt EffectiveIsVisible, wodurch eine eingeschaltete aber leere HideWhenEmpty-Kachel weiterhin einen Rasterplatz belegte. Da im Alltag meist mehrere der sieben HideWhenEmpty-Kacheln leer sind, war das der Normalfall, nicht die Ausnahme. UpdateDashboardSummary() setzte zudem alle IsEmpty- Werte, ohne das Layout danach neu zu berechnen. Zusaetzlich hatte jede Kachel ihren Grid-Margin fest im XAML verdrahtet (links/rechts), obwohl Spalte und Zeile erst zur Laufzeit aus Sichtbarkeit und Reihenfolge berechnet werden - beim Ausblenden einer Kachel wanderten die Nachbarn in die andere Spalte, der Rinnstein sass dann auf der falschen Seite. DashboardCardOption.Margin leitet den Wert jetzt aus Column ab; das XAML bindet darauf statt fixer Werte. Drei Regressionstests decken beide Faelle ab.
This commit is contained in:
@@ -284,6 +284,10 @@ public partial class DashboardViewModel : ObservableObject
|
||||
SupportCard.IsEmpty = SupportPlanReviews.Count == 0;
|
||||
GroupsCard.IsEmpty = CurrentGroups.Count == 0;
|
||||
|
||||
// Erst nachdem alle IsEmpty-Werte stehen: welche Kachel tatsaechlich gerendert wird, haengt
|
||||
// ueber EffectiveIsVisible daran, und davon wiederum die Zeilen-/Spaltenzuordnung.
|
||||
ApplyCardLayout();
|
||||
|
||||
OnPropertyChanged(nameof(TodayLessonCount));
|
||||
OnPropertyChanged(nameof(OpenTaskCount));
|
||||
OnPropertyChanged(nameof(UpcomingCount));
|
||||
@@ -673,12 +677,15 @@ public partial class DashboardViewModel : ObservableObject
|
||||
"missingteachingtime" => "Unterrichtszeit nacherfassen", _ => key,
|
||||
};
|
||||
|
||||
// Zaehlt bewusst EffectiveIsVisible, nicht IsVisible: eine eingeschaltete, aber gerade leere
|
||||
// HideWhenEmpty-Kachel wird nicht gerendert und darf deshalb auch keinen Rasterplatz belegen,
|
||||
// sonst bleibt an ihrer Stelle eine Luecke im zweispaltigen Grid.
|
||||
private void ApplyCardLayout()
|
||||
{
|
||||
var visibleIndex = 0;
|
||||
foreach (var card in DashboardCards)
|
||||
{
|
||||
var index = card.IsVisible ? visibleIndex++ : 0;
|
||||
var index = card.EffectiveIsVisible ? visibleIndex++ : 0;
|
||||
card.Row = index / 2;
|
||||
card.Column = index % 2;
|
||||
}
|
||||
@@ -1262,6 +1269,14 @@ public partial class DashboardCardOption : ObservableObject
|
||||
public bool EffectiveIsVisible => IsVisible && (!HideWhenEmpty || !IsEmpty);
|
||||
public Action? OnVisibilityChanged { get; set; }
|
||||
|
||||
/// <summary>Rinnstein zur jeweils anderen Rasterspalte. Muss aus der berechneten
|
||||
/// <see cref="Column"/> kommen und darf nicht im XAML fest an der Kachel haengen: welche Kachel
|
||||
/// links und welche rechts landet, entscheidet sich erst zur Laufzeit aus Reihenfolge und
|
||||
/// Sichtbarkeit, ein fester Margin sitzt dann bei jeder Umschaltung auf der falschen Seite.</summary>
|
||||
public Avalonia.Thickness Margin => Column == 0
|
||||
? new Avalonia.Thickness(0, 0, 8, 8)
|
||||
: new Avalonia.Thickness(8, 0, 0, 8);
|
||||
|
||||
public DashboardCardOption(string key, string title, bool isVisible)
|
||||
{
|
||||
Key = key;
|
||||
@@ -1278,4 +1293,6 @@ public partial class DashboardCardOption : ObservableObject
|
||||
}
|
||||
|
||||
partial void OnIsEmptyChanged(bool value) => OnPropertyChanged(nameof(EffectiveIsVisible));
|
||||
|
||||
partial void OnColumnChanged(int value) => OnPropertyChanged(nameof(Margin));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user