Skip to main content

ansiq_widgets/
session_transcript.rs

1use ansiq_core::{Element, Layout, Length, Style, TranscriptEntry, TranscriptSession};
2
3use crate::{Box, TranscriptView};
4
5pub struct SessionTranscript<Message = ()> {
6    intro: Option<Element<Message>>,
7    active: Option<Element<Message>>,
8    entries: Vec<TranscriptEntry>,
9    empty: Option<Element<Message>>,
10    session_started: bool,
11    style: Style,
12    gap: u16,
13}
14
15impl<Message> SessionTranscript<Message> {
16    pub fn new() -> Self {
17        Self {
18            intro: None,
19            active: None,
20            entries: Vec::new(),
21            empty: None,
22            session_started: false,
23            style: Style::default(),
24            gap: 1,
25        }
26    }
27
28    pub fn intro(mut self, intro: Element<Message>) -> Self {
29        self.intro = Some(intro);
30        self
31    }
32
33    pub fn active(mut self, active: Element<Message>) -> Self {
34        self.active = Some(active);
35        self
36    }
37
38    pub fn entries(mut self, entries: impl IntoIterator<Item = TranscriptEntry>) -> Self {
39        self.entries = entries.into_iter().collect();
40        self
41    }
42
43    pub fn session(mut self, session: TranscriptSession) -> Self {
44        self.session_started = session.started();
45        self.entries = session.entries().to_vec();
46        self
47    }
48
49    pub fn empty(mut self, empty: Element<Message>) -> Self {
50        self.empty = Some(empty);
51        self
52    }
53
54    pub fn session_started(mut self, session_started: bool) -> Self {
55        self.session_started = session_started;
56        self
57    }
58
59    pub fn gap(mut self, gap: u16) -> Self {
60        self.gap = gap;
61        self
62    }
63
64    pub fn style(mut self, style: Style) -> Self {
65        self.style = style;
66        self
67    }
68
69    pub fn build(self) -> Element<Message> {
70        let mut column = Box::column()
71            .gap(self.gap)
72            .style(self.style)
73            .layout(Layout {
74                width: Length::Fill,
75                height: Length::Auto,
76            });
77
78        if !self.session_started {
79            if let Some(intro) = self.intro {
80                column = column.child(intro);
81            }
82        } else if !self.entries.is_empty() {
83            column = column.child(TranscriptView::new(self.entries).build());
84        } else if let Some(active) = self.active {
85            column = column.child(active);
86        } else if let Some(empty) = self.empty {
87            column = column.child(empty);
88        }
89
90        column.build()
91    }
92}