#![warn(missing_docs)]
#![deny(unsafe_code)]
#![doc(html_logo_url = "https://sixtyfps.io/resources/logo.drawio.svg")]
pub use sixtyfps_macros::sixtyfps;
pub use sixtyfps_corelib::graphics::{Brush, Color, Image, LoadImageError, RgbaColor};
pub use sixtyfps_corelib::model::{
Model, ModelHandle, ModelNotify, ModelPeer, StandardListViewItem, VecModel,
};
pub use sixtyfps_corelib::sharedvector::SharedVector;
pub use sixtyfps_corelib::string::SharedString;
pub use sixtyfps_corelib::timers::{Timer, TimerMode};
#[doc(hidden)]
pub fn register_font_from_memory(data: &'static [u8]) -> Result<(), Box<dyn std::error::Error>> {
sixtyfps_rendering_backend_default::backend().register_font_from_memory(data)
}
#[doc(hidden)]
pub fn register_font_from_path<P: AsRef<std::path::Path>>(
path: P,
) -> Result<(), Box<dyn std::error::Error>> {
sixtyfps_rendering_backend_default::backend().register_font_from_path(path.as_ref())
}
#[doc(hidden)]
pub mod re_exports {
pub use const_field_offset::{self, FieldOffsets, PinnedDrop};
pub use core::iter::FromIterator;
pub use once_cell::sync::Lazy;
pub use once_cell::unsync::OnceCell;
pub use pin_weak::rc::PinWeak;
pub use sixtyfps_corelib::animations::EasingCurve;
pub use sixtyfps_corelib::callbacks::Callback;
pub use sixtyfps_corelib::component::{
init_component_items, Component, ComponentRefPin, ComponentVTable,
};
pub use sixtyfps_corelib::graphics::{
Brush, GradientStop, Image, ImageInner, LinearGradientBrush, PathArcTo, PathCubicTo,
PathData, PathElement, PathEvent, PathLineTo, PathMoveTo, PathQuadraticTo, Point, Rect,
Size,
};
pub use sixtyfps_corelib::input::{
FocusEvent, InputEventResult, KeyEvent, KeyEventResult, KeyboardModifiers, MouseEvent,
};
pub use sixtyfps_corelib::item_tree::{
visit_item_tree, ItemTreeNode, ItemVisitorRefMut, ItemVisitorVTable, TraversalOrder,
VisitChildrenResult,
};
pub use sixtyfps_corelib::items::*;
pub use sixtyfps_corelib::layout::*;
pub use sixtyfps_corelib::model::*;
pub use sixtyfps_corelib::properties::{
set_state_binding, Property, PropertyTracker, StateInfo,
};
pub use sixtyfps_corelib::slice::Slice;
pub use sixtyfps_corelib::window::ComponentWindow;
pub use sixtyfps_corelib::Color;
pub use sixtyfps_corelib::ComponentVTable_static;
pub use sixtyfps_corelib::SharedString;
pub use sixtyfps_corelib::SharedVector;
pub use sixtyfps_rendering_backend_default::native_widgets::*;
pub use vtable::{self, *};
}
#[doc(hidden)]
pub fn create_window() -> re_exports::ComponentWindow {
sixtyfps_rendering_backend_default::backend().create_window()
}
pub fn run_event_loop() {
sixtyfps_rendering_backend_default::backend()
.run_event_loop(sixtyfps_corelib::backend::EventLoopQuitBehavior::QuitOnLastWindowClosed);
}
pub fn quit_event_loop() {
sixtyfps_rendering_backend_default::backend().quit_event_loop();
}
pub fn invoke_from_event_loop(func: impl FnOnce() + Send + 'static) {
sixtyfps_rendering_backend_default::backend().post_event(Box::new(func))
}
pub trait ComponentHandle {
#[doc(hidden)]
type Inner;
fn as_weak(&self) -> Weak<Self>
where
Self: Sized;
fn clone_strong(&self) -> Self;
#[doc(hidden)]
fn from_inner(_: vtable::VRc<re_exports::ComponentVTable, Self::Inner>) -> Self;
fn show(&self);
fn hide(&self);
fn run(&self);
}
mod weak_handle {
use super::*;
pub struct Weak<T: ComponentHandle> {
inner: vtable::VWeak<re_exports::ComponentVTable, T::Inner>,
thread: std::thread::ThreadId,
}
impl<T: ComponentHandle> Clone for Weak<T> {
fn clone(&self) -> Self {
Self { inner: self.inner.clone(), thread: self.thread.clone() }
}
}
impl<T: ComponentHandle> Weak<T> {
#[doc(hidden)]
pub fn new(rc: &vtable::VRc<re_exports::ComponentVTable, T::Inner>) -> Self {
Self { inner: vtable::VRc::downgrade(&rc), thread: std::thread::current().id() }
}
pub fn upgrade(&self) -> Option<T>
where
T: ComponentHandle,
{
if std::thread::current().id() != self.thread {
return None;
}
self.inner.upgrade().map(|inner| T::from_inner(inner))
}
pub fn unwrap(&self) -> T {
self.upgrade().unwrap()
}
}
#[allow(unsafe_code)]
unsafe impl<T: ComponentHandle> Send for Weak<T> {}
}
pub use weak_handle::*;
pub mod testing {
use core::cell::Cell;
thread_local!(static KEYBOARD_MODIFIERS : Cell<crate::re_exports::KeyboardModifiers> = Default::default());
use super::ComponentHandle;
pub trait HasWindow {
fn component_window(&self) -> &super::re_exports::ComponentWindow;
}
pub use sixtyfps_corelib::tests::sixtyfps_mock_elapsed_time as mock_elapsed_time;
pub fn send_mouse_click<
X: vtable::HasStaticVTable<sixtyfps_corelib::component::ComponentVTable> + HasWindow + 'static,
Component: Into<vtable::VRc<sixtyfps_corelib::component::ComponentVTable, X>> + ComponentHandle,
>(
component: &Component,
x: f32,
y: f32,
) {
let rc = component.clone_strong().into();
let dyn_rc = vtable::VRc::into_dyn(rc.clone());
sixtyfps_corelib::tests::sixtyfps_send_mouse_click(&dyn_rc, x, y, rc.component_window());
}
pub fn set_current_keyboard_modifiers<
X: vtable::HasStaticVTable<sixtyfps_corelib::component::ComponentVTable> + HasWindow,
Component: Into<vtable::VRc<sixtyfps_corelib::component::ComponentVTable, X>> + ComponentHandle,
>(
_component: &Component,
modifiers: crate::re_exports::KeyboardModifiers,
) {
KEYBOARD_MODIFIERS.with(|x| x.set(modifiers))
}
pub fn send_keyboard_string_sequence<
X: vtable::HasStaticVTable<sixtyfps_corelib::component::ComponentVTable> + HasWindow,
Component: Into<vtable::VRc<sixtyfps_corelib::component::ComponentVTable, X>> + ComponentHandle,
>(
component: &Component,
sequence: &str,
) {
let component = component.clone_strong().into();
sixtyfps_corelib::tests::send_keyboard_string_sequence(
&super::SharedString::from(sequence),
KEYBOARD_MODIFIERS.with(|x| x.get()),
component.component_window(),
)
}
pub fn set_window_scale_factor<
X: vtable::HasStaticVTable<sixtyfps_corelib::component::ComponentVTable> + HasWindow,
Component: Into<vtable::VRc<sixtyfps_corelib::component::ComponentVTable, X>> + ComponentHandle,
>(
component: &Component,
factor: f32,
) {
let component = component.clone_strong().into();
component.component_window().set_scale_factor(factor)
}
}
#[macro_export]
macro_rules! include_modules {
() => {
include!(env!("SIXTYFPS_INCLUDE_GENERATED"));
};
}
#[doc(hidden)]
#[allow(non_camel_case_types)]
pub struct VersionCheck_0_1_0;
#[cfg(doctest)]
mod compile_fail_tests;
#[cfg(all(doc, nightly))]
pub mod docs;