waffensachkunde

Waffensachkunde – Lernsoftware für die Sachkundeprüfung nach § 7 WaffG. Barrierefrei, offline, EUPL-1.2.

/ app src main anzeige.ts

3,2 KB Rohdatei
app/src/main/anzeige.ts — 89 Zeilen
1 /**
2 * Die Anzeigegröße des Fensters.
3 *
4 * **Warum das hier liegt und nicht im Renderer.** Der Zoom gehört zum
5 * Fenster, nicht zum Dokument: `webContents.setZoomFactor` skaliert alles,
6 * was darin dargestellt wird – Text, Bedienelemente und die siebzehn
7 * Prüfzeichen, bei denen das Bild die Antwort ist. Eine reine
8 * CSS-Schriftvergrößerung ließe die Zeichen unberührt, und ausgerechnet wer
9 * größere Schrift braucht, braucht sie erst recht.
10 *
11 * Außerdem muss die Größe schon anliegen, bevor der erste Bildpunkt
12 * gezeichnet wird – sonst blitzt die Anwendung beim Start in der falschen
13 * Größe auf.
14 *
15 * **Ein Weg für beide Bedienungen.** Die Größe lässt sich über das
16 * Anwendungsmenü (mit den gewohnten Tastenkürzeln) und über Schaltflächen in
17 * den Einstellungen ändern. Beides läuft durch {@link anzeigegroesseSetzen} –
18 * andernfalls zeigte die Einstellung eine Zahl an, die das Menü längst
19 * überholt hat.
20 */
21
22 import { BrowserWindow, webContents, type WebContents } from 'electron';
23
24 import { anzeigegroesseBereinigen, groesser, kleiner, zoomfaktor } from '../shared/ansicht';
25 import { KANAL_ANZEIGEGROESSE_GEAENDERT } from '../shared/ipc';
26 import { einstellungenLesen, einstellungenSchreiben } from './einstellungen';
27
28 /** Die zuletzt gesetzte Größe, damit Menü und Einstellungen dieselbe kennen. */
29 let aktuell: number | null = null;
30
31 /** Die gespeicherte Größe; beim ersten Aufruf aus den Einstellungen gelesen. */
32 export function anzeigegroesse(): number {
33 aktuell ??= anzeigegroesseBereinigen(einstellungenLesen().anzeigegroesse);
34 return aktuell;
35 }
36
37 /**
38 * Setzt die Größe, sichert sie und meldet sie allen Fenstern.
39 *
40 * Das Sichern darf scheitern, ohne dass die Umstellung verloren geht: Wer
41 * gerade die Schrift vergrößert, weil er sonst nichts lesen kann, soll nicht
42 * wegen eines vollen Datenträgers wieder vor kleiner Schrift sitzen. Der
43 * Fehlschlag landet in der Konsole, nicht als Ausnahme beim Aufrufer.
44 */
45 export function anzeigegroesseSetzen(prozentRoh: unknown): number {
46 const prozent = anzeigegroesseBereinigen(prozentRoh);
47 aktuell = prozent;
48
49 for (const inhalt of webContents.getAllWebContents()) {
50 anwendenAuf(inhalt);
51 }
52
53 try {
54 einstellungenSchreiben({ anzeigegroesse: prozent });
55 } catch (fehler: unknown) {
56 console.warn('[anzeige] Größe konnte nicht gesichert werden:', fehler);
57 }
58
59 for (const fenster of BrowserWindow.getAllWindows()) {
60 fenster.webContents.send(KANAL_ANZEIGEGROESSE_GEAENDERT, prozent);
61 }
62
63 return prozent;
64 }
65
66 /**
67 * Legt die gespeicherte Größe auf ein Fenster.
68 *
69 * Muss für jedes neue Fenster aufgerufen werden: Der Zoomfaktor hängt an den
70 * `webContents` und wird nicht vererbt.
71 */
72 export function anwendenAuf(inhalt: WebContents): void {
73 inhalt.setZoomFactor(zoomfaktor(anzeigegroesse()));
74 }
75
76 /** Eine Stufe größer – für das Menü. */
77 export function anzeigeVergroessern(): number {
78 return anzeigegroesseSetzen(groesser(anzeigegroesse()));
79 }
80
81 /** Eine Stufe kleiner – für das Menü. */
82 export function anzeigeVerkleinern(): number {
83 return anzeigegroesseSetzen(kleiner(anzeigegroesse()));
84 }
85
86 /** Zurück auf 100 Prozent. */
87 export function anzeigeZuruecksetzen(): number {
88 return anzeigegroesseSetzen(100);
89 }