properties: rewrite properties (whoops)

This commit is contained in:
Torrie Fischer
2024-12-15 19:27:27 +01:00
parent 3a49e7e390
commit 514c9defd6
19 changed files with 1051 additions and 715 deletions

View File

@@ -1,7 +1,7 @@
use std::str::FromStr;
use crate::task::Task;
use crate::events::*;
use crate::properties::*;
use paste::paste;
#[derive(Debug, PartialEq, Eq, Clone)]
struct Scene {
@@ -13,7 +13,7 @@ struct Scene {
#[derive(Debug, PartialEq, Eq, Clone)]
enum Trigger {
Startup,
PropertyEquals(&'static str, Variant)
PropertyEquals(PropertyID, Variant)
}
pub struct Sequencer {
@@ -34,7 +34,7 @@ impl Sequencer {
Scene {
name: "Online",
patterns: vec!["Idle"],
trigger: Trigger::PropertyEquals("system.network.online", Variant::Boolean(true))
trigger: Trigger::PropertyEquals(prop_id!(System::NetworkOnline), Variant::Boolean(true))
}
]
}
@@ -78,34 +78,53 @@ impl Sequencer {
}
}
pub mod props {
use crate::property_namespace;
property_namespace!(
Scenes,
Current => "",
All => Vec::new()
);
}
use crate::scenes::props::Scenes;
impl Task for Sequencer {
fn start(&mut self, bus: &mut EventBus) {
log::info!("Starting sequencer!!!");
let startup_scene = self.scenes.iter().filter(|i| { i.trigger == Trigger::Startup }).next().unwrap();
bus.push(Event::new_property_change("scenes.current", startup_scene.name));
bus.set_property(Scenes::Current, startup_scene.name);
let mut scene_list = Vec::new();
for scene in self.scenes.iter() {
scene_list.push(Variant::String(scene.name.to_string()));
}
bus.set_property(Scenes::All, scene_list);
}
fn on_property_change(&mut self, key: &'static str, value: &Variant, bus: &mut EventBus) {
fn on_property_change(&mut self, key: PropertyID, value: &Variant, bus: &mut EventBus) {
match (key, value) {
("scenes.current", Variant::String(scene_name)) => {
(prop_id!(Scenes::Current), Variant::String(ref scene_name)) => {
log::info!("Applying scene");
self.apply_scene(scene_name, bus);
},
(key, value) => {
for scene in self.scenes.iter() {
/*for scene in self.scenes.iter() {
match scene.trigger {
Trigger::PropertyEquals(trigger_key, ref trigger_value) => {
if trigger_key == key && trigger_value == value {
log::info!("Triggering scene {}", scene.name);
bus.push(Event::new_property_change("scenes.current", scene.name))
bus.push(Scenes::Current.new_property_change(scene.name))
}
},
_ => ()
}
}
}*/
}
_ => ()
}
}
}
}
use crate::prop_id;