1// Copyright © SixtyFPS GmbH <info@slint.dev>
2// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0
3
4//! This module contains all builtin structures exposed in the .slint language.
5
6/// Call a macro with every builtin structures exposed in the .slint language
7///
8/// ## Example
9/// ```rust
10/// macro_rules! print_builtin_structs {
11/// ($(
12/// $(#[$struct_attr:meta])*
13/// struct $Name:ident {
14/// @name = $inner_name:literal
15/// export {
16/// $( $(#[$pub_attr:meta])* $pub_field:ident : $pub_type:ty, )*
17/// }
18/// private {
19/// $( $(#[$pri_attr:meta])* $pri_field:ident : $pri_type:ty, )*
20/// }
21/// }
22/// )*) => {
23/// $(println!("{} => export:[{}] private:[{}]", stringify!($Name), stringify!($($pub_field),*), stringify!($($pri_field),*));)*
24/// };
25/// }
26/// i_slint_common::for_each_builtin_structs!(print_builtin_structs);
27/// ```
28#[macro_export]
29macro_rules! for_each_builtin_structs {
30 ($macro:ident) => {
31 $macro![
32 /// The `KeyboardModifiers` struct provides booleans to indicate possible modifier keys on a keyboard, such as Shift, Control, etc.
33 /// It is provided as part of `KeyEvent`'s `modifiers` field.
34 ///
35 /// Keyboard shortcuts on Apple platforms typically use the Command key (⌘), such as Command+C for "Copy". On other platforms
36 /// the same shortcut is typically represented using Control+C. To make it easier to develop cross-platform applications, on macOS,
37 /// Slint maps the Command key to the control modifier, and the Control key to the meta modifier.
38 ///
39 /// On Windows, the Windows key is mapped to the meta modifier.
40 #[derive(Copy, Eq)]
41 struct KeyboardModifiers {
42 @name = "slint::private_api::KeyboardModifiers"
43 export {
44 /// Indicates the Alt key on a keyboard.
45 alt: bool,
46 /// Indicates the Control key on a keyboard, except on macOS, where it is the Command key (⌘).
47 control: bool,
48 /// Indicates the Shift key on a keyboard.
49 shift: bool,
50 /// Indicates the Control key on macos, and the Windows key on Windows.
51 meta: bool,
52 }
53 private {
54 }
55 }
56
57 /// Represents a Pointer event sent by the windowing system.
58 /// This structure is passed to the `pointer-event` callback of the `TouchArea` element.
59 struct PointerEvent {
60 @name = "slint::private_api::PointerEvent"
61 export {
62 /// The button that was pressed or released
63 button: PointerEventButton,
64 /// The kind of the event
65 kind: PointerEventKind,
66 /// The keyboard modifiers pressed during the event
67 modifiers: KeyboardModifiers,
68 }
69 private {
70 }
71 }
72
73 /// Represents a Pointer scroll (or wheel) event sent by the windowing system.
74 /// This structure is passed to the `scroll-event` callback of the `TouchArea` element.
75 struct PointerScrollEvent {
76 @name = "slint::private_api::PointerScrollEvent"
77 export {
78 /// The amount of pixel in the horizontal direction
79 delta_x: Coord,
80 /// The amount of pixel in the vertical direction
81 delta_y: Coord,
82 /// The keyboard modifiers pressed during the event
83 modifiers: KeyboardModifiers,
84 }
85 private {
86 }
87 }
88
89 /// This structure is generated and passed to the key press and release callbacks of the `FocusScope` element.
90 struct KeyEvent {
91 @name = "slint::private_api::KeyEvent"
92 export {
93 /// The unicode representation of the key pressed.
94 text: SharedString,
95 /// The keyboard modifiers active at the time of the key press event.
96 modifiers: KeyboardModifiers,
97 /// This field is set to true for key press events that are repeated,
98 /// i.e. the key is held down. It's always false for key release events.
99 repeat: bool,
100 }
101 private {
102 /// Indicates whether the key was pressed or released
103 event_type: KeyEventType,
104 /// If the event type is KeyEventType::UpdateComposition or KeyEventType::CommitComposition,
105 /// then this field specifies what part of the current text to replace.
106 /// Relative to the offset of the pre-edit text within the text input element's text.
107 replacement_range: Option<core::ops::Range<i32>>,
108 /// If the event type is KeyEventType::UpdateComposition, this is the new pre-edit text
109 preedit_text: SharedString,
110 /// The selection within the preedit_text
111 preedit_selection: Option<core::ops::Range<i32>>,
112 /// The new cursor position, when None, the cursor is put after the text that was just inserted
113 cursor_position: Option<i32>,
114 anchor_position: Option<i32>,
115 }
116 }
117
118 /// Represents an item in a StandardListView and a StandardTableView.
119 #[non_exhaustive]
120 struct StandardListViewItem {
121 @name = "slint::StandardListViewItem"
122 export {
123 /// The text content of the item
124 text: SharedString,
125 }
126 private {
127 }
128 }
129
130 /// This is used to define the column and the column header of a TableView
131 #[non_exhaustive]
132 struct TableColumn {
133 @name = "slint::private_api::TableColumn"
134 export {
135 /// The title of the column header
136 title: SharedString,
137 /// The minimum column width (logical length)
138 min_width: Coord,
139 /// The horizontal column stretch
140 horizontal_stretch: f32,
141 /// Sorts the column
142 sort_order: SortOrder,
143 /// the actual width of the column (logical length)
144 width: Coord,
145 }
146 private {
147 }
148 }
149
150 /// Value of the state property
151 /// A state is just the current state, but also has information about the previous state and the moment it changed
152 struct StateInfo {
153 @name = "slint::private_api::StateInfo"
154 export {
155 /// The current state value
156 current_state: i32,
157 /// The previous state
158 previous_state: i32,
159 }
160 private {
161 /// The instant in which the state changed last
162 change_time: crate::animations::Instant,
163 }
164 }
165
166 /// A structure to hold metrics of a font for a specified pixel size.
167 struct FontMetrics {
168 @name = "slint::private_api::FontMetrics"
169 export {
170 /// The distance between the baseline and the top of the tallest glyph in the font.
171 ascent: Coord,
172 /// The distance between the baseline and the bottom of the tallest glyph in the font.
173 /// This is usually negative.
174 descent: Coord,
175 /// The distance between the baseline and the horizontal midpoint of the tallest glyph in the font,
176 /// or zero if not specified by the font.
177 x_height: Coord,
178 /// The distance between the baseline and the top of a regular upper-case glyph in the font,
179 /// or zero if not specified by the font.
180 cap_height: Coord,
181 }
182 private {
183 }
184 }
185
186 /// An item in the menu of a menu bar or context menu
187 struct MenuEntry {
188 @name = "slint::private_api::MenuEntry"
189 export {
190 /// The text of the menu entry
191 title: SharedString,
192 // /// the icon associated with the menu entry
193 // icon: Image,
194 /// an opaque id that can be used to identify the menu entry
195 id: SharedString,
196 // keyboard_shortcut: KeySequence,
197 /// whether the menu entry is enabled
198 enabled: bool,
199 /// Sub menu
200 has_sub_menu: bool,
201 /// The menu entry is a separator
202 is_separator: bool,
203 }
204 private {}
205 }
206 ];
207 };
208}
209