fix: Kalender-Überschrift entfernt, Y-Abstände weiter komprimiert
CI / build-and-test (push) Waiting to run

"Anwesenheit" als eigene Überschrift entfernt - die Monatsnamen im Raster
machen bereits klar, worum es geht. Trailing-Gap vor der Legende von 4mm auf
2mm, Abstand nach dem Schülernamen von 1mm auf 0.5mm reduziert.

Der Höhen-Overhead im Referenzentwurf sinkt dadurch von 45mm auf 36.5mm (vor
den Wochenzeilen) und vergrößert entsprechend den gemeinsamen Skalierungs-
faktor k, wenn die Boxhöhe der begrenzende Faktor ist.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-17 22:26:06 +02:00
co-authored by Claude Sonnet 5
parent 839242194e
commit 9dc7ebab0e
@@ -48,7 +48,7 @@ public static class StudentAttendanceCalendarDrawingBuilder
var designMonthGapX = 6f; var designMonthGapX = 6f;
// Eigener (kleinerer) Y-Abstand vor der Legende, getrennt von designMonthGapX (das misst den // Eigener (kleinerer) Y-Abstand vor der Legende, getrennt von designMonthGapX (das misst den
// horizontalen Abstand zwischen den Monatsblöcken und soll davon unberührt bleiben). // horizontalen Abstand zwischen den Monatsblöcken und soll davon unberührt bleiben).
var designTrailingGapY = 4f; var designTrailingGapY = 2f;
var first = options.NormalizedStartMonth; var first = options.NormalizedStartMonth;
var monthCount = options.NormalizedMonthCount; var monthCount = options.NormalizedMonthCount;
@@ -63,14 +63,14 @@ public static class StudentAttendanceCalendarDrawingBuilder
var offset = ((int)current.DayOfWeek + 6) % 7; var offset = ((int)current.DayOfWeek + 6) % 7;
maxWeeks = Math.Max(maxWeeks, (int)Math.Ceiling((offset + days.Count) / 7d)); maxWeeks = Math.Max(maxWeeks, (int)Math.Ceiling((offset + days.Count) / 7d));
} }
// Höhe des Referenzentwurfs bei k=1 (mm): Titel+Name+Abstand (12, siehe unten - beide bewusst // Höhe des Referenzentwurfs bei k=1 (mm): Name+Abstand (5.5, siehe unten - keine eigene
// klein/grau gehalten, sie dienen nur der Kontrolle "sind das die richtigen Daten", nicht als // "Anwesenheit"-Überschrift mehr, die Monatsnamen darunter machen bereits klar, worum es
// gestalterischer Blickfang) + Monats-/Wochentagskopf (20) + maxWeeks Wochenzeilen (10 je // geht; der Name bleibt klein/grau nur zur Kontrolle "ist das das richtige Kind") + Monats-/
// Woche) + Trailing-Gap (4) + Legende/Nachlauf (9). Muss mit der Höhenberechnung am Ende // Wochentagskopf (20) + maxWeeks Wochenzeilen (10 je Woche) + Trailing-Gap (2) + Legende/
// dieser Methode ("y") übereinstimmen. Je kleiner dieser "Overhead" ausfällt, desto größer // Nachlauf (9). Muss mit der Höhenberechnung am Ende dieser Methode ("y") übereinstimmen. Je
// kann k (und damit das ganze Raster inkl. der Tageskacheln) werden, wenn contentHeight der // kleiner dieser "Overhead" ausfällt, desto größer kann k (und damit das ganze Raster inkl.
// begrenzende Faktor ist. // der Tageskacheln) werden, wenn contentHeight der begrenzende Faktor ist.
var designHeight = 12f + 20f + 10f * maxWeeks + designTrailingGapY + 9f; var designHeight = 5.5f + 20f + 10f * maxWeeks + designTrailingGapY + 9f;
// a_x/a_y: wie viel größer/kleiner als der Referenzentwurf die reale Box in jeweils einer // a_x/a_y: wie viel größer/kleiner als der Referenzentwurf die reale Box in jeweils einer
// Richtung ist. Eine DRAWBOX bricht anders als FLOWDRAWBOX nicht automatisch auf Folgeseiten // Richtung ist. Eine DRAWBOX bricht anders als FLOWDRAWBOX nicht automatisch auf Folgeseiten
@@ -100,15 +100,13 @@ public static class StudentAttendanceCalendarDrawingBuilder
var commands = new List<DrawingCommand>(); var commands = new List<DrawingCommand>();
var contentWidthDesign = designWidth * k; var contentWidthDesign = designWidth * k;
var y = 0f; var y = 0f;
// Titel/Name bewusst klein und in hellem Grau: sie dienen nur der Kontrolle, dass der // Keine eigene "Anwesenheit"-Überschrift mehr - die Monatsnamen im Raster machen bereits
// Kalender zum richtigen Kind/Zeitraum gehört, nicht als gestalterischer Blickfang - der // klar, worum es geht. Der Name bleibt klein und in hellem Grau: er dient nur der Kontrolle,
// dass der Kalender zum richtigen Kind gehört, nicht als gestalterischer Blickfang - der
// eingesparte Platz kommt stattdessen den Tageskacheln zugute (siehe designHeight oben). // eingesparte Platz kommt stattdessen den Tageskacheln zugute (siehe designHeight oben).
commands.Add(new DrawStringEx(0, y, 6 * k, contentWidthDesign, "Anwesenheit",
DrawingTextAlignment.AlignLeft, 7 * finalScale, Color: "#9CA3AF"));
y += 6 * k;
commands.Add(new DrawStringEx(0, y, 5 * k, contentWidthDesign, studentName, commands.Add(new DrawStringEx(0, y, 5 * k, contentWidthDesign, studentName,
DrawingTextAlignment.AlignLeft, 6.5f * finalScale, Color: "#9CA3AF")); DrawingTextAlignment.AlignLeft, 6.5f * finalScale, Color: "#9CA3AF"));
y += 5 * k + 1 * k; y += 5 * k + .5f * k;
var weekdays = new[] { "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So" }; var weekdays = new[] { "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So" };
var gridStartY = y; var gridStartY = y;
for (var monthIndex = 0; monthIndex < monthCount; monthIndex++) for (var monthIndex = 0; monthIndex < monthCount; monthIndex++)