Skip to main content

cbf_chrome/data/
choice_menu.rs

1//! Chrome/Blink-shaped choice menu payload for host-owned `<select>` popups.
2
3use cbf_chrome_sys::ffi::{
4    CBF_CHOICE_MENU_ITEM_CHECKABLE_OPTION, CBF_CHOICE_MENU_ITEM_GROUP, CBF_CHOICE_MENU_ITEM_OPTION,
5    CBF_CHOICE_MENU_ITEM_SEPARATOR, CBF_CHOICE_MENU_ITEM_SUB_MENU,
6    CBF_CHOICE_MENU_TEXT_DIRECTION_LEFT_TO_RIGHT, CBF_CHOICE_MENU_TEXT_DIRECTION_RIGHT_TO_LEFT,
7};
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub enum ChromeChoiceMenuItemType {
11    Option,
12    CheckableOption,
13    Group,
14    Separator,
15    SubMenu,
16}
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq)]
19pub enum ChromeChoiceMenuTextDirection {
20    LeftToRight,
21    RightToLeft,
22}
23
24#[derive(Debug, Clone, Copy, PartialEq, Eq)]
25pub enum ChromeChoiceMenuSelectionMode {
26    Single,
27    Multiple,
28}
29
30#[derive(Debug, Clone, PartialEq, Eq)]
31pub struct ChromeChoiceMenuItem {
32    pub item_type: ChromeChoiceMenuItemType,
33    pub label: Option<String>,
34    pub tool_tip: Option<String>,
35    pub action: u32,
36    pub text_direction: ChromeChoiceMenuTextDirection,
37    pub has_text_direction_override: bool,
38    pub enabled: bool,
39    pub checked: bool,
40    pub children: Vec<ChromeChoiceMenuItem>,
41}
42
43#[derive(Debug, Clone, PartialEq)]
44pub struct ChromeChoiceMenu {
45    pub request_id: u64,
46    pub x: i32,
47    pub y: i32,
48    pub width: i32,
49    pub height: i32,
50    pub item_font_size: f64,
51    pub selected_item: i32,
52    pub right_aligned: bool,
53    pub selection_mode: ChromeChoiceMenuSelectionMode,
54    pub items: Vec<ChromeChoiceMenuItem>,
55}
56
57#[derive(Debug, Clone, PartialEq, Eq)]
58pub struct ChromeChoiceMenuResponse {
59    pub request_id: u64,
60    pub indices: Vec<i32>,
61}
62
63pub(crate) fn choice_menu_item_type_from_ffi(value: u8) -> ChromeChoiceMenuItemType {
64    match value {
65        CBF_CHOICE_MENU_ITEM_OPTION => ChromeChoiceMenuItemType::Option,
66        CBF_CHOICE_MENU_ITEM_CHECKABLE_OPTION => ChromeChoiceMenuItemType::CheckableOption,
67        CBF_CHOICE_MENU_ITEM_GROUP => ChromeChoiceMenuItemType::Group,
68        CBF_CHOICE_MENU_ITEM_SEPARATOR => ChromeChoiceMenuItemType::Separator,
69        CBF_CHOICE_MENU_ITEM_SUB_MENU => ChromeChoiceMenuItemType::SubMenu,
70        _ => ChromeChoiceMenuItemType::Option,
71    }
72}
73
74pub(crate) fn choice_menu_text_direction_from_ffi(value: u8) -> ChromeChoiceMenuTextDirection {
75    match value {
76        CBF_CHOICE_MENU_TEXT_DIRECTION_RIGHT_TO_LEFT => ChromeChoiceMenuTextDirection::RightToLeft,
77        CBF_CHOICE_MENU_TEXT_DIRECTION_LEFT_TO_RIGHT => ChromeChoiceMenuTextDirection::LeftToRight,
78        _ => ChromeChoiceMenuTextDirection::LeftToRight,
79    }
80}