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.
37 lines
1.2 KiB
Rust
37 lines
1.2 KiB
Rust
use dioxus::prelude::*;
|
|
use strum::EnumMessage;
|
|
|
|
use crate::views::editor::dionotes_editor::{Editor, EditorShell, Home};
|
|
use crate::views::workspace_selector::selector::Selector;
|
|
|
|
/// Alle Routen der App in einem Enum.
|
|
///
|
|
/// Bewusst *ein* Router statt zweier: Zwei Routable-Enums teilen sich dieselbe
|
|
/// History, und beide hatten `/` belegt — beim Umschalten hätte der Editor eine
|
|
/// URL zu sehen bekommen, die er nicht kennt.
|
|
#[derive(Debug, Clone, Routable, PartialEq, EnumMessage)]
|
|
#[rustfmt::skip]
|
|
pub enum Route {
|
|
#[nest("/workspace")]
|
|
#[layout(EditorShell)]
|
|
#[route("/")]
|
|
#[strum(message = "Home")]
|
|
Home {},
|
|
#[route("/editor")]
|
|
#[strum(message = "Editor")]
|
|
Editor {},
|
|
#[end_layout]
|
|
#[end_nest]
|
|
#[route("/")]
|
|
Selector {},
|
|
}
|
|
|
|
impl Route {
|
|
/// Die Einträge der Datei-Leiste im Editor.
|
|
///
|
|
/// Explizit statt über `EnumIter`, weil das Enum jetzt auch den Selector
|
|
/// enthält und der in dieser Leiste nichts zu suchen hat. Wermutstropfen:
|
|
/// eine neue Editor-Route hier einzutragen erzwingt der Compiler nicht.
|
|
pub const EDITOR_TABS: [Self; 2] = [Self::Home {}, Self::Editor {}];
|
|
}
|