text input always_active field & ids
This commit is contained in:
parent
42cb83a6bb
commit
d138232655
1 changed files with 38 additions and 2 deletions
|
|
@ -206,6 +206,7 @@ pub struct TextInput<'a, Message> {
|
||||||
dnd_icon: bool,
|
dnd_icon: bool,
|
||||||
line_height: text::LineHeight,
|
line_height: text::LineHeight,
|
||||||
helper_line_height: text::LineHeight,
|
helper_line_height: text::LineHeight,
|
||||||
|
always_active: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Message> TextInput<'a, Message>
|
impl<'a, Message> TextInput<'a, Message>
|
||||||
|
|
@ -249,9 +250,17 @@ where
|
||||||
line_height: text::LineHeight::default(),
|
line_height: text::LineHeight::default(),
|
||||||
label: None,
|
label: None,
|
||||||
helper_text: None,
|
helper_text: None,
|
||||||
|
always_active: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets the input to be always active.
|
||||||
|
/// This makes it behave as if it was always focused.
|
||||||
|
pub fn always_active(mut self) -> Self {
|
||||||
|
self.always_active = true;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets the text of the [`TextInput`].
|
/// Sets the text of the [`TextInput`].
|
||||||
pub fn label(mut self, label: &'a str) -> Self {
|
pub fn label(mut self, label: &'a str) -> Self {
|
||||||
self.label = Some(label);
|
self.label = Some(label);
|
||||||
|
|
@ -504,7 +513,11 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
fn state(&self) -> tree::State {
|
fn state(&self) -> tree::State {
|
||||||
tree::State::new(State::new(self.is_secure, self.is_read_only))
|
tree::State::new(State::new(
|
||||||
|
self.is_secure,
|
||||||
|
self.is_read_only,
|
||||||
|
self.always_active,
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn diff(&mut self, tree: &mut Tree) {
|
fn diff(&mut self, tree: &mut Tree) {
|
||||||
|
|
@ -552,6 +565,14 @@ where
|
||||||
self.is_read_only = state.is_read_only;
|
self.is_read_only = state.is_read_only;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if self.always_active && state.is_focused.is_none() {
|
||||||
|
let now = Instant::now();
|
||||||
|
state.is_focused = Some(Focus {
|
||||||
|
updated_at: now,
|
||||||
|
now,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
let mut children: Vec<_> = self
|
let mut children: Vec<_> = self
|
||||||
.leading_icon
|
.leading_icon
|
||||||
.iter_mut()
|
.iter_mut()
|
||||||
|
|
@ -875,6 +896,14 @@ where
|
||||||
let layout = children.next().unwrap();
|
let layout = children.next().unwrap();
|
||||||
mouse_interaction(layout, cursor_position, self.on_input.is_none())
|
mouse_interaction(layout, cursor_position, self.on_input.is_none())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn id(&self) -> Option<Id> {
|
||||||
|
self.id.clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_id(&mut self, id: Id) {
|
||||||
|
self.id = Some(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Message> From<TextInput<'a, Message>>
|
impl<'a, Message> From<TextInput<'a, Message>>
|
||||||
|
|
@ -2391,10 +2420,17 @@ struct Focus {
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
/// Creates a new [`State`], representing an unfocused [`TextInput`].
|
/// Creates a new [`State`], representing an unfocused [`TextInput`].
|
||||||
pub fn new(is_secure: bool, is_read_only: bool) -> Self {
|
pub fn new(is_secure: bool, is_read_only: bool, always_active: bool) -> Self {
|
||||||
Self {
|
Self {
|
||||||
is_secure,
|
is_secure,
|
||||||
is_read_only,
|
is_read_only,
|
||||||
|
is_focused: always_active.then(|| {
|
||||||
|
let now = Instant::now();
|
||||||
|
Focus {
|
||||||
|
updated_at: now,
|
||||||
|
now,
|
||||||
|
}
|
||||||
|
}),
|
||||||
..Self::default()
|
..Self::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue