ansiq_widgets/
session_transcript.rs1use 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}