render static method
Setzt das Zeilenmodell ins Raster; zeichen fehlt → nach paperSize (32/48).
Implementation
static BelegRaster render(BelegLayout layout, {int? zeichen}) {
final n0 = zeichen ?? (layout.paperSize == 'mm80' ? zeichen80mm : zeichen58mm);
final n = n0 < 8 ? 8 : n0;
final leer = ' ' * n;
final out = <RasterZeile>[];
for (final z in layout.lines) {
switch (z) {
case BelegText():
for (final t in wortzeilen(z.text, n)) {
out.add(RasterZeile(text: _ausrichten(t, n, z.align), art: RasterArt.text, bold: z.bold));
}
case BelegBanner():
for (final t in wortzeilen(z.text, n)) {
out.add(RasterZeile(text: _ausrichten(t, n, BelegAlign.center), art: RasterArt.banner, bold: true, warnung: z.warnung));
}
case BelegLinie():
out.add(RasterZeile(text: (z.char.isEmpty ? '-' : z.char[0]) * n, art: RasterArt.rule));
case BelegLeerraum():
for (var i = 0; i < z.lines; i++) {
out.add(RasterZeile(text: leer, art: RasterArt.space));
}
case BelegQr():
out.add(RasterZeile(text: _ausrichten('[QR-Code]', n, BelegAlign.center), art: RasterArt.qr, qr: z.data));
case BelegSpalten():
final breiten = rasterSpaltenBreiten(z.columns.map((c) => c.width).toList(), n);
final inhalt = <int>[for (var i = 0; i < breiten.length; i++) i < breiten.length - 1 ? (breiten[i] - 1 < 1 ? 1 : breiten[i] - 1) : breiten[i]];
final teile = <List<String>>[for (var i = 0; i < z.columns.length; i++) wortzeilen(z.columns[i].text, inhalt[i])];
// Fließregel (wie renderReceiptGrid): läuft nur EINE Spalte über die erste Zeile
// hinaus, bekommt ihr Rest die volle Breite; laufen mehrere weiter, bleibt das Raster.
final weiterlaufend = <int>[for (var i = 0; i < teile.length; i++) if (teile[i].length > 1) i];
final fliesst = weiterlaufend.length == 1 && z.columns.length > 1;
var zeilen = 1;
if (!fliesst) {
for (final t in teile) {
if (t.length > zeilen) zeilen = t.length;
}
}
for (var r = 0; r < zeilen; r++) {
final sb = StringBuffer();
for (var i = 0; i < z.columns.length; i++) {
final zelle = _ausrichten(r < teile[i].length ? teile[i][r] : '', inhalt[i], z.columns[i].align);
sb.write(i < breiten.length - 1 ? zelle + ' ' * (breiten[i] - inhalt[i]) : zelle);
}
final text = sb.toString();
out.add(RasterZeile(text: text.length == n ? text : _ausrichten(text, n, BelegAlign.left), art: RasterArt.columns));
}
if (fliesst) {
final i = weiterlaufend.first;
final rest = _restNach(z.columns[i].text, teile[i].first);
for (final t in wortzeilen(rest, n)) {
out.add(RasterZeile(text: _ausrichten(t, n, z.columns[i].align), art: RasterArt.columns));
}
}
}
}
return BelegRaster(lines: out, zeichen: n);
}