I want to use this on another branch, but it's a sweeping change, so this prepares the ground for it. This can always be reverted if it doesn't work out.
91 lines
1.8 KiB
Rust
91 lines
1.8 KiB
Rust
use std::ops::Range;
|
|
|
|
use crate::{
|
|
geometry::{
|
|
rect::RectF,
|
|
vector::{vec2f, Vector2F},
|
|
},
|
|
json::{json, ToJson},
|
|
LayoutContext, PaintContext, SceneBuilder, View, ViewContext,
|
|
};
|
|
use crate::{Element, SizeConstraint};
|
|
|
|
#[derive(Default)]
|
|
pub struct Empty {
|
|
collapsed: bool,
|
|
}
|
|
|
|
impl Empty {
|
|
pub fn new() -> Self {
|
|
Self::default()
|
|
}
|
|
|
|
pub fn collapsed(mut self) -> Self {
|
|
self.collapsed = true;
|
|
self
|
|
}
|
|
}
|
|
|
|
impl<V: View> Element<V> for Empty {
|
|
type LayoutState = ();
|
|
type PaintState = ();
|
|
|
|
fn layout(
|
|
&mut self,
|
|
constraint: SizeConstraint,
|
|
_: &mut V,
|
|
_: &mut LayoutContext<V>,
|
|
) -> (Vector2F, Self::LayoutState) {
|
|
let x = if constraint.max.x().is_finite() && !self.collapsed {
|
|
constraint.max.x()
|
|
} else {
|
|
constraint.min.x()
|
|
};
|
|
let y = if constraint.max.y().is_finite() && !self.collapsed {
|
|
constraint.max.y()
|
|
} else {
|
|
constraint.min.y()
|
|
};
|
|
|
|
(vec2f(x, y), ())
|
|
}
|
|
|
|
fn paint(
|
|
&mut self,
|
|
_: &mut SceneBuilder,
|
|
_: RectF,
|
|
_: RectF,
|
|
_: &mut Self::LayoutState,
|
|
_: &mut V,
|
|
_: &mut PaintContext<V>,
|
|
) -> Self::PaintState {
|
|
}
|
|
|
|
fn rect_for_text_range(
|
|
&self,
|
|
_: Range<usize>,
|
|
_: RectF,
|
|
_: RectF,
|
|
_: &Self::LayoutState,
|
|
_: &Self::PaintState,
|
|
_: &V,
|
|
_: &ViewContext<V>,
|
|
) -> Option<RectF> {
|
|
None
|
|
}
|
|
|
|
fn debug(
|
|
&self,
|
|
bounds: RectF,
|
|
_: &Self::LayoutState,
|
|
_: &Self::PaintState,
|
|
_: &V,
|
|
_: &ViewContext<V>,
|
|
) -> serde_json::Value {
|
|
json!({
|
|
"type": "Empty",
|
|
"bounds": bounds.to_json(),
|
|
})
|
|
}
|
|
}
|