use string_builder::Builder; use crate::display_elements::{DisplayColor, DisplayFormat, Signal, DisplayOption}; pub struct TclGenerator { signals: Vec<(String, Option, Option)>, zoom_out: bool, signal_prefix: String, } impl TclGenerator { pub fn new(signal_prefix: String) -> Self { Self { signals: vec![], zoom_out: false, signal_prefix, } } pub fn add_signal(&mut self, signal: &Signal) -> &mut Self { let mut color = None; let mut format = None; for option in signal.options() { match option { DisplayOption::Omit => return self, DisplayOption::Color(c) => { color = Some(c.clone()); }, DisplayOption::Format(f) => { format = Some(f.clone()); } } } self.signals.push((signal.name().to_owned(), color, format)); self } pub fn add_empty(&mut self) -> &mut Self { self.signals.push(("".to_owned(), None, None)); self } pub fn zoom_out(&mut self) -> &mut Self { self.zoom_out = true; self } pub fn generate(self) -> String { let mut builder = Builder::new(300); builder.append("gtkwave::nop\n"); builder.append("gtkwave::/Edit/Set_Trace_Max_Hier 2\n"); builder.append("gtkwave::/View/Show_Filled_High_Values 1\n"); builder.append("gtkwave::/View/Show_Wave_Highlight 1\n"); builder.append("gtkwave::/View/Show_Mouseover 1\n"); builder.append("gtkwave::/View/Left_Justified_Signals 1\n"); for signal in self.signals { if signal.0 == "" { builder.append("gtkwave::/Edit/Insert_Blank\n"); } else { builder.append("gtkwave::addSignalsFromList \""); builder.append(&self.signal_prefix[..]); builder.append(&signal.0[..]); builder.append("\"\n"); builder.append("gtkwave::highlightSignalsFromList \""); builder.append(&self.signal_prefix[..]); builder.append(&signal.0[..]); builder.append("\"\n"); if let Some(color) = signal.1 { builder.append(format!("gtkwave::/Edit/Color_Format/{color}\n")); } if let Some(format) = signal.2 { builder.append(format!("gtkwave::/Edit/Data_Format/{format}\n")); } builder.append("gtkwave::/Edit/UnHighlight_All\n"); } } if self.zoom_out { builder.append("gtkwave::/Time/Zoom/Zoom_Best_Fit\n"); } builder.string().unwrap() } }