**Core**
Die Host-Seite ist jetzt auf eine gemeinsame software-first API ausgerichtet. In [control.rs](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/crates/infinity_host/src/control.rs>) steckt jetzt das stabile gemeinsame Modell für Snapshots, Commands, Pattern-Katalog, Presets, Gruppen, Parameter, Preview und Übergänge. Darauf sitzen die neue Szenen-/Pattern-Schicht in [scene.rs](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/crates/infinity_host/src/scene.rs>) und der simulationsbasierte Host-Service in [simulation.rs](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/crates/infinity_host/src/simulation.rs>). Der neue Core kann jetzt softwareseitig schon: - Pattern-Katalog mit `solid_color`, `gradient`, `chase`, `pulse`, `noise`, `walking_pixel` - Preset-Recall, Gruppen-Targeting, Parameteränderungen und Übergänge - simulierte Preview-Daten für alle 18 Outputs - denselben API-Zugriff für CLI, Engineering-GUI und später Web-UI / grandMA-Adapter Zusätzlich gibt es im Host-CLI jetzt `snapshot`, also eine direkte JSON-Sicht auf den gemeinsamen Host-State über [main.rs](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/crates/infinity_host/src/main.rs>). **Oberflächen** Die technische lokale GUI bleibt bestehen und hängt jetzt auf der neuen gemeinsamen API. In [app.rs](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/crates/infinity_host_ui/src/app.rs>) zeigt sie weiter Mapping/Status/Testmuster, ergänzt um Engine-/Szene-/Übergangsstatus. Sie bleibt bewusst Engineering-orientiert und ist nicht zur kreativen Hauptoberfläche aufgeblasen worden. Die Beispielkonfiguration in [project.example.toml](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/config/project.example.toml>) ist jetzt auch als Software-Spielwiese brauchbarer: mehr Gruppen, mehr kreative Presets und bessere Basis für Look-Entwicklung ohne echte Node-Aktivierung. Die neue API-Ausrichtung ist in [host_api.md](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/docs/host_api.md>) und [architecture.md](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/docs/architecture.md>) dokumentiert. **Verifikation** `cargo check` und `cargo test -q` laufen erfolgreich. Zusätzlich läuft `cargo run -p infinity_host -- snapshot --config config/project.example.toml` und liefert den gemeinsamen Host-Snapshot mit Katalog, aktiver Szene, Preview, Node- und Panelstatus. Der nächste sinnvolle Schritt ist jetzt ein echter API-Adapter fuer die kommende Web-UI, also HTTP/WebSocket auf genau diesem Host-Core statt einer frontend-spezifischen Parallelarchitektur.
This commit is contained in:
@@ -84,7 +84,7 @@ fn draw_global_controls(ui: &mut egui::Ui, snapshot: &HostSnapshot, service: &Ar
|
||||
}
|
||||
|
||||
let selected_pattern = snapshot.global.selected_pattern.clone();
|
||||
egui::ComboBox::from_id_source("pattern_selector")
|
||||
egui::ComboBox::from_id_salt("pattern_selector")
|
||||
.width(180.0)
|
||||
.selected_text(selected_pattern.clone())
|
||||
.show_ui(ui, |ui| {
|
||||
@@ -202,6 +202,41 @@ fn draw_status_panel(ui: &mut egui::Ui, snapshot: &HostSnapshot) {
|
||||
ui.label("Node connectivity, last contact, and recent control activity.");
|
||||
ui.add_space(8.0);
|
||||
|
||||
ui.group(|ui| {
|
||||
ui.label(RichText::new("Engine").strong());
|
||||
ui.label(format!("Pattern: {}", snapshot.active_scene.pattern_id));
|
||||
ui.label(format!(
|
||||
"Preset: {}",
|
||||
snapshot
|
||||
.active_scene
|
||||
.preset_id
|
||||
.as_deref()
|
||||
.unwrap_or("custom")
|
||||
));
|
||||
ui.label(format!(
|
||||
"Group: {}",
|
||||
snapshot
|
||||
.active_scene
|
||||
.target_group
|
||||
.as_deref()
|
||||
.unwrap_or("all_panels")
|
||||
));
|
||||
ui.label(format!(
|
||||
"Frames: {} at {} Hz",
|
||||
snapshot.engine.frame_index, snapshot.engine.frame_hz
|
||||
));
|
||||
if let Some(transition) = &snapshot.engine.active_transition {
|
||||
ui.label(format!(
|
||||
"Transition: {:?} {:.0}%",
|
||||
transition.style,
|
||||
transition.progress * 100.0
|
||||
));
|
||||
} else {
|
||||
ui.label("Transition: idle");
|
||||
}
|
||||
});
|
||||
ui.add_space(8.0);
|
||||
|
||||
for node in &snapshot.nodes {
|
||||
ui.group(|ui| {
|
||||
ui.horizontal(|ui| {
|
||||
|
||||
@@ -4,7 +4,7 @@ use app::HostUiApp;
|
||||
use clap::Parser;
|
||||
use eframe::egui;
|
||||
use infinity_config::{load_project_from_path, ProjectConfig};
|
||||
use infinity_host::MockHostService;
|
||||
use infinity_host::SimulationHostService;
|
||||
use std::path::PathBuf;
|
||||
|
||||
#[derive(Debug, Parser)]
|
||||
@@ -17,7 +17,7 @@ struct Cli {
|
||||
fn main() -> eframe::Result<()> {
|
||||
let cli = Cli::parse();
|
||||
let project = load_project(cli.config.as_deref());
|
||||
let service = MockHostService::spawn(project);
|
||||
let service = SimulationHostService::spawn_shared(project);
|
||||
|
||||
let options = eframe::NativeOptions {
|
||||
viewport: egui::ViewportBuilder::default()
|
||||
|
||||
Reference in New Issue
Block a user