deft 1.0.0

Cross platform ui framework
use crate::base::Rect;
use crate::element::container::Container;
use crate::element::label::Label;
use crate::mrc::Mrc;
use crate::timer::{set_timeout, TimerHandle};
use crate::window::popup::Popup;
use crate::window::WindowHandle;
use std::ops::Deref;

pub struct Tooltip {
    timer_handle: Option<TimerHandle>,
    popup_holder: Mrc<Option<Popup>>,
}

impl Tooltip {
    pub fn new(window_handle: WindowHandle, text: String, target: Rect) -> Self {
        let mut container = Container::new_with_tag("tooltip".to_string());
        let mut label = Label::create();
        label.set_text(text);
        let _ = container.add_child(&label, Some(0));
        let popup_holder = Mrc::new(None);
        let timer_handle = {
            let mut popup_holder = popup_holder.clone();
            let window_handle = window_handle.clone();
            set_timeout(
                move || {
                    if let Ok(w) = window_handle.upgrade() {
                        let p = w.popup_ex(&container, target, false);
                        popup_holder.replace(p);
                    }
                },
                100,
            )
        };
        Tooltip {
            timer_handle: Some(timer_handle),
            popup_holder,
        }
    }
}

impl Drop for Tooltip {
    fn drop(&mut self) {
        if let Some(popup) = self.popup_holder.deref() {
            let _ = popup.close();
        }
    }
}