fix: Kalender-Titel/Name unauffällig verkleinern, Y-Abstände weiter straffen

Titel ("Anwesenheit") und Schülername dienen nur der Kontrolle, dass der
Kalender zum richtigen Kind gehört - nicht als gestalterischer Blickfang.
Beide jetzt klein und hellgrau statt groß/fett/dunkel, dazu ein eigener
(kleinerer) Y-Abstand vor der Legende statt der bisherigen Wiederverwendung
von monthGapX.

Der dadurch eingesparte Höhen-Overhead im Referenzentwurf (61mm -> 45mm vor
den Wochenzeilen) erhöht direkt den gemeinsamen Skalierungsfaktor k, wenn die
Boxhöhe der begrenzende Faktor ist - die Tageskacheln werden dadurch bei
gleicher Vorlagenbox spürbar größer.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-17 15:59:57 +02:00
co-authored by Claude Sonnet 5
parent c128fc6741
commit 839242194e
@@ -46,6 +46,9 @@ public static class StudentAttendanceCalendarDrawingBuilder
// nachdem, ob Breite oder Höhe der realen Box stärker vom Referenzentwurf abweicht.
var designWidth = 170f;
var designMonthGapX = 6f;
// 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).
var designTrailingGapY = 4f;
var first = options.NormalizedStartMonth;
var monthCount = options.NormalizedMonthCount;
@@ -60,10 +63,14 @@ public static class StudentAttendanceCalendarDrawingBuilder
var offset = ((int)current.DayOfWeek + 6) % 7;
maxWeeks = Math.Max(maxWeeks, (int)Math.Ceiling((offset + days.Count) / 7d));
}
// Höhe des Referenzentwurfs bei k=1 (mm): Titel+Name+Abstand (26) + Monats-/Wochentagskopf
// (20) + maxWeeks Wochenzeilen (10 je Woche) + monthGapX (6) + Legende/Nachlauf (9). Muss mit
// der Höhenberechnung am Ende dieser Methode ("y") übereinstimmen.
var designHeight = 26f + 20f + 10f * maxWeeks + designMonthGapX + 9f;
// Höhe des Referenzentwurfs bei k=1 (mm): Titel+Name+Abstand (12, siehe unten - beide bewusst
// klein/grau gehalten, sie dienen nur der Kontrolle "sind das die richtigen Daten", nicht als
// gestalterischer Blickfang) + Monats-/Wochentagskopf (20) + maxWeeks Wochenzeilen (10 je
// Woche) + Trailing-Gap (4) + Legende/Nachlauf (9). Muss mit der Höhenberechnung am Ende
// dieser Methode ("y") übereinstimmen. Je kleiner dieser "Overhead" ausfällt, desto größer
// kann k (und damit das ganze Raster inkl. der Tageskacheln) werden, wenn contentHeight der
// begrenzende Faktor ist.
var designHeight = 12f + 20f + 10f * maxWeeks + designTrailingGapY + 9f;
// 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
@@ -93,12 +100,15 @@ public static class StudentAttendanceCalendarDrawingBuilder
var commands = new List<DrawingCommand>();
var contentWidthDesign = designWidth * k;
var y = 0f;
commands.Add(new DrawStringEx(0, y, 14 * k, contentWidthDesign, "Anwesenheit",
DrawingTextAlignment.AlignLeft, 11 * finalScale, Color: "#1F2937", Bold: true));
y += 14 * k;
commands.Add(new DrawStringEx(0, y, 10 * k, contentWidthDesign, studentName,
DrawingTextAlignment.AlignLeft, 8 * finalScale, Color: "#6B7280"));
y += 10 * k + 2 * k;
// Titel/Name bewusst klein und in hellem Grau: sie dienen nur der Kontrolle, dass der
// Kalender zum richtigen Kind/Zeitraum gehört, nicht als gestalterischer Blickfang - der
// 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,
DrawingTextAlignment.AlignLeft, 6.5f * finalScale, Color: "#9CA3AF"));
y += 5 * k + 1 * k;
var weekdays = new[] { "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So" };
var gridStartY = y;
for (var monthIndex = 0; monthIndex < monthCount; monthIndex++)
@@ -134,7 +144,7 @@ public static class StudentAttendanceCalendarDrawingBuilder
Color: day.HasSignal ? "#FFFFFF" : "#374151", Bold: day.HasSignal));
}
}
y = gridStartY + 11 * k + 9 * k + maxWeeks * cellHeight + monthGapX;
y = gridStartY + 11 * k + 9 * k + maxWeeks * cellHeight + designTrailingGapY * k;
commands.Add(new DrawStringEx(0, y, 8 * k, contentWidthDesign,
"U unentschuldigt · A abwesend · V verspätet · E entschuldigt · ! Klassenbuch",