DVUI

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);
    }
}