Symbole in beiden Leisten, aus einer Quelle

Die Pixelraster stehen jetzt in web/glyphs.json — einmal. Der Schreibtisch
laedt die Datei selbst, die HoneyBar bekommt sie mit der App-Liste mit;
sie bleibt damit eine einzelne Datei ohne zweite Anfrage. Die abgetippten
Wettersymbole in honeybar.js sind weg, und die Symbolauswahl im
Programm-Editor kommt jetzt aus derselben Datei statt aus einer Liste im
Quelltext.

Neu: Symbole neben den App-Namen im Streifen beider Leisten, mit einem
Schalter (Einstellungen -> HoneyBar) fuer beide zugleich. In den
Aufklappmenues und auf den Kacheln stehen sie immer.
This commit is contained in:
marc committed 2026-08-29 22:21:53 +02:00
1 parent d29b69a426
commit 53ab62d220
9 files changed
+395 -278

No files matched your search

+32 -224
View File
@@ -1,235 +1,43 @@
/* Die Pixelsymbole von HoneyOS.
*
* Eigene Datei, weil sie Daten sind und nicht Verhalten: zwölf mal zwölf
* Zeichen je Symbol, mehr passiert hier nicht. Dieselben Raster stehen noch
* einmal in honeybar/honeybar.js — die soll eine einzelne Datei bleiben, die
* eine fremde App mit einer Zeile einbindet (siehe IDEAS 1.3).
* Die Raster selbst stehen in `web/glyphs.json` — **an genau einer Stelle**,
* absichtlich als Daten statt als Quelltext: Der Schreibtisch holt sie hier,
* die HoneyBar in fremden Apps bekommt sie vom Server mit der App-Liste
* mitgeliefert (siehe main.go). Vorher standen sie zweimal da, und die
* Wettersymbole waren schon einmal auseinandergelaufen.
*
* Das Laden geschieht mit `await` auf oberster Ebene: Wer dieses Modul
* einbindet, bekommt fertige Symbole und darf sie überall gerade heraus
* benutzen — sonst müsste jede Zeichenfunktion asynchron werden.
*/
/* ── Pixel-Glyphen ─────────────────────────────────────────────────────────
* 12×12-Raster als Zeichenketten. Ein `#` ist ein Pixel. So bleiben die Icons
* im Retro-Raster statt aus einer Icon-Bibliothek zu kommen.
*/
export const GLYPHS = {
// Wettersymbole. Dieselben Namen wie in weather.go (wmo) und in der HoneyBar —
// solange 1.3 (geteilte Symbolquelle) nicht gebaut ist, stehen sie zweimal da.
sonne: [
"............",
".....##.....",
"..#..##..#..",
"...#....#...",
"....####....",
"..##....##..",
"..##....##..",
"....####....",
"...#....#...",
"..#..##..#..",
".....##.....",
"............",
],
heiter: [
"............",
"...##.......",
"..####..#...",
"...##..###..",
"......#####.",
"...####...#.",
"..#....##.#.",
".##........#",
"#..........#",
".##########.",
"............",
"............",
],
wolke: [
"............",
"....####....",
"...#....#...",
"..#......##.",
".##........#",
"##.........#",
"#..........#",
"#..........#",
".##########.",
"............",
"............",
"............",
],
nebel: [
"............",
"....####....",
"..##....##..",
".##.......#.",
"#..........#",
".##########.",
"............",
".#########..",
"............",
"..#########.",
"............",
".#########..",
],
regen: [
"............",
"....####....",
"...#....#...",
"..#......##.",
".##........#",
"##.........#",
".##########.",
"............",
"..#..#..#...",
".#..#..#....",
"..#..#..#...",
".#..#..#....",
],
schnee: [
"............",
"....####....",
"...#....#...",
"..#......##.",
".##........#",
"##.........#",
".##########.",
"............",
"..#...#...#.",
".#.#.#.#.#..",
"..#...#...#.",
"............",
],
gewitter: [
"............",
"....####....",
"...#....#...",
"..#......##.",
".##........#",
"##.........#",
".##########.",
"......##....",
".....##.....",
"....####....",
"......##....",
".....##.....",
],
cloud: [
"............",
"....####....",
"...#....#...",
"..#......##.",
".##........#",
"##.........#",
"#..........#",
"#..........#",
".##########.",
"............",
"............",
"............",
],
note: [
"..########..",
"..#......#..",
"..#.####.#..",
"..#......#..",
"..#.####.#..",
"..#......#..",
"..#.####.#..",
"..#......#..",
"..#.##...#..",
"..#......#..",
"..########..",
"............",
],
box: [
"............",
".##########.",
".#........#.",
".#........#.",
".#...##...#.",
".#..####..#.",
".#..####..#.",
".#...##...#.",
".#........#.",
".#........#.",
".##########.",
"............",
],
chip: [
"............",
"..#.#.#.#...",
".##########.",
".#........#.",
"##.######.##",
".#.#....#.#.",
"##.#....#.##",
".#.######.#.",
".#........#.",
".##########.",
"..#.#.#.#...",
"............",
],
gear: [
"....####....",
"..#.####.#..",
"..########..",
".####..####.",
"###......###",
"##........##",
"##........##",
"###......###",
".####..####.",
"..########..",
"..#.####.#..",
"....####....",
],
globe: [
"............",
"...######...",
"..#..#...#..",
".#...#....#.",
"############",
"#....#.....#",
"#....#.....#",
"############",
".#...#....#.",
"..#..#...#..",
"...######...",
"............",
],
disk: [
"............",
"############",
"#..######..#",
"#..#....#..#",
"#..#....#..#",
"#..######..#",
"#..........#",
"#.########.#",
"#.#......#.#",
"#.#......#.#",
"############",
"............",
],
folder: [
"............",
".####.......",
"#....#......",
"#.....######",
"#..........#",
"#..........#",
"#..........#",
"#..........#",
"#..........#",
"############",
"............",
"............",
],
};
/** 12×12-Raster als Zeichenketten, ein `#` ist ein Pixel. */
export const GLYPHS = await ladeGlyphen();
async function ladeGlyphen() {
try {
const res = await fetch(new URL("../glyphs.json", import.meta.url), { cache: "no-store" });
if (res.ok) return await res.json();
} catch {
/* fällt unten auf ein leeres Raster zurück */
}
// Ohne Symbole ist der Schreibtisch hässlich, aber benutzbar — ein leerer
// Bildschirm wäre schlimmer. Passieren kann es nur, wenn der eigene Server
// gerade nicht antwortet; dann ist ohnehin nichts zu holen.
console.warn("HoneyOS: glyphs.json nicht geladen — Symbole fehlen.");
return {};
}
export function glyphSvg(name) {
const grid = GLYPHS[name] || GLYPHS.box;
return rasterSvg(GLYPHS[name] || GLYPHS.box);
}
/** Baut aus einem 12×12-Raster ein SVG. Waagerechte Läufe werden
* zusammengefasst: weniger Rechtecke, gleiches Bild. */
export function rasterSvg(grid) {
if (!grid) return "";
const rects = [];
grid.forEach((row, y) => {
// Waagerechte Läufe zusammenfassen: weniger Rechtecke, gleiches Bild.
let run = 0;
for (let x = 0; x <= row.length; x++) {
if (row[x] === "#") {