DVUI

boolFieldWidgetOptional

Parameters

#
src:std.builtin.SourceLocation
std.builtin.SourceLocation
field_name:[]const u8
[]const u8
field_value_optional_ptr:anytype
anytype
opt:BoolFieldOptions
BoolFieldOptions
alignment:*dvui.Alignment
*dvui.Alignment

Source

Implementation

#
pub fn boolFieldWidgetOptional(
    src: std.builtin.SourceLocation,
    field_name: []const u8,
    field_value_optional_ptr: anytype,
    opt: BoolFieldOptions,
    alignment: *dvui.Alignment,
) void {
    const type_info = @typeInfo(@TypeOf(field_value_optional_ptr));
    if (type_info != .pointer or @typeInfo(type_info.pointer.child) != .optional) {
        @compileError(std.fmt.comptimePrint("{s} requires a pointer to an optional, but received a {s}", .{ "boolFieldWidgetOptional", @typeName(field_value_optional_ptr.*) }));
    }
    validateFieldPtrType(null, &.{.bool}, "boolFieldWidgetOptional", @TypeOf(&field_value_optional_ptr.*.?));
    if (opt.display == .none) return;

    const read_only = @typeInfo(@TypeOf(field_value_optional_ptr)).pointer.is_const or opt.display != .read_write;

    var box = dvui.box(src, .{ .dir = .horizontal }, .{});
    defer box.deinit();

    dvui.label(@src(), "{s}?", .{opt.label orelse field_name}, .{ .margin = .{ .y = 4 } });
    var hbox_aligned = dvui.box(@src(), .{ .dir = .horizontal }, .{ .margin = alignment.margin(box.data().id) });
    defer hbox_aligned.deinit();
    alignment.record(box.data().id, hbox_aligned.data());

    if (read_only) {
        dvui.label(@src(), "{?}", .{field_value_optional_ptr.*}, .{ .margin = .{ .y = 4 } });
    } else {
        const entries = .{ "null", "false", "true" };
        var choice: usize = if (field_value_optional_ptr.*) |field_value|
            if (field_value) 2 else 1
        else
            0;
        _ = dvui.dropdown(@src(), &entries, .{ .choice = &choice }, .{}, .{});
        field_value_optional_ptr.* = switch (choice) {
            0 => null,
            1 => false,
            2 => true,
            else => unreachable,
        };
    }
}