Selector-UI: Liste, Zustandsabzeichen, nebenlaeufige Pruefung #13

Merged
RDietermann merged 2 commits from feat/selector-ui into main 2026-08-28 09:00:05 +00:00
Owner

Setzt Issue #8 um — die Prototyp-Variante „Liste führt".

Der Aufbau

Eine Ansicht statt Reiter, höchstens 40rem breit. Kopf- und Fußzeile stehen fest, nur die Liste scrollt. Das Hinzufügen sitzt in der Fußzeile und wird nur beim leeren Erststart zur Primäraktion — sonst ist es ein gewöhnlicher Knopf.

Ein Eintrag zeigt den Ordnernamen, darunter den Pfad in der Code-Schrift. Bei Überlänge wird der Pfad vorne gekürzt (direction: rtl), weil sein Ende mehr aussagt als sein Anfang.

Die Zustandsprüfung läuft nebenläufig

Das ist der Teil mit dem größten Fallstrick. Die Markierungen setzen voraus, dass die App den Zustand jedes Eintrags kennt, bevor der Nutzer klickt. Auf einem nicht eingehängten Netzlaufwerk läuft aber schon is_dir() in ein Timeout von mehreren Sekunden — und das ausgerechnet auf dem Bildschirm, den jeder Start zuerst zeigt.

Deshalb use_resource plus tokio::task::spawn_blocking. Solange die Prüfung läuft, bleiben die Einträge unmarkiert und der Selector bedienbar.

Die drei Zustände

Markierung Farbe Was der Nutzer tun kann
nicht erreichbar Warnfarbe Laufwerk einhängen, Stick einstecken
kein Workspace mehr gedämpft Ordner wiederherstellen
beschädigt Gefahrfarbe Marker-Datei reparieren

Bewusst drei verschiedene Formulierungen, weil sie zu drei verschiedenen Handlungen führen. Ein defekter Eintrag wird gedämpft, bleibt aber anklickbar und verschwindet nie automatisch — meist fehlt nur gerade das Laufwerk, und ein Klick versucht es schlicht erneut. Damit ist „Stick wieder eingesteckt" ohne eigenen Knopf abgedeckt.

Nebenbei

OpenError ist Clone + PartialEq geworden, damit er in einem Signal leben kann; Io trägt die Meldung jetzt als String statt als io::Error, der beides nicht kann. Dazu eine badge_class() für die CSS-Zuordnung.

tokio ist mit dem Feature rt explizit dazugekommen und bringt keine neuen Pakete ins Lockfile — es lag über dioxus-desktop bereits vor.

Die alten Klassen .workspace-selector-layout und .workspace-selector-view sind weg, ersetzt durch die Struktur aus Variante B.

Nicht automatisch geprüft

Das Aussehen. 14 Tests decken die Logik ab, das Rendering nicht — dafür braucht es dx serve. Der Prototyp auf prototype/selector-ui zeigt, wie es aussehen soll.

