orbtk 0.2.31

The Orbital Widget Toolkit
Documentation
use std::cell::RefCell;
use std::sync::Arc;
use widgets::Widget;

pub struct FocusManager {
    focused_widget: RefCell<Option<Arc<dyn Widget>>>
}

impl FocusManager {
    pub fn new() -> Self {
        FocusManager {
            focused_widget: RefCell::new(None),
        }
    }

    pub fn request_focus(&self, widget: &Arc<dyn Widget>) {
        (*self.focused_widget.borrow_mut()) = Some(widget.clone());
    }

    pub fn focused(&self, widget: &Arc<dyn Widget>) -> bool {
        if let Some(ref focused_widget) = *self.focused_widget.borrow_mut() {
            if Arc::ptr_eq(&widget, &focused_widget) {
                return true
            } 
        }

        false
    }

    pub fn focused_widget(&self) -> &RefCell<Option<Arc<dyn Widget>>> {
        &self.focused_widget
    }
}