use crate::{Matrix4, Rect, Size, TextEditingValue, TextInputConfiguration};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct ViewId(pub u64);
#[derive(Clone, Copy, Debug)]
pub struct ViewFocusEvent {
pub view_id: ViewId,
pub state: ViewFocusState,
pub direction: ViewFocusDirection,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ViewFocusState {
Unfocused,
Focused,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ViewFocusDirection {
Undefined,
Forward,
Backward,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct ViewPadding {
pub left: f64,
pub top: f64,
pub right: f64,
pub bottom: f64,
}
impl ViewPadding {
pub const ZERO: ViewPadding = ViewPadding {
left: 0.0,
top: 0.0,
right: 0.0,
bottom: 0.0,
};
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct ViewConstraints {
pub min_width: f64,
pub max_width: f64,
pub min_height: f64,
pub max_height: f64,
}
impl ViewConstraints {
pub const fn new(
min_width: f64,
max_width: f64,
min_height: f64,
max_height: f64,
) -> ViewConstraints {
ViewConstraints {
min_width,
max_width,
min_height,
max_height,
}
}
pub const fn tight(width: f64, height: f64) -> ViewConstraints {
ViewConstraints {
min_width: width,
max_width: width,
min_height: height,
max_height: height,
}
}
}
impl Default for ViewConstraints {
fn default() -> ViewConstraints {
ViewConstraints {
min_width: 0.0,
max_width: f64::INFINITY,
min_height: 0.0,
max_height: f64::INFINITY,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct ViewMetrics {
pub physical_size: [f64; 2],
pub physical_constraints: ViewConstraints,
pub device_pixel_ratio: f64,
pub padding: ViewPadding,
pub view_padding: ViewPadding,
pub view_insets: ViewPadding,
}
impl Default for ViewMetrics {
fn default() -> ViewMetrics {
ViewMetrics {
physical_size: [0.0, 0.0],
physical_constraints: ViewConstraints::tight(0.0, 0.0),
device_pixel_ratio: 1.0,
padding: ViewPadding::ZERO,
view_padding: ViewPadding::ZERO,
view_insets: ViewPadding::ZERO,
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq)]
pub struct GestureSettings {
pub physical_touch_slop: Option<f64>,
pub physical_double_tap_slop: Option<f64>,
}
impl GestureSettings {
pub fn copy_with(
self,
physical_touch_slop: Option<f64>,
physical_double_tap_slop: Option<f64>,
) -> GestureSettings {
GestureSettings {
physical_touch_slop: physical_touch_slop.or(self.physical_touch_slop),
physical_double_tap_slop: physical_double_tap_slop.or(self.physical_double_tap_slop),
}
}
}
pub trait View: 'static {
fn id(&self) -> ViewId;
fn metrics(&self) -> ViewMetrics;
fn gesture_settings(&self) -> GestureSettings {
GestureSettings::default()
}
fn present(&self, picture: std::sync::Arc<crate::Picture>);
fn text_input(&self) -> Option<&dyn TextInputHost> {
None
}
}
pub trait TextInputHost {
fn start(&self, configuration: &TextInputConfiguration);
fn stop(&self);
fn set_editing_state(&self, value: &TextEditingValue);
fn set_composing_rect(&self, rect: Rect);
fn set_caret_rect(&self, rect: Rect);
fn set_client_geometry(&self, size: Size, transform: &Matrix4);
fn handles_editing_keys(&self) -> bool {
false
}
}