tawasuyu

tawasuyu/brahman

Rust 563TOML 212Markdown 66JSON 198014 Definiciones

⎇ main crates/apps/nahual-shell/src/main.rs Rust · 68 líneas · 2.3 KB Historia Quién tocó qué crudo

refactor(monorepo): reorganización lógica + renames + SDDs + split CHANGELOG 550c98f27 · sergio ·

1//! Yahweh — bootstrap GPUI.
2//!
3//! Fase 6: además del LayoutModel, la Shell crea un `AppBus` (Entity) y se
4//! lo pasa al LayoutHost. El bus circula a viewers (TextViewer,
5//! ImageViewer) que se subscriben directo, y el LayoutHost forwardea los
6//! eventos tipados de los explorers (FileExplorer, DatabaseExplorer)
7//! traducidos a AppEvent.
8
9mod brahman_client;
10mod hot_reload;
11mod layout_host;
12mod layout_model;
13mod managed_tree;
14mod persister;
15mod status_panel;
16
17use gpui::{App, Application, Bounds, WindowBounds, WindowOptions, prelude::*, px, size};
18
19use nahual_bus::AppBus;
20use nahual_core::LayerConfig;
21use nahual_theme::Theme;
22
23use crate::layout_host::LayoutHost;
24use crate::layout_model::LayoutModel;
25use crate::persister::Persister;
26
27const LAYOUT_PATH: &str = "layout.json";
28
29fn main() {
30    // Sidecar brahman: nahual se presenta al Init antes de levantar GPUI.
31    // No bloquea: si el Init no está, el thread loggea y termina.
32    brahman_client::spawn();
33
34    Application::new().run(|cx: &mut App| {
35        Theme::install_default(cx);
36
37        let config = LayerConfig::load_or_default(LAYOUT_PATH);
38        let bounds = Bounds::centered(None, size(px(1300.), px(800.)), cx);
39
40        cx.open_window(
41            WindowOptions {
42                window_bounds: Some(WindowBounds::Windowed(bounds)),
43                ..Default::default()
44            },
45            |_w, cx| {
46                let model = cx.new(|_| LayoutModel::new(config.clone()));
47                let bus = cx.new(|_| AppBus);
48                let persister = cx.new(|cx| {
49                    Persister::new(LAYOUT_PATH.into(), model.clone(), cx)
50                });
51                // Hot-reload: notify watcher en el dir del JSON. El
52                // watcher debe mantenerse vivo (drop ⇒ stop), así que lo
53                // movemos a una static atómica vía Box::leak.
54                match hot_reload::spawn_watch(LAYOUT_PATH.into(), model.clone(), cx) {
55                    Ok(watcher) => {
56                        Box::leak(Box::new(watcher));
57                    }
58                    Err(e) => {
59                        eprintln!("[hot_reload] no se pudo iniciar watcher: {}", e);
60                    }
61                }
62                cx.new(|cx| LayoutHost::new(model, bus, persister, cx))
63            },
64        )
65        .unwrap();
66        cx.activate(true);
67    });
68}