use gpui::{
AnyElement, App, Bounds, Corners, Element, GlobalElementId, InspectorElementId, IntoElement,
LayoutId, Pixels, Window, px,
};
use bezel_theme::Theme;
pub const MENU_BLUR: f32 = 44.0;
pub fn material(corner_radius: f32, blur_radius: f32, child: impl IntoElement) -> Material {
Material {
corner_radius,
blur_radius,
child: child.into_any_element(),
}
}
pub struct Material {
corner_radius: f32,
blur_radius: f32,
child: AnyElement,
}
impl Element for Material {
type RequestLayoutState = ();
type PrepaintState = ();
fn id(&self) -> Option<gpui::ElementId> {
None
}
fn source_location(&self) -> Option<&'static core::panic::Location<'static>> {
None
}
fn request_layout(
&mut self,
_id: Option<&GlobalElementId>,
_inspector_id: Option<&InspectorElementId>,
window: &mut Window,
cx: &mut App,
) -> (LayoutId, ()) {
(self.child.request_layout(window, cx), ())
}
fn prepaint(
&mut self,
_id: Option<&GlobalElementId>,
_inspector_id: Option<&InspectorElementId>,
_bounds: Bounds<Pixels>,
_request_layout: &mut Self::RequestLayoutState,
window: &mut Window,
cx: &mut App,
) {
self.child.prepaint(window, cx);
}
fn paint(
&mut self,
_id: Option<&GlobalElementId>,
_inspector_id: Option<&InspectorElementId>,
bounds: Bounds<Pixels>,
_request_layout: &mut Self::RequestLayoutState,
_prepaint: &mut Self::PrepaintState,
window: &mut Window,
cx: &mut App,
) {
if Theme::of(cx).is_glass() {
window.paint_layer(bounds, |window| {
window.paint_backdrop_blur(
bounds,
Corners::all(px(self.corner_radius)),
px(self.blur_radius),
);
self.child.paint(window, cx);
});
} else {
self.child.paint(window, cx);
}
}
}
impl IntoElement for Material {
type Element = Self;
fn into_element(self) -> Self::Element {
self
}
}
pub fn layered(child: impl IntoElement) -> Layered {
Layered {
child: child.into_any_element(),
}
}
pub struct Layered {
child: AnyElement,
}
impl Element for Layered {
type RequestLayoutState = ();
type PrepaintState = ();
fn id(&self) -> Option<gpui::ElementId> {
None
}
fn source_location(&self) -> Option<&'static core::panic::Location<'static>> {
None
}
fn request_layout(
&mut self,
_id: Option<&GlobalElementId>,
_inspector_id: Option<&InspectorElementId>,
window: &mut Window,
cx: &mut App,
) -> (LayoutId, ()) {
(self.child.request_layout(window, cx), ())
}
fn prepaint(
&mut self,
_id: Option<&GlobalElementId>,
_inspector_id: Option<&InspectorElementId>,
_bounds: Bounds<Pixels>,
_request_layout: &mut Self::RequestLayoutState,
window: &mut Window,
cx: &mut App,
) {
self.child.prepaint(window, cx);
}
fn paint(
&mut self,
_id: Option<&GlobalElementId>,
_inspector_id: Option<&InspectorElementId>,
bounds: Bounds<Pixels>,
_request_layout: &mut Self::RequestLayoutState,
_prepaint: &mut Self::PrepaintState,
window: &mut Window,
cx: &mut App,
) {
window.paint_layer(bounds, |window| self.child.paint(window, cx));
}
}
impl IntoElement for Layered {
type Element = Self;
fn into_element(self) -> Self::Element {
self
}
}