Merge pull request #1526 from mtkennerly/feature/find-focused
Add widget operation to find currently focused widget
This commit is contained in:
commit
23364bc4a2
3 changed files with 46 additions and 0 deletions
|
|
@ -167,3 +167,37 @@ pub fn focus_next<T>() -> impl Operation<T> {
|
||||||
|
|
||||||
count(|count| FocusNext { count, current: 0 })
|
count(|count| FocusNext { count, current: 0 })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Produces an [`Operation`] that searches for the current focused widget
|
||||||
|
/// and stores its ID. This ignores widgets that do not have an ID.
|
||||||
|
pub fn find_focused() -> impl Operation<Id> {
|
||||||
|
struct FindFocused {
|
||||||
|
focused: Option<Id>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Operation<Id> for FindFocused {
|
||||||
|
fn focusable(&mut self, state: &mut dyn Focusable, id: Option<&Id>) {
|
||||||
|
if state.is_focused() && id.is_some() {
|
||||||
|
self.focused = id.cloned();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn container(
|
||||||
|
&mut self,
|
||||||
|
_id: Option<&Id>,
|
||||||
|
operate_on_children: &mut dyn FnMut(&mut dyn Operation<Id>),
|
||||||
|
) {
|
||||||
|
operate_on_children(self)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn finish(&self) -> Outcome<Id> {
|
||||||
|
if let Some(id) = &self.focused {
|
||||||
|
Outcome::Some(id.clone())
|
||||||
|
} else {
|
||||||
|
Outcome::None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FindFocused { focused: None }
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -334,6 +334,12 @@ impl Id {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<Id> for widget::Id {
|
||||||
|
fn from(id: Id) -> Self {
|
||||||
|
id.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Produces a [`Command`] that snaps the [`Scrollable`] with the given [`Id`]
|
/// Produces a [`Command`] that snaps the [`Scrollable`] with the given [`Id`]
|
||||||
/// to the provided `percentage`.
|
/// to the provided `percentage`.
|
||||||
pub fn snap_to<Message: 'static>(id: Id, percentage: f32) -> Command<Message> {
|
pub fn snap_to<Message: 'static>(id: Id, percentage: f32) -> Command<Message> {
|
||||||
|
|
|
||||||
|
|
@ -333,6 +333,12 @@ impl Id {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<Id> for widget::Id {
|
||||||
|
fn from(id: Id) -> Self {
|
||||||
|
id.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Produces a [`Command`] that focuses the [`TextInput`] with the given [`Id`].
|
/// Produces a [`Command`] that focuses the [`TextInput`] with the given [`Id`].
|
||||||
pub fn focus<Message: 'static>(id: Id) -> Command<Message> {
|
pub fn focus<Message: 'static>(id: Id) -> Command<Message> {
|
||||||
Command::widget(operation::focusable::focus(id.0))
|
Command::widget(operation::focusable::focus(id.0))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue