Die App hatte zwei Routable-Enums, zwischen denen ein Signal<bool> umschaltete.
Der Schalter wurde nie gesetzt - beim ersten Umlegen waere aufgefallen, dass
sich beide Router dieselbe History teilen und beide "/" belegen: Wer im
Selector auf "Open Workspace" klickt, steht auf /ws_open, und der
Editor-Router kennt nur / und /editor.
Jetzt ein Enum, der Editor-Teil unter #[nest("/workspace")]. An die Stelle des
bool tritt Signal<Option<Workspace>> in einem Context-Provider - Props
scheiden aus, weil sich durch ein Outlet keine durchreichen lassen. Fehlt der
Workspace, schickt ein Guard im EditorShell-Layout zurueck zum Selector; der
Fall tritt real bei Hot-Reload auf, wo der Context faellt und die Route bleibt.
Der Selector verliert seine Reiter und wird eine einzige Route. Das folgt aus
dem UI-Prototyp in Issue #8: Oeffnen ist der Alltagsfall, Hinzufuegen passiert
pro Workspace einmal - zwei gleichrangige Reiter verlangten bei jedem Start
eine Entscheidung, die fast immer dieselbe ist. Damit entfallen der leere
Stub create_new_workspace.rs, die Tab-Konstante fuer den Selector und die
zugehoerigen CSS-Klassen.
Weil EnumIter nicht mehr gebraucht wird, faellt strum_macros als direkte
Abhaengigkeit weg; strum re-exportiert die Derives bereits.
Entscheidungen dazu in den Issues #5, #6 und #8.
27 lines
1.1 KiB
Rust
27 lines
1.1 KiB
Rust
use dioxus::prelude::*;
|
|
|
|
/// Der Bildschirm vor dem Editor: einen bekannten Workspace öffnen oder einen
|
|
/// hinzufügen. Eine einzige Route, keine Reiter — die Workspace-Liste führt,
|
|
/// das Hinzufügen ist Nebenaktion.
|
|
#[component]
|
|
pub fn Selector() -> Element {
|
|
rsx! {
|
|
div { class: "workspace-selector-layout",
|
|
div { class: "workspace-selector-view",
|
|
// TODO: Workspace-Liste aus workspaces.ron laden und darstellen
|
|
// (Ordnername, Pfad darunter, Statusabzeichen). Bis dahin nur
|
|
// der leere Zustand.
|
|
div { class: "empty-state",
|
|
span { class: "empty-state-title", "Noch kein Workspace" }
|
|
span { "Der erste Workspace ist ein Ordner deiner Wahl." }
|
|
// TODO: Nativen Ordner-Dialog anbinden, Marker anlegen und
|
|
// den Workspace in den Context schreiben.
|
|
button { class: "btn btn-primary", disabled: true,
|
|
"Workspace hinzufügen…"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|