demo
Parameters
- include:DemoInclude
- DemoInclude
Source
Implementation
pub fn demo(comptime include: DemoInclude) void {
if (include == .full) {
if (show_widgetpedia_window) {
widgetpedia();
}
}
if (!show_demo_window) {
return;
}
const width = 600;
var float = dvui.floatingWindow(@src(), .{ .open_flag = &show_demo_window }, .{ .min_size_content = .{ .w = width, .h = 400 }, .max_size_content = .width(width), .tag = demo_window_tag });
defer float.deinit();
_ = dvui.dataGet(null, float.data().id, "retain_token", dvui.data.Token) orelse {
dvui.dataSet(null, float.data().id, "retain_token", dvui.data.Token.fromId(float.data().id));
dvui.dataSetDeinitFunction(null, float.data().id, "retain_token", &floatRetainClear);
};
// pad the fps label so that it doesn't trigger refresh when the number
// changes widths
var buf: [100]u8 = undefined;
const fps_str = std.fmt.bufPrint(&buf, "{d:0>3.0} fps | frame no {d}", .{ dvui.FPS(), frame_counter }) catch unreachable;
frame_counter += 1;
float.dragAreaSet(dvui.windowHeader("DVUI Demo", fps_str, &show_demo_window));
var scaler = dvui.scale(@src(), .{ .scale = &scale_val }, .{ .expand = .both });
defer scaler.deinit();
var paned = dvui.paned(@src(), .{ .direction = .horizontal, .collapsed_size = width + 1 }, .{ .expand = .both, .background = false, .min_size_content = .{ .h = 100 } });
//if (dvui.firstFrame(paned.data().id)) {
// paned.split_ratio = 0;
//}
if (paned.showFirst()) {
var scroll = dvui.scrollArea(@src(), .{}, .{ .expand = .both, .style = .content });
defer scroll.deinit();
var invalidate: bool = false;
{
var hbox = dvui.box(@src(), .{ .dir = .horizontal }, .{});
defer hbox.deinit();
if (dvui.button(@src(), "Debug Window", .{}, .{})) {
dvui.toggleDebugWindow();
}
if (include == .full) {
if (dvui.button(@src(), "Widgetpedia", .{}, .{})) {
dvui.Examples.show_widgetpedia_window = true;
}
}
if (dvui.Theme.picker(@src(), &dvui.Theme.builtins, .{})) {
invalidate = true;
}
dvui.labelNoFmt(@src(), "Zoom:", .{ .align_y = 0.5 }, .{ .expand = .vertical });
if (dvui.buttonIcon(@src(), "zoom in", dvui.entypo.plus, .{}, .{}, .{ .expand = .both })) {
scale_val = @round(dvui.themeGet().font_body.size * scale_val + 1.0) / dvui.themeGet().font_body.size;
invalidate = true;
}
if (dvui.buttonIcon(@src(), "Zoom out", dvui.entypo.minus, .{}, .{}, .{ .expand = .both })) {
scale_val = @round(dvui.themeGet().font_body.size * scale_val - 1.0) / dvui.themeGet().font_body.size;
invalidate = true;
}
}
var fbox = dvui.flexbox(@src(), .{}, .{ .expand = .both, .min_size_content = .width(width), .corners = .{ .br = .theme(5), .bl = .theme(5) } });
defer fbox.deinit();
inline for (0..@typeInfo(demoKind).@"enum".fields.len) |i| {
const e = @as(demoKind, @enumFromInt(i));
if (include != .full) {
if (e == .struct_ui) continue;
}
var bw: dvui.ButtonWidget = undefined;
bw.init(@src(), .{}, .{
.id_extra = i,
.border = Rect.all(1),
.background = true,
.min_size_content = dvui.Size.all(120),
.max_size_content = .size(dvui.Size.all(120)),
.margin = Rect.all(5),
.style = .content,
.tag = "demo_button_" ++ @tagName(e),
.label = .{ .text = e.name() },
});
bw.processEvents();
bw.drawBackground();
const use_cache = true;
var cache: *dvui.CacheWidget = undefined;
if (use_cache) {
cache = dvui.cache(@src(), .{ .invalidate = invalidate, .retain = .fromId(float.data().id) }, .{ .expand = .both });
}
if (!use_cache or cache.uncached()) {
const box = dvui.box(@src(), .{}, .{ .expand = .both });
defer box.deinit();
var options: dvui.Options = .{ .gravity_x = 0.5, .gravity_y = 1.0 };
if (dvui.captured(bw.data().id)) options = options.override(.{ .color_text = options.color(.text_press) });
dvui.label(@src(), "{s}", .{e.name()}, options);
var s = e.scaleOffset().scale;
const demo_scaler = dvui.scale(@src(), .{ .scale = &s }, .{ .expand = .both });
defer demo_scaler.deinit();
const oldclip = dvui.clip(demo_scaler.data().contentRectScale().r);
defer dvui.clipSet(oldclip);
const box2 = dvui.box(@src(), .{}, .{ .rect = dvui.Rect.fromPoint(e.scaleOffset().offset).toSize(.{ .w = 400, .h = 1000 }) });
defer box2.deinit();
switch (e) {
.basic_widgets => basicWidgets(),
.applets => applets(),
.text_entry => textEntryWidgets(),
.styling => styling(),
.theming => theming(),
.layout => layout(),
.text_layout => layoutText(),
.plots => plots(),
.reorder_tree => reorderLists(),
.menus => menus(),
.scrolling => scrolling(),
.scroll_canvas => scrollCanvas(),
.dialogs => dialogs(),
.animations => animations(),
.struct_ui => if (include == .full) structUI() else {},
.debugging => debuggingErrors(),
.grid => grids(),
}
}
if (use_cache) {
cache.deinit();
}
bw.drawFocus();
if (bw.clicked()) {
demo_active = e;
if (paned.collapsed()) {
paned.animateSplit(0.0);
}
}
bw.deinit();
}
}
if (paned.showSecond()) {
{
var hbox = dvui.box(@src(), .{ .dir = .horizontal }, .{ .expand = .horizontal });
defer hbox.deinit();
if (paned.collapsed() and dvui.button(@src(), "Back to Demos", .{}, .{ .min_size_content = .{ .h = 30 }, .tag = "dvui_demo_window_back" })) {
paned.animateSplit(1.0);
}
dvui.label(@src(), "{s}", .{demo_active.name()}, .{ .font = dvui.Font.theme(.title), .gravity_y = 0.5 });
if (include == .full) {
if (dvui.labelClick(@src(), "View source code", .{}, .{}, .{ .gravity_x = 1.0, .gravity_y = 0.5, .color_text = dvui.themeGet().focus })) {
const window_rect = dvui.currentWindow().data().contentRect();
source_code_rect = .{ .x = window_rect.x + window_rect.w / 2, .y = window_rect.y, .h = window_rect.h, .w = window_rect.w / 2 };
source_code_show = true;
}
}
}
var scroll: ?*dvui.ScrollAreaWidget = null;
if (demo_active != .grid) {
scroll = dvui.scrollArea(@src(), .{}, .{ .expand = .both, .background = false });
}
defer if (scroll) |s| s.deinit();
var vbox = dvui.box(@src(), .{}, .{ .padding = dvui.Rect.all(4), .expand = .both });
defer vbox.deinit();
switch (demo_active) {
.basic_widgets => basicWidgets(),
.applets => applets(),
.text_entry => textEntryWidgets(),
.styling => styling(),
.theming => theming(),
.layout => layout(),
.text_layout => layoutText(),
.plots => plots(),
.reorder_tree => reorderLists(),
.menus => menus(),
.scrolling => scrolling(),
.scroll_canvas => scrollCanvas(),
.dialogs => dialogs(),
.animations => animations(),
.struct_ui => if (include == .full) structUI() else {},
.debugging => debuggingErrors(),
.grid => grids(),
}
}
paned.deinit();
if (show_dialog) {
dialogDirect();
}
if (icon_browser_show) {
iconBrowser(@src(), &icon_browser_show, "entypo", entypo);
}
if (stroke_test_show) {
show_stroke_test_window();
}
if (include == .full and source_code_show) {
switch (demo_active) {
inline else => |demo_name| {
const source_code = if (dvui.useTreeSitter) @embedFile("Examples/" ++ @tagName(demo_name) ++ ".zig") else "";
displayZigSourceCode(@tagName(demo_name) ++ ".zig", source_code, &source_code_show, &source_code_rect);
},
}
}
}