Funktionswahl vor der Kamera, Wechsel und Knopf-Sichtbarkeit je Funktion

Neuer Vollbild-Dialog (src/ui/mode-dialog.js) mit drei grossen Flaechen,
gebaut nach dem Muster der bestehenden Dialoge. Ablauf beim Start: erst
die Fortsetzen-Frage (falls eine gesicherte Sitzung vorliegt), dann die
Funktionswahl, erst danach startet die Kamera.

Die gewaehlte Funktion steht antippbar in der Scan-Ansicht und laesst
sich dort jederzeit wechseln - der Wechsel gilt sofort: laufende Suche
startet/stoppt, "Modul scannen" erscheint nur noch in Funktion "Text
erkennen", der Zielrahmen wird beim Wechsel weg von laufender Suche
zurueckgesetzt. pipeline.js bleibt unangetastet; main.js reicht je nach
Funktion nur unterschiedliche Adapter hinein (scan-recognition.js).
This commit is contained in:
2026-07-29 13:37:12 +02:00
parent 2eb9d1ecf8
commit 2e619ed64d
4 changed files with 247 additions and 20 deletions
+29 -3
View File
@@ -4,14 +4,15 @@ import { FRAME_INSET } from '../camera.js';
* Baut die Hauptansicht auf und liefert Aktualisierungsfunktionen zurueck.
* Kennt weder Kamera noch Erkennung - alles kommt ueber die Rueckrufe.
*/
export function renderScanView(root, { onCapture, onUndo, onOpenList, onPickFile }) {
export function renderScanView(root, { onCapture, onUndo, onOpenList, onPickFile, onChangeMode }) {
root.innerHTML = `
<button class="mode-button" id="mode-button" type="button"></button>
<div class="camera">
<video id="preview" playsinline muted></video>
<div class="frame"></div>
</div>
<div class="status" id="status"></div>
<button class="action capture" id="capture">Modul scannen</button>
<button class="action capture" id="capture" hidden>Modul scannen</button>
<button class="action secondary" id="pick-file-button" hidden>Bild auswählen</button>
<div class="stacks" id="stacks"></div>
<div class="last">
@@ -27,6 +28,8 @@ export function renderScanView(root, { onCapture, onUndo, onOpenList, onPickFile
const fileEl = root.querySelector('#file');
const pickFileButtonEl = root.querySelector('#pick-file-button');
const frameEl = root.querySelector('.frame');
const captureEl = root.querySelector('#capture');
const modeButtonEl = root.querySelector('#mode-button');
// FRAME_INSET (camera.js) ist die einzige Quelle der Rahmenmasse - sowohl
// fuer diesen sichtbaren Rahmen als auch fuer den nativen Ausschnitt
@@ -36,8 +39,9 @@ export function renderScanView(root, { onCapture, onUndo, onOpenList, onPickFile
`${FRAME_INSET.top * 100}% ${FRAME_INSET.right * 100}% ` +
`${FRAME_INSET.bottom * 100}% ${FRAME_INSET.left * 100}%`;
root.querySelector('#capture').addEventListener('click', onCapture);
captureEl.addEventListener('click', onCapture);
root.querySelector('#undo').addEventListener('click', onUndo);
modeButtonEl.addEventListener('click', onChangeMode);
// Klick auf die sichtbare Schaltflaeche ist selbst die Nutzergeste, die
// die versteckte Dateiauswahl oeffnen darf - anders als ein Aufruf aus dem
// Code heraus, den Handy-Browser blockieren.
@@ -74,6 +78,28 @@ export function renderScanView(root, { onCapture, onUndo, onOpenList, onPickFile
lastEl.textContent = text;
},
/**
* Zeigt die gewaehlte Scan-Funktion in der Ansicht an - antippbar, um zu
* wechseln (siehe onChangeMode). Beschriftung kommt vom Aufrufer, der sie
* seinerseits aus scan-modes.js liest; diese Ansicht kennt die Funktionen
* selbst nicht.
* @param {string} label
*/
setMode(label) {
modeButtonEl.textContent = `${label} ändern ⌄`;
modeButtonEl.setAttribute('aria-label', `Scan-Funktion wechseln (aktuell: ${label})`);
},
/**
* "Modul scannen" hat nur in Funktionen mit Texterkennung auf Knopfdruck
* etwas zu tun (Funktion 3) - in Funktionen mit laufender Codesuche sucht
* die App ohnehin durchgehend, ein Knopf dafuer waere wirkungslos.
* @param {boolean} visible
*/
setCaptureVisible(visible) {
captureEl.hidden = !visible;
},
/** @param {string} text @param {boolean} warn */
setStatus(text, warn = false) {
statusEl.textContent = text;