mod callbacks;
mod state;
use crate::{
EditorModel, MainWindow, SettingsModel,
bridge::{library::source::LibrarySource, render_thread::RenderContext},
gui::render,
settings::SettingsPersister,
};
use callbacks::{
setup_editor, setup_library_callbacks, setup_live_view_mode_callbacks, setup_remote_and_batch,
setup_render_callbacks, setup_solid_view_mode_callbacks, setup_window_close,
};
use slint::ComponentHandle;
use state::{
apply_custom_materials, create_solid_view, load_settings, open_design_library,
spawn_viewport_render_thread,
};
use std::sync::{Arc, Mutex};
pub(in crate::gui) const DB_PATH: &str = "facet_diagrams.sqlite";
pub struct MainWindowHandle {
pub ui: MainWindow,
#[expect(
dead_code,
reason = "RAII guard field -- kept alive, never read; see comment above"
)]
render_ctx: Arc<Mutex<RenderContext>>,
pub(super) settings_store: Arc<SettingsPersister>,
#[expect(
dead_code,
reason = "RAII guard field -- kept alive, never read; see comment above"
)]
remote_rendering_timer: slint::Timer,
}
pub fn build_main_window() -> anyhow::Result<MainWindowHandle> {
let ui = MainWindow::new()?;
ui.global::<SettingsModel>()
.set_gpu_build(cfg!(feature = "gpu"));
ui.global::<EditorModel>().set_enabled(true);
let db = open_design_library(&ui)?;
let render_ctx = Arc::new(Mutex::new(RenderContext::default()));
let solid = create_solid_view(&ui, &render_ctx);
let library_source: Arc<Mutex<LibrarySource>> = Arc::new(Mutex::new(LibrarySource::default()));
apply_custom_materials(&ui, &db, &render_ctx);
let settings_store = load_settings(&ui, &render_ctx);
render::render_visibility::setup_live_render_visibility_callbacks(
&ui,
&render_ctx,
&solid.preview_state,
);
render::render_visibility::recompute_tab_visible(&ui, &render_ctx);
spawn_viewport_render_thread(&ui, &render_ctx, &solid);
setup_render_callbacks(&ui, &db, &render_ctx, &settings_store, &solid);
setup_library_callbacks(
&ui,
&db,
&library_source,
&render_ctx,
&settings_store,
&solid.preview_state,
);
setup_editor(&ui, &db, &library_source, &render_ctx, &solid);
render::design_lighting::setup_design_lighting_callbacks(
&ui,
&db,
&render_ctx,
&settings_store,
);
setup_solid_view_mode_callbacks(&ui, &render_ctx, &settings_store, &solid.preview_state);
setup_live_view_mode_callbacks(&ui, &render_ctx, &settings_store, &solid.preview_state);
let remote_rendering_timer =
setup_remote_and_batch(&ui, &db, &library_source, &render_ctx, &settings_store);
setup_window_close(&ui, &render_ctx, &settings_store);
crate::gui::commands::show_edit_view(&ui);
Ok(MainWindowHandle {
ui,
render_ctx,
settings_store,
remote_rendering_timer,
})
}