Notiz-Baum in der Datei-Leiste #14

Merged
RDietermann merged 2 commits from feat/notiz-baum into main 2026-08-28 09:00:29 +00:00
Owner

Setzt Issue #7 um — und schließt damit die Workspace-Map ab. Die files-bar zeigt nicht mehr zwei Platzhalter-Routen, sondern den Inhalt des offenen Workspace.

Basiert auf feat/selector-ui (PR #13), weil beide dieselben CSS-Dateien anfassen. Ziel-Branch ist deshalb nicht main.

Der Baum

pub enum TreeNode {
    File   { name: String, path: PathBuf },
    Folder { name: String, path: PathBuf, children: Vec<TreeNode> },
}

Eine einzige File-Variante für alle Dateitypen; wer wissen will, ob es eine Notiz ist, fragt path.extension(). Aufgebaut über std::fs::read_dir mit eigener Rekursion — walkdir liegt zwar im Graph, iteriert aber flach.

Regel Verhalten
Dateitypen alle, nicht nur .md
Führender Punkt übersprungen — Dateien wie Ordner, damit .dionotes und .git ohne Ausnahmeliste wegfallen
Symlinks übersprungen (symlink_metadata), sonst bräuchte es Zyklusschutz
Leere Ordner werden angezeigt
Sortierung Ordner zuerst, dann Dateien, alphabetisch ohne Rücksicht auf Groß-/Kleinschreibung
Unlesbarer Unterordner wird leer dargestellt, statt den ganzen Baum scheitern zu lassen

Der Aufklapp-Zustand liegt neben dem Baum

HashSet<PathBuf>, nicht expanded: bool im Knoten. Der Grund ist die Refresh-Entscheidung: Es gibt keinen Filewatcher, der Nutzer liest bei Bedarf neu ein — steckte der Zustand im Knoten, klappte jeder Refresh sämtliche Ordner zu. So überlebt er den Neuaufbau ohne Übertragungslogik. Persistiert wird er nicht.

Das Einlesen läuft wie im Selector über spawn_blocking, damit ein langsames Laufwerk die Oberfläche nicht blockiert.

Was dabei wegfällt

  • EDITOR_TABS — der letzte Rest des in #5 dokumentierten Pflegepunkts, dass der Compiler das Eintragen neuer Routen nicht erzwingt. Mit den Tabs ist auch das Problem weg.
  • strum und strum_macros — dienten nur noch diesen Beschriftungen, jetzt komplett aus dem Graph.
  • Hero samt header.svg (23 KB) — Dioxus-Vorlagentext ohne eigenes CSS, der nach dem Öffnen eines Workspace die rechte Hälfte mit ungestylten Werbelinks füllte. Home ist jetzt ein Empty-State.

Tests

20 grün, davon sechs neu: Sortierung samt Groß-/Kleinschreibung, alle Dateitypen, versteckte Namen (Dateien und Ordner), leere Ordner, Verschachtelung, fehlende Wurzel.

Nicht geprüft

Das Aussehen, wie immer. Und der Klick auf eine Datei tut noch nichts — das Öffnen einer Notiz gehört zum Notiz-Handling und damit in den nächsten Effort. Im Code steht ein TODO an der Stelle.

Setzt Issue #7 um — und **schließt damit die Workspace-Map ab**. Die `files-bar` zeigt nicht mehr zwei Platzhalter-Routen, sondern den Inhalt des offenen Workspace. **Basiert auf `feat/selector-ui`** (PR #13), weil beide dieselben CSS-Dateien anfassen. Ziel-Branch ist deshalb nicht `main`. ## Der Baum ```rust pub enum TreeNode { File { name: String, path: PathBuf }, Folder { name: String, path: PathBuf, children: Vec<TreeNode> }, } ``` Eine einzige `File`-Variante für alle Dateitypen; wer wissen will, ob es eine Notiz ist, fragt `path.extension()`. Aufgebaut über `std::fs::read_dir` mit eigener Rekursion — `walkdir` liegt zwar im Graph, iteriert aber flach. | Regel | Verhalten | | --- | --- | | Dateitypen | alle, nicht nur `.md` | | Führender Punkt | übersprungen — **Dateien wie Ordner**, damit `.dionotes` und `.git` ohne Ausnahmeliste wegfallen | | Symlinks | übersprungen (`symlink_metadata`), sonst bräuchte es Zyklusschutz | | Leere Ordner | werden angezeigt | | Sortierung | Ordner zuerst, dann Dateien, alphabetisch ohne Rücksicht auf Groß-/Kleinschreibung | | Unlesbarer Unterordner | wird leer dargestellt, statt den ganzen Baum scheitern zu lassen | ## Der Aufklapp-Zustand liegt neben dem Baum `HashSet<PathBuf>`, nicht `expanded: bool` im Knoten. Der Grund ist die Refresh-Entscheidung: Es gibt keinen Filewatcher, der Nutzer liest bei Bedarf neu ein — steckte der Zustand im Knoten, klappte **jeder Refresh sämtliche Ordner zu**. So überlebt er den Neuaufbau ohne Übertragungslogik. Persistiert wird er nicht. Das Einlesen läuft wie im Selector über `spawn_blocking`, damit ein langsames Laufwerk die Oberfläche nicht blockiert. ## Was dabei wegfällt - **`EDITOR_TABS`** — der letzte Rest des in #5 dokumentierten Pflegepunkts, dass der Compiler das Eintragen neuer Routen nicht erzwingt. Mit den Tabs ist auch das Problem weg. - **`strum` und `strum_macros`** — dienten nur noch diesen Beschriftungen, jetzt komplett aus dem Graph. - **`Hero` samt `header.svg`** (23 KB) — Dioxus-Vorlagentext ohne eigenes CSS, der nach dem Öffnen eines Workspace die rechte Hälfte mit ungestylten Werbelinks füllte. `Home` ist jetzt ein Empty-State. ## Tests 20 grün, davon sechs neu: Sortierung samt Groß-/Kleinschreibung, alle Dateitypen, versteckte Namen (Dateien *und* Ordner), leere Ordner, Verschachtelung, fehlende Wurzel. ## Nicht geprüft Das Aussehen, wie immer. Und der Klick auf eine Datei tut noch nichts — das Öffnen einer Notiz gehört zum Notiz-Handling und damit in den nächsten Effort. Im Code steht ein TODO an der Stelle.
RDietermann changed target branch from feat/selector-ui to main 2026-08-28 09:00:08 +00:00
RDietermann added 1 commit 2026-08-28 09:00:08 +00:00
Setzt Issue #7 um und schliesst damit die Workspace-Map ab. Die files-bar
zeigt nicht mehr zwei Platzhalter-Routen, sondern den rekursiv eingelesenen
Inhalt des offenen Workspace.

TreeNode ist ein verschachteltes Enum mit einer einzigen File-Variante fuer
alle Dateitypen - wer wissen will, ob es eine Notiz ist, fragt
path.extension(). Aufgebaut wird ueber std::fs::read_dir mit eigener
Rekursion; walkdir liegt zwar im Graph, iteriert aber flach, woraus einen
Baum zu bauen mehr Code waere.

Eingesammelt wird alles ausser Namen mit fuehrendem Punkt - Dateien wie
Ordner, womit .dionotes und .git ohne Ausnahmeliste wegfallen - und ausser
Symlinks, deren Verfolgung einen Zyklusschutz erfordern wuerde. Leere Ordner
werden angezeigt, sortiert wird Ordner-vor-Dateien und alphabetisch ohne
Ruecksicht auf Gross-/Kleinschreibung.

Der Aufklapp-Zustand liegt als HashSet<PathBuf> neben dem Baum, nicht darin:
Es gibt keinen Filewatcher, der Nutzer liest bei Bedarf neu ein - steckte
expanded im Knoten, klappte jeder Refresh saemtliche Ordner zu. Persistiert
wird er nicht.

Mit dem Baum entfaellt die Tab-Leiste im Editor und damit EDITOR_TABS, der
letzte Rest des in #5 dokumentierten Pflegepunkts. strum wird dadurch
nirgends mehr gebraucht und faellt samt strum_macros aus dem Graph.

Ausserdem entfernt: der Dioxus-Vorlagentext Hero samt header.svg, der nach
dem Oeffnen eines Workspace die rechte Haelfte mit ungestylten Werbelinks
fuellte. Home ist jetzt ein Empty-State.
RDietermann added 1 commit 2026-08-28 09:00:23 +00:00
RDietermann merged commit 5013f4bcc4 into main 2026-08-28 09:00:29 +00:00
RDietermann deleted branch feat/notiz-baum 2026-08-28 09:00:29 +00:00
Sign in to join this conversation.