use string_builder::Builder; use crate::display_elements::{DisplayColor, DisplayFormat}; pub struct TclGenerator { signals: Vec<(String, Option, Option)>, signal_prefix: String, } impl TclGenerator { pub fn new(signal_prefix: String) -> Self { Self { signals: vec![], signal_prefix, } } pub fn add_signal( &mut self, signal: String, color: Option, format: Option, ) -> &mut Self { self.signals.push((signal, color, format)); self } pub fn add_empty(&mut self) -> &mut Self { self.signals.push(("".to_owned(), None, None)); 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"); 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"); } } builder.append("gtkwave::/Time/Zoom/Zoom_Best_Fit\n"); builder.string().unwrap() } }