vb6parse/language/controls/
picturebox.rs

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/// Properties for a `PictureBox` control.
13///
14/// This is used as an enum variant of
15/// [`VB6ControlKind::PictureBox`](crate::language::controls::VB6ControlKind::PictureBox).
16/// tag, name, and index are not included in this struct, but instead are part
17/// of the parent [`VB6Control`](crate::language::controls::VB6Control) struct.
18#[derive(Debug, PartialEq, Clone)]
19pub struct PictureBoxProperties {
20    pub align: Align,
21    pub appearance: Appearance,
22    /// Determines if the output from a graphics method is to a persistent bitmap
23    /// which acts as a double buffer.
24    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        // DragIcon
238
239        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        // MouseIcon
275
276        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
285
286        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}