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:
+29
-3
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user