vb6parse/language/controls/
frame.rs

1use crate::language::color::VB6Color;
2use crate::language::controls::{
3    Appearance, BorderStyle, ClipControls, DragMode, MousePointer, OLEDropMode,
4};
5use crate::parsers::Properties;
6
7use bstr::BString;
8use image::DynamicImage;
9use serde::Serialize;
10
11/// Properties for a `Frame` control.
12///
13/// This is used as an enum variant of
14/// [`VB6ControlKind::Frame`](crate::language::controls::VB6ControlKind::Frame).
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 FrameProperties {
19    pub appearance: Appearance,
20    pub back_color: VB6Color,
21    pub border_style: BorderStyle,
22    pub caption: BString,
23    pub clip_controls: ClipControls,
24    pub drag_icon: Option<DynamicImage>,
25    pub drag_mode: DragMode,
26    pub enabled: bool,
27    pub fore_color: VB6Color,
28    pub height: i32,
29    pub help_context_id: i32,
30    pub left: i32,
31    pub mouse_icon: Option<DynamicImage>,
32    pub mouse_pointer: MousePointer,
33    pub ole_drop_mode: OLEDropMode,
34    pub right_to_left: bool,
35    pub tab_index: i32,
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 FrameProperties {
44    fn default() -> Self {
45        FrameProperties {
46            appearance: Appearance::ThreeD,
47            back_color: VB6Color::from_hex("&H8000000F&").unwrap(),
48            border_style: BorderStyle::FixedSingle,
49            caption: BString::from("Frame1"),
50            clip_controls: ClipControls::True,
51            drag_icon: None,
52            drag_mode: DragMode::Manual,
53            enabled: true,
54            fore_color: VB6Color::from_hex("&H80000012&").unwrap(),
55            height: 30,
56            help_context_id: 0,
57            left: 30,
58            mouse_icon: None,
59            mouse_pointer: MousePointer::Default,
60            ole_drop_mode: OLEDropMode::default(),
61            right_to_left: false,
62            tab_index: 0,
63            tool_tip_text: BString::from(""),
64            top: 30,
65            visible: true,
66            whats_this_help_id: 0,
67            width: 100,
68        }
69    }
70}
71
72impl Serialize for FrameProperties {
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("FrameProperties", 20)?;
80
81        s.serialize_field("appearance", &self.appearance)?;
82        s.serialize_field("back_color", &self.back_color)?;
83        s.serialize_field("border_style", &self.border_style)?;
84        s.serialize_field("caption", &self.caption)?;
85        s.serialize_field("clip_controls", &self.clip_controls)?;
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("fore_color", &self.fore_color)?;
93        s.serialize_field("height", &self.height)?;
94        s.serialize_field("help_context_id", &self.help_context_id)?;
95        s.serialize_field("left", &self.left)?;
96
97        let option_text = self.mouse_icon.as_ref().map(|_| "Some(DynamicImage)");
98
99        s.serialize_field("mouse_icon", &option_text)?;
100        s.serialize_field("mouse_pointer", &self.mouse_pointer)?;
101        s.serialize_field("ole_drop_mode", &self.ole_drop_mode)?;
102        s.serialize_field("right_to_left", &self.right_to_left)?;
103        s.serialize_field("tab_index", &self.tab_index)?;
104        s.serialize_field("tool_tip_text", &self.tool_tip_text)?;
105        s.serialize_field("top", &self.top)?;
106        s.serialize_field("visible", &self.visible)?;
107        s.serialize_field("whats_this_help_id", &self.whats_this_help_id)?;
108        s.serialize_field("width", &self.width)?;
109
110        s.end()
111    }
112}
113
114impl<'a> From<Properties<'a>> for FrameProperties {
115    fn from(prop: Properties<'a>) -> Self {
116        let mut frame_prop = FrameProperties::default();
117
118        frame_prop.appearance = prop.get_property(b"Appearance".into(), frame_prop.appearance);
119        frame_prop.back_color = prop.get_color(b"BackColor".into(), frame_prop.back_color);
120        frame_prop.border_style = prop.get_property(b"BorderStyle".into(), frame_prop.border_style);
121        frame_prop.caption = match prop.get(b"Caption".into()) {
122            Some(caption) => caption.into(),
123            None => frame_prop.caption,
124        };
125        frame_prop.clip_controls =
126            prop.get_property(b"ClipControls".into(), frame_prop.clip_controls);
127
128        // drag_icon
129
130        frame_prop.drag_mode = prop.get_property(b"DragMode".into(), frame_prop.drag_mode);
131        frame_prop.enabled = prop.get_bool(b"Enabled".into(), frame_prop.enabled);
132        frame_prop.fore_color = prop.get_color(b"ForeColor".into(), frame_prop.fore_color);
133        frame_prop.height = prop.get_i32(b"Height".into(), frame_prop.height);
134        frame_prop.help_context_id =
135            prop.get_i32(b"HelpContextID".into(), frame_prop.help_context_id);
136        frame_prop.left = prop.get_i32(b"Left".into(), frame_prop.left);
137
138        // Implement mouse_icon
139
140        frame_prop.mouse_pointer =
141            prop.get_property(b"MousePointer".into(), frame_prop.mouse_pointer);
142        frame_prop.ole_drop_mode =
143            prop.get_property(b"OLEDropMode".into(), frame_prop.ole_drop_mode);
144        frame_prop.right_to_left = prop.get_bool(b"RightToLeft".into(), frame_prop.right_to_left);
145        frame_prop.tab_index = prop.get_i32(b"TabIndex".into(), frame_prop.tab_index);
146        frame_prop.tool_tip_text = match prop.get("ToolTipText".into()) {
147            Some(tool_tip_text) => tool_tip_text.into(),
148            None => frame_prop.tool_tip_text,
149        };
150        frame_prop.top = prop.get_i32(b"Top".into(), frame_prop.top);
151        frame_prop.visible = prop.get_bool(b"Visible".into(), frame_prop.visible);
152        frame_prop.whats_this_help_id =
153            prop.get_i32(b"WhatsThisHelp".into(), frame_prop.whats_this_help_id);
154        frame_prop.width = prop.get_i32(b"Width".into(), frame_prop.width);
155
156        frame_prop
157    }
158}