60 lines
1.5 KiB
Rust
60 lines
1.5 KiB
Rust
extern crate alloc;
|
|
|
|
use tui_orchestrator::focus::{FocusId, FocusManager, Focusable};
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
|
enum FormElement {
|
|
Username,
|
|
Password,
|
|
RememberMe,
|
|
Submit,
|
|
Cancel,
|
|
}
|
|
|
|
impl FocusId for FormElement {}
|
|
|
|
#[allow(dead_code)]
|
|
struct LoginForm {
|
|
username: String,
|
|
password: String,
|
|
remember: bool,
|
|
}
|
|
|
|
impl Focusable<FormElement> for LoginForm {
|
|
fn focus_targets(&self) -> alloc::vec::Vec<FormElement> {
|
|
vec![
|
|
FormElement::Username,
|
|
FormElement::Password,
|
|
FormElement::RememberMe,
|
|
FormElement::Submit,
|
|
FormElement::Cancel,
|
|
]
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
let form = LoginForm {
|
|
username: String::new(),
|
|
password: String::new(),
|
|
remember: false,
|
|
};
|
|
|
|
let mut focus_manager: FocusManager<FormElement> = FocusManager::new();
|
|
focus_manager.set_targets(form.focus_targets());
|
|
|
|
assert_eq!(focus_manager.current(), Some(&FormElement::Username));
|
|
|
|
focus_manager.next();
|
|
assert_eq!(focus_manager.current(), Some(&FormElement::Password));
|
|
|
|
focus_manager.set_focus(FormElement::Submit).unwrap();
|
|
assert_eq!(focus_manager.current(), Some(&FormElement::Submit));
|
|
|
|
let query = focus_manager.query();
|
|
assert!(query.is_focused(&FormElement::Submit));
|
|
|
|
focus_manager.set_overlay(FormElement::Cancel);
|
|
assert!(focus_manager.has_overlay());
|
|
assert_eq!(focus_manager.current(), Some(&FormElement::Cancel));
|
|
}
|