pub struct FocusManager<Id> { /* private fields */ }Expand description
Manages keyboard focus across multiple components.
FocusManager is generic over an ID type, which is typically a user-defined
enum representing the focusable elements in your application. It tracks
which element is currently focused and provides methods for navigation.
§Type Parameters
Id: The type used to identify focusable elements. Must implementCloneandPartialEq.
§Navigation Behavior
focus_next()moves focus forward, wrapping from last to firstfocus_prev()moves focus backward, wrapping from first to last- When unfocused,
focus_next()focuses the first item,focus_prev()focuses the last
Implementations§
Source§impl<Id: Clone + PartialEq> FocusManager<Id>
impl<Id: Clone + PartialEq> FocusManager<Id>
Sourcepub fn new(order: Vec<Id>) -> Self
pub fn new(order: Vec<Id>) -> Self
Creates a new focus manager with the given focus order.
The manager starts with no element focused. Use with_initial_focus
to start with the first element focused.
§Example
use envision::component::FocusManager;
let focus: FocusManager<&str> = FocusManager::new(vec!["a", "b", "c"]);
assert_eq!(focus.focused(), None);Sourcepub fn with_initial_focus(order: Vec<Id>) -> Self
pub fn with_initial_focus(order: Vec<Id>) -> Self
Creates a new focus manager with the first element focused.
If the order is empty, no element will be focused.
§Example
use envision::component::FocusManager;
let focus = FocusManager::with_initial_focus(vec!["a", "b", "c"]);
assert_eq!(focus.focused(), Some(&"a"));Sourcepub fn focused(&self) -> Option<&Id>
pub fn focused(&self) -> Option<&Id>
Returns the currently focused ID, if any.
§Example
use envision::component::FocusManager;
let mut focus = FocusManager::new(vec!["a", "b"]);
assert_eq!(focus.focused(), None);
focus.focus(&"a");
assert_eq!(focus.focused(), Some(&"a"));Sourcepub fn is_focused(&self, id: &Id) -> bool
pub fn is_focused(&self, id: &Id) -> bool
Returns true if the given ID is currently focused.
§Example
use envision::component::FocusManager;
let focus = FocusManager::with_initial_focus(vec!["a", "b"]);
assert!(focus.is_focused(&"a"));
assert!(!focus.is_focused(&"b"));Sourcepub fn focus(&mut self, id: &Id) -> bool
pub fn focus(&mut self, id: &Id) -> bool
Focuses a specific ID.
Returns true if the ID was found and focused, false if the ID
is not in the focus order.
§Example
use envision::component::FocusManager;
let mut focus = FocusManager::new(vec!["a", "b", "c"]);
assert!(focus.focus(&"b"));
assert_eq!(focus.focused(), Some(&"b"));
assert!(!focus.focus(&"unknown"));
assert_eq!(focus.focused(), Some(&"b")); // UnchangedSourcepub fn focus_next(&mut self) -> Option<&Id>
pub fn focus_next(&mut self) -> Option<&Id>
Moves focus to the next item in the order.
If no item is currently focused, focuses the first item. Wraps from the last item to the first.
Returns the newly focused ID, or None if the order is empty.
§Example
use envision::component::FocusManager;
let mut focus = FocusManager::with_initial_focus(vec!["a", "b", "c"]);
assert_eq!(focus.focus_next(), Some(&"b"));
assert_eq!(focus.focus_next(), Some(&"c"));
assert_eq!(focus.focus_next(), Some(&"a")); // WrapsSourcepub fn focus_prev(&mut self) -> Option<&Id>
pub fn focus_prev(&mut self) -> Option<&Id>
Moves focus to the previous item in the order.
If no item is currently focused, focuses the last item. Wraps from the first item to the last.
Returns the newly focused ID, or None if the order is empty.
§Example
use envision::component::FocusManager;
let mut focus = FocusManager::with_initial_focus(vec!["a", "b", "c"]);
assert_eq!(focus.focus_prev(), Some(&"c")); // Wraps from first to last
assert_eq!(focus.focus_prev(), Some(&"b"));
assert_eq!(focus.focus_prev(), Some(&"a"));Sourcepub fn blur(&mut self)
pub fn blur(&mut self)
Removes focus entirely.
After calling this, focused() will return None.
§Example
use envision::component::FocusManager;
let mut focus = FocusManager::with_initial_focus(vec!["a", "b"]);
assert!(focus.focused().is_some());
focus.blur();
assert!(focus.focused().is_none());Sourcepub fn focus_first(&mut self) -> Option<&Id>
pub fn focus_first(&mut self) -> Option<&Id>
Focuses the first item in the order.
Returns the focused ID, or None if the order is empty.
§Example
use envision::component::FocusManager;
let mut focus = FocusManager::new(vec!["a", "b", "c"]);
focus.focus(&"c");
assert_eq!(focus.focus_first(), Some(&"a"));
assert_eq!(focus.focused(), Some(&"a"));Sourcepub fn focus_last(&mut self) -> Option<&Id>
pub fn focus_last(&mut self) -> Option<&Id>
Focuses the last item in the order.
Returns the focused ID, or None if the order is empty.
§Example
use envision::component::FocusManager;
let mut focus = FocusManager::new(vec!["a", "b", "c"]);
assert_eq!(focus.focus_last(), Some(&"c"));
assert_eq!(focus.focused(), Some(&"c"));Sourcepub fn order(&self) -> &[Id]
pub fn order(&self) -> &[Id]
Returns the focus order.
§Example
use envision::component::FocusManager;
let focus = FocusManager::new(vec!["a", "b", "c"]);
assert_eq!(focus.order(), &["a", "b", "c"]);Trait Implementations§
Source§impl<Id: Clone> Clone for FocusManager<Id>
impl<Id: Clone> Clone for FocusManager<Id>
Source§fn clone(&self) -> FocusManager<Id>
fn clone(&self) -> FocusManager<Id>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<Id: Debug> Debug for FocusManager<Id>
impl<Id: Debug> Debug for FocusManager<Id>
Auto Trait Implementations§
impl<Id> Freeze for FocusManager<Id>
impl<Id> RefUnwindSafe for FocusManager<Id>where
Id: RefUnwindSafe,
impl<Id> Send for FocusManager<Id>where
Id: Send,
impl<Id> Sync for FocusManager<Id>where
Id: Sync,
impl<Id> Unpin for FocusManager<Id>where
Id: Unpin,
impl<Id> UnwindSafe for FocusManager<Id>where
Id: UnwindSafe,
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more