gpui_component/setting/fields/
element.rs1use gpui::{AnyElement, App, IntoElement, StyleRefinement, Window};
2use std::rc::Rc;
3
4use crate::setting::{fields::SettingFieldRender, AnySettingField, RenderOptions};
5
6pub 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}