gpui_component/setting/fields/
element.rs

1use gpui::{AnyElement, App, IntoElement, StyleRefinement, Window};
2use std::rc::Rc;
3
4use crate::setting::{fields::SettingFieldRender, AnySettingField, RenderOptions};
5
6/// A trait for rendering custom setting field elements.
7///
8/// For [`crate::setting::SettingField::element`] method.
9pub trait SettingFieldElement {
10    type Element: IntoElement + 'static;
11
12    fn render_field(
13        &self,
14        options: &RenderOptions,
15        window: &mut Window,
16        cx: &mut App,
17    ) -> Self::Element;
18}
19
20impl<F, E> SettingFieldElement for F
21where
22    E: IntoElement + 'static,
23    F: Fn(&RenderOptions, &mut Window, &mut App) -> E,
24{
25    type Element = E;
26
27    fn render_field(
28        &self,
29        options: &RenderOptions,
30        window: &mut Window,
31        cx: &mut App,
32    ) -> Self::Element {
33        (self)(options, window, cx)
34    }
35}
36
37pub(crate) struct AnySettingFieldElement<T>(pub(crate) T);
38impl<T> SettingFieldElement for AnySettingFieldElement<T>
39where
40    T: SettingFieldElement,
41{
42    type Element = AnyElement;
43
44    fn render_field(
45        &self,
46        options: &RenderOptions,
47        window: &mut Window,
48        cx: &mut App,
49    ) -> Self::Element {
50        self.0.render_field(options, window, cx).into_any_element()
51    }
52}
53impl SettingFieldElement for Rc<dyn SettingFieldElement<Element = AnyElement>> {
54    type Element = AnyElement;
55
56    fn render_field(
57        &self,
58        options: &RenderOptions,
59        window: &mut Window,
60        cx: &mut App,
61    ) -> Self::Element {
62        self.as_ref().render_field(options, window, cx)
63    }
64}
65
66pub(crate) struct ElementField {
67    element_render: Rc<dyn SettingFieldElement<Element = AnyElement>>,
68}
69
70impl ElementField {
71    pub(crate) fn new<E>(element_render: E) -> Self
72    where
73        E: SettingFieldElement<Element = AnyElement> + 'static,
74    {
75        Self {
76            element_render: Rc::new(element_render),
77        }
78    }
79}
80
81impl SettingFieldRender for ElementField {
82    fn render(
83        &self,
84        _: Rc<dyn AnySettingField>,
85        options: &RenderOptions,
86        _style: &StyleRefinement,
87        window: &mut Window,
88        cx: &mut App,
89    ) -> AnyElement {
90        (self.element_render).render_field(options, window, cx)
91    }
92}