1use crate::language::controls::{
2 Align, Appearance, BorderStyle, ClipControls, DragMode, DrawMode, DrawStyle, FillStyle,
3 LinkMode, MousePointer, OLEDragMode, OLEDropMode, ScaleMode,
4};
5use crate::parsers::Properties;
6use crate::VB6Color;
7
8use bstr::BString;
9use image::DynamicImage;
10use serde::Serialize;
11
12#[derive(Debug, PartialEq, Clone)]
19pub struct PictureBoxProperties {
20 pub align: Align,
21 pub appearance: Appearance,
22 pub auto_redraw: bool,
25 pub auto_size: bool,
26 pub back_color: VB6Color,
27 pub border_style: BorderStyle,
28 pub causes_validation: bool,
29 pub clip_controls: ClipControls,
30 pub data_field: BString,
31 pub data_format: BString,
32 pub data_member: BString,
33 pub data_source: BString,
34 pub drag_icon: Option<DynamicImage>,
35 pub drag_mode: DragMode,
36 pub draw_mode: DrawMode,
37 pub draw_style: DrawStyle,
38 pub draw_width: i32,
39 pub enabled: bool,
40 pub fill_color: VB6Color,
41 pub fill_style: FillStyle,
42 pub font_transparent: bool,
43 pub fore_color: VB6Color,
44 pub has_dc: bool,
45 pub height: i32,
46 pub help_context_id: i32,
47 pub left: i32,
48 pub link_item: BString,
49 pub link_mode: LinkMode,
50 pub link_timeout: i32,
51 pub link_topic: BString,
52 pub mouse_icon: Option<DynamicImage>,
53 pub mouse_pointer: MousePointer,
54 pub negotiate: bool,
55 pub ole_drag_mode: OLEDragMode,
56 pub ole_drop_mode: OLEDropMode,
57 pub picture: Option<DynamicImage>,
58 pub right_to_left: bool,
59 pub scale_height: i32,
60 pub scale_left: i32,
61 pub scale_mode: ScaleMode,
62 pub scale_top: i32,
63 pub scale_width: i32,
64 pub tab_index: i32,
65 pub tab_stop: bool,
66 pub tool_tip_text: BString,
67 pub top: i32,
68 pub visible: bool,
69 pub whats_this_help_id: i32,
70 pub width: i32,
71}
72
73impl Default for PictureBoxProperties {
74 fn default() -> Self {
75 PictureBoxProperties {
76 align: Align::None,
77 appearance: Appearance::ThreeD,
78 auto_redraw: false,
79 auto_size: false,
80 back_color: VB6Color::from_hex("&H8000000F&").unwrap(),
81 border_style: BorderStyle::FixedSingle,
82 causes_validation: true,
83 clip_controls: ClipControls::default(),
84 data_field: "".into(),
85 data_format: "".into(),
86 data_member: "".into(),
87 data_source: "".into(),
88 drag_icon: None,
89 drag_mode: DragMode::Manual,
90 draw_mode: DrawMode::CopyPen,
91 draw_style: DrawStyle::Solid,
92 draw_width: 1,
93 enabled: true,
94 fill_color: VB6Color::from_hex("&H00000000&").unwrap(),
95 fill_style: FillStyle::Transparent,
96 font_transparent: true,
97 fore_color: VB6Color::from_hex("&H80000012&").unwrap(),
98 has_dc: true,
99 height: 30,
100 help_context_id: 0,
101 left: 30,
102 link_item: "".into(),
103 link_mode: LinkMode::None,
104 link_timeout: 50,
105 link_topic: "".into(),
106 mouse_icon: None,
107 mouse_pointer: MousePointer::Default,
108 negotiate: false,
109 ole_drag_mode: OLEDragMode::Manual,
110 ole_drop_mode: OLEDropMode::default(),
111 picture: None,
112 right_to_left: false,
113 scale_height: 100,
114 scale_left: 0,
115 scale_mode: ScaleMode::Twip,
116 scale_top: 0,
117 scale_width: 100,
118 tab_index: 0,
119 tab_stop: true,
120 tool_tip_text: "".into(),
121 top: 30,
122 visible: true,
123 whats_this_help_id: 0,
124 width: 100,
125 }
126 }
127}
128
129impl Serialize for PictureBoxProperties {
130 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
131 where
132 S: serde::Serializer,
133 {
134 use serde::ser::SerializeStruct;
135
136 let mut s = serializer.serialize_struct("PictureBoxProperties", 39)?;
137 s.serialize_field("align", &self.align)?;
138 s.serialize_field("appearance", &self.appearance)?;
139 s.serialize_field("auto_redraw", &self.auto_redraw)?;
140 s.serialize_field("auto_size", &self.auto_size)?;
141 s.serialize_field("back_color", &self.back_color)?;
142 s.serialize_field("border_style", &self.border_style)?;
143 s.serialize_field("causes_validation", &self.causes_validation)?;
144 s.serialize_field("clip_controls", &self.clip_controls)?;
145 s.serialize_field("data_field", &self.data_field)?;
146 s.serialize_field("data_format", &self.data_format)?;
147 s.serialize_field("data_member", &self.data_member)?;
148 s.serialize_field("data_source", &self.data_source)?;
149
150 let option_text = self.drag_icon.as_ref().map(|_| "Some(DynamicImage)");
151
152 s.serialize_field("drag_icon", &option_text)?;
153 s.serialize_field("drag_mode", &self.drag_mode)?;
154 s.serialize_field("draw_mode", &self.draw_mode)?;
155 s.serialize_field("draw_style", &self.draw_style)?;
156 s.serialize_field("draw_width", &self.draw_width)?;
157 s.serialize_field("enabled", &self.enabled)?;
158 s.serialize_field("fill_color", &self.fill_color)?;
159 s.serialize_field("fill_style", &self.fill_style)?;
160 s.serialize_field("font_transparent", &self.font_transparent)?;
161 s.serialize_field("fore_color", &self.fore_color)?;
162 s.serialize_field("has_dc", &self.has_dc)?;
163 s.serialize_field("height", &self.height)?;
164 s.serialize_field("help_context_id", &self.help_context_id)?;
165 s.serialize_field("left", &self.left)?;
166 s.serialize_field("link_item", &self.link_item)?;
167 s.serialize_field("link_mode", &self.link_mode)?;
168 s.serialize_field("link_timeout", &self.link_timeout)?;
169 s.serialize_field("link_topic", &self.link_topic)?;
170
171 let option_text = self.mouse_icon.as_ref().map(|_| "Some(DynamicImage)");
172
173 s.serialize_field("mouse_icon", &option_text)?;
174 s.serialize_field("mouse_pointer", &self.mouse_pointer)?;
175 s.serialize_field("negotiate", &self.negotiate)?;
176 s.serialize_field("ole_drag_mode", &self.ole_drag_mode)?;
177 s.serialize_field("ole_drop_mode", &self.ole_drop_mode)?;
178
179 let option_text = self.picture.as_ref().map(|_| "Some(DynamicImage)");
180
181 s.serialize_field("picture", &option_text)?;
182 s.serialize_field("right_to_left", &self.right_to_left)?;
183 s.serialize_field("scale_height", &self.scale_height)?;
184 s.serialize_field("scale_left", &self.scale_left)?;
185 s.serialize_field("scale_mode", &self.scale_mode)?;
186 s.serialize_field("scale_top", &self.scale_top)?;
187 s.serialize_field("scale_width", &self.scale_width)?;
188 s.serialize_field("tab_index", &self.tab_index)?;
189 s.serialize_field("tab_stop", &self.tab_stop)?;
190 s.serialize_field("tool_tip_text", &self.tool_tip_text)?;
191 s.serialize_field("top", &self.top)?;
192 s.serialize_field("visible", &self.visible)?;
193 s.serialize_field("whats_this_help_id", &self.whats_this_help_id)?;
194 s.serialize_field("width", &self.width)?;
195
196 s.end()
197 }
198}
199
200impl<'a> From<Properties<'a>> for PictureBoxProperties {
201 fn from(prop: Properties<'a>) -> Self {
202 let mut picture_box_prop = PictureBoxProperties::default();
203
204 picture_box_prop.align = prop.get_property(b"Align".into(), picture_box_prop.align);
205 picture_box_prop.appearance =
206 prop.get_property(b"Appearance".into(), picture_box_prop.appearance);
207 picture_box_prop.auto_redraw =
208 prop.get_bool(b"AutoRedraw".into(), picture_box_prop.auto_redraw);
209 picture_box_prop.auto_size = prop.get_bool(b"AutoSize".into(), picture_box_prop.auto_size);
210 picture_box_prop.back_color =
211 prop.get_color(b"BackColor".into(), picture_box_prop.back_color);
212 picture_box_prop.border_style =
213 prop.get_property(b"BorderStyle".into(), picture_box_prop.border_style);
214 picture_box_prop.causes_validation = prop.get_bool(
215 b"CausesValidation".into(),
216 picture_box_prop.causes_validation,
217 );
218 picture_box_prop.clip_controls =
219 prop.get_property(b"ClipControls".into(), picture_box_prop.clip_controls);
220 picture_box_prop.data_field = match prop.get(b"DataField".into()) {
221 Some(data_field) => data_field.into(),
222 None => picture_box_prop.data_field,
223 };
224 picture_box_prop.data_format = match prop.get(b"DataFormat".into()) {
225 Some(data_format) => data_format.into(),
226 None => picture_box_prop.data_format,
227 };
228 picture_box_prop.data_member = match prop.get(b"DataMember".into()) {
229 Some(data_member) => data_member.into(),
230 None => picture_box_prop.data_member,
231 };
232 picture_box_prop.data_source = match prop.get(b"DataSource".into()) {
233 Some(data_source) => data_source.into(),
234 None => picture_box_prop.data_source,
235 };
236
237 picture_box_prop.drag_mode =
240 prop.get_property(b"DragMode".into(), picture_box_prop.drag_mode);
241 picture_box_prop.draw_mode =
242 prop.get_property(b"DrawMode".into(), picture_box_prop.draw_mode);
243 picture_box_prop.draw_style =
244 prop.get_property(b"DrawStyle".into(), picture_box_prop.draw_style);
245 picture_box_prop.draw_width =
246 prop.get_i32(b"DrawWidth".into(), picture_box_prop.draw_width);
247 picture_box_prop.enabled = prop.get_bool(b"Enabled".into(), picture_box_prop.enabled);
248 picture_box_prop.fill_color =
249 prop.get_color(b"FillColor".into(), picture_box_prop.fill_color);
250 picture_box_prop.fill_style =
251 prop.get_property(b"FillStyle".into(), picture_box_prop.fill_style);
252 picture_box_prop.font_transparent =
253 prop.get_bool(b"FontTransparent".into(), picture_box_prop.font_transparent);
254 picture_box_prop.fore_color =
255 prop.get_color(b"ForeColor".into(), picture_box_prop.fore_color);
256 picture_box_prop.has_dc = prop.get_bool(b"HasDC".into(), picture_box_prop.has_dc);
257 picture_box_prop.height = prop.get_i32(b"Height".into(), picture_box_prop.height);
258 picture_box_prop.help_context_id =
259 prop.get_i32(b"HelpContextID".into(), picture_box_prop.help_context_id);
260 picture_box_prop.left = prop.get_i32(b"Left".into(), picture_box_prop.left);
261 picture_box_prop.link_item = match prop.get(b"LinkItem".into()) {
262 Some(link_item) => link_item.into(),
263 None => picture_box_prop.link_item,
264 };
265 picture_box_prop.link_mode =
266 prop.get_property(b"LinkMode".into(), picture_box_prop.link_mode);
267 picture_box_prop.link_timeout =
268 prop.get_i32(b"LinkTimeout".into(), picture_box_prop.link_timeout);
269 picture_box_prop.link_topic = match prop.get(b"LinkTopic".into()) {
270 Some(link_topic) => link_topic.into(),
271 None => picture_box_prop.link_topic,
272 };
273
274 picture_box_prop.mouse_pointer =
277 prop.get_property(b"MousePointer".into(), picture_box_prop.mouse_pointer);
278 picture_box_prop.negotiate = prop.get_bool(b"Negotiate".into(), picture_box_prop.negotiate);
279 picture_box_prop.ole_drag_mode =
280 prop.get_property(b"OLEDragMode".into(), picture_box_prop.ole_drag_mode);
281 picture_box_prop.ole_drop_mode =
282 prop.get_property(b"OLEDropMode".into(), picture_box_prop.ole_drop_mode);
283
284 picture_box_prop.right_to_left =
287 prop.get_bool(b"RightToLeft".into(), picture_box_prop.right_to_left);
288 picture_box_prop.scale_height =
289 prop.get_i32(b"ScaleHeight".into(), picture_box_prop.scale_height);
290 picture_box_prop.scale_left =
291 prop.get_i32(b"ScaleLeft".into(), picture_box_prop.scale_left);
292 picture_box_prop.scale_mode =
293 prop.get_property(b"ScaleMode".into(), picture_box_prop.scale_mode);
294 picture_box_prop.scale_top = prop.get_i32(b"ScaleTop".into(), picture_box_prop.scale_top);
295 picture_box_prop.scale_width =
296 prop.get_i32(b"ScaleWidth".into(), picture_box_prop.scale_width);
297 picture_box_prop.tab_index = prop.get_i32(b"TabIndex".into(), picture_box_prop.tab_index);
298 picture_box_prop.tab_stop = prop.get_bool(b"TabStop".into(), picture_box_prop.tab_stop);
299 picture_box_prop.tool_tip_text = match prop.get(b"ToolTipText".into()) {
300 Some(tool_tip_text) => tool_tip_text.into(),
301 None => "".into(),
302 };
303 picture_box_prop.top = prop.get_i32(b"Top".into(), picture_box_prop.top);
304 picture_box_prop.visible = prop.get_bool(b"Visible".into(), picture_box_prop.visible);
305 picture_box_prop.whats_this_help_id = prop.get_i32(
306 b"WhatsThisHelpID".into(),
307 picture_box_prop.whats_this_help_id,
308 );
309 picture_box_prop.width = prop.get_i32(b"Width".into(), picture_box_prop.width);
310
311 picture_box_prop
312 }
313}