1#![warn(missing_docs)]
25
26use crate::{
27 button::{Button, ButtonMessage},
28 core::{pool::Handle, reflect::prelude::*, type_traits::prelude::*, visitor::prelude::*},
29 define_widget_deref,
30 grid::{Column, GridBuilder, Row},
31 message::{MessageData, UiMessage},
32 resources,
33 text::{Text, TextBuilder, TextMessage},
34 utils::ImageButtonBuilder,
35 widget::{Widget, WidgetBuilder},
36 BuildContext, Control, Thickness, UiNode, UserInterface, VerticalAlignment,
37};
38use fyrox_core::uuid_provider;
39use fyrox_graph::constructor::{ConstructorProvider, GraphNodeConstructor};
40
41#[derive(Debug, Clone, PartialEq, Eq)]
43pub enum UuidEditorMessage {
44 Value(Uuid),
46}
47impl MessageData for UuidEditorMessage {}
48
49#[derive(Default, Clone, Visit, Reflect, Debug, ComponentProvider)]
70#[reflect(derived_type = "UiNode")]
71pub struct UuidEditor {
72 widget: Widget,
73 value: Uuid,
74 text: Handle<Text>,
75 generate: Handle<Button>,
76}
77
78impl ConstructorProvider<UiNode, UserInterface> for UuidEditor {
79 fn constructor() -> GraphNodeConstructor<UiNode, UserInterface> {
80 GraphNodeConstructor::new::<Self>()
81 .with_variant("Uuid Editor", |ui| {
82 UuidEditorBuilder::new(WidgetBuilder::new().with_name("Uuid Editor"))
83 .build(&mut ui.build_ctx())
84 .to_base()
85 .into()
86 })
87 .with_group("Input")
88 }
89}
90
91define_widget_deref!(UuidEditor);
92
93uuid_provider!(UuidEditor = "667f7f48-2448-42da-91dd-cd743ca7117e");
94
95impl Control for UuidEditor {
96 fn handle_routed_message(&mut self, ui: &mut UserInterface, message: &mut UiMessage) {
97 self.widget.handle_routed_message(ui, message);
98
99 if let Some(UuidEditorMessage::Value(value)) = message.data_for(self.handle) {
100 if self.value != *value {
101 self.value = *value;
102 ui.try_send_response(message);
103 ui.send(self.text, TextMessage::Text(value.to_string()));
104 }
105 } else if let Some(ButtonMessage::Click) = message.data_from(self.generate) {
106 ui.send(self.handle, UuidEditorMessage::Value(Uuid::new_v4()));
107 }
108 }
109}
110
111pub struct UuidEditorBuilder {
113 widget_builder: WidgetBuilder,
114 value: Uuid,
115}
116
117impl UuidEditorBuilder {
118 pub fn new(widget_builder: WidgetBuilder) -> Self {
120 Self {
121 widget_builder,
122 value: Default::default(),
123 }
124 }
125
126 pub fn with_value(mut self, value: Uuid) -> Self {
128 self.value = value;
129 self
130 }
131
132 pub fn build(self, ctx: &mut BuildContext) -> Handle<UuidEditor> {
134 let text;
135 let generate;
136 let grid = GridBuilder::new(
137 WidgetBuilder::new()
138 .with_child({
139 text = TextBuilder::new(
140 WidgetBuilder::new()
141 .on_column(0)
142 .on_row(0)
143 .with_margin(Thickness::uniform(1.0))
144 .with_vertical_alignment(VerticalAlignment::Center),
145 )
146 .with_text(self.value.to_string())
147 .build(ctx);
148 text
149 })
150 .with_child({
151 generate = ImageButtonBuilder::default()
152 .on_column(1)
153 .on_row(0)
154 .with_size(20.0)
155 .with_image_size(14.0)
156 .with_image(resources::SHUFFLE.clone())
157 .with_tooltip("New Random UUID")
158 .build_button(ctx);
159 generate
160 }),
161 )
162 .add_row(Row::stretch())
163 .add_column(Column::stretch())
164 .add_column(Column::auto())
165 .build(ctx);
166
167 let uuid_editor = UuidEditor {
168 widget: self.widget_builder.with_child(grid).build(ctx),
169 value: self.value,
170 text,
171 generate,
172 };
173
174 ctx.add(uuid_editor)
175 }
176}
177
178#[cfg(test)]
179mod test {
180 use crate::uuid::UuidEditorBuilder;
181 use crate::{test::test_widget_deletion, widget::WidgetBuilder};
182
183 #[test]
184 fn test_deletion() {
185 test_widget_deletion(|ctx| UuidEditorBuilder::new(WidgetBuilder::new()).build(ctx));
186 }
187}