//! This module contains the basic datastructures that are exposed to the C API use vtable::*; use crate::graphics::{HighLevelRenderingPrimitive, Rect}; use crate::input::MouseEvent; use crate::item_rendering::CachedRenderingData; use crate::item_tree::ItemVisitorVTable; use crate::layout::LayoutInfo; /// A Component is representing an unit that is allocated together #[vtable] #[repr(C)] pub struct ComponentVTable { /// Visit the children of the item at index `index`. /// Note that the root item is at index 0, so passing 0 would visit the item under root (the children of root). /// If you want to visit the root item, you need to pass -1 as an index pub visit_children_item: extern "C" fn( core::pin::Pin>, index: isize, visitor: VRefMut, ), /// Returns the layout info for this component pub layout_info: extern "C" fn(core::pin::Pin>) -> LayoutInfo, /// Will compute the layout of pub compute_layout: extern "C" fn(core::pin::Pin>), } /// Alias for `vtable::VRef` which represent a pointer to a `dyn Component` with /// the associated vtable pub type ComponentRef<'a> = vtable::VRef<'a, ComponentVTable>; /// Items are the nodes in the render tree. #[vtable] #[repr(C)] pub struct ItemVTable { /// Returns the geometry of this item (relative to its parent item) pub geometry: extern "C" fn(core::pin::Pin>) -> Rect, /// offset in bytes fromthe *const ItemImpl. /// isize::MAX means None #[allow(non_upper_case_globals)] #[field_offset(CachedRenderingData)] pub cached_rendering_data_offset: usize, /// Return the rendering primitive used to display this item. pub rendering_primitive: extern "C" fn(core::pin::Pin>) -> HighLevelRenderingPrimitive, /// We would need max/min/preferred size, and all layout info pub layouting_info: extern "C" fn(core::pin::Pin>) -> LayoutInfo, /// input event pub input_event: extern "C" fn(core::pin::Pin>, MouseEvent), } /// Alias for `vtable::VRef` which represent a pointer to a `dyn Item` with /// the associated vtable pub type ItemRef<'a> = vtable::VRef<'a, ItemVTable>; #[repr(C)] #[derive(Default)] /// WindowProperties is used to pass the references to properties of the instantiated /// component that the run-time will keep up-to-date. pub struct WindowProperties<'a> { /// A reference to the property that is supposed to be kept up-to-date with the width /// of the window. pub width: Option<&'a crate::Property>, /// A reference to the property that is supposed to be kept up-to-date with the height /// of the window. pub height: Option<&'a crate::Property>, /// A reference to the property that is supposed to be kept up-to-date with the current /// screen dpi / scale factor pub scale_factor: Option<&'a crate::Property>, } // This is here because for some reason (rust bug?) the ItemVTable_static is not accessible in the other modules ItemVTable_static! { /// The VTable for `Image` #[no_mangle] pub static ImageVTable for crate::items::Image } ItemVTable_static! { /// The VTable for `Rectangle` #[no_mangle] pub static RectangleVTable for crate::items::Rectangle } ItemVTable_static! { /// The VTable for `BorderRectangle` #[no_mangle] pub static BorderRectangleVTable for crate::items::BorderRectangle } ItemVTable_static! { /// The VTable for `Text` #[no_mangle] pub static TextVTable for crate::items::Text } ItemVTable_static! { /// The VTable for `TouchArea` #[no_mangle] pub static TouchAreaVTable for crate::items::TouchArea } ItemVTable_static! { /// The VTable for `Path` #[no_mangle] pub static PathVTable for crate::items::Path } ItemVTable_static! { /// The VTable for `Flickable` #[no_mangle] pub static FlickableVTable for crate::items::Flickable }