init
It's expected to call this when self is undefined
Parameters
- self:*MenuWidget
- *MenuWidget
- src:std.builtin.SourceLocation
- std.builtin.SourceLocation
- init_opts:InitOptions
- InitOptions
- opts:Options
- Options
Source
Implementation
pub fn init(self: *MenuWidget, src: std.builtin.SourceLocation, init_opts: InitOptions, opts: Options) void {
self.* = MenuWidget{
.wd = WidgetData.init(src, .{}, defaults.override(opts)),
.init_opts = init_opts,
.winId = dvui.subwindowCurrentId(),
.last_focus = dvui.lastFocusedIdInFrame(),
};
if (dvui.dataGet(null, self.wd.id, "_sub_act", bool)) |a| {
self.submenus_activated = a;
}
self.focused_menuItem = dvui.dataGet(null, self.wd.id, "_has_focused_menuItem", bool) orelse false;
// keep this alive if it was set in MenuItemWidget
_ = dvui.dataGet(null, self.wd.id, "_submenus_activating", void);
if (dvui.dataGet(null, self.wd.id, "_mouse_mode", bool)) |mouse_mode| self.mouse_mode = mouse_mode;
dvui.parentSet(self.widget());
self.parentMenu = menuSet(self);
self.data().register();
self.data().borderAndBackground(.{});
const evts = dvui.events();
for (evts) |*e| {
if (e.evt == .key) {
self.mouse_mode = false;
} else if (e.evt == .mouse and e.evt.mouse.action != .position) {
self.mouse_mode = true;
}
if (!dvui.eventMatchSimple(e, self.data()))
continue;
self.processEvent(e);
}
self.group.init(@src(), .{ .nav_key_dir = self.init_opts.dir }, .{});
// a floating menu could have been opened by mouse, but then a key is
// pressed, so focus the group which will focus the first thing in the menu
if (self.floating() and dvui.focusedWidgetIdInCurrentSubwindow() == null) {
dvui.focusWidget(self.group.data().id, null, null);
}
self.box.init(@src(), .{ .dir = self.init_opts.dir }, self.data().options.strip().override(.{ .expand = .both }));
self.box.drawBackground();
if (self.data().accesskit_node()) |ak_node| {
AccessKit.nodeAddAction(ak_node, AccessKit.Action.focus);
AccessKit.nodeAddAction(ak_node, AccessKit.Action.click);
}
}