enumFieldWidgetOptional
Parameters
- src:std.builtin.SourceLocation
- std.builtin.SourceLocation
- field_name:[]const u8
- []const u8
- field_value_optional_ptr:anytype
- anytype
- opt:StandardFieldOptions
- StandardFieldOptions
- alignment:*dvui.Alignment
- *dvui.Alignment
Source
Implementation
pub fn enumFieldWidgetOptional(
src: std.builtin.SourceLocation,
field_name: []const u8,
field_value_optional_ptr: anytype,
opt: StandardFieldOptions,
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}", .{ "enumFieldWidgetOptional", @typeName(field_value_optional_ptr.*) }));
}
validateFieldPtrType(null, &.{.@"enum"}, "enumFieldWidget", @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;
var box = dvui.box(src, .{ .dir = .horizontal }, .{ .expand = .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(), "{s}", .{if (field_value_optional_ptr.*) |field_value| @tagName(field_value) else "null"}, .{ .margin = .{ .y = 4 } });
} else {
const choices = std.meta.FieldEnum(T);
const entries = std.meta.fieldNames(choices);
var choice: ?usize = if (field_value_optional_ptr.*) |field_value|
@intFromEnum(std.meta.stringToEnum(std.meta.FieldEnum(T), @tagName(field_value)).?)
else
null;
_ = dvui.dropdown(@src(), entries, .{ .choice_nullable = &choice }, .{ .placeholder = "null" }, .{});
if (choice) |ch| {
@setEvalBranchQuota(5000);
field_value_optional_ptr.* = std.meta.stringToEnum(T, @tagName(@as(std.meta.FieldEnum(T), @enumFromInt(ch)))).?;
} else field_value_optional_ptr.* = null;
}
}