pub struct View<M = ()> { /* private fields */ }Expand description
A surface’s view: the root of each region (main, dock, layer).
A region left out is not shown.
A node given for a region is the region root itself; a list (a Vec or
an array) is wrapped in a col root. Tern draws a region’s children into
an element of its own and ignores the root’s kind and props (but
role), so a root should be a container. A bare node or list converts
into a view as main’s children:
use tern_sdk::ui::{self, View};
let view: View = ui::md("**hi**").into();
let root = view.regions()[0].unwrap();
assert_eq!((root.kind(), root.child_nodes()[0].kind()), ("col", "md"));Implementations§
Source§impl<M> View<M>
impl<M> View<M>
Sourcepub fn new() -> Self
pub fn new() -> Self
The empty view.
Examples found in repository?
examples/ask.rs (line 37)
35fn view() -> View<()> {
36 let sizes = SIZES.iter().map(|(value, label)| choice(value, label));
37 View::new().main([html::form()
38 .key("ask")
39 .class("ask")
40 .child(html::p("Which size?").key("q"))
41 .child(html::div().key("sizes").class("sizes").children(sizes))
42 .child(
43 html::button("Create")
44 .key("go")
45 .actions(Actions::new().click("submit")),
46 )])
47}More examples
examples/table.rs (line 62)
47fn view(entries: &[Entry]) -> View {
48 let head = html::tr()
49 .child(html::th("Name"))
50 .child(html::th("Size").class("size"));
51 let rows = entries.iter().map(|e| {
52 let name = if e.dir {
53 format!("{}/", e.name)
54 } else {
55 e.name.clone()
56 };
57 let size = if e.dir { "-".to_owned() } else { human(e.size) };
58 html::tr()
59 .child(html::td(name).class(if e.dir { "dir" } else { "file" }))
60 .child(html::td(size).class("size"))
61 });
62 View::new().main([html::table()
63 .class("ls")
64 .child(html::thead().child(head))
65 .child(html::tbody().children(rows))])
66}examples/progress.rs (line 65)
40fn view(build: &Build) -> View {
41 let fraction = build.done as f64 / STEPS.len() as f64;
42 let running = build.took.is_none();
43 let activity: ui::Node = if running {
44 ui::spinner()
45 .style("dots")
46 .label(STEPS[build.done.min(STEPS.len() - 1)])
47 .into()
48 } else {
49 ui::icon(if build.status == Status::Done {
50 "check"
51 } else {
52 "x"
53 })
54 .tone(if build.status == Status::Done {
55 "success"
56 } else {
57 "error"
58 })
59 .into()
60 };
61 let mut timer = ui::elapsed().age(0);
62 if let Some(took) = build.took {
63 timer = timer.stopped(took);
64 }
65 View::new().main([ui::card()
66 .key("build")
67 .head("Building demo")
68 .status(build.status.clone())
69 .child(
70 ui::row()
71 .key("head")
72 .gap("sm")
73 .children(nodes![activity.key("a"), timer.key("t")]),
74 )
75 .child(
76 ui::ansi(&build.log)
77 .key("log")
78 .follow(true)
79 .max(Bound::h(Extent::Lines(8.0))),
80 )
81 .child(ui::progress().key("bar").value(fraction).label(format!(
82 "{}/{}",
83 build.done,
84 STEPS.len()
85 )))])
86}examples/chat.rs (line 76)
61 fn view(&self) -> View<Msg> {
62 let messages = self.transcript.iter().enumerate().map(|(i, (who, text))| {
63 let node = ui::md(text.clone()).key(i);
64 if *who == "you" {
65 ui::card().key(i).tone("user").child(node.key("t"))
66 } else {
67 ui::card().key(i).variant("bare").child(node.key("t"))
68 }
69 });
70 let cursor: usize = self
71 .draft
72 .chars()
73 .take(self.cursor)
74 .map(char::len_utf16)
75 .sum();
76 View::new().main(ui::col().children(messages)).dock(nodes![
77 ui::editor()
78 .key("ed")
79 .text(self.draft.clone())
80 .cursor(cursor)
81 .placeholder("Message (Enter sends, Escape quits)")
82 .sendable(true)
83 .on_send(|text| Msg::Send(text.to_owned()))
84 .on_focus(Msg::Focus),
85 ui::status()
86 .key("bar")
87 .child(ui::seg("chat").icon("message"))
88 .child(
89 ui::seg(format!("{} messages", self.transcript.len()))
90 .side(Side::Right)
91 .tone(if self.transcript.is_empty() {
92 Tone::Muted
93 } else {
94 Tone::Success
95 }),
96 ),
97 ])
98 }Sourcepub fn main(self, region: impl Into<Node<M>>) -> Self
pub fn main(self, region: impl Into<Node<M>>) -> Self
Sets main, the flowing document: a root node, or a list of
children wrapped in a col.
Examples found in repository?
examples/ask.rs (lines 37-46)
35fn view() -> View<()> {
36 let sizes = SIZES.iter().map(|(value, label)| choice(value, label));
37 View::new().main([html::form()
38 .key("ask")
39 .class("ask")
40 .child(html::p("Which size?").key("q"))
41 .child(html::div().key("sizes").class("sizes").children(sizes))
42 .child(
43 html::button("Create")
44 .key("go")
45 .actions(Actions::new().click("submit")),
46 )])
47}More examples
examples/table.rs (lines 62-65)
47fn view(entries: &[Entry]) -> View {
48 let head = html::tr()
49 .child(html::th("Name"))
50 .child(html::th("Size").class("size"));
51 let rows = entries.iter().map(|e| {
52 let name = if e.dir {
53 format!("{}/", e.name)
54 } else {
55 e.name.clone()
56 };
57 let size = if e.dir { "-".to_owned() } else { human(e.size) };
58 html::tr()
59 .child(html::td(name).class(if e.dir { "dir" } else { "file" }))
60 .child(html::td(size).class("size"))
61 });
62 View::new().main([html::table()
63 .class("ls")
64 .child(html::thead().child(head))
65 .child(html::tbody().children(rows))])
66}examples/progress.rs (lines 65-85)
40fn view(build: &Build) -> View {
41 let fraction = build.done as f64 / STEPS.len() as f64;
42 let running = build.took.is_none();
43 let activity: ui::Node = if running {
44 ui::spinner()
45 .style("dots")
46 .label(STEPS[build.done.min(STEPS.len() - 1)])
47 .into()
48 } else {
49 ui::icon(if build.status == Status::Done {
50 "check"
51 } else {
52 "x"
53 })
54 .tone(if build.status == Status::Done {
55 "success"
56 } else {
57 "error"
58 })
59 .into()
60 };
61 let mut timer = ui::elapsed().age(0);
62 if let Some(took) = build.took {
63 timer = timer.stopped(took);
64 }
65 View::new().main([ui::card()
66 .key("build")
67 .head("Building demo")
68 .status(build.status.clone())
69 .child(
70 ui::row()
71 .key("head")
72 .gap("sm")
73 .children(nodes![activity.key("a"), timer.key("t")]),
74 )
75 .child(
76 ui::ansi(&build.log)
77 .key("log")
78 .follow(true)
79 .max(Bound::h(Extent::Lines(8.0))),
80 )
81 .child(ui::progress().key("bar").value(fraction).label(format!(
82 "{}/{}",
83 build.done,
84 STEPS.len()
85 )))])
86}examples/chat.rs (line 76)
61 fn view(&self) -> View<Msg> {
62 let messages = self.transcript.iter().enumerate().map(|(i, (who, text))| {
63 let node = ui::md(text.clone()).key(i);
64 if *who == "you" {
65 ui::card().key(i).tone("user").child(node.key("t"))
66 } else {
67 ui::card().key(i).variant("bare").child(node.key("t"))
68 }
69 });
70 let cursor: usize = self
71 .draft
72 .chars()
73 .take(self.cursor)
74 .map(char::len_utf16)
75 .sum();
76 View::new().main(ui::col().children(messages)).dock(nodes![
77 ui::editor()
78 .key("ed")
79 .text(self.draft.clone())
80 .cursor(cursor)
81 .placeholder("Message (Enter sends, Escape quits)")
82 .sendable(true)
83 .on_send(|text| Msg::Send(text.to_owned()))
84 .on_focus(Msg::Focus),
85 ui::status()
86 .key("bar")
87 .child(ui::seg("chat").icon("message"))
88 .child(
89 ui::seg(format!("{} messages", self.transcript.len()))
90 .side(Side::Right)
91 .tone(if self.transcript.is_empty() {
92 Tone::Muted
93 } else {
94 Tone::Success
95 }),
96 ),
97 ])
98 }Sourcepub fn dock(self, region: impl Into<Node<M>>) -> Self
pub fn dock(self, region: impl Into<Node<M>>) -> Self
Sets dock, sticky at the pane’s bottom: a root node, or a list.
Examples found in repository?
examples/chat.rs (lines 76-97)
61 fn view(&self) -> View<Msg> {
62 let messages = self.transcript.iter().enumerate().map(|(i, (who, text))| {
63 let node = ui::md(text.clone()).key(i);
64 if *who == "you" {
65 ui::card().key(i).tone("user").child(node.key("t"))
66 } else {
67 ui::card().key(i).variant("bare").child(node.key("t"))
68 }
69 });
70 let cursor: usize = self
71 .draft
72 .chars()
73 .take(self.cursor)
74 .map(char::len_utf16)
75 .sum();
76 View::new().main(ui::col().children(messages)).dock(nodes![
77 ui::editor()
78 .key("ed")
79 .text(self.draft.clone())
80 .cursor(cursor)
81 .placeholder("Message (Enter sends, Escape quits)")
82 .sendable(true)
83 .on_send(|text| Msg::Send(text.to_owned()))
84 .on_focus(Msg::Focus),
85 ui::status()
86 .key("bar")
87 .child(ui::seg("chat").icon("message"))
88 .child(
89 ui::seg(format!("{} messages", self.transcript.len()))
90 .side(Side::Right)
91 .tone(if self.transcript.is_empty() {
92 Tone::Muted
93 } else {
94 Tone::Success
95 }),
96 ),
97 ])
98 }Trait Implementations§
Auto Trait Implementations§
impl<M = ()> !RefUnwindSafe for View<M>
impl<M = ()> !UnwindSafe for View<M>
impl<M> Freeze for View<M>
impl<M> Send for View<M>
impl<M> Sync for View<M>
impl<M> Unpin for View<M>
impl<M> UnsafeUnpin for View<M>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more