Fix text centering and add label length setting to web UI
- Use ctx.textAlign='center' instead of manual offset with Math.max clamp - Add label length selector (30/40/50mm) to settings - Compute canvas size from label length at 8 dots/mm (203 DPI) - Preview updates when label length changes Fixes #3
This commit is contained in:
@@ -343,6 +343,14 @@
|
|||||||
<option value="2">Continuous</option>
|
<option value="2">Continuous</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="setting-item">
|
||||||
|
<label>Label length (mm)</label>
|
||||||
|
<select id="labelLength">
|
||||||
|
<option value="30" selected>30 mm</option>
|
||||||
|
<option value="40">40 mm</option>
|
||||||
|
<option value="50">50 mm</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
<div class="setting-item">
|
<div class="setting-item">
|
||||||
<label>Shutdown (min)</label>
|
<label>Shutdown (min)</label>
|
||||||
<input type="number" id="shutdownTime" value="20" min="1" max="999">
|
<input type="number" id="shutdownTime" value="20" min="1" max="999">
|
||||||
@@ -597,9 +605,14 @@ async function applySettings() {
|
|||||||
|
|
||||||
// ---- Image processing ----
|
// ---- Image processing ----
|
||||||
|
|
||||||
|
function getLabelHeight() {
|
||||||
|
const mm = parseInt($('labelLength').value) || 30;
|
||||||
|
return Math.round(mm * 8); // 203 DPI = 8 dots/mm
|
||||||
|
}
|
||||||
|
|
||||||
function textToCanvas(text, fontSize) {
|
function textToCanvas(text, fontSize) {
|
||||||
// Render text in landscape orientation, then rotate 90 CW for label
|
// Render text in landscape orientation, then rotate 90 CW for label
|
||||||
const landscapeW = 240;
|
const landscapeW = getLabelHeight();
|
||||||
const landscapeH = PRINTHEAD_PX;
|
const landscapeH = PRINTHEAD_PX;
|
||||||
|
|
||||||
const tmp = document.createElement('canvas');
|
const tmp = document.createElement('canvas');
|
||||||
@@ -611,23 +624,23 @@ function textToCanvas(text, fontSize) {
|
|||||||
ctx.fillStyle = '#fff';
|
ctx.fillStyle = '#fff';
|
||||||
ctx.fillRect(0, 0, landscapeW, landscapeH);
|
ctx.fillRect(0, 0, landscapeW, landscapeH);
|
||||||
|
|
||||||
// Render text
|
// Render text centered
|
||||||
ctx.fillStyle = '#000';
|
ctx.fillStyle = '#000';
|
||||||
ctx.font = `${fontSize}px sans-serif`;
|
ctx.font = `${fontSize}px sans-serif`;
|
||||||
|
ctx.textAlign = 'center';
|
||||||
ctx.textBaseline = 'middle';
|
ctx.textBaseline = 'middle';
|
||||||
|
|
||||||
|
const centerX = landscapeW / 2;
|
||||||
const lines = text.split('\n');
|
const lines = text.split('\n');
|
||||||
const lineHeight = fontSize * 1.2;
|
const lineHeight = fontSize * 1.2;
|
||||||
const totalH = lines.length * lineHeight;
|
const totalH = lines.length * lineHeight;
|
||||||
const startY = (landscapeH - totalH) / 2 + lineHeight / 2;
|
const startY = (landscapeH - totalH) / 2 + lineHeight / 2;
|
||||||
|
|
||||||
for (let i = 0; i < lines.length; i++) {
|
for (let i = 0; i < lines.length; i++) {
|
||||||
const metrics = ctx.measureText(lines[i]);
|
ctx.fillText(lines[i], centerX, startY + i * lineHeight);
|
||||||
const x = (landscapeW - metrics.width) / 2;
|
|
||||||
ctx.fillText(lines[i], Math.max(4, x), startY + i * lineHeight);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rotate 90 CW: (x,y) -> (landscapeH - 1 - y, x)
|
// Rotate 90 CW
|
||||||
const out = document.createElement('canvas');
|
const out = document.createElement('canvas');
|
||||||
out.width = PRINTHEAD_PX;
|
out.width = PRINTHEAD_PX;
|
||||||
out.height = landscapeW;
|
out.height = landscapeW;
|
||||||
@@ -836,6 +849,7 @@ function handleFile(file) {
|
|||||||
|
|
||||||
$('textInput').addEventListener('input', updateTextPreview);
|
$('textInput').addEventListener('input', updateTextPreview);
|
||||||
$('fontSize').addEventListener('input', updateTextPreview);
|
$('fontSize').addEventListener('input', updateTextPreview);
|
||||||
|
$('labelLength').addEventListener('change', updateTextPreview);
|
||||||
|
|
||||||
// File input
|
// File input
|
||||||
$('fileInput').addEventListener('change', e => {
|
$('fileInput').addEventListener('change', e => {
|
||||||
|
|||||||
Reference in New Issue
Block a user