DVUI

Parameters

#
self:*FocusGroupWidget
*FocusGroupWidget
src:std.builtin.SourceLocation
std.builtin.SourceLocation
init_opts:InitOptions
InitOptions
opts:Options
Options

Source

Implementation

#
pub fn init(self: *FocusGroupWidget, src: std.builtin.SourceLocation, init_opts: InitOptions, opts: Options) void {
    const id = dvui.parentGet().extendId(src, opts.idExtra());
    const rect: Rect = dvui.dataGet(null, id, "_rect", Rect) orelse .{};
    const defaults = Options{ .name = "Focus Group", .rect = rect, .expand = if (rect.empty()) .both else .none };
    self.* = .{
        .init_opts = init_opts,
        .wd = WidgetData.init(src, .{}, defaults.override(opts)),
        .last_focus = dvui.lastFocusedIdInFrame(),
        .tab_index_prev = dvui.dataGetSlice(null, id, "_tab_prev", []dvui.TabIndex) orelse &.{},
        .remember_focus = dvui.dataGet(null, id, "_remember_focus", dvui.Id) orelse null,
        .tab_index_group = dvui.TabIndexGroup.current,
    };
    dvui.parentSet(self.widget());
    self.data().register();

    // only register ourselves if there is no focus group already registered
    const cw = dvui.currentWindow();
    if (cw.subwindows.get(dvui.subwindowCurrentId())) |sw| {
        if (sw.focus_group == null) {

            // put ourselves in the tab index so the whole focus group can be focused by tab
            // but only if we contain focusable widgets
            if (self.tab_index_prev.len > 0)
                dvui.tabIndexSet(self.data().id, self.data().options.tab_index, self.data().rectScale().r);

            if (self.data().id == dvui.focusedWidgetId()) {
                // if we got focused, focus our remembered focus or first id
                if (self.remember_focus) |focused_id| {
                    dvui.focusWidget(focused_id, null, null);
                } else {
                    self.focusNext(null);
                }
            }

            sw.focus_group = self;
            //std.debug.print("subwindow {x} focus group {x}\n", .{ sw.id.asU64(), self.data().id.asU64() });
        }
    }
}