//! `yahweh_bus` — `AppBus` + `AppEvent` para comunicación cross-widget. //! //! Es un `Entity` que emite [`AppEvent`]. Cualquier widget se //! subscribe con `cx.subscribe(&bus, |this, _, ev, cx| { ... })`. La //! Shell crea exactamente un AppBus al boot y lo distribuye: //! //! - **Productores** (FileExplorer, DatabaseExplorer): el LayoutHost los //! subscribe individualmente y reenvía sus eventos tipados al bus, //! normalizando al formato `{provider, id, …}` agnóstico. //! - **Consumidores** (TextViewer, ImageViewer, …): reciben el handle del //! bus en su constructor y se subscriben directo. //! //! Por qué un bus y no `cx.subscribe` directo entre productor y consumidor: //! los viewers no saben qué explorers existen (ni viceversa). El bus //! desacopla — puede haber 0, 1 o N explorers de distintos providers, y //! varios viewers en paralelo viendo el mismo evento. use gpui::EventEmitter; /// Eventos cross-widget. Diseñados para ser agnósticos del dominio: /// `provider` es el id (string) del DataProvider que sabe interpretar el /// `id`. `provider_path` es el contexto opcional (ej. el .sqlite del /// DatabaseExplorer) que el viewer necesita para construir su provider. #[derive(Clone, Debug)] pub enum AppEvent { /// Una entidad fue seleccionada (single click). Suele triggerear un /// preview en el viewer activo. EntitySelected { provider: String, provider_path: Option, id: String, }, /// Una entidad fue ejecutada (doble click u "Open" del menú). EntityOpened { provider: String, provider_path: Option, id: String, }, } #[derive(Default)] pub struct AppBus; impl EventEmitter for AppBus {}