Add is_focused function that produces an Operation to get the focused state of a focusable by ID.
Add `is_focused` function that produces a `Task` to get the focused state of a `text_input` by ID.
This commit is contained in:
parent
f1ed99cb47
commit
9cba92f57f
2 changed files with 50 additions and 0 deletions
|
|
@ -257,3 +257,48 @@ pub fn find_focused() -> impl Operation<Id> {
|
||||||
|
|
||||||
FindFocused { focused: None }
|
FindFocused { focused: None }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Produces an [`Operation`] that searches for the focusable widget
|
||||||
|
/// and stores whether it is focused or not. This ignores widgets that
|
||||||
|
/// do not have an ID.
|
||||||
|
pub fn is_focused(target: Id) -> impl Operation<bool> {
|
||||||
|
struct IsFocused {
|
||||||
|
target: Id,
|
||||||
|
is_focused: Option<bool>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Operation<bool> for IsFocused {
|
||||||
|
fn focusable(
|
||||||
|
&mut self,
|
||||||
|
id: Option<&Id>,
|
||||||
|
_bounds: Rectangle,
|
||||||
|
state: &mut dyn Focusable,
|
||||||
|
) {
|
||||||
|
if id.is_some_and(|id| *id == self.target) {
|
||||||
|
self.is_focused = Some(state.is_focused());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn container(
|
||||||
|
&mut self,
|
||||||
|
_id: Option<&Id>,
|
||||||
|
_bounds: Rectangle,
|
||||||
|
operate_on_children: &mut dyn FnMut(&mut dyn Operation<bool>),
|
||||||
|
) {
|
||||||
|
operate_on_children(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn finish(&self) -> Outcome<bool> {
|
||||||
|
if let Some(is_focused) = &self.is_focused {
|
||||||
|
Outcome::Some(*is_focused)
|
||||||
|
} else {
|
||||||
|
Outcome::None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IsFocused {
|
||||||
|
target,
|
||||||
|
is_focused: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1481,6 +1481,11 @@ impl From<String> for Id {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Produces a [`Task`] that returns whether the [`TextInput`] with the given [`Id`] is focused or not.
|
||||||
|
pub fn is_focused(id: impl Into<Id>) -> Task<bool> {
|
||||||
|
task::widget(operation::focusable::is_focused(id.into().into()))
|
||||||
|
}
|
||||||
|
|
||||||
/// Produces a [`Task`] that focuses the [`TextInput`] with the given [`Id`].
|
/// Produces a [`Task`] that focuses the [`TextInput`] with the given [`Id`].
|
||||||
pub fn focus<T>(id: impl Into<Id>) -> Task<T> {
|
pub fn focus<T>(id: impl Into<Id>) -> Task<T> {
|
||||||
task::effect(Action::widget(operation::focusable::focus(id.into().0)))
|
task::effect(Action::widget(operation::focusable::focus(id.into().0)))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue