use crate::cli::GlobalArgs;
use crate::cli::color::parse_color;
use crate::cli::duration::parse_duration;
use crate::cmm::cmm_eotf::Eotf;
use crate::tools::tool_client::ToolClient;
use crate::tools::tool_client::with_tool_client;
use crate::wire::jay_damage_tracking::SetVisualizerColor;
use crate::wire::jay_damage_tracking::SetVisualizerDecay;
use crate::wire::jay_damage_tracking::SetVisualizerEnabled;
use clap::Args;
use clap::Subcommand;
use std::rc::Rc;
#[derive(Args, Debug)]
pub struct DamageTrackingArgs {
#[clap(subcommand)]
command: DamageTrackingCmd,
}
#[derive(Subcommand, Debug)]
pub enum DamageTrackingCmd {
Show,
Hide,
SetColor(ColorArgs),
SetDecay(DecayArgs),
}
#[derive(Args, Debug)]
pub struct ColorArgs {
color: String,
}
#[derive(Args, Debug)]
pub struct DecayArgs {
duration: Vec<String>,
}
pub fn main(_global: GlobalArgs, damage_tracking_args: DamageTrackingArgs) {
with_tool_client(async move |tc| {
let damage_tracking = Rc::new(DamageTracking { tc: tc.clone() });
damage_tracking.run(damage_tracking_args).await;
});
}
struct DamageTracking {
tc: Rc<ToolClient>,
}
impl DamageTracking {
async fn run(&self, args: DamageTrackingArgs) {
let tc = &self.tc;
let Some(dt) = tc.jay_damage_tracking().await else {
fatal!("Compositor does not support damage tracking");
};
match args.command {
DamageTrackingCmd::Show => {
tc.send(SetVisualizerEnabled {
self_id: dt,
enabled: true,
});
}
DamageTrackingCmd::Hide => {
tc.send(SetVisualizerEnabled {
self_id: dt,
enabled: false,
});
}
DamageTrackingCmd::SetColor(c) => {
let color = parse_color(&c.color);
let [r, g, b, a] = color.to_array(Eotf::Gamma22);
tc.send(SetVisualizerColor {
self_id: dt,
r,
g,
b,
a,
});
}
DamageTrackingCmd::SetDecay(c) => {
let duration = parse_duration(&c.duration);
tc.send(SetVisualizerDecay {
self_id: dt,
millis: duration.as_millis() as _,
});
}
}
tc.round_trip().await;
}
}