vb6parse/language/controls/
frame.rs1use 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#[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 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 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}