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