dialog
Add a dialog to be displayed on the GUI thread during Window.end.
user_struct can be anytype, each field will be stored using
dataSet/dataSetSlice for use in opts.displayFn
Can be called from any thread, but if calling from a non-GUI thread or
outside Window.begin/Window.end you must set opts.window.
Parameters
- src:std.builtin.SourceLocation
- std.builtin.SourceLocation
- user_struct:anytype
- anytype
- opts:DialogOptions
- DialogOptions
Source
Implementation
pub fn dialog(src: std.builtin.SourceLocation, user_struct: anytype, opts: DialogOptions) void {
const id_mutex = dialogAdd(opts.window, src, opts.id_extra, opts.displayFn);
const id = id_mutex.id;
dataSet(opts.window, id, "_modal", opts.modal);
dataSetSlice(opts.window, id, "_title", opts.title);
dataSetSlice(opts.window, id, "_message", opts.message);
dataSetSlice(opts.window, id, "_ok_label", opts.ok_label);
dataSet(opts.window, id, "_center_on", (opts.window orelse currentWindow()).subwindows.current_rect);
if (opts.cancel_label) |cl| {
dataSetSlice(opts.window, id, "_cancel_label", cl);
}
if (opts.default) |d| {
dataSet(opts.window, id, "_default", d);
}
if (opts.max_size) |ms| {
dataSet(opts.window, id, "_max_size", ms);
}
if (opts.callafterFn) |ca| {
dataSet(opts.window, id, "_callafter", ca);
}
// add all fields of user_struct
inline for (@typeInfo(@TypeOf(user_struct)).@"struct".fields) |f| {
const ft = @typeInfo(f.type);
if (ft == .pointer and (ft.pointer.size == .slice or (ft.pointer.size == .one and @typeInfo(ft.pointer.child) == .array))) {
dataSetSlice(opts.window, id, f.name, @field(user_struct, f.name));
} else {
dataSet(opts.window, id, f.name, @field(user_struct, f.name));
}
}
id_mutex.mutex.unlock(io);
}