pub struct Editor<M = ()>(/* private fields */);Expand description
editor: a multi-line text field whose text the program owns.
Implementations§
Source§impl<M> Editor<M>
impl<M> Editor<M>
Sourcepub fn key(self, key: impl Into<NodeKey>) -> Self
pub fn key(self, key: impl Into<NodeKey>) -> Self
Identity among siblings: keeps the node’s id (and Tern’s view state) across reorders. A string, or an integer.
Examples found in repository?
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 role(self, role: impl Into<String>) -> Self
pub fn role(self, role: impl Into<String>) -> Self
A name of yours, exposed to CSS as data-role.
Keeps the node mounted but not laid out.
Sourcepub fn mark(self, mark: impl Into<Mark>) -> Self
pub fn mark(self, mark: impl Into<Mark>) -> Self
A transient selection mark drawn over the node.
Sourcepub fn aria(self, aria: impl Into<String>) -> Self
pub fn aria(self, aria: impl Into<String>) -> Self
The accessible name of a node that shows no text.
Sourcepub fn href(self, href: impl Into<String>) -> Self
pub fn href(self, href: impl Into<String>) -> Self
A link: ⌘-click opens it; copy and open use it.
Sourcepub fn basis(self, basis: impl Into<Basis>) -> Self
pub fn basis(self, basis: impl Into<Basis>) -> Self
Flex basis: a fraction of the parent, or the content’s size.
Sourcepub fn prop(self, name: &str, value: impl Serialize) -> Self
pub fn prop(self, name: &str, value: impl Serialize) -> Self
Sets any prop untyped; null removes it.
Sourcepub fn on_click(self, msg: M) -> Self
pub fn on_click(self, msg: M) -> Self
Sends msg on a click (sets actions.click to "click" unless
the node names its click action itself).
Sourcepub fn on_dblclick(self, msg: M) -> Self
pub fn on_dblclick(self, msg: M) -> Self
Sends msg on a double click (sets actions.dblclick to
"dblclick" unless the node names it).
Adds act to the context menu and sends msg when it is picked.
Sourcepub fn on_action(self, act: impl Into<String>, msg: M) -> Self
pub fn on_action(self, act: impl Into<String>, msg: M) -> Self
Sends msg on action events whose action is act (name or
name=value).
Sourcepub fn on_action_with(
self,
act: impl Into<String>,
f: impl Fn(&Action) -> M + Send + Sync + 'static,
) -> Self
pub fn on_action_with( self, act: impl Into<String>, f: impl Fn(&Action) -> M + Send + Sync + 'static, ) -> Self
Maps action events whose action is act to a message.
Sourcepub fn on_toggle(self, f: impl Fn(bool) -> M + Send + Sync + 'static) -> Self
pub fn on_toggle(self, f: impl Fn(bool) -> M + Send + Sync + 'static) -> Self
Maps toggle events (the new collapsed) to a message.
Sourcepub fn on_select(self, f: impl Fn(&str) -> M + Send + Sync + 'static) -> Self
pub fn on_select(self, f: impl Fn(&str) -> M + Send + Sync + 'static) -> Self
Maps select events (the item) to a message. On a list’s item the
item’s own handler runs first.
Sourcepub fn on_activate(self, f: impl Fn(&str) -> M + Send + Sync + 'static) -> Self
pub fn on_activate(self, f: impl Fn(&str) -> M + Send + Sync + 'static) -> Self
Maps activate events (the item) to a message.
Sourcepub fn on_change(self, f: impl Fn(&Change) -> M + Send + Sync + 'static) -> Self
pub fn on_change(self, f: impl Fn(&Change) -> M + Send + Sync + 'static) -> Self
Maps change events to a message.
Sourcepub fn on_focus(self, msg: M) -> Self
pub fn on_focus(self, msg: M) -> Self
Sends msg on focus events (a click asked for the keys).
Examples found in repository?
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 on_edit(self, f: impl Fn(&Edit) -> M + Send + Sync + 'static) -> Self
pub fn on_edit(self, f: impl Fn(&Edit) -> M + Send + Sync + 'static) -> Self
Maps edit events (native editing) to a message.
Sourcepub fn on_send(self, f: impl Fn(&str) -> M + Send + Sync + 'static) -> Self
pub fn on_send(self, f: impl Fn(&str) -> M + Send + Sync + 'static) -> Self
Maps send events (the text to submit) to a message.
Examples found in repository?
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 }Source§impl<M> Editor<M>
impl<M> Editor<M>
Sourcepub fn text(self, value: impl Into<String>) -> Self
pub fn text(self, value: impl Into<String>) -> Self
The text.
Examples found in repository?
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 cursor(self, value: impl Into<usize>) -> Self
pub fn cursor(self, value: impl Into<usize>) -> Self
The caret, UTF-16.
Examples found in repository?
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 placeholder(self, value: impl Into<String>) -> Self
pub fn placeholder(self, value: impl Into<String>) -> Self
Dim text while empty.
Examples found in repository?
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 sendable(self, value: impl Into<bool>) -> Self
pub fn sendable(self, value: impl Into<bool>) -> Self
Accepts an atomic send.
Examples found in repository?
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 }