Setzt Issue #8 um — die Prototyp-Variante „Liste führt". ## Der Aufbau Eine Ansicht statt Reiter, höchstens 40rem breit. Kopf- und Fußzeile stehen fest, nur die Liste scrollt. Das Hinzufügen sitzt in der Fußzeile und wird **nur beim leeren Erststart** zur Primäraktion — sonst ist es ein gewöhnlicher Knopf. Ein Eintrag zeigt den Ordnernamen, darunter den Pfad in der Code-Schrift. Bei Überlänge wird der Pfad **vorne** gekürzt (`direction: rtl`), weil sein Ende mehr aussagt als sein Anfang. ## Die Zustandsprüfung läuft nebenläufig Das ist der Teil mit dem größten Fallstrick. Die Markierungen setzen voraus, dass die App den Zustand jedes Eintrags kennt, bevor der Nutzer klickt. Auf einem nicht eingehängten Netzlaufwerk läuft aber schon `is_dir()` in ein Timeout von mehreren Sekunden — und das ausgerechnet auf dem Bildschirm, den jeder Start zuerst zeigt. Deshalb `use_resource` plus `tokio::task::spawn_blocking`. Solange die Prüfung läuft, bleiben die Einträge unmarkiert und der Selector bedienbar. ## Die drei Zustände | Markierung | Farbe | Was der Nutzer tun kann | | --- | --- | --- | | `nicht erreichbar` | Warnfarbe | Laufwerk einhängen, Stick einstecken | | `kein Workspace mehr` | gedämpft | Ordner wiederherstellen | | `beschädigt` | Gefahrfarbe | Marker-Datei reparieren | Bewusst drei verschiedene Formulierungen, weil sie zu drei verschiedenen Handlungen führen. Ein defekter Eintrag wird gedämpft, **bleibt aber anklickbar und verschwindet nie automatisch** — meist fehlt nur gerade das Laufwerk, und ein Klick versucht es schlicht erneut. Damit ist „Stick wieder eingesteckt" ohne eigenen Knopf abgedeckt. ## Nebenbei `OpenError` ist `Clone + PartialEq` geworden, damit er in einem Signal leben kann; `Io` trägt die Meldung jetzt als `String` statt als `io::Error`, der beides nicht kann. Dazu eine `badge_class()` für die CSS-Zuordnung. `tokio` ist mit dem Feature `rt` explizit dazugekommen und bringt **keine** neuen Pakete ins Lockfile — es lag über `dioxus-desktop` bereits vor. Die alten Klassen `.workspace-selector-layout` und `.workspace-selector-view` sind weg, ersetzt durch die Struktur aus Variante B. ## Nicht automatisch geprüft Das Aussehen. 14 Tests decken die Logik ab, das Rendering nicht — dafür braucht es `dx serve`. Der Prototyp auf `prototype/selector-ui` zeigt, wie es aussehen soll.
RDietermann added 1 commit 2026-08-28 08:38:20 +00:00
Setzt Issue #8 um: eine Ansicht statt Reiter. Die Liste der bekannten
Workspaces fuehrt, das Hinzufuegen sitzt als Nebenaktion in der Fusszeile und
wird nur beim leeren Erststart zur Primaeraktion. Oeffnen ist der
Alltagsfall, Hinzufuegen passiert pro Workspace genau einmal - zwei
gleichrangige Reiter haetten bei jedem Start eine Entscheidung verlangt, die
fast immer dieselbe ist.

Ein Eintrag zeigt den Ordnernamen, darunter den Pfad in der Code-Schrift. Der
Pfad wird bei Ueberlaenge vorne gekuerzt, weil sein Ende mehr aussagt als sein
Anfang.

Die Zustandspruefung laeuft nebenlaeufig ueber use_resource und
spawn_blocking. Ohne das wuerde ein nicht eingehaengtes Netzlaufwerk den
Selector einfrieren: dort laeuft schon is_dir() in ein Timeout von Sekunden,
und zwar auf dem Bildschirm, den jeder Start zuerst zeigt. Solange die
Pruefung laeuft, bleiben die Eintraege unmarkiert.

Die drei Zustaende aus #6 bekommen eigene Farben und Formulierungen - nicht
erreichbar, kein Workspace mehr, beschaedigt -, weil sie zu verschiedenen
Handlungen fuehren. Ein defekter Eintrag wird gedaempft, bleibt aber
anklickbar und verschwindet nie automatisch: Meist fehlt nur gerade das
Laufwerk, und ein Klick versucht es erneut.

OpenError ist dafuer Clone und PartialEq geworden; Io traegt jetzt die
Meldung als String statt io::Error, der beides nicht kann.
RDietermann added 1 commit 2026-08-28 08:59:58 +00:00
RDietermann merged commit cf5baebc6f into main 2026-08-28 09:00:05 +00:00
RDietermann deleted branch feat/selector-ui 2026-08-28 09:00:05 +00:00
Sign in to join this conversation.