zed/test.rs
2023-08-30 16:12:14 -06:00

5618 lines
171 KiB
Rust

#![feature(prelude_import)]
#![allow(dead_code, unused_variables)]
#[prelude_import]
use std::prelude::rust_2021::*;
#[macro_use]
extern crate std;
use color::black;
use components::button;
use element::Element;
use frame::frame;
use gpui::{
geometry::{rect::RectF, vector::vec2f},
platform::WindowOptions,
};
use log::LevelFilter;
use simplelog::SimpleLogger;
use themes::{rose_pine, ThemeColors};
use view::view;
mod adapter {
use crate::element::AnyElement;
use crate::element::{LayoutContext, PaintContext};
use gpui::{geometry::rect::RectF, LayoutEngine};
use util::ResultExt;
pub struct Adapter<V>(pub(crate) AnyElement<V>);
impl<V: 'static> gpui::Element<V> for Adapter<V> {
type LayoutState = Option<LayoutEngine>;
type PaintState = ();
fn layout(
&mut self,
constraint: gpui::SizeConstraint,
view: &mut V,
cx: &mut LayoutContext<V>,
) -> (gpui::geometry::vector::Vector2F, Self::LayoutState) {
cx.push_layout_engine(LayoutEngine::new());
let node = self.0.layout(view, cx).log_err();
if let Some(node) = node {
let layout_engine = cx.layout_engine().unwrap();
layout_engine.compute_layout(node, constraint.max).log_err();
}
let layout_engine = cx.pop_layout_engine();
if true {
if !layout_engine.is_some() {
::core::panicking::panic("assertion failed: layout_engine.is_some()")
}
}
(constraint.max, layout_engine)
}
fn paint(
&mut self,
scene: &mut gpui::SceneBuilder,
bounds: RectF,
visible_bounds: RectF,
layout_engine: &mut Option<LayoutEngine>,
view: &mut V,
legacy_cx: &mut gpui::PaintContext<V>,
) -> Self::PaintState {
legacy_cx.push_layout_engine(layout_engine.take().unwrap());
let mut cx = PaintContext::new(legacy_cx, scene);
self.0.paint(view, &mut cx).log_err();
*layout_engine = legacy_cx.pop_layout_engine();
if true {
if !layout_engine.is_some() {
::core::panicking::panic("assertion failed: layout_engine.is_some()")
}
}
}
fn rect_for_text_range(
&self,
range_utf16: std::ops::Range<usize>,
bounds: RectF,
visible_bounds: RectF,
layout: &Self::LayoutState,
paint: &Self::PaintState,
view: &V,
cx: &gpui::ViewContext<V>,
) -> Option<RectF> {
::core::panicking::panic("not yet implemented")
}
fn debug(
&self,
bounds: RectF,
layout: &Self::LayoutState,
paint: &Self::PaintState,
view: &V,
cx: &gpui::ViewContext<V>,
) -> gpui::serde_json::Value {
::core::panicking::panic("not yet implemented")
}
}
}
mod color {
#![allow(dead_code)]
use smallvec::SmallVec;
use std::{num::ParseIntError, ops::Range};
pub fn rgb<C: From<Rgba>>(hex: u32) -> C {
let r = ((hex >> 16) & 0xFF) as f32 / 255.0;
let g = ((hex >> 8) & 0xFF) as f32 / 255.0;
let b = (hex & 0xFF) as f32 / 255.0;
Rgba { r, g, b, a: 1.0 }.into()
}
pub struct Rgba {
pub r: f32,
pub g: f32,
pub b: f32,
pub a: f32,
}
#[automatically_derived]
impl ::core::clone::Clone for Rgba {
#[inline]
fn clone(&self) -> Rgba {
let _: ::core::clone::AssertParamIsClone<f32>;
*self
}
}
#[automatically_derived]
impl ::core::marker::Copy for Rgba {}
#[automatically_derived]
impl ::core::default::Default for Rgba {
#[inline]
fn default() -> Rgba {
Rgba {
r: ::core::default::Default::default(),
g: ::core::default::Default::default(),
b: ::core::default::Default::default(),
a: ::core::default::Default::default(),
}
}
}
#[automatically_derived]
impl ::core::fmt::Debug for Rgba {
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(
f, "Rgba", "r", &self.r, "g", &self.g, "b", &self.b, "a", &&self.a,
)
}
}
pub trait Lerp {
fn lerp(&self, level: f32) -> Hsla;
}
impl Lerp for Range<Hsla> {
fn lerp(&self, level: f32) -> Hsla {
let level = level.clamp(0., 1.);
Hsla {
h: self.start.h + (level * (self.end.h - self.start.h)),
s: self.start.s + (level * (self.end.s - self.start.s)),
l: self.start.l + (level * (self.end.l - self.start.l)),
a: self.start.a + (level * (self.end.a - self.start.a)),
}
}
}
impl From<gpui::color::Color> for Rgba {
fn from(value: gpui::color::Color) -> Self {
Self {
r: value.0.r as f32 / 255.0,
g: value.0.g as f32 / 255.0,
b: value.0.b as f32 / 255.0,
a: value.0.a as f32 / 255.0,
}
}
}
impl From<Hsla> for Rgba {
fn from(color: Hsla) -> Self {
let h = color.h;
let s = color.s;
let l = color.l;
let c = (1.0 - (2.0 * l - 1.0).abs()) * s;
let x = c * (1.0 - ((h * 6.0) % 2.0 - 1.0).abs());
let m = l - c / 2.0;
let cm = c + m;
let xm = x + m;
let (r, g, b) = match (h * 6.0).floor() as i32 {
0 | 6 => (cm, xm, m),
1 => (xm, cm, m),
2 => (m, cm, xm),
3 => (m, xm, cm),
4 => (xm, m, cm),
_ => (cm, m, xm),
};
Rgba {
r,
g,
b,
a: color.a,
}
}
}
impl TryFrom<&'_ str> for Rgba {
type Error = ParseIntError;
fn try_from(value: &'_ str) -> Result<Self, Self::Error> {
let r = u8::from_str_radix(&value[1..3], 16)? as f32 / 255.0;
let g = u8::from_str_radix(&value[3..5], 16)? as f32 / 255.0;
let b = u8::from_str_radix(&value[5..7], 16)? as f32 / 255.0;
let a = if value.len() > 7 {
u8::from_str_radix(&value[7..9], 16)? as f32 / 255.0
} else {
1.0
};
Ok(Rgba { r, g, b, a })
}
}
impl Into<gpui::color::Color> for Rgba {
fn into(self) -> gpui::color::Color {
gpui::color::rgba(self.r, self.g, self.b, self.a)
}
}
pub struct Hsla {
pub h: f32,
pub s: f32,
pub l: f32,
pub a: f32,
}
#[automatically_derived]
impl ::core::default::Default for Hsla {
#[inline]
fn default() -> Hsla {
Hsla {
h: ::core::default::Default::default(),
s: ::core::default::Default::default(),
l: ::core::default::Default::default(),
a: ::core::default::Default::default(),
}
}
}
#[automatically_derived]
impl ::core::marker::Copy for Hsla {}
#[automatically_derived]
impl ::core::clone::Clone for Hsla {
#[inline]
fn clone(&self) -> Hsla {
let _: ::core::clone::AssertParamIsClone<f32>;
*self
}
}
#[automatically_derived]
impl ::core::fmt::Debug for Hsla {
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(
f, "Hsla", "h", &self.h, "s", &self.s, "l", &self.l, "a", &&self.a,
)
}
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for Hsla {}
#[automatically_derived]
impl ::core::cmp::PartialEq for Hsla {
#[inline]
fn eq(&self, other: &Hsla) -> bool {
self.h == other.h && self.s == other.s && self.l == other.l && self.a == other.a
}
}
pub fn hsla(h: f32, s: f32, l: f32, a: f32) -> Hsla {
Hsla {
h: h.clamp(0., 1.),
s: s.clamp(0., 1.),
l: l.clamp(0., 1.),
a: a.clamp(0., 1.),
}
}
pub fn black() -> Hsla {
Hsla {
h: 0.,
s: 0.,
l: 0.,
a: 1.,
}
}
impl From<Rgba> for Hsla {
fn from(color: Rgba) -> Self {
let r = color.r;
let g = color.g;
let b = color.b;
let max = r.max(g.max(b));
let min = r.min(g.min(b));
let delta = max - min;
let l = (max + min) / 2.0;
let s = if l == 0.0 || l == 1.0 {
0.0
} else if l < 0.5 {
delta / (2.0 * l)
} else {
delta / (2.0 - 2.0 * l)
};
let h = if delta == 0.0 {
0.0
} else if max == r {
((g - b) / delta).rem_euclid(6.0) / 6.0
} else if max == g {
((b - r) / delta + 2.0) / 6.0
} else {
((r - g) / delta + 4.0) / 6.0
};
Hsla {
h,
s,
l,
a: color.a,
}
}
}
impl Hsla {
/// Scales the saturation and lightness by the given values, clamping at 1.0.
pub fn scale_sl(mut self, s: f32, l: f32) -> Self {
self.s = (self.s * s).clamp(0., 1.);
self.l = (self.l * l).clamp(0., 1.);
self
}
/// Increases the saturation of the color by a certain amount, with a max
/// value of 1.0.
pub fn saturate(mut self, amount: f32) -> Self {
self.s += amount;
self.s = self.s.clamp(0.0, 1.0);
self
}
/// Decreases the saturation of the color by a certain amount, with a min
/// value of 0.0.
pub fn desaturate(mut self, amount: f32) -> Self {
self.s -= amount;
self.s = self.s.max(0.0);
if self.s < 0.0 {
self.s = 0.0;
}
self
}
/// Brightens the color by increasing the lightness by a certain amount,
/// with a max value of 1.0.
pub fn brighten(mut self, amount: f32) -> Self {
self.l += amount;
self.l = self.l.clamp(0.0, 1.0);
self
}
/// Darkens the color by decreasing the lightness by a certain amount,
/// with a max value of 0.0.
pub fn darken(mut self, amount: f32) -> Self {
self.l -= amount;
self.l = self.l.clamp(0.0, 1.0);
self
}
}
impl From<gpui::color::Color> for Hsla {
fn from(value: gpui::color::Color) -> Self {
Rgba::from(value).into()
}
}
impl Into<gpui::color::Color> for Hsla {
fn into(self) -> gpui::color::Color {
Rgba::from(self).into()
}
}
pub struct ColorScale {
colors: SmallVec<[Hsla; 2]>,
positions: SmallVec<[f32; 2]>,
}
pub fn scale<I, C>(colors: I) -> ColorScale
where
I: IntoIterator<Item = C>,
C: Into<Hsla>,
{
let mut scale = ColorScale {
colors: colors.into_iter().map(Into::into).collect(),
positions: SmallVec::new(),
};
let num_colors: f32 = scale.colors.len() as f32 - 1.0;
scale.positions = (0..scale.colors.len())
.map(|i| i as f32 / num_colors)
.collect();
scale
}
impl ColorScale {
fn at(&self, t: f32) -> Hsla {
if true {
if !(0.0 <= t && t <= 1.0) {
{
::core::panicking::panic_fmt(format_args!(
"t value {0} is out of range. Expected value in range 0.0 to 1.0",
t,
));
}
}
}
let position = match self
.positions
.binary_search_by(|a| a.partial_cmp(&t).unwrap())
{
Ok(index) | Err(index) => index,
};
let lower_bound = position.saturating_sub(1);
let upper_bound = position.min(self.colors.len() - 1);
let lower_color = &self.colors[lower_bound];
let upper_color = &self.colors[upper_bound];
match upper_bound.checked_sub(lower_bound) {
Some(0) | None => *lower_color,
Some(_) => {
let interval_t = (t - self.positions[lower_bound])
/ (self.positions[upper_bound] - self.positions[lower_bound]);
let h = lower_color.h + interval_t * (upper_color.h - lower_color.h);
let s = lower_color.s + interval_t * (upper_color.s - lower_color.s);
let l = lower_color.l + interval_t * (upper_color.l - lower_color.l);
let a = lower_color.a + interval_t * (upper_color.a - lower_color.a);
Hsla { h, s, l, a }
}
}
}
}
}
mod components {
use crate::{
element::{Element, ElementMetadata},
frame,
text::ArcCow,
themes::rose_pine,
};
use gpui::{platform::MouseButton, ViewContext};
use gpui2_macros::Element;
use std::{marker::PhantomData, rc::Rc};
struct ButtonHandlers<V, D> {
click: Option<Rc<dyn Fn(&mut V, &D, &mut ViewContext<V>)>>,
}
impl<V, D> Default for ButtonHandlers<V, D> {
fn default() -> Self {
Self { click: None }
}
}
#[element_crate = "crate"]
pub struct Button<V: 'static, D: 'static> {
metadata: ElementMetadata<V>,
handlers: ButtonHandlers<V, D>,
label: Option<ArcCow<'static, str>>,
icon: Option<ArcCow<'static, str>>,
data: Rc<D>,
view_type: PhantomData<V>,
}
impl<V: 'static, D: 'static> crate::element::Element<V> for Button<V, D> {
type Layout = crate::element::AnyElement<V>;
fn declared_style(&mut self) -> &mut crate::style::OptionalStyle {
&mut self.metadata.style
}
fn handlers_mut(&mut self) -> &mut Vec<crate::element::EventHandler<V>> {
&mut self.metadata.handlers
}
fn layout(
&mut self,
view: &mut V,
cx: &mut crate::element::LayoutContext<V>,
) -> anyhow::Result<(taffy::tree::NodeId, Self::Layout)> {
let mut element = self.render(view, cx).into_any();
let node_id = element.layout(view, cx)?;
Ok((node_id, element))
}
fn paint<'a>(
&mut self,
layout: crate::element::Layout<'a, Self::Layout>,
view: &mut V,
cx: &mut crate::element::PaintContext<V>,
) -> anyhow::Result<()> {
layout.from_element.paint(view, cx)?;
Ok(())
}
}
impl<V: 'static, D: 'static> crate::element::IntoElement<V> for Button<V, D> {
type Element = Self;
fn into_element(self) -> Self {
self
}
}
impl<V: 'static> Button<V, ()> {
fn new() -> Self {
Self {
metadata: Default::default(),
handlers: ButtonHandlers::default(),
label: None,
icon: None,
data: Rc::new(()),
view_type: PhantomData,
}
}
pub fn data<D: 'static>(self, data: D) -> Button<V, D> {
Button {
metadata: Default::default(),
handlers: ButtonHandlers::default(),
label: self.label,
icon: self.icon,
data: Rc::new(data),
view_type: PhantomData,
}
}
}
impl<V: 'static, D: 'static> Button<V, D> {
pub fn label(mut self, label: impl Into<ArcCow<'static, str>>) -> Self {
self.label = Some(label.into());
self
}
pub fn icon(mut self, icon: impl Into<ArcCow<'static, str>>) -> Self {
self.icon = Some(icon.into());
self
}
pub fn click(self, handler: impl Fn(&mut V, &D, &mut ViewContext<V>) + 'static) -> Self {
let data = self.data.clone();
Element::click(self, MouseButton::Left, move |view, _, cx| {
handler(view, data.as_ref(), cx);
})
}
}
pub fn button<V>() -> Button<V, ()> {
Button::new()
}
impl<V: 'static, D: 'static> Button<V, D> {
fn render(&mut self, view: &mut V, cx: &mut ViewContext<V>) -> impl Element<V> {
let button = frame()
.fill(rose_pine::dawn().error(0.5))
.h_4()
.children(self.label.clone());
if let Some(handler) = self.handlers.click.clone() {
let data = self.data.clone();
button.mouse_down(MouseButton::Left, move |view, event, cx| {
handler(view, data.as_ref(), cx)
})
} else {
button
}
}
}
}
mod element {
pub use crate::paint_context::PaintContext;
use crate::{
adapter::Adapter,
color::Hsla,
hoverable::Hoverable,
style::{Display, Fill, OptionalStyle, Overflow, Position},
};
use anyhow::Result;
pub use gpui::LayoutContext;
use gpui::{
geometry::{DefinedLength, Length, OptionalPoint},
platform::{MouseButton, MouseButtonEvent},
EngineLayout, EventContext, RenderContext, ViewContext,
};
use gpui2_macros::tailwind_lengths;
use std::{
any::{Any, TypeId},
cell::Cell,
rc::Rc,
};
pub use taffy::tree::NodeId;
pub struct Layout<'a, E: ?Sized> {
pub from_engine: EngineLayout,
pub from_element: &'a mut E,
}
pub struct ElementMetadata<V> {
pub style: OptionalStyle,
pub handlers: Vec<EventHandler<V>>,
}
pub struct EventHandler<V> {
handler: Rc<dyn Fn(&mut V, &dyn Any, &mut EventContext<V>)>,
event_type: TypeId,
outside_bounds: bool,
}
impl<V> Clone for EventHandler<V> {
fn clone(&self) -> Self {
Self {
handler: self.handler.clone(),
event_type: self.event_type,
outside_bounds: self.outside_bounds,
}
}
}
impl<V> Default for ElementMetadata<V> {
fn default() -> Self {
Self {
style: OptionalStyle::default(),
handlers: Vec::new(),
}
}
}
pub trait Element<V: 'static>: 'static {
type Layout: 'static;
fn declared_style(&mut self) -> &mut OptionalStyle;
fn computed_style(&mut self) -> &OptionalStyle {
self.declared_style()
}
fn handlers_mut(&mut self) -> &mut Vec<EventHandler<V>>;
fn layout(
&mut self,
view: &mut V,
cx: &mut LayoutContext<V>,
) -> Result<(NodeId, Self::Layout)>;
fn paint<'a>(
&mut self,
layout: Layout<Self::Layout>,
view: &mut V,
cx: &mut PaintContext<V>,
) -> Result<()>;
/// Convert to a dynamically-typed element suitable for layout and paint.
fn into_any(self) -> AnyElement<V>
where
Self: 'static + Sized,
{
AnyElement {
element: Box::new(self) as Box<dyn ElementObject<V>>,
layout: None,
}
}
fn adapt(self) -> Adapter<V>
where
Self: Sized,
Self: Element<V>,
{
Adapter(self.into_any())
}
fn click(
self,
button: MouseButton,
handler: impl Fn(&mut V, &MouseButtonEvent, &mut ViewContext<V>) + 'static,
) -> Self
where
Self: Sized,
{
let pressed: Rc<Cell<bool>> = Default::default();
self.mouse_down(button, {
let pressed = pressed.clone();
move |_, _, _| {
pressed.set(true);
}
})
.mouse_up_outside(button, {
let pressed = pressed.clone();
move |_, _, _| {
pressed.set(false);
}
})
.mouse_up(button, move |view, event, event_cx| {
if pressed.get() {
pressed.set(false);
handler(view, event, event_cx);
}
})
}
fn mouse_down(
mut self,
button: MouseButton,
handler: impl Fn(&mut V, &MouseButtonEvent, &mut EventContext<V>) + 'static,
) -> Self
where
Self: Sized,
{
self.handlers_mut().push(EventHandler {
handler: Rc::new(move |view, event, event_cx| {
let event = event.downcast_ref::<MouseButtonEvent>().unwrap();
if event.button == button && event.is_down {
handler(view, event, event_cx);
}
}),
event_type: TypeId::of::<MouseButtonEvent>(),
outside_bounds: false,
});
self
}
fn mouse_down_outside(
mut self,
button: MouseButton,
handler: impl Fn(&mut V, &MouseButtonEvent, &mut EventContext<V>) + 'static,
) -> Self
where
Self: Sized,
{
self.handlers_mut().push(EventHandler {
handler: Rc::new(move |view, event, event_cx| {
let event = event.downcast_ref::<MouseButtonEvent>().unwrap();
if event.button == button && event.is_down {
handler(view, event, event_cx);
}
}),
event_type: TypeId::of::<MouseButtonEvent>(),
outside_bounds: true,
});
self
}
fn mouse_up(
mut self,
button: MouseButton,
handler: impl Fn(&mut V, &MouseButtonEvent, &mut EventContext<V>) + 'static,
) -> Self
where
Self: Sized,
{
self.handlers_mut().push(EventHandler {
handler: Rc::new(move |view, event, event_cx| {
let event = event.downcast_ref::<MouseButtonEvent>().unwrap();
if event.button == button && !event.is_down {
handler(view, event, event_cx);
}
}),
event_type: TypeId::of::<MouseButtonEvent>(),
outside_bounds: false,
});
self
}
fn mouse_up_outside(
mut self,
button: MouseButton,
handler: impl Fn(&mut V, &MouseButtonEvent, &mut EventContext<V>) + 'static,
) -> Self
where
Self: Sized,
{
self.handlers_mut().push(EventHandler {
handler: Rc::new(move |view, event, event_cx| {
let event = event.downcast_ref::<MouseButtonEvent>().unwrap();
if event.button == button && !event.is_down {
handler(view, event, event_cx);
}
}),
event_type: TypeId::of::<MouseButtonEvent>(),
outside_bounds: true,
});
self
}
fn block(mut self) -> Self
where
Self: Sized,
{
self.declared_style().display = Some(Display::Block);
self
}
fn flex(mut self) -> Self
where
Self: Sized,
{
self.declared_style().display = Some(Display::Flex);
self
}
fn grid(mut self) -> Self
where
Self: Sized,
{
self.declared_style().display = Some(Display::Grid);
self
}
fn overflow_visible(mut self) -> Self
where
Self: Sized,
{
self.declared_style().overflow = OptionalPoint {
x: Some(Overflow::Visible),
y: Some(Overflow::Visible),
};
self
}
fn overflow_hidden(mut self) -> Self
where
Self: Sized,
{
self.declared_style().overflow = OptionalPoint {
x: Some(Overflow::Hidden),
y: Some(Overflow::Hidden),
};
self
}
fn overflow_scroll(mut self) -> Self
where
Self: Sized,
{
self.declared_style().overflow = OptionalPoint {
x: Some(Overflow::Scroll),
y: Some(Overflow::Scroll),
};
self
}
fn overflow_x_visible(mut self) -> Self
where
Self: Sized,
{
self.declared_style().overflow.x = Some(Overflow::Visible);
self
}
fn overflow_x_hidden(mut self) -> Self
where
Self: Sized,
{
self.declared_style().overflow.x = Some(Overflow::Hidden);
self
}
fn overflow_x_scroll(mut self) -> Self
where
Self: Sized,
{
self.declared_style().overflow.x = Some(Overflow::Scroll);
self
}
fn overflow_y_visible(mut self) -> Self
where
Self: Sized,
{
self.declared_style().overflow.y = Some(Overflow::Visible);
self
}
fn overflow_y_hidden(mut self) -> Self
where
Self: Sized,
{
self.declared_style().overflow.y = Some(Overflow::Hidden);
self
}
fn overflow_y_scroll(mut self) -> Self
where
Self: Sized,
{
self.declared_style().overflow.y = Some(Overflow::Scroll);
self
}
fn relative(mut self) -> Self
where
Self: Sized,
{
self.declared_style().position = Some(Position::Relative);
self
}
fn absolute(mut self) -> Self
where
Self: Sized,
{
self.declared_style().position = Some(Position::Absolute);
self
}
fn inset_0(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Pixels(0.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_px(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Pixels(1.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_0_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.125).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_1(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.25).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_1_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.375).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_2(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.5).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_2_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.625).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_3(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.75).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_3_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.875).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_4(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.25).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_6(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.5).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_7(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.75).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_8(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_9(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.25).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_10(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.5).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_11(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.75).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_12(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(3.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_14(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(3.5).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_16(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(4.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_20(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(5.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_24(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(6.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_28(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(7.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_32(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(8.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_36(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(9.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_40(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(10.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_44(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(11.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_48(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(12.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_52(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(13.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_56(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(14.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_60(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(15.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_64(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(16.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_72(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(18.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_80(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(20.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_96(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(24.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_half(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_1_3rd(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(33.333333).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_2_3rd(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(66.666667).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_1_4th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(25.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_2_4th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_3_4th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(75.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_1_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(20.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_2_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(40.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_3_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(60.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_4_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(80.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_1_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(16.666667).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_2_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(33.333333).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_3_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_4_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(66.666667).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_5_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(83.333333).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_1_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(8.333333).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_2_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(16.666667).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_3_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(25.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_4_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(33.333333).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_5_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(41.666667).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_6_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_7_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(58.333333).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_8_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(66.666667).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_9_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(75.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_10_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(83.333333).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_11_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(91.666667).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn inset_full(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(100.).into();
{
let inset = self
.computed_style()
.inset
.get_or_insert_with(Default::default);
inset.top = length;
inset.right = length;
inset.bottom = length;
inset.left = length;
self
}
}
fn w(mut self, width: impl Into<Length>) -> Self
where
Self: Sized,
{
self.declared_style().size.width = Some(width.into());
self
}
fn w_auto(mut self) -> Self
where
Self: Sized,
{
self.declared_style().size.width = Some(Length::Auto);
self
}
fn w_0(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Pixels(0.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_px(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Pixels(1.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_0_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.125).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_1(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.25).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_1_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.375).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_2(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.5).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_2_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.625).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_3(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.75).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_3_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.875).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_4(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.25).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_6(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.5).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_7(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.75).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_8(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_9(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.25).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_10(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.5).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_11(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.75).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_12(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(3.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_14(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(3.5).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_16(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(4.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_20(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(5.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_24(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(6.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_28(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(7.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_32(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(8.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_36(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(9.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_40(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(10.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_44(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(11.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_48(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(12.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_52(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(13.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_56(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(14.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_60(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(15.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_64(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(16.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_72(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(18.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_80(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(20.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_96(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(24.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_half(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_1_3rd(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(33.333333).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_2_3rd(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(66.666667).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_1_4th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(25.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_2_4th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_3_4th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(75.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_1_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(20.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_2_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(40.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_3_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(60.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_4_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(80.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_1_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(16.666667).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_2_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(33.333333).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_3_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_4_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(66.666667).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_5_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(83.333333).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_1_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(8.333333).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_2_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(16.666667).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_3_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(25.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_4_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(33.333333).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_5_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(41.666667).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_6_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_7_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(58.333333).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_8_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(66.666667).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_9_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(75.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_10_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(83.333333).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_11_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(91.666667).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn w_full(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(100.).into();
{
self.declared_style().size.width = Some(length);
self
}
}
fn min_w_0(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Pixels(0.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_px(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Pixels(1.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_0_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.125).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_1(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.25).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_1_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.375).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_2(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.5).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_2_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.625).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_3(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.75).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_3_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.875).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_4(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.25).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_6(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.5).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_7(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.75).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_8(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_9(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.25).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_10(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.5).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_11(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.75).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_12(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(3.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_14(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(3.5).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_16(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(4.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_20(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(5.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_24(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(6.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_28(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(7.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_32(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(8.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_36(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(9.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_40(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(10.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_44(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(11.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_48(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(12.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_52(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(13.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_56(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(14.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_60(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(15.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_64(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(16.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_72(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(18.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_80(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(20.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_96(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(24.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_half(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_1_3rd(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(33.333333).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_2_3rd(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(66.666667).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_1_4th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(25.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_2_4th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_3_4th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(75.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_1_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(20.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_2_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(40.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_3_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(60.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_4_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(80.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_1_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(16.666667).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_2_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(33.333333).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_3_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_4_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(66.666667).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_5_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(83.333333).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_1_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(8.333333).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_2_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(16.666667).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_3_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(25.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_4_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(33.333333).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_5_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(41.666667).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_6_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_7_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(58.333333).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_8_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(66.666667).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_9_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(75.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_10_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(83.333333).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_11_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(91.666667).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn min_w_full(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(100.).into();
{
self.declared_style().min_size.width = Some(length);
self
}
}
fn h(mut self, height: impl Into<Length>) -> Self
where
Self: Sized,
{
self.declared_style().size.height = Some(height.into());
self
}
fn h_auto(mut self) -> Self
where
Self: Sized,
{
self.declared_style().size.height = Some(Length::Auto);
self
}
fn h_0(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Pixels(0.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_px(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Pixels(1.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_0_5(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(0.125).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_1(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(0.25).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_1_5(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(0.375).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_2(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(0.5).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_2_5(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(0.625).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_3(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(0.75).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_3_5(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(0.875).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_4(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(1.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_5(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(1.25).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_6(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(1.5).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_7(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(1.75).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_8(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(2.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_9(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(2.25).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_10(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(2.5).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_11(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(2.75).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_12(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(3.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_14(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(3.5).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_16(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(4.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_20(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(5.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_24(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(6.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_28(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(7.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_32(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(8.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_36(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(9.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_40(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(10.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_44(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(11.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_48(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(12.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_52(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(13.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_56(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(14.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_60(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(15.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_64(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(16.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_72(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(18.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_80(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(20.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_96(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Rems(24.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_half(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(50.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_1_3rd(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(33.333333).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_2_3rd(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(66.666667).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_1_4th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(25.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_2_4th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(50.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_3_4th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(75.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_1_5th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(20.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_2_5th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(40.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_3_5th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(60.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_4_5th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(80.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_1_6th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(16.666667).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_2_6th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(33.333333).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_3_6th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(50.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_4_6th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(66.666667).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_5_6th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(83.333333).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_1_12th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(8.333333).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_2_12th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(16.666667).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_3_12th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(25.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_4_12th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(33.333333).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_5_12th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(41.666667).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_6_12th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(50.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_7_12th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(58.333333).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_8_12th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(66.666667).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_9_12th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(75.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_10_12th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(83.333333).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_11_12th(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(91.666667).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn h_full(mut self) -> Self
where
Self: Sized,
{
let height = DefinedLength::Percent(100.).into();
{
self.declared_style().size.height = Some(height);
self
}
}
fn min_h_0(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Pixels(0.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_px(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Pixels(1.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_0_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.125).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_1(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.25).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_1_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.375).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_2(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.5).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_2_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.625).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_3(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.75).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_3_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(0.875).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_4(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_5(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.25).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_6(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.5).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_7(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(1.75).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_8(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_9(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.25).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_10(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.5).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_11(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(2.75).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_12(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(3.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_14(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(3.5).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_16(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(4.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_20(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(5.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_24(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(6.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_28(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(7.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_32(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(8.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_36(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(9.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_40(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(10.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_44(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(11.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_48(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(12.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_52(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(13.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_56(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(14.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_60(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(15.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_64(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(16.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_72(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(18.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_80(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(20.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_96(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Rems(24.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_half(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_1_3rd(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(33.333333).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_2_3rd(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(66.666667).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_1_4th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(25.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_2_4th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_3_4th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(75.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_1_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(20.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_2_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(40.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_3_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(60.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_4_5th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(80.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_1_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(16.666667).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_2_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(33.333333).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_3_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_4_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(66.666667).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_5_6th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(83.333333).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_1_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(8.333333).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_2_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(16.666667).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_3_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(25.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_4_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(33.333333).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_5_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(41.666667).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_6_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(50.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_7_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(58.333333).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_8_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(66.666667).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_9_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(75.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_10_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(83.333333).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_11_12th(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(91.666667).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn min_h_full(mut self) -> Self
where
Self: Sized,
{
let length = DefinedLength::Percent(100.).into();
{
self.declared_style().min_size.height = Some(length);
self
}
}
fn hoverable(self) -> Hoverable<V, Self>
where
Self: Sized,
{
Hoverable::new(self)
}
fn fill(mut self, fill: impl Into<Fill>) -> Self
where
Self: Sized,
{
self.declared_style().fill = Some(Some(fill.into()));
self
}
fn text_color(mut self, color: impl Into<Hsla>) -> Self
where
Self: Sized,
{
self.declared_style().text_color = Some(Some(color.into()));
self
}
}
trait ElementObject<V> {
fn style(&mut self) -> &mut OptionalStyle;
fn handlers_mut(&mut self) -> &mut Vec<EventHandler<V>>;
fn layout(
&mut self,
view: &mut V,
cx: &mut LayoutContext<V>,
) -> Result<(NodeId, Box<dyn Any>)>;
fn paint(
&mut self,
layout: Layout<dyn Any>,
view: &mut V,
cx: &mut PaintContext<V>,
) -> Result<()>;
}
impl<V: 'static, E: Element<V>> ElementObject<V> for E {
fn style(&mut self) -> &mut OptionalStyle {
Element::declared_style(self)
}
fn handlers_mut(&mut self) -> &mut Vec<EventHandler<V>> {
Element::handlers_mut(self)
}
fn layout(
&mut self,
view: &mut V,
cx: &mut LayoutContext<V>,
) -> Result<(NodeId, Box<dyn Any>)> {
let (node_id, layout) = self.layout(view, cx)?;
let layout = Box::new(layout) as Box<dyn Any>;
Ok((node_id, layout))
}
fn paint(
&mut self,
layout: Layout<dyn Any>,
view: &mut V,
cx: &mut PaintContext<V>,
) -> Result<()> {
let layout = Layout {
from_engine: layout.from_engine,
from_element: layout.from_element.downcast_mut::<E::Layout>().unwrap(),
};
self.paint(layout, view, cx)
}
}
/// A dynamically typed element.
pub struct AnyElement<V> {
element: Box<dyn ElementObject<V>>,
layout: Option<(NodeId, Box<dyn Any>)>,
}
impl<V: 'static> AnyElement<V> {
pub fn layout(&mut self, view: &mut V, cx: &mut LayoutContext<V>) -> Result<NodeId> {
let pushed_text_style = self.push_text_style(cx);
let (node_id, layout) = self.element.layout(view, cx)?;
self.layout = Some((node_id, layout));
if pushed_text_style {
cx.pop_text_style();
}
Ok(node_id)
}
pub fn push_text_style(&mut self, cx: &mut impl RenderContext) -> bool {
let text_style = self.element.style().text_style();
if let Some(text_style) = text_style {
let mut current_text_style = cx.text_style();
text_style.apply(&mut current_text_style);
cx.push_text_style(current_text_style);
true
} else {
false
}
}
pub fn paint(&mut self, view: &mut V, cx: &mut PaintContext<V>) -> Result<()> {
let pushed_text_style = self.push_text_style(cx);
let (layout_node_id, element_layout) =
self.layout.as_mut().expect("paint called before layout");
let layout = Layout {
from_engine: cx
.layout_engine()
.unwrap()
.computed_layout(*layout_node_id)
.expect("make sure you're using this within a gpui2 adapter element"),
from_element: element_layout.as_mut(),
};
let style = self.element.style();
let fill_color = style.fill.flatten().and_then(|fill| fill.color());
if let Some(fill_color) = fill_color {
cx.scene.push_quad(gpui::scene::Quad {
bounds: layout.from_engine.bounds,
background: Some(fill_color.into()),
border: Default::default(),
corner_radii: Default::default(),
});
}
for event_handler in self.element.handlers_mut().iter().cloned() {
let EngineLayout { order, bounds } = layout.from_engine;
let view_id = cx.view_id();
let view_event_handler = event_handler.handler.clone();
cx.scene
.interactive_regions
.push(gpui::scene::InteractiveRegion {
order,
bounds,
outside_bounds: event_handler.outside_bounds,
event_handler: Rc::new(move |view, event, window_cx, view_id| {
let mut view_context = ViewContext::mutable(window_cx, view_id);
let mut event_context = EventContext::new(&mut view_context);
view_event_handler(
view.downcast_mut().unwrap(),
event,
&mut event_context,
);
}),
event_type: event_handler.event_type,
view_id,
});
}
self.element.paint(layout, view, cx)?;
if pushed_text_style {
cx.pop_text_style();
}
Ok(())
}
}
impl<V: 'static> Element<V> for AnyElement<V> {
type Layout = ();
fn declared_style(&mut self) -> &mut OptionalStyle {
self.element.style()
}
fn handlers_mut(&mut self) -> &mut Vec<EventHandler<V>> {
self.element.handlers_mut()
}
fn layout(
&mut self,
view: &mut V,
cx: &mut LayoutContext<V>,
) -> Result<(NodeId, Self::Layout)> {
Ok((self.layout(view, cx)?, ()))
}
fn paint(
&mut self,
layout: Layout<()>,
view: &mut V,
cx: &mut PaintContext<V>,
) -> Result<()> {
self.paint(view, cx)
}
}
pub trait IntoElement<V: 'static> {
type Element: Element<V>;
fn into_element(self) -> Self::Element;
fn into_any_element(self) -> AnyElement<V>
where
Self: Sized,
{
self.into_element().into_any()
}
}
}
mod frame {
use crate::{
element::{
AnyElement, Element, EventHandler, IntoElement, Layout, LayoutContext, NodeId,
PaintContext,
},
style::{OptionalStyle, Style},
};
use anyhow::{anyhow, Result};
use gpui::LayoutNodeId;
use gpui2_macros::IntoElement;
#[element_crate = "crate"]
pub struct Frame<V: 'static> {
style: OptionalStyle,
handlers: Vec<EventHandler<V>>,
children: Vec<AnyElement<V>>,
}
impl<V: 'static> crate::element::IntoElement<V> for Frame<V> {
type Element = Self;
fn into_element(self) -> Self {
self
}
}
pub fn frame<V>() -> Frame<V> {
Frame {
style: OptionalStyle::default(),
handlers: Vec::new(),
children: Vec::new(),
}
}
impl<V: 'static> Element<V> for Frame<V> {
type Layout = ();
fn declared_style(&mut self) -> &mut OptionalStyle {
&mut self.style
}
fn handlers_mut(&mut self) -> &mut Vec<EventHandler<V>> {
&mut self.handlers
}
fn layout(
&mut self,
view: &mut V,
cx: &mut LayoutContext<V>,
) -> Result<(NodeId, Self::Layout)> {
let child_layout_node_ids = self
.children
.iter_mut()
.map(|child| child.layout(view, cx))
.collect::<Result<Vec<LayoutNodeId>>>()?;
let rem_size = cx.rem_pixels();
let style: Style = self.style.into();
let node_id = cx
.layout_engine()
.ok_or_else(|| {
::anyhow::__private::must_use({
let error =
::anyhow::__private::format_err(format_args!("no layout engine"));
error
})
})?
.add_node(style.to_taffy(rem_size), child_layout_node_ids)?;
Ok((node_id, ()))
}
fn paint(
&mut self,
layout: Layout<()>,
view: &mut V,
cx: &mut PaintContext<V>,
) -> Result<()> {
for child in &mut self.children {
child.paint(view, cx)?;
}
Ok(())
}
}
impl<V: 'static> Frame<V> {
pub fn child(mut self, child: impl IntoElement<V>) -> Self {
self.children.push(child.into_any_element());
self
}
pub fn children<I, E>(mut self, children: I) -> Self
where
I: IntoIterator<Item = E>,
E: IntoElement<V>,
{
self.children
.extend(children.into_iter().map(|e| e.into_any_element()));
self
}
}
}
mod hoverable {
use crate::{
element::Element,
style::{OptionalStyle, Style},
};
use gpui::{
geometry::{rect::RectF, vector::Vector2F},
scene::MouseMove,
EngineLayout,
};
use std::{cell::Cell, marker::PhantomData, rc::Rc};
pub struct Hoverable<V, E> {
hover_style: OptionalStyle,
computed_style: Option<Style>,
view_type: PhantomData<V>,
child: E,
}
impl<V, E> Hoverable<V, E> {
pub fn new(child: E) -> Self {
Self {
hover_style: OptionalStyle::default(),
computed_style: None,
view_type: PhantomData,
child,
}
}
}
impl<V: 'static, E: Element<V>> Element<V> for Hoverable<V, E> {
type Layout = E::Layout;
fn declared_style(&mut self) -> &mut OptionalStyle {
&mut self.hover_style
}
fn computed_style(&mut self) -> &OptionalStyle {
::core::panicking::panic("not yet implemented")
}
fn handlers_mut(&mut self) -> &mut Vec<crate::element::EventHandler<V>> {
self.child.handlers_mut()
}
fn layout(
&mut self,
view: &mut V,
cx: &mut gpui::LayoutContext<V>,
) -> anyhow::Result<(taffy::tree::NodeId, Self::Layout)> {
self.child.layout(view, cx)
}
fn paint<'a>(
&mut self,
layout: crate::element::Layout<Self::Layout>,
view: &mut V,
cx: &mut crate::element::PaintContext<V>,
) -> anyhow::Result<()> {
let EngineLayout { bounds, order } = layout.from_engine;
let window_bounds = RectF::new(Vector2F::zero(), cx.window_size());
let was_hovered = Rc::new(Cell::new(false));
self.child.paint(layout, view, cx)?;
cx.draw_interactive_region(
order,
window_bounds,
false,
move |view, event: &MouseMove, cx| {
let is_hovered = bounds.contains_point(cx.mouse_position());
if is_hovered != was_hovered.get() {
was_hovered.set(is_hovered);
cx.repaint();
}
},
);
Ok(())
}
}
}
mod paint_context {
use derive_more::{Deref, DerefMut};
use gpui::{geometry::rect::RectF, EventContext, RenderContext, ViewContext};
pub use gpui::{LayoutContext, PaintContext as LegacyPaintContext};
use std::{any::TypeId, rc::Rc};
pub use taffy::tree::NodeId;
pub struct PaintContext<'a, 'b, 'c, 'd, V> {
#[deref]
#[deref_mut]
pub(crate) legacy_cx: &'d mut LegacyPaintContext<'a, 'b, 'c, V>,
pub(crate) scene: &'d mut gpui::SceneBuilder,
}
impl<'a, 'b, 'c, 'd, V> ::core::ops::Deref for PaintContext<'a, 'b, 'c, 'd, V> {
type Target = &'d mut LegacyPaintContext<'a, 'b, 'c, V>;
#[inline]
fn deref(&self) -> &Self::Target {
&self.legacy_cx
}
}
impl<'a, 'b, 'c, 'd, V> ::core::ops::DerefMut for PaintContext<'a, 'b, 'c, 'd, V> {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.legacy_cx
}
}
impl<V> RenderContext for PaintContext<'_, '_, '_, '_, V> {
fn text_style(&self) -> gpui::fonts::TextStyle {
self.legacy_cx.text_style()
}
fn push_text_style(&mut self, style: gpui::fonts::TextStyle) {
self.legacy_cx.push_text_style(style)
}
fn pop_text_style(&mut self) {
self.legacy_cx.pop_text_style()
}
}
impl<'a, 'b, 'c, 'd, V: 'static> PaintContext<'a, 'b, 'c, 'd, V> {
pub fn new(
legacy_cx: &'d mut LegacyPaintContext<'a, 'b, 'c, V>,
scene: &'d mut gpui::SceneBuilder,
) -> Self {
Self { legacy_cx, scene }
}
pub fn draw_interactive_region<E: 'static>(
&mut self,
order: u32,
bounds: RectF,
outside_bounds: bool,
event_handler: impl Fn(&mut V, &E, &mut EventContext<V>) + 'static,
) {
self.scene
.interactive_regions
.push(gpui::scene::InteractiveRegion {
order,
bounds,
outside_bounds,
event_handler: Rc::new(move |view, event, window_cx, view_id| {
let mut view_context = ViewContext::mutable(window_cx, view_id);
let mut event_context = EventContext::new(&mut view_context);
event_handler(
view.downcast_mut().unwrap(),
event.downcast_ref().unwrap(),
&mut event_context,
);
}),
event_type: TypeId::of::<E>(),
view_id: self.view_id(),
});
}
}
}
mod style {
use crate::color::Hsla;
use gpui::geometry::{
DefinedLength, Edges, Length, OptionalEdges, OptionalPoint, OptionalSize, Point, Size,
};
use optional::Optional;
pub use taffy::style::{
AlignContent, AlignItems, AlignSelf, Display, FlexDirection, FlexWrap, JustifyContent,
Overflow, Position,
};
pub struct Style {
/// What layout strategy should be used?
pub display: Display,
/// How children overflowing their container should affect layout
#[optional]
pub overflow: Point<Overflow>,
/// How much space (in points) should be reserved for the scrollbars of `Overflow::Scroll` and `Overflow::Auto` nodes.
pub scrollbar_width: f32,
/// What should the `position` value of this struct use as a base offset?
pub position: Position,
/// How should the position of this element be tweaked relative to the layout defined?
pub inset: Edges<Length>,
/// Sets the initial size of the item
#[optional]
pub size: Size<Length>,
/// Controls the minimum size of the item
#[optional]
pub min_size: Size<Length>,
/// Controls the maximum size of the item
#[optional]
pub max_size: Size<Length>,
/// Sets the preferred aspect ratio for the item. The ratio is calculated as width divided by height.
pub aspect_ratio: Option<f32>,
/// How large should the margin be on each side?
#[optional]
pub margin: Edges<Length>,
/// How large should the padding be on each side?
pub padding: Edges<DefinedLength>,
/// How large should the border be on each side?
pub border: Edges<DefinedLength>,
/// How this node's children aligned in the cross/block axis?
pub align_items: Option<AlignItems>,
/// How this node should be aligned in the cross/block axis. Falls back to the parents [`AlignItems`] if not set
pub align_self: Option<AlignSelf>,
/// How should content contained within this item be aligned in the cross/block axis
pub align_content: Option<AlignContent>,
/// How should contained within this item be aligned in the main/inline axis
pub justify_content: Option<JustifyContent>,
/// How large should the gaps between items in a flex container be?
pub gap: Size<DefinedLength>,
/// Which direction does the main axis flow in?
pub flex_direction: FlexDirection,
/// Should elements wrap, or stay in a single line?
pub flex_wrap: FlexWrap,
/// Sets the initial main axis size of the item
pub flex_basis: Length,
/// The relative rate at which this item grows when it is expanding to fill space, 0.0 is the default value, and this value must be positive.
pub flex_grow: f32,
/// The relative rate at which this item shrinks when it is contracting to fit into space, 1.0 is the default value, and this value must be positive.
pub flex_shrink: f32,
/// The fill color of this element
pub fill: Option<Fill>,
/// The color of text within this element. Cascades to children unless overridden.
pub text_color: Option<Hsla>,
}
#[automatically_derived]
impl ::core::clone::Clone for Style {
#[inline]
fn clone(&self) -> Style {
Style {
display: ::core::clone::Clone::clone(&self.display),
overflow: ::core::clone::Clone::clone(&self.overflow),
scrollbar_width: ::core::clone::Clone::clone(&self.scrollbar_width),
position: ::core::clone::Clone::clone(&self.position),
inset: ::core::clone::Clone::clone(&self.inset),
size: ::core::clone::Clone::clone(&self.size),
min_size: ::core::clone::Clone::clone(&self.min_size),
max_size: ::core::clone::Clone::clone(&self.max_size),
aspect_ratio: ::core::clone::Clone::clone(&self.aspect_ratio),
margin: ::core::clone::Clone::clone(&self.margin),
padding: ::core::clone::Clone::clone(&self.padding),
border: ::core::clone::Clone::clone(&self.border),
align_items: ::core::clone::Clone::clone(&self.align_items),
align_self: ::core::clone::Clone::clone(&self.align_self),
align_content: ::core::clone::Clone::clone(&self.align_content),
justify_content: ::core::clone::Clone::clone(&self.justify_content),
gap: ::core::clone::Clone::clone(&self.gap),
flex_direction: ::core::clone::Clone::clone(&self.flex_direction),
flex_wrap: ::core::clone::Clone::clone(&self.flex_wrap),
flex_basis: ::core::clone::Clone::clone(&self.flex_basis),
flex_grow: ::core::clone::Clone::clone(&self.flex_grow),
flex_shrink: ::core::clone::Clone::clone(&self.flex_shrink),
fill: ::core::clone::Clone::clone(&self.fill),
text_color: ::core::clone::Clone::clone(&self.text_color),
}
}
}
pub struct OptionalStyle {
pub display: Option<Display>,
pub overflow: OptionalPoint<Overflow>,
pub scrollbar_width: Option<f32>,
pub position: Option<Position>,
pub inset: Option<Edges<Length>>,
pub size: OptionalSize<Length>,
pub min_size: OptionalSize<Length>,
pub max_size: OptionalSize<Length>,
pub aspect_ratio: Option<Option<f32>>,
pub margin: OptionalEdges<Length>,
pub padding: Option<Edges<DefinedLength>>,
pub border: Option<Edges<DefinedLength>>,
pub align_items: Option<Option<AlignItems>>,
pub align_self: Option<Option<AlignSelf>>,
pub align_content: Option<Option<AlignContent>>,
pub justify_content: Option<Option<JustifyContent>>,
pub gap: Option<Size<DefinedLength>>,
pub flex_direction: Option<FlexDirection>,
pub flex_wrap: Option<FlexWrap>,
pub flex_basis: Option<Length>,
pub flex_grow: Option<f32>,
pub flex_shrink: Option<f32>,
pub fill: Option<Option<Fill>>,
pub text_color: Option<Option<Hsla>>,
}
#[automatically_derived]
impl ::core::default::Default for OptionalStyle {
#[inline]
fn default() -> OptionalStyle {
OptionalStyle {
display: ::core::default::Default::default(),
overflow: ::core::default::Default::default(),
scrollbar_width: ::core::default::Default::default(),
position: ::core::default::Default::default(),
inset: ::core::default::Default::default(),
size: ::core::default::Default::default(),
min_size: ::core::default::Default::default(),
max_size: ::core::default::Default::default(),
aspect_ratio: ::core::default::Default::default(),
margin: ::core::default::Default::default(),
padding: ::core::default::Default::default(),
border: ::core::default::Default::default(),
align_items: ::core::default::Default::default(),
align_self: ::core::default::Default::default(),
align_content: ::core::default::Default::default(),
justify_content: ::core::default::Default::default(),
gap: ::core::default::Default::default(),
flex_direction: ::core::default::Default::default(),
flex_wrap: ::core::default::Default::default(),
flex_basis: ::core::default::Default::default(),
flex_grow: ::core::default::Default::default(),
flex_shrink: ::core::default::Default::default(),
fill: ::core::default::Default::default(),
text_color: ::core::default::Default::default(),
}
}
}
#[automatically_derived]
impl ::core::clone::Clone for OptionalStyle {
#[inline]
fn clone(&self) -> OptionalStyle {
OptionalStyle {
display: ::core::clone::Clone::clone(&self.display),
overflow: ::core::clone::Clone::clone(&self.overflow),
scrollbar_width: ::core::clone::Clone::clone(&self.scrollbar_width),
position: ::core::clone::Clone::clone(&self.position),
inset: ::core::clone::Clone::clone(&self.inset),
size: ::core::clone::Clone::clone(&self.size),
min_size: ::core::clone::Clone::clone(&self.min_size),
max_size: ::core::clone::Clone::clone(&self.max_size),
aspect_ratio: ::core::clone::Clone::clone(&self.aspect_ratio),
margin: ::core::clone::Clone::clone(&self.margin),
padding: ::core::clone::Clone::clone(&self.padding),
border: ::core::clone::Clone::clone(&self.border),
align_items: ::core::clone::Clone::clone(&self.align_items),
align_self: ::core::clone::Clone::clone(&self.align_self),
align_content: ::core::clone::Clone::clone(&self.align_content),
justify_content: ::core::clone::Clone::clone(&self.justify_content),
gap: ::core::clone::Clone::clone(&self.gap),
flex_direction: ::core::clone::Clone::clone(&self.flex_direction),
flex_wrap: ::core::clone::Clone::clone(&self.flex_wrap),
flex_basis: ::core::clone::Clone::clone(&self.flex_basis),
flex_grow: ::core::clone::Clone::clone(&self.flex_grow),
flex_shrink: ::core::clone::Clone::clone(&self.flex_shrink),
fill: ::core::clone::Clone::clone(&self.fill),
text_color: ::core::clone::Clone::clone(&self.text_color),
}
}
}
impl Optional for OptionalStyle {
type Base = Style;
fn assign(&self, base: &mut Self::Base) {
if let Some(value) = self.display.clone() {
base.display = value;
}
if let Some(value) = self.overflow.clone() {
base.overflow = value;
}
if let Some(value) = self.scrollbar_width.clone() {
base.scrollbar_width = value;
}
if let Some(value) = self.position.clone() {
base.position = value;
}
if let Some(value) = self.inset.clone() {
base.inset = value;
}
if let Some(value) = self.size.clone() {
base.size = value;
}
if let Some(value) = self.min_size.clone() {
base.min_size = value;
}
if let Some(value) = self.max_size.clone() {
base.max_size = value;
}
if let Some(value) = self.aspect_ratio.clone() {
base.aspect_ratio = value;
}
if let Some(value) = self.margin.clone() {
base.margin = value;
}
if let Some(value) = self.padding.clone() {
base.padding = value;
}
if let Some(value) = self.border.clone() {
base.border = value;
}
if let Some(value) = self.align_items.clone() {
base.align_items = value;
}
if let Some(value) = self.align_self.clone() {
base.align_self = value;
}
if let Some(value) = self.align_content.clone() {
base.align_content = value;
}
if let Some(value) = self.justify_content.clone() {
base.justify_content = value;
}
if let Some(value) = self.gap.clone() {
base.gap = value;
}
if let Some(value) = self.flex_direction.clone() {
base.flex_direction = value;
}
if let Some(value) = self.flex_wrap.clone() {
base.flex_wrap = value;
}
if let Some(value) = self.flex_basis.clone() {
base.flex_basis = value;
}
if let Some(value) = self.flex_grow.clone() {
base.flex_grow = value;
}
if let Some(value) = self.flex_shrink.clone() {
base.flex_shrink = value;
}
if let Some(value) = self.fill.clone() {
base.fill = value;
}
if let Some(value) = self.text_color.clone() {
base.text_color = value;
}
}
}
impl From<OptionalStyle> for Style
where
Style: Default,
{
fn from(wrapper: OptionalStyle) -> Self {
let mut base = Self::default();
wrapper.assign(&mut base);
base
}
}
impl Style {
pub const DEFAULT: Style = Style {
display: Display::DEFAULT,
overflow: Point {
x: Overflow::Visible,
y: Overflow::Visible,
},
scrollbar_width: 0.0,
position: Position::Relative,
inset: Edges::auto(),
margin: Edges::<Length>::zero(),
padding: Edges::<DefinedLength>::zero(),
border: Edges::<DefinedLength>::zero(),
size: Size::auto(),
min_size: Size::auto(),
max_size: Size::auto(),
aspect_ratio: None,
gap: Size::zero(),
align_items: None,
align_self: None,
align_content: None,
justify_content: None,
flex_direction: FlexDirection::Row,
flex_wrap: FlexWrap::NoWrap,
flex_grow: 0.0,
flex_shrink: 1.0,
flex_basis: Length::Auto,
fill: None,
text_color: None,
};
pub fn new() -> Self {
Self::DEFAULT.clone()
}
pub fn to_taffy(&self, rem_size: f32) -> taffy::style::Style {
taffy::style::Style {
display: self.display,
overflow: self.overflow.clone().into(),
scrollbar_width: self.scrollbar_width,
position: self.position,
inset: self.inset.to_taffy(rem_size),
size: self.size.to_taffy(rem_size),
min_size: self.min_size.to_taffy(rem_size),
max_size: self.max_size.to_taffy(rem_size),
aspect_ratio: self.aspect_ratio,
margin: self.margin.to_taffy(rem_size),
padding: self.padding.to_taffy(rem_size),
border: self.border.to_taffy(rem_size),
align_items: self.align_items,
align_self: self.align_self,
align_content: self.align_content,
justify_content: self.justify_content,
gap: self.gap.to_taffy(rem_size),
flex_direction: self.flex_direction,
flex_wrap: self.flex_wrap,
flex_basis: self.flex_basis.to_taffy(rem_size).into(),
flex_grow: self.flex_grow,
flex_shrink: self.flex_shrink,
..Default::default()
}
}
}
impl Default for Style {
fn default() -> Self {
Self::DEFAULT.clone()
}
}
impl OptionalStyle {
pub fn text_style(&self) -> Option<OptionalTextStyle> {
self.text_color.map(|color| OptionalTextStyle { color })
}
}
pub struct OptionalTextStyle {
color: Option<Hsla>,
}
impl OptionalTextStyle {
pub fn apply(&self, style: &mut gpui::fonts::TextStyle) {
if let Some(color) = self.color {
style.color = color.into();
}
}
}
pub enum Fill {
Color(Hsla),
}
#[automatically_derived]
impl ::core::clone::Clone for Fill {
#[inline]
fn clone(&self) -> Fill {
match self {
Fill::Color(__self_0) => Fill::Color(::core::clone::Clone::clone(__self_0)),
}
}
}
impl Fill {
pub fn color(&self) -> Option<Hsla> {
match self {
Fill::Color(color) => Some(*color),
}
}
}
impl Default for Fill {
fn default() -> Self {
Self::Color(Hsla::default())
}
}
impl From<Hsla> for Fill {
fn from(color: Hsla) -> Self {
Self::Color(color)
}
}
}
mod text {
use crate::{
element::{Element, ElementMetadata, EventHandler, IntoElement},
style::Style,
};
use gpui::{geometry::Size, text_layout::LineLayout, RenderContext};
use parking_lot::Mutex;
use std::sync::Arc;
impl<V: 'static, S: Into<ArcCow<'static, str>>> IntoElement<V> for S {
type Element = Text<V>;
fn into_element(self) -> Self::Element {
Text {
text: self.into(),
metadata: Default::default(),
}
}
}
pub struct Text<V> {
text: ArcCow<'static, str>,
metadata: ElementMetadata<V>,
}
impl<V: 'static> Element<V> for Text<V> {
type Layout = Arc<Mutex<Option<TextLayout>>>;
fn declared_style(&mut self) -> &mut crate::style::OptionalStyle {
&mut self.metadata.style
}
fn layout(
&mut self,
view: &mut V,
cx: &mut gpui::LayoutContext<V>,
) -> anyhow::Result<(taffy::tree::NodeId, Self::Layout)> {
let rem_size = cx.rem_pixels();
let fonts = cx.platform().fonts();
let text_style = cx.text_style();
let line_height = cx.font_cache().line_height(text_style.font_size);
let layout_engine = cx.layout_engine().expect("no layout engine present");
let text = self.text.clone();
let layout = Arc::new(Mutex::new(None));
let style: Style = self.metadata.style.into();
let node_id = layout_engine.add_measured_node(style.to_taffy(rem_size), {
let layout = layout.clone();
move |params| {
let line_layout = fonts.layout_line(
text.as_ref(),
text_style.font_size,
&[(text.len(), text_style.to_run())],
);
let size = Size {
width: line_layout.width,
height: line_height,
};
layout.lock().replace(TextLayout {
line_layout: Arc::new(line_layout),
line_height,
});
size
}
})?;
Ok((node_id, layout))
}
fn paint<'a>(
&mut self,
layout: crate::element::Layout<Arc<Mutex<Option<TextLayout>>>>,
view: &mut V,
cx: &mut crate::element::PaintContext<V>,
) -> anyhow::Result<()> {
let element_layout_lock = layout.from_element.lock();
let element_layout = element_layout_lock
.as_ref()
.expect("layout has not been performed");
let line_layout = element_layout.line_layout.clone();
let line_height = element_layout.line_height;
drop(element_layout_lock);
let text_style = cx.text_style();
let line = gpui::text_layout::Line::new(
line_layout,
&[(self.text.len(), text_style.to_run())],
);
line.paint(
cx.scene,
layout.from_engine.bounds.origin(),
layout.from_engine.bounds,
line_height,
cx.legacy_cx,
);
Ok(())
}
fn handlers_mut(&mut self) -> &mut Vec<EventHandler<V>> {
&mut self.metadata.handlers
}
}
pub struct TextLayout {
line_layout: Arc<LineLayout>,
line_height: f32,
}
pub enum ArcCow<'a, T: ?Sized> {
Borrowed(&'a T),
Owned(Arc<T>),
}
impl<'a, T: ?Sized> Clone for ArcCow<'a, T> {
fn clone(&self) -> Self {
match self {
Self::Borrowed(borrowed) => Self::Borrowed(borrowed),
Self::Owned(owned) => Self::Owned(owned.clone()),
}
}
}
impl<'a, T: ?Sized> From<&'a T> for ArcCow<'a, T> {
fn from(s: &'a T) -> Self {
Self::Borrowed(s)
}
}
impl<T> From<Arc<T>> for ArcCow<'_, T> {
fn from(s: Arc<T>) -> Self {
Self::Owned(s)
}
}
impl From<String> for ArcCow<'_, str> {
fn from(value: String) -> Self {
Self::Owned(value.into())
}
}
impl<T: ?Sized> std::ops::Deref for ArcCow<'_, T> {
type Target = T;
fn deref(&self) -> &Self::Target {
match self {
ArcCow::Borrowed(s) => s,
ArcCow::Owned(s) => s.as_ref(),
}
}
}
impl<T: ?Sized> AsRef<T> for ArcCow<'_, T> {
fn as_ref(&self) -> &T {
match self {
ArcCow::Borrowed(borrowed) => borrowed,
ArcCow::Owned(owned) => owned.as_ref(),
}
}
}
}
mod themes {
use crate::color::{Hsla, Lerp};
use std::ops::Range;
pub mod rose_pine {
use crate::{
color::{hsla, rgb, Hsla},
ThemeColors,
};
use std::ops::Range;
pub struct RosePineThemes {
pub default: RosePinePalette,
pub dawn: RosePinePalette,
pub moon: RosePinePalette,
}
pub struct RosePinePalette {
pub base: Hsla,
pub surface: Hsla,
pub overlay: Hsla,
pub muted: Hsla,
pub subtle: Hsla,
pub text: Hsla,
pub love: Hsla,
pub gold: Hsla,
pub rose: Hsla,
pub pine: Hsla,
pub foam: Hsla,
pub iris: Hsla,
pub highlight_low: Hsla,
pub highlight_med: Hsla,
pub highlight_high: Hsla,
}
#[automatically_derived]
impl ::core::clone::Clone for RosePinePalette {
#[inline]
fn clone(&self) -> RosePinePalette {
let _: ::core::clone::AssertParamIsClone<Hsla>;
*self
}
}
#[automatically_derived]
impl ::core::marker::Copy for RosePinePalette {}
#[automatically_derived]
impl ::core::fmt::Debug for RosePinePalette {
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ = &[
"base",
"surface",
"overlay",
"muted",
"subtle",
"text",
"love",
"gold",
"rose",
"pine",
"foam",
"iris",
"highlight_low",
"highlight_med",
"highlight_high",
];
let values: &[&dyn::core::fmt::Debug] = &[
&self.base,
&self.surface,
&self.overlay,
&self.muted,
&self.subtle,
&self.text,
&self.love,
&self.gold,
&self.rose,
&self.pine,
&self.foam,
&self.iris,
&self.highlight_low,
&self.highlight_med,
&&self.highlight_high,
];
::core::fmt::Formatter::debug_struct_fields_finish(
f,
"RosePinePalette",
names,
values,
)
}
}
impl RosePinePalette {
pub fn default() -> RosePinePalette {
RosePinePalette {
base: rgb(0x191724),
surface: rgb(0x1f1d2e),
overlay: rgb(0x26233a),
muted: rgb(0x6e6a86),
subtle: rgb(0x908caa),
text: rgb(0xe0def4),
love: rgb(0xeb6f92),
gold: rgb(0xf6c177),
rose: rgb(0xebbcba),
pine: rgb(0x31748f),
foam: rgb(0x9ccfd8),
iris: rgb(0xc4a7e7),
highlight_low: rgb(0x21202e),
highlight_med: rgb(0x403d52),
highlight_high: rgb(0x524f67),
}
}
pub fn moon() -> RosePinePalette {
RosePinePalette {
base: rgb(0x232136),
surface: rgb(0x2a273f),
overlay: rgb(0x393552),
muted: rgb(0x6e6a86),
subtle: rgb(0x908caa),
text: rgb(0xe0def4),
love: rgb(0xeb6f92),
gold: rgb(0xf6c177),
rose: rgb(0xea9a97),
pine: rgb(0x3e8fb0),
foam: rgb(0x9ccfd8),
iris: rgb(0xc4a7e7),
highlight_low: rgb(0x2a283e),
highlight_med: rgb(0x44415a),
highlight_high: rgb(0x56526e),
}
}
pub fn dawn() -> RosePinePalette {
RosePinePalette {
base: rgb(0xfaf4ed),
surface: rgb(0xfffaf3),
overlay: rgb(0xf2e9e1),
muted: rgb(0x9893a5),
subtle: rgb(0x797593),
text: rgb(0x575279),
love: rgb(0xb4637a),
gold: rgb(0xea9d34),
rose: rgb(0xd7827e),
pine: rgb(0x286983),
foam: rgb(0x56949f),
iris: rgb(0x907aa9),
highlight_low: rgb(0xf4ede8),
highlight_med: rgb(0xdfdad9),
highlight_high: rgb(0xcecacd),
}
}
}
pub fn default() -> ThemeColors {
theme_colors(&RosePinePalette::default())
}
pub fn moon() -> ThemeColors {
theme_colors(&RosePinePalette::moon())
}
pub fn dawn() -> ThemeColors {
theme_colors(&RosePinePalette::dawn())
}
fn theme_colors(p: &RosePinePalette) -> ThemeColors {
ThemeColors {
base: scale_sl(p.base, (0.8, 0.8), (1.2, 1.2)),
surface: scale_sl(p.surface, (0.8, 0.8), (1.2, 1.2)),
overlay: scale_sl(p.overlay, (0.8, 0.8), (1.2, 1.2)),
muted: scale_sl(p.muted, (0.8, 0.8), (1.2, 1.2)),
subtle: scale_sl(p.subtle, (0.8, 0.8), (1.2, 1.2)),
text: scale_sl(p.text, (0.8, 0.8), (1.2, 1.2)),
highlight_low: scale_sl(p.highlight_low, (0.8, 0.8), (1.2, 1.2)),
highlight_med: scale_sl(p.highlight_med, (0.8, 0.8), (1.2, 1.2)),
highlight_high: scale_sl(p.highlight_high, (0.8, 0.8), (1.2, 1.2)),
success: scale_sl(p.foam, (0.8, 0.8), (1.2, 1.2)),
warning: scale_sl(p.gold, (0.8, 0.8), (1.2, 1.2)),
error: scale_sl(p.love, (0.8, 0.8), (1.2, 1.2)),
inserted: scale_sl(p.foam, (0.8, 0.8), (1.2, 1.2)),
deleted: scale_sl(p.love, (0.8, 0.8), (1.2, 1.2)),
modified: scale_sl(p.rose, (0.8, 0.8), (1.2, 1.2)),
}
}
/// Produces a range by multiplying the saturation and lightness of the base color by the given
/// start and end factors.
fn scale_sl(
base: Hsla,
(start_s, start_l): (f32, f32),
(end_s, end_l): (f32, f32),
) -> Range<Hsla> {
let start = hsla(base.h, base.s * start_s, base.l * start_l, base.a);
let end = hsla(base.h, base.s * end_s, base.l * end_l, base.a);
Range { start, end }
}
}
pub struct ThemeColors {
pub base: Range<Hsla>,
pub surface: Range<Hsla>,
pub overlay: Range<Hsla>,
pub muted: Range<Hsla>,
pub subtle: Range<Hsla>,
pub text: Range<Hsla>,
pub highlight_low: Range<Hsla>,
pub highlight_med: Range<Hsla>,
pub highlight_high: Range<Hsla>,
pub success: Range<Hsla>,
pub warning: Range<Hsla>,
pub error: Range<Hsla>,
pub inserted: Range<Hsla>,
pub deleted: Range<Hsla>,
pub modified: Range<Hsla>,
}
impl ThemeColors {
pub fn base(&self, level: f32) -> Hsla {
self.base.lerp(level)
}
pub fn surface(&self, level: f32) -> Hsla {
self.surface.lerp(level)
}
pub fn overlay(&self, level: f32) -> Hsla {
self.overlay.lerp(level)
}
pub fn muted(&self, level: f32) -> Hsla {
self.muted.lerp(level)
}
pub fn subtle(&self, level: f32) -> Hsla {
self.subtle.lerp(level)
}
pub fn text(&self, level: f32) -> Hsla {
self.text.lerp(level)
}
pub fn highlight_low(&self, level: f32) -> Hsla {
self.highlight_low.lerp(level)
}
pub fn highlight_med(&self, level: f32) -> Hsla {
self.highlight_med.lerp(level)
}
pub fn highlight_high(&self, level: f32) -> Hsla {
self.highlight_high.lerp(level)
}
pub fn success(&self, level: f32) -> Hsla {
self.success.lerp(level)
}
pub fn warning(&self, level: f32) -> Hsla {
self.warning.lerp(level)
}
pub fn error(&self, level: f32) -> Hsla {
self.error.lerp(level)
}
pub fn inserted(&self, level: f32) -> Hsla {
self.inserted.lerp(level)
}
pub fn deleted(&self, level: f32) -> Hsla {
self.deleted.lerp(level)
}
pub fn modified(&self, level: f32) -> Hsla {
self.modified.lerp(level)
}
}
}
mod view {
use crate::element::{AnyElement, Element};
use gpui::{Element as _, ViewContext};
pub fn view<F, E>(mut render: F) -> ViewFn
where
F: 'static + FnMut(&mut ViewContext<ViewFn>) -> E,
E: Element<ViewFn>,
{
ViewFn(Box::new(move |cx| (render)(cx).into_any()))
}
pub struct ViewFn(Box<dyn FnMut(&mut ViewContext<ViewFn>) -> AnyElement<ViewFn>>);
impl gpui::Entity for ViewFn {
type Event = ();
}
impl gpui::View for ViewFn {
fn render(&mut self, cx: &mut ViewContext<Self>) -> gpui::AnyElement<Self> {
(self.0)(cx).adapt().into_any()
}
}
}
fn main() {
SimpleLogger::init(LevelFilter::Info, Default::default()).expect("could not initialize logger");
gpui::App::new(()).unwrap().run(|cx| {
cx.add_window(
WindowOptions {
bounds: gpui::platform::WindowBounds::Fixed(RectF::new(
vec2f(0., 0.),
vec2f(400., 300.),
)),
center: true,
..Default::default()
},
|_| view(|_| storybook(&rose_pine::moon())),
);
cx.platform().activate(true);
});
}
fn storybook<V: 'static>(theme: &ThemeColors) -> impl Element<V> {
frame()
.text_color(black())
.h_full()
.w_half()
.fill(theme.success(0.5))
.child(button().label("Hello").click(|_, _, _| {
::std::io::_print(format_args!("click!\n"));
}))
}