use super::{Feature, FrameStyle, MarginStyle, TextClass};
use crate::autoimpl;
use crate::dir::Directional;
use crate::event::EventState;
use crate::geom::Rect;
use crate::layout::{AlignPair, FrameRules, LogicalBuilder, Margins, SizeRules};
use crate::text::fonts::FontSelector;
use std::ops::{Deref, DerefMut};
#[allow(unused)]
use crate::{event::ConfigCx, layout::Stretch, theme::DrawCx};
pub struct SizeCx<'a> {
ev: &'a mut EventState,
w: &'a dyn ThemeSize,
}
impl<'a> Deref for SizeCx<'a> {
type Target = EventState;
fn deref(&self) -> &EventState {
self.ev
}
}
impl<'a> DerefMut for SizeCx<'a> {
fn deref_mut(&mut self) -> &mut EventState {
self.ev
}
}
impl<'a> SizeCx<'a> {
#[cfg_attr(not(feature = "internal_doc"), doc(hidden))]
#[cfg_attr(docsrs, doc(cfg(internal_doc)))]
#[inline]
pub fn new(ev: &'a mut EventState, w: &'a dyn ThemeSize) -> Self {
SizeCx { ev, w }
}
#[inline]
pub fn scale_factor(&self) -> f32 {
self.w.scale_factor()
}
#[inline]
pub fn logical(&self, width: f32, height: f32) -> LogicalBuilder {
LogicalBuilder::new((width, height), self.scale_factor())
}
#[inline]
pub fn font(&self, class: TextClass) -> FontSelector {
self.w.font(class)
}
#[inline]
pub fn dpem(&self, class: TextClass) -> f32 {
self.w.dpem(class)
}
#[inline]
pub fn wrapped_line_len(&self, class: TextClass, dpem: f32) -> (i32, i32) {
self.w.wrapped_line_len(class, dpem)
}
#[inline]
pub fn min_element_size(&self) -> i32 {
self.w.min_element_size()
}
#[inline]
pub fn min_scroll_size(&self, axis: impl Directional, class: Option<TextClass>) -> i32 {
let class = class.unwrap_or(TextClass::Standard);
self.w.min_scroll_size(axis.is_vertical(), class)
}
#[inline]
pub fn grip_len(&self) -> i32 {
self.w.grip_len()
}
#[inline]
pub fn scroll_bar_width(&self) -> i32 {
self.w.scroll_bar_width()
}
#[inline]
pub fn margins(&self, style: MarginStyle) -> Margins {
self.w.margins(style)
}
#[inline]
pub fn inner_margins(&self) -> Margins {
self.w.margins(MarginStyle::Inner)
}
#[inline]
pub fn tiny_margins(&self) -> Margins {
self.w.margins(MarginStyle::Tiny)
}
#[inline]
pub fn small_margins(&self) -> Margins {
self.w.margins(MarginStyle::Small)
}
#[inline]
pub fn large_margins(&self) -> Margins {
self.w.margins(MarginStyle::Large)
}
#[inline]
pub fn text_margins(&self) -> Margins {
self.w.margins(MarginStyle::Text)
}
#[inline]
pub fn feature(&self, feature: Feature, axis: impl Directional) -> SizeRules {
self.w.feature(feature, axis.is_vertical())
}
#[inline]
pub fn frame(&self, style: FrameStyle, axis: impl Directional) -> FrameRules {
self.w.frame(style, axis.is_vertical())
}
#[inline]
pub fn align_feature(&self, feature: Feature, rect: Rect, align: AlignPair) -> Rect {
self.w.align_feature(feature, rect, align)
}
}
#[autoimpl(for<S: trait + ?Sized, R: Deref<Target = S>> R)]
pub trait ThemeSize {
fn scale_factor(&self) -> f32;
fn font(&self, class: TextClass) -> FontSelector;
fn dpem(&self, class: TextClass) -> f32;
fn wrapped_line_len(&self, class: TextClass, dpem: f32) -> (i32, i32);
fn min_element_size(&self) -> i32;
fn min_scroll_size(&self, axis_is_vertical: bool, class: TextClass) -> i32;
fn grip_len(&self) -> i32;
fn scroll_bar_width(&self) -> i32;
fn margins(&self, style: MarginStyle) -> Margins;
fn feature(&self, feature: Feature, axis_is_vertical: bool) -> SizeRules;
fn align_feature(&self, feature: Feature, rect: Rect, align: AlignPair) -> Rect;
fn frame(&self, style: FrameStyle, axis_is_vertical: bool) -> FrameRules;
}