vb6parse/language/controls/
image.rs

1use crate::language::controls::{
2    Appearance, BorderStyle, DragMode, MousePointer, OLEDragMode, OLEDropMode,
3};
4
5use crate::parsers::Properties;
6
7use bstr::BString;
8use image::DynamicImage;
9use serde::Serialize;
10
11/// Properties for a `Image` control.
12///
13/// This is used as an enum variant of
14/// [`VB6ControlKind::Image`](crate::language::controls::VB6ControlKind::Image).
15/// tag, name, and index are not included in this struct, but instead are part
16/// of the parent [`VB6Control`](crate::language::controls::VB6Control) struct.
17#[derive(Debug, PartialEq, Clone)]
18pub struct ImageProperties {
19    pub appearance: Appearance,
20    pub border_style: BorderStyle,
21    pub data_field: BString,
22    pub data_format: BString,
23    pub data_member: BString,
24    pub data_source: BString,
25    pub drag_icon: Option<DynamicImage>,
26    pub drag_mode: DragMode,
27    pub enabled: bool,
28    pub height: i32,
29    pub left: i32,
30    pub mouse_icon: Option<DynamicImage>,
31    pub mouse_pointer: MousePointer,
32    pub ole_drag_mode: OLEDragMode,
33    pub ole_drop_mode: OLEDropMode,
34    pub picture: Option<DynamicImage>,
35    pub stretch: bool,
36    pub tool_tip_text: BString,
37    pub top: i32,
38    pub visible: bool,
39    pub whats_this_help_id: i32,
40    pub width: i32,
41}
42
43impl Default for ImageProperties {
44    fn default() -> Self {
45        ImageProperties {
46            appearance: Appearance::ThreeD,
47            border_style: BorderStyle::None,
48            data_field: "".into(),
49            data_format: "".into(),
50            data_member: "".into(),
51            data_source: "".into(),
52            drag_icon: None,
53            drag_mode: DragMode::Manual,
54            enabled: true,
55            height: 975,
56            left: 1080,
57            mouse_icon: None,
58            mouse_pointer: MousePointer::Default,
59            ole_drag_mode: OLEDragMode::Manual,
60            ole_drop_mode: OLEDropMode::default(),
61            picture: None,
62            stretch: false,
63            tool_tip_text: "".into(),
64            top: 960,
65            visible: true,
66            whats_this_help_id: 0,
67            width: 615,
68        }
69    }
70}
71
72impl Serialize for ImageProperties {
73    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
74    where
75        S: serde::Serializer,
76    {
77        use serde::ser::SerializeStruct;
78
79        let mut s = serializer.serialize_struct("ImageProperties", 21)?;
80        s.serialize_field("appearance", &self.appearance)?;
81        s.serialize_field("border_style", &self.border_style)?;
82        s.serialize_field("data_field", &self.data_field)?;
83        s.serialize_field("data_format", &self.data_format)?;
84        s.serialize_field("data_member", &self.data_member)?;
85        s.serialize_field("data_source", &self.data_source)?;
86
87        let option_text = self.drag_icon.as_ref().map(|_| "Some(DynamicImage)");
88
89        s.serialize_field("drag_icon", &option_text)?;
90        s.serialize_field("drag_mode", &self.drag_mode)?;
91        s.serialize_field("enabled", &self.enabled)?;
92        s.serialize_field("height", &self.height)?;
93        s.serialize_field("left", &self.left)?;
94
95        let option_text = self.mouse_icon.as_ref().map(|_| "Some(DynamicImage)");
96
97        s.serialize_field("mouse_icon", &option_text)?;
98        s.serialize_field("mouse_pointer", &self.mouse_pointer)?;
99        s.serialize_field("ole_drag_mode", &self.ole_drag_mode)?;
100        s.serialize_field("ole_drop_mode", &self.ole_drop_mode)?;
101
102        let option_text = self.picture.as_ref().map(|_| "Some(DynamicImage)");
103
104        s.serialize_field("picture", &option_text)?;
105        s.serialize_field("stretch", &self.stretch)?;
106        s.serialize_field("tool_tip_text", &self.tool_tip_text)?;
107        s.serialize_field("top", &self.top)?;
108        s.serialize_field("visible", &self.visible)?;
109        s.serialize_field("whats_this_help_id", &self.whats_this_help_id)?;
110        s.serialize_field("width", &self.width)?;
111
112        s.end()
113    }
114}
115
116impl<'a> From<Properties<'a>> for ImageProperties {
117    fn from(prop: Properties<'a>) -> Self {
118        let mut image_prop = ImageProperties::default();
119
120        image_prop.appearance = prop.get_property(b"Appearance".into(), image_prop.appearance);
121        image_prop.border_style = prop.get_property(b"BorderStyle".into(), image_prop.border_style);
122        image_prop.data_field = match prop.get(b"DataField".into()) {
123            Some(data_field) => data_field.into(),
124            None => image_prop.data_field,
125        };
126        image_prop.data_format = match prop.get(b"DataFormat".into()) {
127            Some(data_format) => data_format.into(),
128            None => image_prop.data_format,
129        };
130        image_prop.data_member = match prop.get(b"DataMember".into()) {
131            Some(data_member) => data_member.into(),
132            None => image_prop.data_member,
133        };
134        image_prop.data_source = match prop.get(b"DataSource".into()) {
135            Some(data_source) => data_source.into(),
136            None => image_prop.data_source,
137        };
138
139        // DragIcon
140
141        image_prop.drag_mode = prop.get_property(b"DragMode".into(), image_prop.drag_mode);
142        image_prop.enabled = prop.get_bool(b"Enabled".into(), image_prop.enabled);
143        image_prop.height = prop.get_i32(b"Height".into(), image_prop.height);
144        image_prop.left = prop.get_i32(b"Left".into(), image_prop.left);
145
146        // MouseIcon
147
148        image_prop.mouse_pointer =
149            prop.get_property(b"MousePointer".into(), image_prop.mouse_pointer);
150        image_prop.ole_drag_mode =
151            prop.get_property(b"OLEDragMode".into(), image_prop.ole_drag_mode);
152        image_prop.ole_drop_mode =
153            prop.get_property(b"OLEDropMode".into(), image_prop.ole_drop_mode);
154
155        // Picture
156
157        image_prop.stretch = prop.get_bool(b"Stretch".into(), image_prop.stretch);
158        image_prop.tool_tip_text = match prop.get("ToolTipText".into()) {
159            Some(tool_tip_text) => tool_tip_text.into(),
160            None => "".into(),
161        };
162        image_prop.top = prop.get_i32(b"Top".into(), image_prop.top);
163        image_prop.visible = prop.get_bool(b"Visible".into(), image_prop.visible);
164        image_prop.whats_this_help_id =
165            prop.get_i32(b"WhatsThisHelpID".into(), image_prop.whats_this_help_id);
166        image_prop.width = prop.get_i32(b"Width".into(), image_prop.width);
167
168        image_prop
169    }
170}