DVUI

numberFieldWidgetOptional

Display a numeric field

Parameters

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

Source

Implementation

#
pub fn numberFieldWidgetOptional(
    src: std.builtin.SourceLocation,
    field_name: []const u8,
    field_value_optional_ptr: anytype,
    opt: NumberFieldOptions,
    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}", .{ "numberFieldWidgetOptional", @typeName(field_value_optional_ptr.*) }));
    }
    validateFieldPtrType(null, &.{ .float, .int }, "numberFieldWidgetOptional", @TypeOf(&field_value_optional_ptr.*.?));
    if (opt.display == .none) return;

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

    switch (opt.widget_type) {
        .number_entry => {
            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) {
                const maybe_num = dvui.textEntryNumber(@src(), T, .{
                    .min = opt.minValue(T),
                    .max = opt.maxValue(T),
                    .value = if (field_value_optional_ptr.*) |*opt_ptr| opt_ptr else null,
                    .show_min_max = opt.min != null and opt.max != null,
                    .placeholder = "null",
                }, .{});
                if (maybe_num.value == .Valid) {
                    field_value_optional_ptr.* = maybe_num.value.Valid;
                } else {
                    field_value_optional_ptr.* = null;
                }
            }
            if (!defaults.narrow or read_only)
                dvui.label(@src(), "{?d}", .{field_value_optional_ptr.*}, .{ .margin = .{ .y = 4 } });
        },
        .slider, .slider_entry, .entry_on_enter => {
            unreachable;
        },
    }
}