~ruther/gtkwave-tcl-generator

ref: f2309875e50e66ab61c32522d613d5420c557dfa gtkwave-tcl-generator/src/tcl_generator.rs -rw-r--r-- 2.2 KiB
f2309875 — František Boháček feat: map new parsers to tcl generator inputs 1 year, 7 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
use string_builder::Builder;

use crate::display_elements::{DisplayColor, DisplayFormat};

pub struct TclGenerator {
    signals: Vec<(String, Option<DisplayColor>, Option<DisplayFormat>)>,
    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<DisplayColor>,
        format: Option<DisplayFormat>,
    ) -> &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()
    }
}
Do not follow this link