@@ -2,14 +2,15 @@ use crate::{
item::{Item, ItemHandle, ItemSettings, WeakItemHandle},
toolbar::Toolbar,
workspace_settings::{AutosaveSetting, WorkspaceSettings},
- SplitDirection, Workspace,
+ NewCenterTerminal, NewFile, NewSearch, SplitDirection, ToggleZoom, Workspace,
};
use anyhow::Result;
use collections::{HashMap, HashSet, VecDeque};
use gpui::{
- actions, prelude::*, Action, AppContext, AsyncWindowContext, Div, EntityId, EventEmitter,
- FocusHandle, Focusable, FocusableView, Model, Pixels, Point, PromptLevel, Render, Task, View,
- ViewContext, VisualContext, WeakView, WindowContext,
+ actions, overlay, prelude::*, Action, AnchorCorner, AnyWeakView, AppContext,
+ AsyncWindowContext, DismissEvent, Div, EntityId, EventEmitter, FocusHandle, Focusable,
+ FocusableView, Model, Pixels, Point, PromptLevel, Render, Task, View, ViewContext,
+ VisualContext, WeakView, WindowContext,
};
use parking_lot::Mutex;
use project::{Project, ProjectEntryId, ProjectPath};
@@ -25,8 +26,8 @@ use std::{
},
};
-use ui::v_stack;
-use ui::{prelude::*, Color, Icon, IconButton, IconElement, Tooltip};
+use ui::{prelude::*, right_click_menu, Color, Icon, IconButton, IconElement, Tooltip};
+use ui::{v_stack, ContextMenu};
use util::truncate_and_remove_front;
#[derive(PartialEq, Clone, Copy, Deserialize, Debug)]
@@ -50,7 +51,7 @@ pub enum SaveIntent {
//todo!("Do we need the default bound on actions? Decide soon")
// #[register_action]
-#[derive(Clone, Deserialize, PartialEq, Debug)]
+#[derive(Action, Clone, Deserialize, PartialEq, Debug)]
pub struct ActivateItem(pub usize);
// #[derive(Clone, PartialEq)]
@@ -143,17 +144,24 @@ impl fmt::Debug for Event {
}
}
+struct FocusedView {
+ view: AnyWeakView,
+ focus_handle: FocusHandle,
+}
+
pub struct Pane {
focus_handle: FocusHandle,
items: Vec<Box<dyn ItemHandle>>,
activation_history: Vec<EntityId>,
zoomed: bool,
active_item_index: usize,
- // last_focused_view_by_item: HashMap<usize, AnyWeakViewHandle>,
+ last_focused_view_by_item: HashMap<EntityId, FocusHandle>,
autoscroll: bool,
nav_history: NavHistory,
toolbar: View<Toolbar>,
- // tab_bar_context_menu: TabBarContextMenu,
+ tab_bar_focus_handle: FocusHandle,
+ new_item_menu: Option<View<ContextMenu>>,
+ split_item_menu: Option<View<ContextMenu>>,
// tab_context_menu: ViewHandle<ContextMenu>,
workspace: WeakView<Workspace>,
project: Model<Project>,
@@ -306,7 +314,7 @@ impl Pane {
activation_history: Vec::new(),
zoomed: false,
active_item_index: 0,
- // last_focused_view_by_item: Default::default(),
+ last_focused_view_by_item: Default::default(),
autoscroll: false,
nav_history: NavHistory(Arc::new(Mutex::new(NavHistoryState {
mode: NavigationMode::Normal,
@@ -318,6 +326,9 @@ impl Pane {
next_timestamp,
}))),
toolbar: cx.build_view(|_| Toolbar::new()),
+ tab_bar_focus_handle: cx.focus_handle(),
+ new_item_menu: None,
+ split_item_menu: None,
// tab_bar_context_menu: TabBarContextMenu {
// kind: TabBarContextMenuKind::New,
// handle: context_menu,
@@ -392,9 +403,48 @@ impl Pane {
}
pub fn has_focus(&self, cx: &WindowContext) -> bool {
+ // todo!(); // inline this manually
self.focus_handle.contains_focused(cx)
}
+ fn focus_in(&mut self, cx: &mut ViewContext<Self>) {
+ if !self.has_focus(cx) {
+ cx.emit(Event::Focus);
+ cx.notify();
+ }
+
+ self.toolbar.update(cx, |toolbar, cx| {
+ toolbar.focus_changed(true, cx);
+ });
+
+ if let Some(active_item) = self.active_item() {
+ if self.focus_handle.is_focused(cx) {
+ // Pane was focused directly. We need to either focus a view inside the active item,
+ // or focus the active item itself
+ if let Some(weak_last_focused_view) =
+ self.last_focused_view_by_item.get(&active_item.item_id())
+ {
+ weak_last_focused_view.focus(cx);
+ return;
+ }
+
+ active_item.focus_handle(cx).focus(cx);
+ } else if !self.tab_bar_focus_handle.contains_focused(cx) {
+ if let Some(focused) = cx.focused() {
+ self.last_focused_view_by_item
+ .insert(active_item.item_id(), focused);
+ }
+ }
+ }
+ }
+
+ fn focus_out(&mut self, cx: &mut ViewContext<Self>) {
+ self.toolbar.update(cx, |toolbar, cx| {
+ toolbar.focus_changed(false, cx);
+ });
+ cx.notify();
+ }
+
pub fn active_item_index(&self) -> usize {
self.active_item_index
}
@@ -652,21 +702,16 @@ impl Pane {
.position(|i| i.item_id() == item.item_id())
}
- // pub fn toggle_zoom(&mut self, _: &ToggleZoom, cx: &mut ViewContext<Self>) {
- // // Potentially warn the user of the new keybinding
- // let workspace_handle = self.workspace().clone();
- // cx.spawn(|_, mut cx| async move { notify_of_new_dock(&workspace_handle, &mut cx) })
- // .detach();
-
- // if self.zoomed {
- // cx.emit(Event::ZoomOut);
- // } else if !self.items.is_empty() {
- // if !self.has_focus {
- // cx.focus_self();
- // }
- // cx.emit(Event::ZoomIn);
- // }
- // }
+ pub fn toggle_zoom(&mut self, _: &ToggleZoom, cx: &mut ViewContext<Self>) {
+ if self.zoomed {
+ cx.emit(Event::ZoomOut);
+ } else if !self.items.is_empty() {
+ if !self.focus_handle.contains_focused(cx) {
+ cx.focus_self();
+ }
+ cx.emit(Event::ZoomIn);
+ }
+ }
pub fn activate_item(
&mut self,
@@ -1403,7 +1448,7 @@ impl Pane {
let close_right = ItemSettings::get_global(cx).close_position.right();
let is_active = ix == self.active_item_index;
- div()
+ let tab = div()
.group("")
.id(ix)
.cursor_pointer()
@@ -1477,13 +1522,41 @@ impl Pane {
.children((!close_right).then(|| close_icon()))
.child(label)
.children(close_right.then(|| close_icon())),
- )
+ );
+
+ right_click_menu(ix).trigger(tab).menu(|cx| {
+ ContextMenu::build(cx, |menu, cx| {
+ menu.action(
+ "Close Active Item",
+ CloseActiveItem { save_intent: None }.boxed_clone(),
+ cx,
+ )
+ .action("Close Inactive Items", CloseInactiveItems.boxed_clone(), cx)
+ .action("Close Clean Items", CloseCleanItems.boxed_clone(), cx)
+ .action(
+ "Close Items To The Left",
+ CloseItemsToTheLeft.boxed_clone(),
+ cx,
+ )
+ .action(
+ "Close Items To The Right",
+ CloseItemsToTheRight.boxed_clone(),
+ cx,
+ )
+ .action(
+ "Close All Items",
+ CloseAllItems { save_intent: None }.boxed_clone(),
+ cx,
+ )
+ })
+ })
}
fn render_tab_bar(&mut self, cx: &mut ViewContext<'_, Pane>) -> impl IntoElement {
div()
.group("tab_bar")
.id("tab_bar")
+ .track_focus(&self.tab_bar_focus_handle)
.w_full()
.flex()
.bg(cx.theme().colors().tab_bar_background)
@@ -1550,20 +1623,87 @@ impl Pane {
.gap_px()
.child(
div()
+ .bg(gpui::blue())
.border()
.border_color(gpui::red())
- .child(IconButton::new("plus", Icon::Plus)),
+ .child(IconButton::new("plus", Icon::Plus).on_click(
+ cx.listener(|this, _, cx| {
+ let menu = ContextMenu::build(cx, |menu, cx| {
+ menu.action("New File", NewFile.boxed_clone(), cx)
+ .action(
+ "New Terminal",
+ NewCenterTerminal.boxed_clone(),
+ cx,
+ )
+ .action(
+ "New Search",
+ NewSearch.boxed_clone(),
+ cx,
+ )
+ });
+ cx.subscribe(
+ &menu,
+ |this, _, event: &DismissEvent, cx| {
+ this.focus(cx);
+ this.new_item_menu = None;
+ },
+ )
+ .detach();
+ this.new_item_menu = Some(menu);
+ }),
+ ))
+ .when_some(self.new_item_menu.as_ref(), |el, new_item_menu| {
+ el.child(Self::render_menu_overlay(new_item_menu))
+ }),
)
.child(
div()
.border()
.border_color(gpui::red())
- .child(IconButton::new("split", Icon::Split)),
+ .child(IconButton::new("split", Icon::Split).on_click(
+ cx.listener(|this, _, cx| {
+ let menu = ContextMenu::build(cx, |menu, cx| {
+ menu.action(
+ "Split Right",
+ SplitRight.boxed_clone(),
+ cx,
+ )
+ .action("Split Left", SplitLeft.boxed_clone(), cx)
+ .action("Split Up", SplitUp.boxed_clone(), cx)
+ .action("Split Down", SplitDown.boxed_clone(), cx)
+ });
+ cx.subscribe(
+ &menu,
+ |this, _, event: &DismissEvent, cx| {
+ this.focus(cx);
+ this.split_item_menu = None;
+ },
+ )
+ .detach();
+ this.split_item_menu = Some(menu);
+ }),
+ ))
+ .when_some(
+ self.split_item_menu.as_ref(),
+ |el, split_item_menu| {
+ el.child(Self::render_menu_overlay(split_item_menu))
+ },
+ ),
),
),
)
}
+ fn render_menu_overlay(menu: &View<ContextMenu>) -> Div {
+ div()
+ .absolute()
+ .z_index(1)
+ .bottom_0()
+ .right_0()
+ .size_0()
+ .child(overlay().anchor(AnchorCorner::TopRight).child(menu.clone()))
+ }
+
// fn render_tabs(&mut self, cx: &mut ViewContext<Self>) -> impl Element<Self> {
// let theme = theme::current(cx).clone();
@@ -1962,9 +2102,23 @@ impl Render for Pane {
type Element = Focusable<Div>;
fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
+ let this = cx.view().downgrade();
+
v_stack()
.key_context("Pane")
.track_focus(&self.focus_handle)
+ .on_focus_in({
+ let this = this.clone();
+ move |event, cx| {
+ this.update(cx, |this, cx| this.focus_in(cx)).ok();
+ }
+ })
+ .on_focus_out({
+ let this = this.clone();
+ move |event, cx| {
+ this.update(cx, |this, cx| this.focus_out(cx)).ok();
+ }
+ })
.on_action(cx.listener(|pane, _: &SplitLeft, cx| pane.split(SplitDirection::Left, cx)))
.on_action(cx.listener(|pane, _: &SplitUp, cx| pane.split(SplitDirection::Up, cx)))
.on_action(
@@ -1973,25 +2127,53 @@ impl Render for Pane {
.on_action(cx.listener(|pane, _: &SplitDown, cx| pane.split(SplitDirection::Down, cx)))
.on_action(cx.listener(|pane, _: &GoBack, cx| pane.navigate_backward(cx)))
.on_action(cx.listener(|pane, _: &GoForward, cx| pane.navigate_forward(cx)))
- // cx.add_action(Pane::toggle_zoom);
- // cx.add_action(|pane: &mut Pane, action: &ActivateItem, cx| {
- // pane.activate_item(action.0, true, true, cx);
- // });
- // cx.add_action(|pane: &mut Pane, _: &ActivateLastItem, cx| {
- // pane.activate_item(pane.items.len() - 1, true, true, cx);
- // });
- // cx.add_action(|pane: &mut Pane, _: &ActivatePrevItem, cx| {
- // pane.activate_prev_item(true, cx);
- // });
- // cx.add_action(|pane: &mut Pane, _: &ActivateNextItem, cx| {
- // pane.activate_next_item(true, cx);
- // });
- // cx.add_async_action(Pane::close_active_item);
- // cx.add_async_action(Pane::close_inactive_items);
- // cx.add_async_action(Pane::close_clean_items);
- // cx.add_async_action(Pane::close_items_to_the_left);
- // cx.add_async_action(Pane::close_items_to_the_right);
- // cx.add_async_action(Pane::close_all_items);
+ .on_action(cx.listener(Pane::toggle_zoom))
+ .on_action(cx.listener(|pane: &mut Pane, action: &ActivateItem, cx| {
+ pane.activate_item(action.0, true, true, cx);
+ }))
+ .on_action(cx.listener(|pane: &mut Pane, _: &ActivateLastItem, cx| {
+ pane.activate_item(pane.items.len() - 1, true, true, cx);
+ }))
+ .on_action(cx.listener(|pane: &mut Pane, _: &ActivatePrevItem, cx| {
+ pane.activate_prev_item(true, cx);
+ }))
+ .on_action(cx.listener(|pane: &mut Pane, _: &ActivateNextItem, cx| {
+ pane.activate_next_item(true, cx);
+ }))
+ .on_action(
+ cx.listener(|pane: &mut Self, action: &CloseActiveItem, cx| {
+ pane.close_active_item(action, cx)
+ .map(|task| task.detach_and_log_err(cx));
+ }),
+ )
+ .on_action(
+ cx.listener(|pane: &mut Self, action: &CloseInactiveItems, cx| {
+ pane.close_inactive_items(action, cx)
+ .map(|task| task.detach_and_log_err(cx));
+ }),
+ )
+ .on_action(
+ cx.listener(|pane: &mut Self, action: &CloseCleanItems, cx| {
+ pane.close_clean_items(action, cx)
+ .map(|task| task.detach_and_log_err(cx));
+ }),
+ )
+ .on_action(
+ cx.listener(|pane: &mut Self, action: &CloseItemsToTheLeft, cx| {
+ pane.close_items_to_the_left(action, cx)
+ .map(|task| task.detach_and_log_err(cx));
+ }),
+ )
+ .on_action(
+ cx.listener(|pane: &mut Self, action: &CloseItemsToTheRight, cx| {
+ pane.close_items_to_the_right(action, cx)
+ .map(|task| task.detach_and_log_err(cx));
+ }),
+ )
+ .on_action(cx.listener(|pane: &mut Self, action: &CloseAllItems, cx| {
+ pane.close_all_items(action, cx)
+ .map(|task| task.detach_and_log_err(cx));
+ }))
.size_full()
.on_action(
cx.listener(|pane: &mut Self, action: &CloseActiveItem, cx| {
@@ -1,5618 +0,0 @@
-#![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,aa
-};
-use log::LevelFilter;a
-use simplelog::SimpleLogger;
-use themes::{rose_pine, ThemeColors};
-use view::view;a
-mod adapter {
- use crate::element::AnyElement;
- use crate::element::{LayoutContext, PaintContext};
- use gpui::{geometry::rect::RectF, LayoutEngine};aaaa
- use util::ResultExt;
- pub struct Adapter<V>(pub(crate) AnyElement<V>);
- impl<V: 'static> gpui::Element<V> for Adapter<V> {aa
- type LayoutState = Option<LayaoutEngine>;
- type PaintState = ();
- fn layout(
- &mut self,
- constraint: gpui::SizeConstraint,
- view: &mut V,
- cx: &mut LayoutContext<V>,aa
- ) -> (gpui::geometry::vector::Vector2F, Self::LayoutState) {
- cx.push_layout_engine(LayoutEngine::new());
- let node = self.0.layout(view, cx).log_err();a
- 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 {a
- if !layout_engine.is_some() {
- ::core::panicking::panic("assertion failed: layout_engine.is_some()")
- }
- }
- (constraint.max, layout_engine)a
- }
- fn paint(a
- &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>,aaa
- ) -> 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 gpui_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 gpui_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 gpui_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"));
- }))
-}