mirror of
https://github.com/zed-industries/zed.git
synced 2024-12-26 10:40:54 +00:00
5618 lines
171 KiB
Rust
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"));
|
|
}))
|
|
}
|