1use crate::re::GPtr::GPtr;
2use crate::re::UIMessage::UIMessage;
3use crate::re::UserEvents::INPUT_CONTEXT_ID;
4use crate::re::offsets_rtti::RTTI_IMenu;
5use crate::re::offsets_vtable::VTABLE_IMenu;
6use crate::re::{CallbackProcessor, FxDelegate, GFxMovieView};
7use crate::rel::id::VariantID;
8use core::ffi::c_void;
9
10#[repr(C)]
11#[derive(Debug)]
12pub struct IMenu {
13 pub vtable: *const IMenuVtbl, pub refCount: core::sync::atomic::AtomicU32, pad0C: u16, pub uiMovie: GPtr<GFxMovieView>, pub depthPriority: i8, pad19: u8, pad20: u16, pub menuFlags: UI_MENU_FLAGS, pub inputContext: INPUT_CONTEXT_ID, pad24: u32, pub fxDelegate: GPtr<FxDelegate>, }
27const _: () = assert!(core::mem::size_of::<IMenu>() == 0x30);
28
29impl IMenu {
30 pub const RTTI: VariantID = RTTI_IMenu;
32
33 pub const VTABLE: [VariantID; 1] = VTABLE_IMenu;
35
36 #[inline]
38 pub const fn advances_under_pause_menu(&self) -> bool {
39 self.menuFlags.contains(UI_MENU_FLAGS::AdvancesUnderPauseMenu)
40 }
41
42 #[inline]
44 pub const fn allow_saving(&self) -> bool {
45 self.menuFlags.contains(UI_MENU_FLAGS::AllowSaving)
46 }
47
48 #[inline]
50 pub const fn always_open(&self) -> bool {
51 self.menuFlags.contains(UI_MENU_FLAGS::AlwaysOpen)
52 }
53
54 #[inline]
56 pub const fn application_menu(&self) -> bool {
57 self.menuFlags.contains(UI_MENU_FLAGS::ApplicationMenu)
58 }
59
60 #[inline]
62 pub const fn assign_cursor_to_renderer(&self) -> bool {
63 self.menuFlags.contains(UI_MENU_FLAGS::AssignCursorToRenderer)
64 }
65
66 #[inline]
68 pub const fn custom_rendering(&self) -> bool {
69 self.menuFlags.contains(UI_MENU_FLAGS::CustomRendering)
70 }
71
72 #[inline]
74 pub const fn companion_app_allowed(&self) -> bool {
75 self.menuFlags.contains(UI_MENU_FLAGS::CompanionAppAllowed)
76 }
77
78 #[inline]
80 pub const fn disable_pause_menu(&self) -> bool {
81 self.menuFlags.contains(UI_MENU_FLAGS::DisablePauseMenu)
82 }
83
84 #[inline]
86 pub const fn dont_hide_cursor_when_topmost(&self) -> bool {
87 self.menuFlags.contains(UI_MENU_FLAGS::DontHideCursorWhenTopmost)
88 }
89
90 #[inline]
92 pub const fn freeze_frame_background(&self) -> bool {
93 self.menuFlags.contains(UI_MENU_FLAGS::FreezeFrameBackground)
94 }
95
96 #[inline]
98 pub const fn freeze_frame_pause(&self) -> bool {
99 self.menuFlags.contains(UI_MENU_FLAGS::FreezeFramePause)
100 }
101
102 #[inline]
104 pub const fn has_button_bar(&self) -> bool {
105 self.menuFlags.contains(UI_MENU_FLAGS::HasButtonBar)
106 }
107
108 #[inline]
110 pub const fn inventory_item_menu(&self) -> bool {
111 self.menuFlags.contains(UI_MENU_FLAGS::InventoryItemMenu)
112 }
113
114 #[inline]
116 pub const fn is_top_button_bar(&self) -> bool {
117 self.menuFlags.contains(UI_MENU_FLAGS::IsTopButtonBar)
118 }
119
120 #[inline]
122 pub const fn large_scaleform_render_cache_mode(&self) -> bool {
123 self.menuFlags.contains(UI_MENU_FLAGS::LargeScaleformRenderCacheMode)
124 }
125
126 #[inline]
128 pub const fn modal(&self) -> bool {
129 self.menuFlags.contains(UI_MENU_FLAGS::Modal)
130 }
131
132 #[inline]
134 pub const fn on_stack(&self) -> bool {
135 self.menuFlags.contains(UI_MENU_FLAGS::OnStack)
136 }
137
138 #[inline]
140 pub const fn pauses_game(&self) -> bool {
141 self.menuFlags.contains(UI_MENU_FLAGS::PausesGame)
142 }
143
144 #[inline]
146 pub const fn renders_offscreen_targets(&self) -> bool {
147 self.menuFlags.contains(UI_MENU_FLAGS::RendersOffscreenTargets)
148 }
149
150 #[inline]
152 pub const fn renders_under_pause_menu(&self) -> bool {
153 self.menuFlags.contains(UI_MENU_FLAGS::RendersUnderPauseMenu)
154 }
155
156 #[inline]
158 pub const fn requires_update(&self) -> bool {
159 self.menuFlags.contains(UI_MENU_FLAGS::RequiresUpdate)
160 }
161
162 #[inline]
164 pub const fn skip_render_during_freeze_frame_screenshot(&self) -> bool {
165 self.menuFlags.contains(UI_MENU_FLAGS::SkipRenderDuringFreezeFrameScreenshot)
166 }
167
168 #[inline]
170 pub const fn topmost_rendered_menu(&self) -> bool {
171 self.menuFlags.contains(UI_MENU_FLAGS::TopmostRenderedMenu)
172 }
173
174 #[inline]
176 pub const fn update_uses_cursor(&self) -> bool {
177 self.menuFlags.contains(UI_MENU_FLAGS::UpdateUsesCursor)
178 }
179
180 #[inline]
182 pub const fn uses_blurred_background(&self) -> bool {
183 self.menuFlags.contains(UI_MENU_FLAGS::UsesBlurredBackground)
184 }
185
186 #[inline]
188 pub const fn uses_cursor(&self) -> bool {
189 self.menuFlags.contains(UI_MENU_FLAGS::UsesCursor)
190 }
191
192 #[inline]
194 pub const fn uses_menu_context(&self) -> bool {
195 self.menuFlags.contains(UI_MENU_FLAGS::UsesMenuContext)
196 }
197
198 #[inline]
200 pub const fn uses_movement_to_direction(&self) -> bool {
201 self.menuFlags.contains(UI_MENU_FLAGS::UsesMovementToDirection)
202 }
203}
204
205pub struct IMenuVtbl {
206 pub CxxDrop: unsafe extern "C" fn(this: *mut IMenu),
208 pub Accept: fn(this: *mut IMenu, processor: *mut CallbackProcessor), pub PostCreate: fn(this: *mut IMenu), pub Unk_03: fn(this: *mut IMenu, c_void), pub ProcessMessage: fn(this: *mut IMenu, message: &UIMessage) -> UI_MESSAGE_RESULTS, pub AdvanceMovie: fn(this: *mut IMenu, interval: f32, currentTime: u32), pub PostDisplay: fn(this: *mut IMenu), pub PreDisplay: fn(this: *mut IMenu), pub RefreshPlatform: fn(this: *mut IMenu), pub Unk_09: fn(this: *mut IMenu, unk: UI_MENU_Unk09), pub Unk_0A: fn(this: *mut IMenu), }
226
227impl crate::re::GPtr::RefCounted for IMenu {
228 fn add_ref(&mut self) {
229 self.refCount.fetch_add(1, core::sync::atomic::Ordering::Acquire);
230 }
231 fn release(&mut self) {
232 self.refCount.fetch_sub(1, core::sync::atomic::Ordering::Release);
233 }
234}
235
236#[commonlibsse_ng_derive_internal::to_bitflags]
237#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
238#[repr(u32)]
239pub enum UI_MENU_FLAGS {
240 None = 0,
241 PausesGame = 1 << 0,
242 AlwaysOpen = 1 << 1,
243 UsesCursor = 1 << 2,
244 UsesMenuContext = 1 << 3,
245 Modal = 1 << 4, FreezeFrameBackground = 1 << 5,
247 OnStack = 1 << 6,
248 DisablePauseMenu = 1 << 7,
249 RequiresUpdate = 1 << 8,
250 TopmostRenderedMenu = 1 << 9,
251 UpdateUsesCursor = 1 << 10,
252 AllowSaving = 1 << 11,
253 RendersOffscreenTargets = 1 << 12,
254 InventoryItemMenu = 1 << 13,
255 DontHideCursorWhenTopmost = 1 << 14,
256 CustomRendering = 1 << 15,
257 AssignCursorToRenderer = 1 << 16,
258 ApplicationMenu = 1 << 17,
259 HasButtonBar = 1 << 18,
260 IsTopButtonBar = 1 << 19,
261 AdvancesUnderPauseMenu = 1 << 20,
262 RendersUnderPauseMenu = 1 << 21,
263 UsesBlurredBackground = 1 << 22,
264 CompanionAppAllowed = 1 << 23,
265 FreezeFramePause = 1 << 24,
266 SkipRenderDuringFreezeFrameScreenshot = 1 << 25,
267 LargeScaleformRenderCacheMode = 1 << 26,
268 UsesMovementToDirection = 1 << 27,
269}
270
271#[commonlibsse_ng_derive_internal::ffi_enum]
272#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
273#[repr(u32)]
274pub enum UI_MESSAGE_RESULTS {
275 Handled = 0,
276 Ignore = 1,
277 PassOn = 2,
278}
279
280#[commonlibsse_ng_derive_internal::ffi_enum]
282#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
283#[repr(u32)]
284#[non_exhaustive]
285pub enum UI_MENU_Unk09 {
286 None = u32::MAX,
287}