DVUI

optionalFieldWidget

Display an optional returns true if optional is not null

Parameters

#
src:std.builtin.SourceLocation
std.builtin.SourceLocation
field_name:[]const u8
[]const u8
field_value_ptr:anytype
anytype
opts:OptionalFieldOptions
OptionalFieldOptions
alignment:*dvui.Alignment
*dvui.Alignment

Source

Implementation

#
pub fn optionalFieldWidget(
    src: std.builtin.SourceLocation,
    field_name: []const u8,
    field_value_ptr: anytype,
    opts: OptionalFieldOptions,
    alignment: *dvui.Alignment,
) bool {
    validateFieldPtrType(null, &.{.optional}, "optionalFieldWidget", @TypeOf(field_value_ptr));

    // Display mode is ignored. It controls whether the optional value is read_only, not the optional itself.
    const read_only = @typeInfo(@TypeOf(field_value_ptr)).pointer.is_const or opts.display != .read_write;

    var choice: usize = if (field_value_ptr.* == null) 0 else 1; // 0 = Null, 1 = Not Null

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

        if (!read_only) {
            _ = dvui.dropdown(@src(), &.{ "null", "not null" }, .{ .choice = &choice }, .{}, .{});
        } else {
            dvui.labelNoFmt(@src(), if (choice == 0) "null" else "not null", .{}, .{ .margin = .{ .y = 4 } });
        }
    }
    return choice == 1; // Not null
}