use super::Pending;
use crate::draw::DrawShared;
use crate::event::EventState;
use crate::geom::{Rect, Size};
use crate::layout::AlignPair;
use crate::shell::Platform;
use crate::text::TextApi;
use crate::theme::{Feature, SizeCx, TextClass, ThemeSize};
use crate::{Action, Node, WidgetId};
use std::ops::{Deref, DerefMut};
#[allow(unused)] use crate::{event::Event, Events, Layout};
#[must_use]
pub struct ConfigCx<'a> {
sh: &'a dyn ThemeSize,
ds: &'a mut dyn DrawShared,
pub(crate) ev: &'a mut EventState,
}
impl<'a> ConfigCx<'a> {
#[cfg_attr(not(feature = "internal_doc"), doc(hidden))]
#[cfg_attr(doc_cfg, doc(cfg(internal_doc)))]
pub fn new(sh: &'a dyn ThemeSize, ds: &'a mut dyn DrawShared, ev: &'a mut EventState) -> Self {
ConfigCx { sh, ds, ev }
}
pub fn platform(&self) -> Platform {
self.ds.platform()
}
#[inline]
pub fn size_cx(&self) -> SizeCx<'a> {
SizeCx::new(self.sh)
}
#[inline]
pub fn draw_shared(&mut self) -> &mut dyn DrawShared {
self.ds
}
#[inline]
pub fn ev_state(&mut self) -> &mut EventState {
self.ev
}
pub fn disable_nav_focus(&mut self, disabled: bool) {
self.ev.config.nav_focus = !disabled;
if disabled {
if let Some(id) = self.ev.nav_focus.take() {
self.pending
.push_back(Pending::Send(id, Event::LostNavFocus));
}
}
}
#[inline]
pub fn configure(&mut self, mut widget: Node<'_>, id: WidgetId) {
widget._configure(self, id);
}
#[inline]
pub fn update(&mut self, mut widget: Node<'_>) {
widget._update(self);
}
#[inline]
pub fn align_feature(&self, feature: Feature, rect: Rect, align: AlignPair) -> Rect {
self.sh.align_feature(feature, rect, align)
}
#[inline]
pub fn text_set_size(
&self,
text: &mut dyn TextApi,
class: TextClass,
size: Size,
align: Option<AlignPair>,
) {
self.sh.text_set_size(text, class, size, align)
}
}
impl<'a> std::ops::BitOrAssign<Action> for ConfigCx<'a> {
#[inline]
fn bitor_assign(&mut self, action: Action) {
self.ev.send_action(action);
}
}
impl<'a> Deref for ConfigCx<'a> {
type Target = EventState;
fn deref(&self) -> &EventState {
self.ev
}
}
impl<'a> DerefMut for ConfigCx<'a> {
fn deref_mut(&mut self) -> &mut EventState {
self.ev
}
}