dialogDisplay
Parameters
- id:Id
- Id
Source
Implementation
pub fn dialogDisplay(id: Id) !void {
const modal = dvui.dataGet(null, id, "_modal", bool) orelse {
log.err("dialogDisplay lost data for dialog {x}\n", .{id});
dvui.dialogRemove(id);
return;
};
const title = dvui.dataGetSlice(null, id, "_title", []u8) orelse {
log.err("dialogDisplay lost data for dialog {x}\n", .{id});
dvui.dialogRemove(id);
return;
};
const message = dvui.dataGetSlice(null, id, "_message", []u8) orelse {
log.err("dialogDisplay lost data for dialog {x}\n", .{id});
dvui.dialogRemove(id);
return;
};
const ok_label = dvui.dataGetSlice(null, id, "_ok_label", []u8) orelse {
log.err("dialogDisplay lost data for dialog {x}\n", .{id});
dvui.dialogRemove(id);
return;
};
const center_on = dvui.dataGet(null, id, "_center_on", Rect.Natural) orelse currentWindow().subwindows.current_rect;
const cancel_label = dvui.dataGetSlice(null, id, "_cancel_label", []u8);
const default = dvui.dataGet(null, id, "_default", enums.DialogResponse);
const callafter = dvui.dataGet(null, id, "_callafter", DialogCallAfterFn);
const maxSize = dvui.dataGet(null, id, "_max_size", Options.MaxSize);
var win = floatingWindow(@src(), .{ .modal = modal, .center_on = center_on, .window_avoid = .nudge }, .{ .role = .dialog, .id_extra = id.asUsize(), .max_size_content = maxSize });
defer win.deinit();
var header_openflag = true;
win.dragAreaSet(dvui.windowHeader(title, "", &header_openflag));
if (!header_openflag) {
dvui.dialogRemove(id);
if (callafter) |ca| {
ca(id, .cancel) catch |err| {
log.debug("Dialog callafter for {x} returned {any}", .{ id, err });
};
}
return;
}
{
// Add the buttons at the bottom first, so that they are guaranteed to be shown
var hbox = dvui.box(@src(), .{ .dir = .horizontal }, .{ .gravity_x = 1.0, .gravity_y = 1.0, .margin = .all(4) });
defer hbox.deinit();
if (cancel_label) |cl| {
var cancel_data: WidgetData = undefined;
const gravx: f32, const tindex: u16 = switch (currentWindow().button_order) {
.cancel_ok => .{ 0.0, 1 },
.ok_cancel => .{ 1.0, 3 },
};
if (dvui.button(@src(), cl, .{}, .{ .tab_index = tindex, .data_out = &cancel_data, .gravity_x = gravx })) {
dvui.dialogRemove(id);
if (callafter) |ca| {
ca(id, .cancel) catch |err| {
log.debug("Dialog callafter for {x} returned {any}", .{ id, err });
};
}
return;
}
if (default != null and dvui.firstFrame(hbox.data().id) and default.? == .cancel) {
dvui.focusWidget(cancel_data.id, null, null);
}
}
var ok_data: WidgetData = undefined;
if (dvui.button(@src(), ok_label, .{}, .{ .tab_index = 2, .data_out = &ok_data })) {
dvui.dialogRemove(id);
if (callafter) |ca| {
ca(id, .ok) catch |err| {
log.debug("Dialog callafter for {x} returned {any}", .{ id, err });
};
}
return;
}
if (default != null and dvui.firstFrame(hbox.data().id) and default.? == .ok) {
dvui.focusWidget(ok_data.id, null, null);
}
}
// Now add the scroll area which will get the remaining space
var scroll = dvui.scrollArea(@src(), .{}, .{ .expand = .both, .style = .window });
var tl = dvui.textLayout(@src(), .{}, .{ .background = false });
tl.addText(message, .{});
tl.deinit();
scroll.deinit();
}