ferroui_controls/markup_types/
contracts.rs1use crate::chrome::IWindowDrawnDecorationsTemplate;
10use crate::primitives::IPopupHost;
11use crate::selection::ISelectionModel;
12use crate::templates::{
13 IControlTemplate, IDataTemplate, IRecyclingDataTemplate, ITemplateOf, ITreeDataTemplate, ITypedDataTemplate,
14};
15use crate::documents::Inline;
16use crate::{Control, Panel};
17use ferroui_base::data::core::ValueTypes;
18use ferroui_base::ferro_markup_type;
19use ferroui_base::metadata::{IAddChild, MarkupType, MarkupTyped};
20use ferroui_base::styling::ITemplate;
21use ferroui_base::{BoxedValue, Ref};
22use std::rc::Rc;
23
24#[doc(hidden)]
31pub struct AddChildOf<T>(std::marker::PhantomData<T>);
32
33ferro_markup_type!(interface AddChildOf<Ref<Control>> as "IAddChild`1" {
34 namespace: "FerroUI.Metadata",
35 handles: [Rc<dyn IAddChild<Ref<Control>>>, Option<Rc<dyn IAddChild<Ref<Control>>>>],
36 this: Rc<dyn IAddChild<Ref<Control>>>,
37 generic: "IAddChild`1" [Ref<Control>],
38 methods: [
39 fn AddChild(Ref<Control>) => |this: &Rc<dyn IAddChild<Ref<Control>>>, child: Ref<Control>| this.add_child(child),
40 ],
41});
42
43ferro_markup_type!(interface AddChildOf<Ref<Inline>> as "IAddChild`1" {
44 namespace: "FerroUI.Metadata",
45 handles: [Rc<dyn IAddChild<Ref<Inline>>>, Option<Rc<dyn IAddChild<Ref<Inline>>>>],
46 this: Rc<dyn IAddChild<Ref<Inline>>>,
47 generic: "IAddChild`1" [Ref<Inline>],
48 methods: [
49 fn AddChild(Ref<Inline>) => |this: &Rc<dyn IAddChild<Ref<Inline>>>, child: Ref<Inline>| this.add_child(child),
50 ],
51});
52
53ferro_markup_type!(interface dyn IDataTemplate as "IDataTemplate" {
56 namespace: "FerroUI.Controls.Templates",
57 handles: [Rc<dyn IDataTemplate>, Option<Rc<dyn IDataTemplate>>],
58});
59
60ferro_markup_type!(interface dyn ITreeDataTemplate as "ITreeDataTemplate" {
61 namespace: "FerroUI.Controls.Templates",
62 handles: [Rc<dyn ITreeDataTemplate>, Option<Rc<dyn ITreeDataTemplate>>],
63 interfaces: [Rc<dyn IDataTemplate>],
64});
65
66ferro_markup_type!(interface dyn IRecyclingDataTemplate as "IRecyclingDataTemplate" {
67 namespace: "FerroUI.Controls.Templates",
68 handles: [Rc<dyn IRecyclingDataTemplate>, Option<Rc<dyn IRecyclingDataTemplate>>],
69 interfaces: [Rc<dyn IDataTemplate>],
70});
71
72ferro_markup_type!(interface dyn ITypedDataTemplate as "ITypedDataTemplate" {
75 namespace: "FerroUI.Controls.Templates",
76 handles: [Rc<dyn ITypedDataTemplate>, Option<Rc<dyn ITypedDataTemplate>>],
77 interfaces: [Rc<dyn IDataTemplate>],
78});
79
80ferro_markup_type!(interface dyn IControlTemplate as "IControlTemplate" {
81 namespace: "FerroUI.Controls.Templates",
82 handles: [Rc<dyn IControlTemplate>, Option<Rc<dyn IControlTemplate>>],
83 attributes: [ControlTemplateScope],
84});
85
86ferro_markup_type!(interface dyn ITemplateOf<Option<Ref<Control>>> as "ITemplate`1" {
89 namespace: "FerroUI.Controls",
90 handles: [Rc<dyn ITemplateOf<Option<Ref<Control>>>>, Option<Rc<dyn ITemplateOf<Option<Ref<Control>>>>>],
91 interfaces: [Rc<dyn ITemplate>],
92 generic: "ITemplate`1" [Option<Ref<Control>>],
93});
94
95ferro_markup_type!(interface dyn ITemplateOf<Ref<Control>> as "ITemplate`1" {
96 namespace: "FerroUI.Controls",
97 handles: [Rc<dyn ITemplateOf<Ref<Control>>>, Option<Rc<dyn ITemplateOf<Ref<Control>>>>],
98 interfaces: [Rc<dyn ITemplate>],
99 generic: "ITemplate`1" [Ref<Control>],
100});
101
102ferro_markup_type!(interface dyn ITemplateOf<Option<Ref<Panel>>> as "ITemplate`1" {
103 namespace: "FerroUI.Controls",
104 handles: [Rc<dyn ITemplateOf<Option<Ref<Panel>>>>, Option<Rc<dyn ITemplateOf<Option<Ref<Panel>>>>>],
105 interfaces: [Rc<dyn ITemplate>],
106 generic: "ITemplate`1" [Option<Ref<Panel>>],
107});
108
109ferro_markup_type!(interface dyn IWindowDrawnDecorationsTemplate as "IWindowDrawnDecorationsTemplate" {
112 namespace: "FerroUI.Controls.Chrome",
113 handles: [Rc<dyn IWindowDrawnDecorationsTemplate>, Option<Rc<dyn IWindowDrawnDecorationsTemplate>>],
114 attributes: [ControlTemplateScope],
115});
116
117ferro_markup_type!(interface dyn ISelectionModel as "ISelectionModel" {
120 namespace: "FerroUI.Controls.Selection",
121 handles: [Rc<dyn ISelectionModel>, Option<Rc<dyn ISelectionModel>>],
122});
123
124ferro_markup_type!(interface dyn IPopupHost as "IPopupHost" {
127 namespace: "FerroUI.Controls.Primitives",
128 handles: [Rc<dyn IPopupHost>, Option<Rc<dyn IPopupHost>>],
129});
130
131ferro_markup_type!(interface crate::ItemsSource as "IList" {
141 namespace: "System.Collections",
142 handles: [crate::ItemsSource, Option<crate::ItemsSource>],
143 this: crate::ItemsSource,
144 properties: [
145 Count: i32 { try_get: items_source_count },
146 ],
147 indexers: [
148 (i32) -> Option<BoxedValue> { try_get: items_source_item },
149 ],
150});
151
152fn items_source_count(source: &crate::ItemsSource) -> Result<i32, &'static str> {
154 i32::try_from(source.count()).map_err(|_| "The number of items exceeds the range of Int32.")
155}
156
157fn items_source_item(source: &crate::ItemsSource, index: i32) -> Result<Option<BoxedValue>, &'static str> {
160 match usize::try_from(index) {
161 Ok(index) if index < source.count() => Ok(source.get_at(index)),
162 _ => Err("Index was out of range. Must be non-negative and less than the size of the collection."),
163 }
164}
165
166ferro_markup_type!(interface dyn crate::notifications::INotification as "INotification" {
169 namespace: "FerroUI.Controls.Notifications",
170 handles: [
171 Rc<dyn crate::notifications::INotification>,
172 Option<Rc<dyn crate::notifications::INotification>>
173 ],
174 this: Rc<dyn crate::notifications::INotification>,
175 properties: [
176 Title: Option<String> { get: |n: &Rc<dyn crate::notifications::INotification>| n.title() },
177 Message: Option<String> { get: |n: &Rc<dyn crate::notifications::INotification>| n.message() },
178 Type: crate::notifications::NotificationType { get: |n: &Rc<dyn crate::notifications::INotification>| n.type_() },
179 ],
180});
181
182pub(super) const TYPES: &[&MarkupType] = &[
183 <dyn crate::notifications::INotification as MarkupTyped>::MARKUP,
184 <AddChildOf<Ref<Control>> as MarkupTyped>::MARKUP,
185 <AddChildOf<Ref<Inline>> as MarkupTyped>::MARKUP,
186 <dyn IDataTemplate as MarkupTyped>::MARKUP,
187 <dyn ITreeDataTemplate as MarkupTyped>::MARKUP,
188 <dyn IRecyclingDataTemplate as MarkupTyped>::MARKUP,
189 <dyn ITypedDataTemplate as MarkupTyped>::MARKUP,
190 <dyn IControlTemplate as MarkupTyped>::MARKUP,
191 <dyn ITemplateOf<Option<Ref<Control>>> as MarkupTyped>::MARKUP,
192 <dyn ITemplateOf<Ref<Control>> as MarkupTyped>::MARKUP,
193 <dyn ITemplateOf<Option<Ref<Panel>>> as MarkupTyped>::MARKUP,
194 <dyn IWindowDrawnDecorationsTemplate as MarkupTyped>::MARKUP,
195 <dyn ISelectionModel as MarkupTyped>::MARKUP,
196 <dyn IPopupHost as MarkupTyped>::MARKUP,
197 <crate::ItemsSource as MarkupTyped>::MARKUP,
198];
199
200pub(super) fn register_value_types() {
203 ValueTypes::register_nullable::<Rc<dyn crate::notifications::INotification>>();
204 ValueTypes::register_nullable::<Rc<dyn IAddChild<Ref<Control>>>>();
205 ValueTypes::register_nullable::<Rc<dyn IAddChild<Ref<Inline>>>>();
206 ValueTypes::register_nullable::<Rc<dyn IDataTemplate>>();
207 ValueTypes::register_nullable::<Rc<dyn IControlTemplate>>();
208 ValueTypes::register_nullable::<Rc<dyn ITemplateOf<Option<Ref<Control>>>>>();
209 ValueTypes::register_nullable::<Rc<dyn ITemplateOf<Ref<Control>>>>();
210 ValueTypes::register_nullable::<Rc<dyn ITemplateOf<Option<Ref<Panel>>>>>();
211 ValueTypes::register_nullable::<Rc<dyn IWindowDrawnDecorationsTemplate>>();
212 ValueTypes::register_nullable::<Rc<dyn ISelectionModel>>();
213 ValueTypes::register_nullable::<Rc<dyn IPopupHost>>();
214 ValueTypes::register_nullable::<Rc<dyn ITreeDataTemplate>>();
216 ValueTypes::register_nullable::<Rc<dyn IRecyclingDataTemplate>>();
217 ValueTypes::register_nullable::<Rc<dyn ITypedDataTemplate>>();
218 ValueTypes::register_cast::<Rc<dyn ITreeDataTemplate>, Rc<dyn IDataTemplate>>(|t| t.clone());
219 ValueTypes::register_cast::<Rc<dyn IRecyclingDataTemplate>, Rc<dyn IDataTemplate>>(|t| t.clone());
220 ValueTypes::register_cast::<Rc<dyn ITypedDataTemplate>, Rc<dyn IDataTemplate>>(|t| t.clone());
221 ValueTypes::register_cast::<Rc<dyn ITemplateOf<Option<Ref<Control>>>>, Rc<dyn ITemplate>>(|t| t.clone());
223 ValueTypes::register_cast::<Rc<dyn ITemplateOf<Ref<Control>>>, Rc<dyn ITemplate>>(|t| t.clone());
224 ValueTypes::register_cast::<Rc<dyn ITemplateOf<Option<Ref<Panel>>>>, Rc<dyn ITemplate>>(|t| t.clone());
225}