ribir_core 0.0.1-alpha.1

Ribir is a framework for building modern native/wasm cross-platform user interface applications.
use crate::{impl_query_self_only, prelude::*, widget::TreeArena};

#[derive(Declare)]
pub struct DelayDropWidget {
  #[declare(builtin)]
  pub delay_drop_until: bool,
}

impl ComposeChild for DelayDropWidget {
  type Child = Widget;
  #[inline]
  fn compose_child(this: State<Self>, child: Self::Child) -> Widget {
    let this = match this {
      State::Stateless(w) => Stateful::new(w),
      State::Stateful(w) => w,
    };
    widget_attach_data(child, this)
  }
}

impl Query for DelayDropWidget {
  impl_query_self_only!();
}

pub(crate) fn query_drop_until_widget(
  wid: WidgetId,
  arena: &TreeArena,
) -> Option<Stateful<DelayDropWidget>> {
  let mut drop_widget = None;
  wid
    .assert_get(arena)
    .query_on_first_type(QueryOrder::OutsideFirst, |w: &Stateful<DelayDropWidget>| {
      drop_widget = Some(w.clone_stateful())
    });
  drop_widget
}