// Copyright © SixtyFPS GmbH // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0 //! Module containing the private api that is used by the generated code. //! //! This is internal API that shouldn't be used because compatibility is not //! guaranteed #![doc(hidden)] use core::pin::Pin; use re_exports::*; // Helper functions called from generated code to reduce code bloat from // extra copies of the original functions for each call site due to // the impl Fn() they are taking. pub trait StrongItemTreeRef: Sized { type Weak: Clone + 'static; fn to_weak(&self) -> Self::Weak; fn from_weak(weak: &Self::Weak) -> Option; } impl StrongItemTreeRef for VRc { type Weak = VWeak; fn to_weak(&self) -> Self::Weak { VRc::downgrade(self) } fn from_weak(weak: &Self::Weak) -> Option { weak.upgrade() } } impl StrongItemTreeRef for VRcMapped { type Weak = VWeakMapped; fn to_weak(&self) -> Self::Weak { VRcMapped::downgrade(self) } fn from_weak(weak: &Self::Weak) -> Option { weak.upgrade() } } impl StrongItemTreeRef for Pin> { type Weak = PinWeak; fn to_weak(&self) -> Self::Weak { PinWeak::downgrade(self.clone()) } fn from_weak(weak: &Self::Weak) -> Option { weak.upgrade() } } pub fn set_property_binding( property: Pin<&Property>, component_strong: &StrongRef, binding: fn(StrongRef) -> T, ) { let weak = component_strong.to_weak(); property .set_binding(move || binding(::from_weak(&weak).unwrap())) } pub fn set_animated_property_binding< T: Clone + i_slint_core::properties::InterpolatedPropertyValue + 'static, StrongRef: StrongItemTreeRef + 'static, >( property: Pin<&Property>, component_strong: &StrongRef, binding: fn(StrongRef) -> T, animation_data: PropertyAnimation, ) { let weak = component_strong.to_weak(); property.set_animated_binding( move || binding(::from_weak(&weak).unwrap()), animation_data, ) } pub fn set_animated_property_binding_for_transition< T: Clone + i_slint_core::properties::InterpolatedPropertyValue + 'static, StrongRef: StrongItemTreeRef + 'static, >( property: Pin<&Property>, component_strong: &StrongRef, binding: fn(StrongRef) -> T, compute_animation_details: fn( StrongRef, ) -> (PropertyAnimation, i_slint_core::animations::Instant), ) { let weak_1 = component_strong.to_weak(); let weak_2 = weak_1.clone(); property.set_animated_binding_for_transition( move || binding(::from_weak(&weak_1).unwrap()), move || { compute_animation_details(::from_weak(&weak_2).unwrap()) }, ) } pub fn set_property_state_binding( property: Pin<&Property>, component_strong: &StrongRef, binding: fn(StrongRef) -> i32, ) { let weak = component_strong.to_weak(); re_exports::set_state_binding(property, move || { binding(::from_weak(&weak).unwrap()) }) } pub fn set_callback_handler< Arg: ?Sized + 'static, Ret: Default + 'static, StrongRef: StrongItemTreeRef + 'static, >( callback: Pin<&Callback>, component_strong: &StrongRef, handler: fn(StrongRef, &Arg) -> Ret, ) { let weak = component_strong.to_weak(); callback.set_handler(move |arg| { handler(::from_weak(&weak).unwrap(), arg) }) } pub fn debug(s: SharedString) { #[cfg(feature = "log")] log::debug!("{s}"); #[cfg(not(feature = "log"))] i_slint_core::debug_log!("{s}"); } pub fn ensure_backend() -> Result<(), crate::PlatformError> { i_slint_backend_selector::with_platform(|_b| { // Nothing to do, just make sure a backend was created Ok(()) }) } /// Creates a new window to render components in. pub fn create_window_adapter( ) -> Result, crate::PlatformError> { i_slint_backend_selector::with_platform(|b| b.create_window_adapter()) } /// Wrapper around i_slint_core::translations::translate for the generated code pub fn translate( origin: SharedString, context: SharedString, domain: SharedString, args: Slice, n: i32, plural: SharedString, ) -> SharedString { i_slint_core::translations::translate(&origin, &context, &domain, args.as_slice(), n, &plural) } #[cfg(feature = "gettext")] pub fn init_translations(domain: &str, dirname: impl Into) { i_slint_core::translations::gettext_bindtextdomain(domain, dirname.into()).unwrap() } pub fn use_24_hour_format() -> bool { i_slint_core::date_time::use_24_hour_format() } /// internal re_exports used by the macro generated pub mod re_exports { pub use alloc::boxed::Box; pub use alloc::rc::{Rc, Weak}; pub use alloc::string::String; pub use alloc::{vec, vec::Vec}; pub use const_field_offset::{self, FieldOffsets, PinnedDrop}; pub use core::iter::FromIterator; pub use core::option::{Option, Option::*}; pub use core::result::{Result, Result::*}; pub use i_slint_core::format; // This one is empty when Qt is not available, which triggers a warning #[allow(unused_imports)] pub use i_slint_backend_selector::native_widgets::*; pub use i_slint_core::accessibility::{ AccessibilityAction, AccessibleStringProperty, SupportedAccessibilityAction, }; pub use i_slint_core::animations::{animation_tick, EasingCurve}; pub use i_slint_core::callbacks::Callback; pub use i_slint_core::date_time::*; pub use i_slint_core::graphics::*; pub use i_slint_core::input::{ key_codes::Key, FocusEvent, InputEventResult, KeyEvent, KeyEventResult, KeyboardModifiers, MouseEvent, }; pub use i_slint_core::item_tree::{ register_item_tree, unregister_item_tree, IndexRange, ItemTree, ItemTreeRefPin, ItemTreeVTable, ItemTreeWeak, }; pub use i_slint_core::item_tree::{ visit_item_tree, ItemTreeNode, ItemVisitorRefMut, ItemVisitorVTable, ItemWeak, TraversalOrder, VisitChildrenResult, }; pub use i_slint_core::items::*; pub use i_slint_core::layout::*; pub use i_slint_core::lengths::{ logical_position_to_api, LogicalLength, LogicalPoint, LogicalRect, }; pub use i_slint_core::model::*; pub use i_slint_core::properties::{ set_state_binding, ChangeTracker, Property, PropertyTracker, StateInfo, }; pub use i_slint_core::slice::Slice; pub use i_slint_core::timers::{Timer, TimerMode}; pub use i_slint_core::window::{ InputMethodRequest, WindowAdapter, WindowAdapterRc, WindowInner, }; pub use i_slint_core::Color; pub use i_slint_core::Coord; pub use i_slint_core::ItemTreeVTable_static; pub use i_slint_core::SharedString; pub use i_slint_core::SharedVector; pub use num_traits::float::Float; pub use num_traits::ops::euclid::Euclid; pub use once_cell::race::OnceBox; pub use once_cell::unsync::OnceCell; pub use pin_weak::rc::PinWeak; pub use vtable::{self, *}; }