Ich teile hier noch mal eine mögliche Ergänzung, die ich bei mir selbst verwende.
Meist gibt man ja eher Zahlen aus, das ist fein soweit. Wenn man aber längere Textfelder ausgeben will, gibt es das Problem, das der Text zu lang ist und eigentlich umgebrochen werden muss.
Beispiel: Texte aus dem Kalender.
Mein erster Lösungsansatz sieht im Code so aus:
Neu hinzugekommen sind für Textfelder drei Parameter:
maxZeilenbreite: Zeichen, die maximal pro Zeile hinpassen auf das Display
maxZeilen: maximal auszugebende Zeilen auf dem Display für dieses Textfeld
zeilenAbstand: Pixelhöhe pro Zeile inkl. optischem Abstand
Ersetze im Text-Block (ganz unten in "elementAuflösen" ) die Zeilen
const textArr = [x, y, wert, schrift, farbe];
if (typeof item.align === 'number') textArr.push(item.align);
return { text: textArr };
durch die gepimpte Version:
// --- automatischer Zeilenumbruch ---
if (item.maxZeilenbreite && item.maxZeilen) {
const breite = item.maxZeilenbreite;
const zeilen = item.maxZeilen;
const abstand = item.zeilenAbstand || 20;
const zeilenArr = wert.split('\n'); // erlaubt manuelle \n
const result = [];
let posY = y;
let zähler = 0;
for (const rawLine of zeilenArr) {
const words = rawLine.split(' ');
let line = '';
for (const w of words) {
const probe = line + (line ? ' ' : '') + w;
if (probe.length > breite && line.length) {
// neue Zeile
result.push({ text: [x, posY, line.trim(), schrift, farbe] });
posY += abstand;
zähler++;
if (zähler >= zeilen) return result;
line = w;
} else {
line = probe;
}
}
if (line) {
result.push({ text: [x, posY, line.trim(), schrift, farbe] });
posY += abstand;
zähler++;
if (zähler >= zeilen) return result;
}
}
return result;
}
// --- klassischer Einzeiler (wie bisher) ---
const textArr = [x, y, wert, schrift, farbe];
if (typeof item.align === 'number') textArr.push(item.align);
return { text: textArr };
Die relevante Konfigurationszeile in der Konfig sieht dann z.B. so aus:
{ dp: 'alias.0.Kalendervorschau', font: 'calibrib16', color: 1, x: 0, y: 25, maxZeilenbreite: 38, maxZeilen: 7, zeilenAbstand: 17 }
Das setzt zwar etwas Fingerspitzengefühl beim Benutzer voraus, aber gegen eine Vollautomatisierung spricht die Herausforderung, dass jede Schriftart in Pixeln unterschiedlich breit und hoch ist. Dazu mache ich lieber mit drei Parametern per Hand Anpassungen, als zu versuchen, das mit Formlen in den Griff zu bekommen.