Skip to main content

cbf_chrome/data/
drag.rs

1//! Chrome-specific drag-and-drop operation flags and data, with conversions to/from `cbf` equivalents.
2
3use std::collections::BTreeMap;
4
5use super::ids::TabId;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8pub struct ChromeDragOperations(u32);
9
10impl ChromeDragOperations {
11    pub const NONE: Self = Self(0);
12    pub const COPY: Self = Self(1 << 0);
13    pub const LINK: Self = Self(1 << 1);
14    pub const MOVE: Self = Self(1 << 2);
15
16    pub const fn from_bits(bits: u32) -> Self {
17        Self(bits)
18    }
19
20    pub const fn bits(self) -> u32 {
21        self.0
22    }
23}
24
25impl From<ChromeDragOperations> for cbf::data::drag::DragOperations {
26    fn from(value: ChromeDragOperations) -> Self {
27        Self::from_bits(value.bits())
28    }
29}
30
31impl From<cbf::data::drag::DragOperations> for ChromeDragOperations {
32    fn from(value: cbf::data::drag::DragOperations) -> Self {
33        Self::from_bits(value.bits())
34    }
35}
36
37#[derive(Debug, Clone, PartialEq, Eq)]
38pub struct ChromeDragUrlInfo {
39    pub url: String,
40    pub title: String,
41}
42
43impl From<ChromeDragUrlInfo> for cbf::data::drag::DragUrlInfo {
44    fn from(value: ChromeDragUrlInfo) -> Self {
45        Self {
46            url: value.url,
47            title: value.title,
48        }
49    }
50}
51
52impl From<cbf::data::drag::DragUrlInfo> for ChromeDragUrlInfo {
53    fn from(value: cbf::data::drag::DragUrlInfo) -> Self {
54        Self {
55            url: value.url,
56            title: value.title,
57        }
58    }
59}
60
61#[derive(Debug, Clone, PartialEq, Eq)]
62pub struct ChromeDragData {
63    pub text: String,
64    pub html: String,
65    pub html_base_url: String,
66    pub url_infos: Vec<ChromeDragUrlInfo>,
67    pub filenames: Vec<String>,
68    pub file_mime_types: Vec<String>,
69    pub custom_data: BTreeMap<String, String>,
70}
71
72impl From<ChromeDragData> for cbf::data::drag::DragData {
73    fn from(value: ChromeDragData) -> Self {
74        Self {
75            text: value.text,
76            html: value.html,
77            html_base_url: value.html_base_url,
78            url_infos: value.url_infos.into_iter().map(Into::into).collect(),
79            filenames: value.filenames,
80            file_mime_types: value.file_mime_types,
81            custom_data: value.custom_data,
82        }
83    }
84}
85
86impl From<cbf::data::drag::DragData> for ChromeDragData {
87    fn from(value: cbf::data::drag::DragData) -> Self {
88        Self {
89            text: value.text,
90            html: value.html,
91            html_base_url: value.html_base_url,
92            url_infos: value.url_infos.into_iter().map(Into::into).collect(),
93            filenames: value.filenames,
94            file_mime_types: value.file_mime_types,
95            custom_data: value.custom_data,
96        }
97    }
98}
99
100#[derive(Debug, Clone, PartialEq)]
101pub struct ChromeDragImage {
102    pub png_bytes: Vec<u8>,
103    pub pixel_width: u32,
104    pub pixel_height: u32,
105    pub scale: f32,
106    pub cursor_offset_x: i32,
107    pub cursor_offset_y: i32,
108}
109
110impl From<ChromeDragImage> for cbf::data::drag::DragImage {
111    fn from(value: ChromeDragImage) -> Self {
112        Self {
113            png_bytes: value.png_bytes,
114            pixel_width: value.pixel_width,
115            pixel_height: value.pixel_height,
116            scale: value.scale,
117            cursor_offset_x: value.cursor_offset_x,
118            cursor_offset_y: value.cursor_offset_y,
119        }
120    }
121}
122
123impl From<cbf::data::drag::DragImage> for ChromeDragImage {
124    fn from(value: cbf::data::drag::DragImage) -> Self {
125        Self {
126            png_bytes: value.png_bytes,
127            pixel_width: value.pixel_width,
128            pixel_height: value.pixel_height,
129            scale: value.scale,
130            cursor_offset_x: value.cursor_offset_x,
131            cursor_offset_y: value.cursor_offset_y,
132        }
133    }
134}
135
136#[derive(Debug, Clone, PartialEq)]
137pub struct ChromeDragStartRequest {
138    pub session_id: u64,
139    pub browsing_context_id: TabId,
140    pub allowed_operations: ChromeDragOperations,
141    pub source_origin: String,
142    pub data: ChromeDragData,
143    pub image: Option<ChromeDragImage>,
144}
145
146impl From<ChromeDragStartRequest> for cbf::data::drag::DragStartRequest {
147    fn from(value: ChromeDragStartRequest) -> Self {
148        Self {
149            session_id: value.session_id,
150            browsing_context_id: value.browsing_context_id.into(),
151            allowed_operations: value.allowed_operations.into(),
152            source_origin: value.source_origin,
153            data: value.data.into(),
154            image: value.image.map(Into::into),
155        }
156    }
157}
158
159#[derive(Debug, Clone, PartialEq)]
160pub struct ChromeDragUpdate {
161    pub session_id: u64,
162    pub browsing_context_id: TabId,
163    pub allowed_operations: ChromeDragOperations,
164    pub modifiers: u32,
165    pub position_in_widget_x: f32,
166    pub position_in_widget_y: f32,
167    pub position_in_screen_x: f32,
168    pub position_in_screen_y: f32,
169}
170
171impl From<ChromeDragUpdate> for cbf::data::drag::DragUpdate {
172    fn from(value: ChromeDragUpdate) -> Self {
173        Self {
174            session_id: value.session_id,
175            browsing_context_id: value.browsing_context_id.into(),
176            allowed_operations: value.allowed_operations.into(),
177            modifiers: value.modifiers,
178            position_in_widget_x: value.position_in_widget_x,
179            position_in_widget_y: value.position_in_widget_y,
180            position_in_screen_x: value.position_in_screen_x,
181            position_in_screen_y: value.position_in_screen_y,
182        }
183    }
184}
185
186impl From<cbf::data::drag::DragUpdate> for ChromeDragUpdate {
187    fn from(value: cbf::data::drag::DragUpdate) -> Self {
188        Self {
189            session_id: value.session_id,
190            browsing_context_id: value.browsing_context_id.into(),
191            allowed_operations: value.allowed_operations.into(),
192            modifiers: value.modifiers,
193            position_in_widget_x: value.position_in_widget_x,
194            position_in_widget_y: value.position_in_widget_y,
195            position_in_screen_x: value.position_in_screen_x,
196            position_in_screen_y: value.position_in_screen_y,
197        }
198    }
199}
200
201#[derive(Debug, Clone, PartialEq)]
202pub struct ChromeDragDrop {
203    pub session_id: u64,
204    pub browsing_context_id: TabId,
205    pub modifiers: u32,
206    pub position_in_widget_x: f32,
207    pub position_in_widget_y: f32,
208    pub position_in_screen_x: f32,
209    pub position_in_screen_y: f32,
210}
211
212impl From<ChromeDragDrop> for cbf::data::drag::DragDrop {
213    fn from(value: ChromeDragDrop) -> Self {
214        Self {
215            session_id: value.session_id,
216            browsing_context_id: value.browsing_context_id.into(),
217            modifiers: value.modifiers,
218            position_in_widget_x: value.position_in_widget_x,
219            position_in_widget_y: value.position_in_widget_y,
220            position_in_screen_x: value.position_in_screen_x,
221            position_in_screen_y: value.position_in_screen_y,
222        }
223    }
224}
225
226impl From<cbf::data::drag::DragDrop> for ChromeDragDrop {
227    fn from(value: cbf::data::drag::DragDrop) -> Self {
228        Self {
229            session_id: value.session_id,
230            browsing_context_id: value.browsing_context_id.into(),
231            modifiers: value.modifiers,
232            position_in_widget_x: value.position_in_widget_x,
233            position_in_widget_y: value.position_in_widget_y,
234            position_in_screen_x: value.position_in_screen_x,
235            position_in_screen_y: value.position_in_screen_y,
236        }
237    }
238}