aboutsummaryrefslogtreecommitdiff
path: root/vendor/zgui/src
diff options
context:
space:
mode:
authorNic Gaffney <gaffney_nic@protonmail.com>2024-06-12 21:15:52 -0500
committerNic Gaffney <gaffney_nic@protonmail.com>2024-06-12 21:15:52 -0500
commit963fae202108acd0498349e872e4811fa6c6aba0 (patch)
tree1a7d5b6ee837700819d8f6f5a2484342a0ab6ec1 /vendor/zgui/src
parent6084001df845815efd9c0eb712acf4fd9311ce36 (diff)
downloadparticle-sim-963fae202108acd0498349e872e4811fa6c6aba0.tar.gz
Added imgui for configuration
Diffstat (limited to 'vendor/zgui/src')
-rw-r--r--vendor/zgui/src/backend_dx12.zig59
-rw-r--r--vendor/zgui/src/backend_glfw.zig35
-rw-r--r--vendor/zgui/src/backend_glfw_dx12.zig45
-rw-r--r--vendor/zgui/src/backend_glfw_opengl.zig44
-rw-r--r--vendor/zgui/src/backend_glfw_wgpu.zig67
-rw-r--r--vendor/zgui/src/backend_win32_dx12.zig48
-rw-r--r--vendor/zgui/src/gui.zig4580
-rw-r--r--vendor/zgui/src/plot.zig596
-rw-r--r--vendor/zgui/src/te.zig255
-rw-r--r--vendor/zgui/src/zgui.cpp2708
10 files changed, 8437 insertions, 0 deletions
diff --git a/vendor/zgui/src/backend_dx12.zig b/vendor/zgui/src/backend_dx12.zig
new file mode 100644
index 0000000..22672e7
--- /dev/null
+++ b/vendor/zgui/src/backend_dx12.zig
@@ -0,0 +1,59 @@
+pub const D3D12_CPU_DESCRIPTOR_HANDLE = extern struct {
+ ptr: c_ulonglong,
+};
+
+pub const D3D12_GPU_DESCRIPTOR_HANDLE = extern struct {
+ ptr: c_ulonglong,
+};
+
+pub fn init(
+ device: *const anyopaque, // ID3D12Device
+ num_frames_in_flight: u32,
+ rtv_format: c_uint, // DXGI_FORMAT
+ cbv_srv_heap: *const anyopaque, // ID3D12DescriptorHeap
+ font_srv_cpu_desc_handle: D3D12_CPU_DESCRIPTOR_HANDLE,
+ font_srv_gpu_desc_handle: D3D12_GPU_DESCRIPTOR_HANDLE,
+) void {
+ if (!ImGui_ImplDX12_Init(
+ device,
+ num_frames_in_flight,
+ rtv_format,
+ cbv_srv_heap,
+ font_srv_cpu_desc_handle,
+ font_srv_gpu_desc_handle,
+ )) {
+ @panic("failed to init d3d12 for imgui");
+ }
+}
+
+pub fn deinit() void {
+ ImGui_ImplDX12_Shutdown();
+}
+
+pub fn newFrame() void {
+ ImGui_ImplDX12_NewFrame();
+}
+
+pub fn render(
+ draw_data: *const anyopaque, // *gui.DrawData
+ gfx_command_list: *const anyopaque, // *ID3D12GraphicsCommandList
+) void {
+ ImGui_ImplDX12_RenderDrawData(draw_data, gfx_command_list);
+}
+
+// Those functions are defined in 'imgui_impl_dx12.cpp`
+// (they include few custom changes).
+extern fn ImGui_ImplDX12_Init(
+ device: *const anyopaque, // ID3D12Device
+ num_frames_in_flight: u32,
+ rtv_format: u32, // DXGI_FORMAT
+ cbv_srv_heap: *const anyopaque, // ID3D12DescriptorHeap
+ font_srv_cpu_desc_handle: D3D12_CPU_DESCRIPTOR_HANDLE,
+ font_srv_gpu_desc_handle: D3D12_GPU_DESCRIPTOR_HANDLE,
+) bool;
+extern fn ImGui_ImplDX12_Shutdown() void;
+extern fn ImGui_ImplDX12_NewFrame() void;
+extern fn ImGui_ImplDX12_RenderDrawData(
+ draw_data: *const anyopaque, // *ImDrawData
+ graphics_command_list: *const anyopaque, // *ID3D12GraphicsCommandList
+) void;
diff --git a/vendor/zgui/src/backend_glfw.zig b/vendor/zgui/src/backend_glfw.zig
new file mode 100644
index 0000000..83603fe
--- /dev/null
+++ b/vendor/zgui/src/backend_glfw.zig
@@ -0,0 +1,35 @@
+const gui = @import("gui.zig");
+
+// This call will install GLFW callbacks to handle GUI interactions.
+// Those callbacks will chain-call user's previously installed callbacks, if any.
+// This means that custom user's callbacks need to be installed *before* calling zgpu.gui.init().
+pub fn init(
+ window: *const anyopaque, // zglfw.Window
+) void {
+ if (!ImGui_ImplGlfw_InitForOther(window, true)) {
+ unreachable;
+ }
+}
+
+pub fn initOpenGL(
+ window: *const anyopaque, // zglfw.Window
+) void {
+ if (!ImGui_ImplGlfw_InitForOpenGL(window, true)) {
+ unreachable;
+ }
+}
+
+pub fn deinit() void {
+ ImGui_ImplGlfw_Shutdown();
+}
+
+pub fn newFrame() void {
+ ImGui_ImplGlfw_NewFrame();
+}
+
+// Those functions are defined in `imgui_impl_glfw.cpp`
+// (they include few custom changes).
+extern fn ImGui_ImplGlfw_InitForOther(window: *const anyopaque, install_callbacks: bool) bool;
+extern fn ImGui_ImplGlfw_InitForOpenGL(window: *const anyopaque, install_callbacks: bool) bool;
+extern fn ImGui_ImplGlfw_NewFrame() void;
+extern fn ImGui_ImplGlfw_Shutdown() void;
diff --git a/vendor/zgui/src/backend_glfw_dx12.zig b/vendor/zgui/src/backend_glfw_dx12.zig
new file mode 100644
index 0000000..48c63cb
--- /dev/null
+++ b/vendor/zgui/src/backend_glfw_dx12.zig
@@ -0,0 +1,45 @@
+const gui = @import("gui.zig");
+const backend_glfw = @import("backend_glfw.zig");
+const backend_dx12 = @import("backend_dx12.zig");
+
+pub fn init(
+ window: *const anyopaque, // zglfw.Window
+ device: *const anyopaque, // ID3D12Device
+ num_frames_in_flight: u32,
+ rtv_format: c_uint, // DXGI_FORMAT
+ cbv_srv_heap: *const anyopaque, // ID3D12DescriptorHeap
+ font_srv_cpu_desc_handle: backend_dx12.D3D12_CPU_DESCRIPTOR_HANDLE,
+ font_srv_gpu_desc_handle: backend_dx12.D3D12_GPU_DESCRIPTOR_HANDLE,
+) void {
+ backend_glfw.init(window);
+ backend_dx12.init(
+ device,
+ num_frames_in_flight,
+ rtv_format,
+ cbv_srv_heap,
+ font_srv_cpu_desc_handle,
+ font_srv_gpu_desc_handle,
+ );
+}
+
+pub fn deinit() void {
+ backend_dx12.deinit();
+ backend_glfw.deinit();
+}
+
+pub fn newFrame(fb_width: u32, fb_height: u32) void {
+ backend_glfw.newFrame();
+ backend_dx12.newFrame();
+
+ gui.io.setDisplaySize(@as(f32, @floatFromInt(fb_width)), @as(f32, @floatFromInt(fb_height)));
+ gui.io.setDisplayFramebufferScale(1.0, 1.0);
+
+ gui.newFrame();
+}
+
+pub fn draw(
+ graphics_command_list: *const anyopaque, // *ID3D12GraphicsCommandList
+) void {
+ gui.render();
+ backend_dx12.render(gui.getDrawData(), graphics_command_list);
+}
diff --git a/vendor/zgui/src/backend_glfw_opengl.zig b/vendor/zgui/src/backend_glfw_opengl.zig
new file mode 100644
index 0000000..cb94dc3
--- /dev/null
+++ b/vendor/zgui/src/backend_glfw_opengl.zig
@@ -0,0 +1,44 @@
+const gui = @import("gui.zig");
+const backend_glfw = @import("backend_glfw.zig");
+
+pub fn initWithGlSlVersion(
+ window: *const anyopaque, // zglfw.Window
+ glsl_version: ?[:0]const u8, // e.g. "#version 130"
+) void {
+ backend_glfw.initOpenGL(window);
+
+ ImGui_ImplOpenGL3_Init(@ptrCast(glsl_version));
+}
+
+pub fn init(
+ window: *const anyopaque, // zglfw.Window
+) void {
+ initWithGlSlVersion(window, null);
+}
+
+pub fn deinit() void {
+ ImGui_ImplOpenGL3_Shutdown();
+ backend_glfw.deinit();
+}
+
+pub fn newFrame(fb_width: u32, fb_height: u32) void {
+ backend_glfw.newFrame();
+ ImGui_ImplOpenGL3_NewFrame();
+
+ gui.io.setDisplaySize(@as(f32, @floatFromInt(fb_width)), @as(f32, @floatFromInt(fb_height)));
+ gui.io.setDisplayFramebufferScale(1.0, 1.0);
+
+ gui.newFrame();
+}
+
+pub fn draw() void {
+ gui.render();
+ ImGui_ImplOpenGL3_RenderDrawData(gui.getDrawData());
+}
+
+// Those functions are defined in 'imgui_impl_opengl3.cpp`
+// (they include few custom changes).
+extern fn ImGui_ImplOpenGL3_Init(glsl_version: [*c]const u8) void;
+extern fn ImGui_ImplOpenGL3_Shutdown() void;
+extern fn ImGui_ImplOpenGL3_NewFrame() void;
+extern fn ImGui_ImplOpenGL3_RenderDrawData(data: *const anyopaque) void;
diff --git a/vendor/zgui/src/backend_glfw_wgpu.zig b/vendor/zgui/src/backend_glfw_wgpu.zig
new file mode 100644
index 0000000..e6fa517
--- /dev/null
+++ b/vendor/zgui/src/backend_glfw_wgpu.zig
@@ -0,0 +1,67 @@
+const gui = @import("gui.zig");
+const backend_glfw = @import("backend_glfw.zig");
+
+// This call will install GLFW callbacks to handle GUI interactions.
+// Those callbacks will chain-call user's previously installed callbacks, if any.
+// This means that custom user's callbacks need to be installed *before* calling zgpu.gui.init().
+pub fn init(
+ window: *const anyopaque, // zglfw.Window
+ wgpu_device: *const anyopaque, // wgpu.Device
+ wgpu_swap_chain_format: u32, // wgpu.TextureFormat
+ wgpu_depth_format: u32, // wgpu.TextureFormat
+) void {
+ backend_glfw.init(window);
+
+ var info = ImGui_ImplWGPU_InitInfo{
+ .device = wgpu_device,
+ .num_frames_in_flight = 1,
+ .rt_format = wgpu_swap_chain_format,
+ .depth_format = wgpu_depth_format,
+ .pipeline_multisample_state = .{},
+ };
+
+ if (!ImGui_ImplWGPU_Init(&info)) {
+ unreachable;
+ }
+}
+
+pub fn deinit() void {
+ ImGui_ImplWGPU_Shutdown();
+ backend_glfw.deinit();
+}
+
+pub fn newFrame(fb_width: u32, fb_height: u32) void {
+ ImGui_ImplWGPU_NewFrame();
+ backend_glfw.newFrame();
+
+ gui.io.setDisplaySize(@floatFromInt(fb_width), @floatFromInt(fb_height));
+ gui.io.setDisplayFramebufferScale(1.0, 1.0);
+
+ gui.newFrame();
+}
+
+pub fn draw(wgpu_render_pass: *const anyopaque) void {
+ gui.render();
+ ImGui_ImplWGPU_RenderDrawData(gui.getDrawData(), wgpu_render_pass);
+}
+
+pub const ImGui_ImplWGPU_InitInfo = extern struct {
+ device: *const anyopaque,
+ num_frames_in_flight: u32 = 1,
+ rt_format: u32,
+ depth_format: u32,
+
+ pipeline_multisample_state: extern struct {
+ next_in_chain: ?*const anyopaque = null,
+ count: u32 = 1,
+ mask: u32 = @bitCast(@as(i32, -1)),
+ alpha_to_coverage_enabled: bool = false,
+ },
+};
+
+// Those functions are defined in 'imgui_impl_wgpu.cpp`
+// (they include few custom changes).
+extern fn ImGui_ImplWGPU_Init(init_info: *ImGui_ImplWGPU_InitInfo) bool;
+extern fn ImGui_ImplWGPU_NewFrame() void;
+extern fn ImGui_ImplWGPU_RenderDrawData(draw_data: *const anyopaque, pass_encoder: *const anyopaque) void;
+extern fn ImGui_ImplWGPU_Shutdown() void;
diff --git a/vendor/zgui/src/backend_win32_dx12.zig b/vendor/zgui/src/backend_win32_dx12.zig
new file mode 100644
index 0000000..2cc5bf9
--- /dev/null
+++ b/vendor/zgui/src/backend_win32_dx12.zig
@@ -0,0 +1,48 @@
+const std = @import("std");
+
+const gui = @import("gui.zig");
+const backend_dx12 = @import("backend_dx12.zig");
+
+pub fn init(
+ hwnd: *const anyopaque, // HWND
+ d3d12_device: *const anyopaque, // ID3D12Device*
+ num_frames_in_flight: u16,
+ rtv_format: u32, // DXGI_FORMAT
+ cbv_srv_heap: *const anyopaque, // ID3D12DescriptorHeap*
+ font_srv_cpu_desc_handle: backend_dx12.D3D12_CPU_DESCRIPTOR_HANDLE,
+ font_srv_gpu_desc_handle: backend_dx12.D3D12_GPU_DESCRIPTOR_HANDLE,
+) void {
+ std.debug.assert(ImGui_ImplWin32_Init(hwnd));
+ backend_dx12.init(
+ d3d12_device,
+ num_frames_in_flight,
+ rtv_format,
+ cbv_srv_heap,
+ font_srv_cpu_desc_handle,
+ font_srv_gpu_desc_handle,
+ );
+}
+
+pub fn deinit() void {
+ backend_dx12.deinit();
+ ImGui_ImplWin32_Shutdown();
+}
+
+pub fn newFrame(fb_width: u32, fb_height: u32) void {
+ ImGui_ImplWin32_NewFrame();
+ backend_dx12.newFrame();
+
+ gui.io.setDisplaySize(@as(f32, @floatFromInt(fb_width)), @as(f32, @floatFromInt(fb_height)));
+ gui.io.setDisplayFramebufferScale(1.0, 1.0);
+
+ gui.newFrame();
+}
+
+pub fn draw(graphics_command_list: *const anyopaque) void {
+ gui.render();
+ backend_dx12.render(gui.getDrawData(), graphics_command_list);
+}
+
+extern fn ImGui_ImplWin32_Init(hwnd: *const anyopaque) bool;
+extern fn ImGui_ImplWin32_Shutdown() void;
+extern fn ImGui_ImplWin32_NewFrame() void;
diff --git a/vendor/zgui/src/gui.zig b/vendor/zgui/src/gui.zig
new file mode 100644
index 0000000..4bb4eac
--- /dev/null
+++ b/vendor/zgui/src/gui.zig
@@ -0,0 +1,4580 @@
+//--------------------------------------------------------------------------------------------------
+//
+// Zig bindings for 'dear imgui' library. Easy to use, hand-crafted API with default arguments,
+// named parameters and Zig style text formatting.
+//
+//--------------------------------------------------------------------------------------------------
+pub const plot = @import("plot.zig");
+pub const te = @import("te.zig");
+pub const backend = switch (@import("zgui_options").backend) {
+ .glfw_wgpu => @import("backend_glfw_wgpu.zig"),
+ .glfw_opengl3 => @import("backend_glfw_opengl.zig"),
+ .glfw_dx12 => @import("backend_glfw_dx12.zig"),
+ .glfw => @import("backend_glfw.zig"),
+ .win32_dx12 => @import("backend_win32_dx12.zig"),
+ .no_backend => .{},
+};
+const te_enabled = @import("zgui_options").with_te;
+//--------------------------------------------------------------------------------------------------
+const std = @import("std");
+const assert = std.debug.assert;
+//--------------------------------------------------------------------------------------------------
+pub const f32_min: f32 = 1.17549435082228750796873653722225e-38;
+pub const f32_max: f32 = 3.40282346638528859811704183484517e+38;
+//--------------------------------------------------------------------------------------------------
+pub const DrawIdx = u16;
+pub const DrawVert = extern struct {
+ pos: [2]f32,
+ uv: [2]f32,
+ color: u32,
+};
+//--------------------------------------------------------------------------------------------------
+
+pub fn init(allocator: std.mem.Allocator) void {
+ if (zguiGetCurrentContext() == null) {
+ mem_allocator = allocator;
+ mem_allocations = std.AutoHashMap(usize, usize).init(allocator);
+ mem_allocations.?.ensureTotalCapacity(32) catch @panic("zgui: out of memory");
+ zguiSetAllocatorFunctions(zguiMemAlloc, zguiMemFree);
+
+ _ = zguiCreateContext(null);
+
+ temp_buffer = std.ArrayList(u8).init(allocator);
+ temp_buffer.?.resize(3 * 1024 + 1) catch unreachable;
+
+ if (te_enabled) {
+ te.init();
+ }
+ }
+}
+pub fn deinit() void {
+ if (zguiGetCurrentContext() != null) {
+ temp_buffer.?.deinit();
+ zguiDestroyContext(null);
+
+ // Must be after destroy imgui context.
+ // And before allocation check
+ if (te_enabled) {
+ te.deinit();
+ }
+
+ if (mem_allocations.?.count() > 0) {
+ var it = mem_allocations.?.iterator();
+ while (it.next()) |kv| {
+ const address = kv.key_ptr.*;
+ const size = kv.value_ptr.*;
+ mem_allocator.?.free(@as([*]align(mem_alignment) u8, @ptrFromInt(address))[0..size]);
+ std.log.info(
+ "[zgui] Possible memory leak or static memory usage detected: (address: 0x{x}, size: {d})",
+ .{ address, size },
+ );
+ }
+ mem_allocations.?.clearAndFree();
+ }
+
+ assert(mem_allocations.?.count() == 0);
+ mem_allocations.?.deinit();
+ mem_allocations = null;
+ mem_allocator = null;
+ }
+}
+pub fn initNoContext(allocator: std.mem.Allocator) void {
+ if (temp_buffer == null) {
+ temp_buffer = std.ArrayList(u8).init(allocator);
+ temp_buffer.?.resize(3 * 1024 + 1) catch unreachable;
+ }
+}
+pub fn deinitNoContext() void {
+ if (temp_buffer) |buf| {
+ buf.deinit();
+ }
+}
+extern fn zguiCreateContext(shared_font_atlas: ?*const anyopaque) Context;
+extern fn zguiDestroyContext(ctx: ?Context) void;
+extern fn zguiGetCurrentContext() ?Context;
+//--------------------------------------------------------------------------------------------------
+var mem_allocator: ?std.mem.Allocator = null;
+var mem_allocations: ?std.AutoHashMap(usize, usize) = null;
+var mem_mutex: std.Thread.Mutex = .{};
+const mem_alignment = 16;
+
+fn zguiMemAlloc(size: usize, _: ?*anyopaque) callconv(.C) ?*anyopaque {
+ mem_mutex.lock();
+ defer mem_mutex.unlock();
+
+ const mem = mem_allocator.?.alignedAlloc(
+ u8,
+ mem_alignment,
+ size,
+ ) catch @panic("zgui: out of memory");
+
+ mem_allocations.?.put(@intFromPtr(mem.ptr), size) catch @panic("zgui: out of memory");
+
+ return mem.ptr;
+}
+
+fn zguiMemFree(maybe_ptr: ?*anyopaque, _: ?*anyopaque) callconv(.C) void {
+ if (maybe_ptr) |ptr| {
+ mem_mutex.lock();
+ defer mem_mutex.unlock();
+
+ if (mem_allocations != null) {
+ const size = mem_allocations.?.fetchRemove(@intFromPtr(ptr)).?.value;
+ const mem = @as([*]align(mem_alignment) u8, @ptrCast(@alignCast(ptr)))[0..size];
+ mem_allocator.?.free(mem);
+ }
+ }
+}
+
+extern fn zguiSetAllocatorFunctions(
+ alloc_func: ?*const fn (usize, ?*anyopaque) callconv(.C) ?*anyopaque,
+ free_func: ?*const fn (?*anyopaque, ?*anyopaque) callconv(.C) void,
+) void;
+//--------------------------------------------------------------------------------------------------
+pub const ConfigFlags = packed struct(c_int) {
+ nav_enable_keyboard: bool = false,
+ nav_enable_gamepad: bool = false,
+ nav_enable_set_mouse_pos: bool = false,
+ nav_no_capture_keyboard: bool = false,
+ no_mouse: bool = false,
+ no_mouse_cursor_change: bool = false,
+ dock_enable: bool = false,
+ _pading0: u3 = 0,
+ viewport_enable: bool = false,
+ _pading1: u3 = 0,
+ dpi_enable_scale_viewport: bool = false,
+ dpi_enable_scale_fonts: bool = false,
+ user_storage: u4 = 0,
+ is_srgb: bool = false,
+ is_touch_screen: bool = false,
+ _padding: u10 = 0,
+};
+
+pub const FontConfig = extern struct {
+ font_data: ?*anyopaque,
+ font_data_size: c_int,
+ font_data_owned_by_atlas: bool,
+ font_no: c_int,
+ size_pixels: f32,
+ oversample_h: c_int,
+ oversample_v: c_int,
+ pixel_snap_h: bool,
+ glyph_extra_spacing: [2]f32,
+ glyph_offset: [2]f32,
+ glyph_ranges: [*c]u16,
+ glyph_min_advance_x: f32,
+ glyph_max_advance_x: f32,
+ merge_mode: bool,
+ font_builder_flags: c_uint,
+ rasterizer_multiply: f32,
+ rasterizer_density: f32,
+ ellipsis_char: Wchar,
+ name: [40]u8,
+ dst_font: *Font,
+
+ pub fn init() FontConfig {
+ return zguiFontConfig_Init();
+ }
+ extern fn zguiFontConfig_Init() FontConfig;
+};
+
+pub const io = struct {
+ pub fn addFontFromFile(filename: [:0]const u8, size_pixels: f32) Font {
+ return zguiIoAddFontFromFile(filename, size_pixels);
+ }
+ extern fn zguiIoAddFontFromFile(filename: [*:0]const u8, size_pixels: f32) Font;
+
+ pub fn addFontFromFileWithConfig(
+ filename: [:0]const u8,
+ size_pixels: f32,
+ config: ?FontConfig,
+ ranges: ?[*]const Wchar,
+ ) Font {
+ return zguiIoAddFontFromFileWithConfig(filename, size_pixels, if (config) |c| &c else null, ranges);
+ }
+ extern fn zguiIoAddFontFromFileWithConfig(
+ filename: [*:0]const u8,
+ size_pixels: f32,
+ config: ?*const FontConfig,
+ ranges: ?[*]const Wchar,
+ ) Font;
+
+ pub fn addFontFromMemory(fontdata: []const u8, size_pixels: f32) Font {
+ return zguiIoAddFontFromMemory(fontdata.ptr, @intCast(fontdata.len), size_pixels);
+ }
+ extern fn zguiIoAddFontFromMemory(font_data: *const anyopaque, font_size: c_int, size_pixels: f32) Font;
+
+ pub fn addFontFromMemoryWithConfig(
+ fontdata: []const u8,
+ size_pixels: f32,
+ config: ?FontConfig,
+ ranges: ?[*]const Wchar,
+ ) Font {
+ return zguiIoAddFontFromMemoryWithConfig(
+ fontdata.ptr,
+ @intCast(fontdata.len),
+ size_pixels,
+ if (config) |c| &c else null,
+ ranges,
+ );
+ }
+ extern fn zguiIoAddFontFromMemoryWithConfig(
+ font_data: *const anyopaque,
+ font_size: c_int,
+ size_pixels: f32,
+ config: ?*const FontConfig,
+ ranges: ?[*]const Wchar,
+ ) Font;
+
+ pub fn getFont(index: u32) Font {
+ return zguiIoGetFont(index);
+ }
+ extern fn zguiIoGetFont(index: c_uint) Font;
+
+ /// `pub fn setDefaultFont(font: Font) void`
+ pub const setDefaultFont = zguiIoSetDefaultFont;
+ extern fn zguiIoSetDefaultFont(font: Font) void;
+
+ pub fn getFontsTextDataAsRgba32() struct {
+ width: i32,
+ height: i32,
+ pixels: ?[*]const u32,
+ } {
+ var width: i32 = undefined;
+ var height: i32 = undefined;
+ const ptr = zguiIoGetFontsTexDataAsRgba32(&width, &height);
+ return .{
+ .width = width,
+ .height = height,
+ .pixels = ptr,
+ };
+ }
+ extern fn zguiIoGetFontsTexDataAsRgba32(width: *c_int, height: *c_int) [*c]const u32;
+
+ /// `pub fn setFontsTexId(id:TextureIdent) set the backend Id for the fonts atlas
+ pub const setFontsTexId = zguiIoSetFontsTexId;
+ extern fn zguiIoSetFontsTexId(id: TextureIdent) void;
+
+ pub const getFontsTexId = zguiIoGetFontsTexId;
+ extern fn zguiIoGetFontsTexId() TextureIdent;
+
+ /// `pub fn zguiIoSetConfigWindowsMoveFromTitleBarOnly(bool) void`
+ pub const setConfigWindowsMoveFromTitleBarOnly = zguiIoSetConfigWindowsMoveFromTitleBarOnly;
+ extern fn zguiIoSetConfigWindowsMoveFromTitleBarOnly(enabled: bool) void;
+
+ /// `pub fn zguiIoGetWantCaptureMouse() bool`
+ pub const getWantCaptureMouse = zguiIoGetWantCaptureMouse;
+ extern fn zguiIoGetWantCaptureMouse() bool;
+
+ /// `pub fn zguiIoGetWantCaptureKeyboard() bool`
+ pub const getWantCaptureKeyboard = zguiIoGetWantCaptureKeyboard;
+ extern fn zguiIoGetWantCaptureKeyboard() bool;
+
+ /// `pub fn zguiIoGetWantTextInput() bool`
+ pub const getWantTextInput = zguiIoGetWantTextInput;
+ extern fn zguiIoGetWantTextInput() bool;
+
+ pub fn setIniFilename(filename: ?[*:0]const u8) void {
+ zguiIoSetIniFilename(filename);
+ }
+ extern fn zguiIoSetIniFilename(filename: ?[*:0]const u8) void;
+
+ /// `pub fn setDisplaySize(width: f32, height: f32) void`
+ pub const setDisplaySize = zguiIoSetDisplaySize;
+ extern fn zguiIoSetDisplaySize(width: f32, height: f32) void;
+
+ pub fn getDisplaySize() [2]f32 {
+ var size: [2]f32 = undefined;
+ zguiIoGetDisplaySize(&size);
+ return size;
+ }
+ extern fn zguiIoGetDisplaySize(size: *[2]f32) void;
+
+ /// `pub fn setDisplayFramebufferScale(sx: f32, sy: f32) void`
+ pub const setDisplayFramebufferScale = zguiIoSetDisplayFramebufferScale;
+ extern fn zguiIoSetDisplayFramebufferScale(sx: f32, sy: f32) void;
+
+ /// `pub fn setConfigFlags(flags: ConfigFlags) void`
+ pub const setConfigFlags = zguiIoSetConfigFlags;
+ extern fn zguiIoSetConfigFlags(flags: ConfigFlags) void;
+
+ /// `pub fn setDeltaTime(delta_time: f32) void`
+ pub const setDeltaTime = zguiIoSetDeltaTime;
+ extern fn zguiIoSetDeltaTime(delta_time: f32) void;
+
+ pub const addFocusEvent = zguiIoAddFocusEvent;
+ extern fn zguiIoAddFocusEvent(focused: bool) void;
+
+ pub const addMousePositionEvent = zguiIoAddMousePositionEvent;
+ extern fn zguiIoAddMousePositionEvent(x: f32, y: f32) void;
+
+ pub const addMouseButtonEvent = zguiIoAddMouseButtonEvent;
+ extern fn zguiIoAddMouseButtonEvent(button: MouseButton, down: bool) void;
+
+ pub const addMouseWheelEvent = zguiIoAddMouseWheelEvent;
+ extern fn zguiIoAddMouseWheelEvent(x: f32, y: f32) void;
+
+ pub const addKeyEvent = zguiIoAddKeyEvent;
+ extern fn zguiIoAddKeyEvent(key: Key, down: bool) void;
+
+ pub const addInputCharactersUTF8 = zguiIoAddInputCharactersUTF8;
+ extern fn zguiIoAddInputCharactersUTF8(utf8_chars: ?[*:0]const u8) void;
+
+ pub fn setKeyEventNativeData(key: Key, keycode: i32, scancode: i32) void {
+ zguiIoSetKeyEventNativeData(key, keycode, scancode);
+ }
+ extern fn zguiIoSetKeyEventNativeData(key: Key, keycode: c_int, scancode: c_int) void;
+
+ pub fn addCharacterEvent(char: i32) void {
+ zguiIoAddCharacterEvent(char);
+ }
+ extern fn zguiIoAddCharacterEvent(char: c_int) void;
+};
+
+pub fn setClipboardText(value: [:0]const u8) void {
+ zguiSetClipboardText(value.ptr);
+}
+pub fn getClipboardText() [:0]const u8 {
+ const value = zguiGetClipboardText();
+ return std.mem.span(value);
+}
+extern fn zguiSetClipboardText(text: [*:0]const u8) void;
+extern fn zguiGetClipboardText() [*:0]const u8;
+//--------------------------------------------------------------------------------------------------
+const Context = *opaque {};
+pub const DrawData = *extern struct {
+ valid: bool,
+ cmd_lists_count: c_int,
+ total_idx_count: c_int,
+ total_vtx_count: c_int,
+ cmd_lists: Vector(DrawList),
+ display_pos: [2]f32,
+ display_size: [2]f32,
+ framebuffer_scale: [2]f32,
+};
+pub const Font = *opaque {};
+pub const Ident = u32;
+pub const TextureIdent = *anyopaque;
+pub const Wchar = if (@import("zgui_options").use_wchar32) u32 else u16;
+pub const Key = enum(c_int) {
+ none = 0,
+ tab = 512,
+ left_arrow,
+ right_arrow,
+ up_arrow,
+ down_arrow,
+ page_up,
+ page_down,
+ home,
+ end,
+ insert,
+ delete,
+ back_space,
+ space,
+ enter,
+ escape,
+ left_ctrl,
+ left_shift,
+ left_alt,
+ left_super,
+ right_ctrl,
+ right_shift,
+ right_alt,
+ right_super,
+ menu,
+ zero,
+ one,
+ two,
+ three,
+ four,
+ five,
+ six,
+ seven,
+ eight,
+ nine,
+ a,
+ b,
+ c,
+ d,
+ e,
+ f,
+ g,
+ h,
+ i,
+ j,
+ k,
+ l,
+ m,
+ n,
+ o,
+ p,
+ q,
+ r,
+ s,
+ t,
+ u,
+ v,
+ w,
+ x,
+ y,
+ z,
+ f1,
+ f2,
+ f3,
+ f4,
+ f5,
+ f6,
+ f7,
+ f8,
+ f9,
+ f10,
+ f11,
+ f12,
+ f13,
+ f14,
+ f15,
+ f16,
+ f17,
+ f18,
+ f19,
+ f20,
+ f21,
+ f22,
+ f23,
+ f24,
+ apostrophe,
+ comma,
+ minus,
+ period,
+ slash,
+ semicolon,
+ equal,
+ left_bracket,
+ back_slash,
+ right_bracket,
+ grave_accent,
+ caps_lock,
+ scroll_lock,
+ num_lock,
+ print_screen,
+ pause,
+ keypad_0,
+ keypad_1,
+ keypad_2,
+ keypad_3,
+ keypad_4,
+ keypad_5,
+ keypad_6,
+ keypad_7,
+ keypad_8,
+ keypad_9,
+ keypad_decimal,
+ keypad_divide,
+ keypad_multiply,
+ keypad_subtract,
+ keypad_add,
+ keypad_enter,
+ keypad_equal,
+
+ app_back,
+ app_forward,
+
+ gamepad_start,
+ gamepad_back,
+ gamepad_faceleft,
+ gamepad_faceright,
+ gamepad_faceup,
+ gamepad_facedown,
+ gamepad_dpadleft,
+ gamepad_dpadright,
+ gamepad_dpadup,
+ gamepad_dpaddown,
+ gamepad_l1,
+ gamepad_r1,
+ gamepad_l2,
+ gamepad_r2,
+ gamepad_l3,
+ gamepad_r3,
+ gamepad_lstickleft,
+ gamepad_lstickright,
+ gamepad_lstickup,
+ gamepad_lstickdown,
+ gamepad_rstickleft,
+ gamepad_rstickright,
+ gamepad_rstickup,
+ gamepad_rstickdown,
+
+ mouse_left,
+ mouse_right,
+ mouse_middle,
+ mouse_x1,
+ mouse_x2,
+
+ mouse_wheel_x,
+ mouse_wheel_y,
+
+ mod_ctrl = 1 << 12,
+ mod_shift = 1 << 13,
+ mod_alt = 1 << 14,
+ mod_super = 1 << 15,
+ mod_mask_ = 0xf000,
+};
+
+//--------------------------------------------------------------------------------------------------
+pub const WindowFlags = packed struct(c_int) {
+ no_title_bar: bool = false,
+ no_resize: bool = false,
+ no_move: bool = false,
+ no_scrollbar: bool = false,
+ no_scroll_with_mouse: bool = false,
+ no_collapse: bool = false,
+ always_auto_resize: bool = false,
+ no_background: bool = false,
+ no_saved_settings: bool = false,
+ no_mouse_inputs: bool = false,
+ menu_bar: bool = false,
+ horizontal_scrollbar: bool = false,
+ no_focus_on_appearing: bool = false,
+ no_bring_to_front_on_focus: bool = false,
+ always_vertical_scrollbar: bool = false,
+ always_horizontal_scrollbar: bool = false,
+ no_nav_inputs: bool = false,
+ no_nav_focus: bool = false,
+ unsaved_document: bool = false,
+ no_docking: bool = false,
+ _padding: u12 = 0,
+
+ pub const no_nav = WindowFlags{ .no_nav_inputs = true, .no_nav_focus = true };
+ pub const no_decoration = WindowFlags{
+ .no_title_bar = true,
+ .no_resize = true,
+ .no_scrollbar = true,
+ .no_collapse = true,
+ };
+ pub const no_inputs = WindowFlags{
+ .no_mouse_inputs = true,
+ .no_nav_inputs = true,
+ .no_nav_focus = true,
+ };
+};
+
+pub const ChildFlags = packed struct(c_int) {
+ border: bool = false,
+ no_move: bool = false,
+ always_use_window_padding: bool = false,
+ resize_x: bool = false,
+ resize_y: bool = false,
+ auto_resize_x: bool = false,
+ auto_resize_y: bool = false,
+ always_auto_resize: bool = false,
+ frame_style: bool = false,
+ _padding: u23 = 0,
+};
+
+//--------------------------------------------------------------------------------------------------
+pub const SliderFlags = packed struct(c_int) {
+ _reserved0: bool = false,
+ _reserved1: bool = false,
+ _reserved2: bool = false,
+ _reserved3: bool = false,
+ always_clamp: bool = false,
+ logarithmic: bool = false,
+ no_round_to_format: bool = false,
+ no_input: bool = false,
+ _padding: u24 = 0,
+};
+//--------------------------------------------------------------------------------------------------
+pub const ButtonFlags = packed struct(c_int) {
+ mouse_button_left: bool = false,
+ mouse_button_right: bool = false,
+ mouse_button_middle: bool = false,
+ _padding: u29 = 0,
+};
+//--------------------------------------------------------------------------------------------------
+pub const Direction = enum(c_int) {
+ none = -1,
+ left = 0,
+ right = 1,
+ up = 2,
+ down = 3,
+};
+//--------------------------------------------------------------------------------------------------
+pub const DataType = enum(c_int) { I8, U8, I16, U16, I32, U32, I64, U64, F32, F64 };
+//--------------------------------------------------------------------------------------------------
+pub const Condition = enum(c_int) {
+ none = 0,
+ always = 1,
+ once = 2,
+ first_use_ever = 4,
+ appearing = 8,
+};
+//--------------------------------------------------------------------------------------------------
+//
+// Main
+//
+//--------------------------------------------------------------------------------------------------
+/// `pub fn newFrame() void`
+pub const newFrame = zguiNewFrame;
+extern fn zguiNewFrame() void;
+//--------------------------------------------------------------------------------------------------
+/// `pub fn render() void`
+pub const render = zguiRender;
+extern fn zguiRender() void;
+//--------------------------------------------------------------------------------------------------
+/// `pub fn getDrawData() DrawData`
+pub const getDrawData = zguiGetDrawData;
+extern fn zguiGetDrawData() DrawData;
+//--------------------------------------------------------------------------------------------------
+//
+// Demo, Debug, Information
+//
+//--------------------------------------------------------------------------------------------------
+/// `pub fn showDemoWindow(popen: ?*bool) void`
+pub const showDemoWindow = zguiShowDemoWindow;
+extern fn zguiShowDemoWindow(popen: ?*bool) void;
+//--------------------------------------------------------------------------------------------------
+//
+// Windows
+//
+//--------------------------------------------------------------------------------------------------
+const SetNextWindowPos = struct {
+ x: f32,
+ y: f32,
+ cond: Condition = .none,
+ pivot_x: f32 = 0.0,
+ pivot_y: f32 = 0.0,
+};
+pub fn setNextWindowPos(args: SetNextWindowPos) void {
+ zguiSetNextWindowPos(args.x, args.y, args.cond, args.pivot_x, args.pivot_y);
+}
+extern fn zguiSetNextWindowPos(x: f32, y: f32, cond: Condition, pivot_x: f32, pivot_y: f32) void;
+//--------------------------------------------------------------------------------------------------
+const SetNextWindowSize = struct {
+ w: f32,
+ h: f32,
+ cond: Condition = .none,
+};
+pub fn setNextWindowSize(args: SetNextWindowSize) void {
+ zguiSetNextWindowSize(args.w, args.h, args.cond);
+}
+extern fn zguiSetNextWindowSize(w: f32, h: f32, cond: Condition) void;
+//--------------------------------------------------------------------------------------------------
+const SetNextWindowCollapsed = struct {
+ collapsed: bool,
+ cond: Condition = .none,
+};
+pub fn setNextWindowCollapsed(args: SetNextWindowCollapsed) void {
+ zguiSetNextWindowCollapsed(args.collapsed, args.cond);
+}
+extern fn zguiSetNextWindowCollapsed(collapsed: bool, cond: Condition) void;
+//--------------------------------------------------------------------------------------------------
+/// `pub fn setNextWindowFocus() void`
+pub const setNextWindowFocus = zguiSetNextWindowFocus;
+extern fn zguiSetNextWindowFocus() void;
+//--------------------------------------------------------------------------------------------------
+const SetNextWindowBgAlpha = struct {
+ alpha: f32,
+};
+pub fn setNextWindowBgAlpha(args: SetNextWindowBgAlpha) void {
+ zguiSetNextWindowBgAlpha(args.alpha);
+}
+extern fn zguiSetNextWindowBgAlpha(alpha: f32) void;
+//--------------------------------------------------------------------------------------------------
+pub fn setWindowFocus(name: ?[:0]const u8) void {
+ zguiSetWindowFocus(name orelse null);
+}
+extern fn zguiSetWindowFocus(name: ?[*:0]const u8) void;
+//-------------------------------------------------------------------------------------------------
+pub fn setKeyboardFocusHere(offset: i32) void {
+ zguiSetKeyboardFocusHere(offset);
+}
+extern fn zguiSetKeyboardFocusHere(offset: c_int) void;
+
+//--------------------------------------------------------------------------------------------------
+const Begin = struct {
+ popen: ?*bool = null,
+ flags: WindowFlags = .{},
+};
+pub fn begin(name: [:0]const u8, args: Begin) bool {
+ return zguiBegin(name, args.popen, args.flags);
+}
+/// `pub fn end() void`
+pub const end = zguiEnd;
+extern fn zguiBegin(name: [*:0]const u8, popen: ?*bool, flags: WindowFlags) bool;
+extern fn zguiEnd() void;
+//--------------------------------------------------------------------------------------------------
+const BeginChild = struct {
+ w: f32 = 0.0,
+ h: f32 = 0.0,
+ child_flags: ChildFlags = .{},
+ window_flags: WindowFlags = .{},
+};
+pub fn beginChild(str_id: [:0]const u8, args: BeginChild) bool {
+ return zguiBeginChild(str_id, args.w, args.h, args.child_flags, args.window_flags);
+}
+pub fn beginChildId(id: Ident, args: BeginChild) bool {
+ return zguiBeginChildId(id, args.w, args.h, args.child_flags, args.window_flags);
+}
+/// `pub fn endChild() void`
+pub const endChild = zguiEndChild;
+extern fn zguiBeginChild(str_id: [*:0]const u8, w: f32, h: f32, flags: ChildFlags, window_flags: WindowFlags) bool;
+extern fn zguiBeginChildId(id: Ident, w: f32, h: f32, flags: ChildFlags, window_flags: WindowFlags) bool;
+extern fn zguiEndChild() void;
+//--------------------------------------------------------------------------------------------------
+/// `pub fn zguiGetScrollX() f32`
+pub const getScrollX = zguiGetScrollX;
+/// `pub fn zguiGetScrollY() f32`
+pub const getScrollY = zguiGetScrollY;
+/// `pub fn zguiSetScrollX(scroll_x: f32) void`
+pub const setScrollX = zguiSetScrollX;
+/// `pub fn zguiSetScrollY(scroll_y: f32) void`
+pub const setScrollY = zguiSetScrollY;
+/// `pub fn zguiGetScrollMaxX() f32`
+pub const getScrollMaxX = zguiGetScrollMaxX;
+/// `pub fn zguiGetScrollMaxY() f32`
+pub const getScrollMaxY = zguiGetScrollMaxY;
+extern fn zguiGetScrollX() f32;
+extern fn zguiGetScrollY() f32;
+extern fn zguiSetScrollX(scroll_x: f32) void;
+extern fn zguiSetScrollY(scroll_y: f32) void;
+extern fn zguiGetScrollMaxX() f32;
+extern fn zguiGetScrollMaxY() f32;
+const SetScrollHereX = struct {
+ center_x_ratio: f32 = 0.5,
+};
+const SetScrollHereY = struct {
+ center_y_ratio: f32 = 0.5,
+};
+pub fn setScrollHereX(args: SetScrollHereX) void {
+ zguiSetScrollHereX(args.center_x_ratio);
+}
+pub fn setScrollHereY(args: SetScrollHereY) void {
+ zguiSetScrollHereY(args.center_y_ratio);
+}
+const SetScrollFromPosX = struct {
+ local_x: f32,
+ center_x_ratio: f32 = 0.5,
+};
+const SetScrollFromPosY = struct {
+ local_y: f32,
+ center_y_ratio: f32 = 0.5,
+};
+pub fn setScrollFromPosX(args: SetScrollFromPosX) void {
+ zguiSetScrollFromPosX(args.local_x, args.center_x_ratio);
+}
+pub fn setScrollFromPosY(args: SetScrollFromPosY) void {
+ zguiSetScrollFromPosY(args.local_y, args.center_y_ratio);
+}
+extern fn zguiSetScrollHereX(center_x_ratio: f32) void;
+extern fn zguiSetScrollHereY(center_y_ratio: f32) void;
+extern fn zguiSetScrollFromPosX(local_x: f32, center_x_ratio: f32) void;
+extern fn zguiSetScrollFromPosY(local_y: f32, center_y_ratio: f32) void;
+//--------------------------------------------------------------------------------------------------
+pub const FocusedFlags = packed struct(c_int) {
+ child_windows: bool = false,
+ root_window: bool = false,
+ any_window: bool = false,
+ no_popup_hierarchy: bool = false,
+ dock_hierarchy: bool = false,
+ _padding: u27 = 0,
+
+ pub const root_and_child_windows = FocusedFlags{ .root_window = true, .child_windows = true };
+};
+//--------------------------------------------------------------------------------------------------
+pub const HoveredFlags = packed struct(c_int) {
+ child_windows: bool = false,
+ root_window: bool = false,
+ any_window: bool = false,
+ no_popup_hierarchy: bool = false,
+ dock_hierarchy: bool = false,
+ allow_when_blocked_by_popup: bool = false,
+ _reserved1: bool = false,
+ allow_when_blocked_by_active_item: bool = false,
+ allow_when_overlapped_by_item: bool = false,
+ allow_when_overlapped_by_window: bool = false,
+ allow_when_disabled: bool = false,
+ no_nav_override: bool = false,
+ for_tooltip: bool = false,
+ stationary: bool = false,
+ delay_none: bool = false,
+ delay_normal: bool = false,
+ delay_short: bool = false,
+ no_shared_delay: bool = false,
+ _padding: u14 = 0,
+
+ pub const rect_only = HoveredFlags{
+ .allow_when_blocked_by_popup = true,
+ .allow_when_blocked_by_active_item = true,
+ .allow_when_overlapped_by_item = true,
+ .allow_when_overlapped_by_window = true,
+ };
+ pub const root_and_child_windows = HoveredFlags{ .root_window = true, .child_windows = true };
+};
+//--------------------------------------------------------------------------------------------------
+/// `pub fn isWindowAppearing() bool`
+pub const isWindowAppearing = zguiIsWindowAppearing;
+/// `pub fn isWindowCollapsed() bool`
+pub const isWindowCollapsed = zguiIsWindowCollapsed;
+pub fn isWindowFocused(flags: FocusedFlags) bool {
+ return zguiIsWindowFocused(flags);
+}
+pub fn isWindowHovered(flags: HoveredFlags) bool {
+ return zguiIsWindowHovered(flags);
+}
+extern fn zguiIsWindowAppearing() bool;
+extern fn zguiIsWindowCollapsed() bool;
+extern fn zguiIsWindowFocused(flags: FocusedFlags) bool;
+extern fn zguiIsWindowHovered(flags: HoveredFlags) bool;
+//--------------------------------------------------------------------------------------------------
+pub fn getWindowPos() [2]f32 {
+ var pos: [2]f32 = undefined;
+ zguiGetWindowPos(&pos);
+ return pos;
+}
+pub fn getWindowSize() [2]f32 {
+ var size: [2]f32 = undefined;
+ zguiGetWindowSize(&size);
+ return size;
+}
+
+pub fn getContentRegionAvail() [2]f32 {
+ var size: [2]f32 = undefined;
+ zguiGetContentRegionAvail(&size);
+ return size;
+}
+
+pub fn getContentRegionMax() [2]f32 {
+ var size: [2]f32 = undefined;
+ zguiGetContentRegionMax(&size);
+ return size;
+}
+
+pub fn getWindowContentRegionMin() [2]f32 {
+ var size: [2]f32 = undefined;
+ zguiGetWindowContentRegionMin(&size);
+ return size;
+}
+
+pub fn getWindowContentRegionMax() [2]f32 {
+ var size: [2]f32 = undefined;
+ zguiGetWindowContentRegionMax(&size);
+ return size;
+}
+
+/// `pub fn getWindowWidth() f32`
+pub const getWindowWidth = zguiGetWindowWidth;
+/// `pub fn getWindowHeight() f32`
+pub const getWindowHeight = zguiGetWindowHeight;
+extern fn zguiGetWindowPos(pos: *[2]f32) void;
+extern fn zguiGetWindowSize(size: *[2]f32) void;
+extern fn zguiGetWindowWidth() f32;
+extern fn zguiGetWindowHeight() f32;
+extern fn zguiGetContentRegionAvail(size: *[2]f32) void;
+extern fn zguiGetContentRegionMax(size: *[2]f32) void;
+extern fn zguiGetWindowContentRegionMin(size: *[2]f32) void;
+extern fn zguiGetWindowContentRegionMax(size: *[2]f32) void;
+//--------------------------------------------------------------------------------------------------
+//
+// Docking
+//
+//--------------------------------------------------------------------------------------------------
+pub const DockNodeFlags = packed struct(c_int) {
+ keep_alive_only: bool = false,
+ _reserved: u1 = 0,
+ no_docking_over_central_node: bool = false,
+ passthru_central_node: bool = false,
+ no_docking_split: bool = false,
+ no_resize: bool = false,
+ auto_hide_tab_bar: bool = false,
+ no_undocking: bool = false,
+ _padding_0: u2 = 0,
+
+ // Extended enum entries from imgui_internal (unstable, subject to change, use at own risk)
+ dock_space: bool = false,
+ central_node: bool = false,
+ no_tab_bar: bool = false,
+ hidden_tab_bar: bool = false,
+ no_window_menu_button: bool = false,
+ no_close_button: bool = false,
+ no_resize_x: bool = false,
+ no_resize_y: bool = false,
+ docked_windows_in_focus_route: bool = false,
+ no_docking_split_other: bool = false,
+ no_docking_over_me: bool = false,
+ no_docking_over_other: bool = false,
+ no_docking_over_empty: bool = false,
+ _padding_1: u9 = 0,
+};
+extern fn zguiDockSpace(str_id: [*:0]const u8, size: *const [2]f32, flags: DockNodeFlags) Ident;
+
+pub fn DockSpace(str_id: [:0]const u8, size: [2]f32, flags: DockNodeFlags) Ident {
+ return zguiDockSpace(str_id.ptr, &size, flags);
+}
+extern fn zguiDockSpaceOverViewport(viewport: Viewport, flags: DockNodeFlags) Ident;
+pub const DockSpaceOverViewport = zguiDockSpaceOverViewport;
+
+//--------------------------------------------------------------------------------------------------
+//
+// DockBuilder (Unstable internal imgui API, subject to change, use at own risk)
+//
+//--------------------------------------------------------------------------------------------------
+pub fn dockBuilderDockWindow(window_name: [:0]const u8, node_id: Ident) void {
+ zguiDockBuilderDockWindow(window_name.ptr, node_id);
+}
+pub const dockBuilderAddNode = zguiDockBuilderAddNode;
+pub const dockBuilderRemoveNode = zguiDockBuilderRemoveNode;
+pub fn dockBuilderSetNodePos(node_id: Ident, pos: [2]f32) void {
+ zguiDockBuilderSetNodePos(node_id, &pos);
+}
+pub fn dockBuilderSetNodeSize(node_id: Ident, size: [2]f32) void {
+ zguiDockBuilderSetNodeSize(node_id, &size);
+}
+pub const dockBuilderSplitNode = zguiDockBuilderSplitNode;
+pub const dockBuilderFinish = zguiDockBuilderFinish;
+
+extern fn zguiDockBuilderDockWindow(window_name: [*:0]const u8, node_id: Ident) void;
+extern fn zguiDockBuilderAddNode(node_id: Ident, flags: DockNodeFlags) Ident;
+extern fn zguiDockBuilderRemoveNode(node_id: Ident) void;
+extern fn zguiDockBuilderSetNodePos(node_id: Ident, pos: *const [2]f32) void;
+extern fn zguiDockBuilderSetNodeSize(node_id: Ident, size: *const [2]f32) void;
+extern fn zguiDockBuilderSplitNode(
+ node_id: Ident,
+ split_dir: Direction,
+ size_ratio_for_node_at_dir: f32,
+ out_id_at_dir: ?*Ident,
+ out_id_at_opposite_dir: ?*Ident,
+) Ident;
+extern fn zguiDockBuilderFinish(node_id: Ident) void;
+
+//--------------------------------------------------------------------------------------------------
+//
+// Style
+//
+//--------------------------------------------------------------------------------------------------
+pub const Style = extern struct {
+ alpha: f32,
+ disabled_alpha: f32,
+ window_padding: [2]f32,
+ window_rounding: f32,
+ window_border_size: f32,
+ window_min_size: [2]f32,
+ window_title_align: [2]f32,
+ window_menu_button_position: Direction,
+ child_rounding: f32,
+ child_border_size: f32,
+ popup_rounding: f32,
+ popup_border_size: f32,
+ frame_padding: [2]f32,
+ frame_rounding: f32,
+ frame_border_size: f32,
+ item_spacing: [2]f32,
+ item_inner_spacing: [2]f32,
+ cell_padding: [2]f32,
+ touch_extra_padding: [2]f32,
+ indent_spacing: f32,
+ columns_min_spacing: f32,
+ scrollbar_size: f32,
+ scrollbar_rounding: f32,
+ grab_min_size: f32,
+ grab_rounding: f32,
+ log_slider_deadzone: f32,
+ tab_rounding: f32,
+ tab_border_size: f32,
+ tab_min_width_for_close_button: f32,
+ tab_bar_border_size: f32,
+ table_angled_header_angle: f32,
+ color_button_position: Direction,
+ button_text_align: [2]f32,
+ selectable_text_align: [2]f32,
+ separator_text_border_size: f32,
+ separator_text_align: [2]f32,
+ separator_text_padding: [2]f32,
+ display_window_padding: [2]f32,
+ display_safe_area_padding: [2]f32,
+ docking_separator_size: f32,
+ mouse_cursor_scale: f32,
+ anti_aliased_lines: bool,
+ anti_aliased_lines_use_tex: bool,
+ anti_aliased_fill: bool,
+ curve_tessellation_tol: f32,
+ circle_tessellation_max_error: f32,
+
+ colors: [@typeInfo(StyleCol).Enum.fields.len][4]f32,
+
+ hover_stationary_delay: f32,
+ hover_delay_short: f32,
+ hover_delay_normal: f32,
+
+ hover_flags_for_tooltip_mouse: HoveredFlags,
+ hover_flags_for_tooltip_nav: HoveredFlags,
+
+ /// `pub fn init() Style`
+ pub const init = zguiStyle_Init;
+ extern fn zguiStyle_Init() Style;
+
+ /// `pub fn scaleAllSizes(style: *Style, scale_factor: f32) void`
+ pub const scaleAllSizes = zguiStyle_ScaleAllSizes;
+ extern fn zguiStyle_ScaleAllSizes(style: *Style, scale_factor: f32) void;
+
+ pub fn getColor(style: Style, idx: StyleCol) [4]f32 {
+ return style.colors[@intCast(@intFromEnum(idx))];
+ }
+ pub fn setColor(style: *Style, idx: StyleCol, color: [4]f32) void {
+ style.colors[@intCast(@intFromEnum(idx))] = color;
+ }
+};
+/// `pub fn getStyle() *Style`
+pub const getStyle = zguiGetStyle;
+extern fn zguiGetStyle() *Style;
+//--------------------------------------------------------------------------------------------------
+pub const StyleCol = enum(c_int) {
+ text,
+ text_disabled,
+ window_bg,
+ child_bg,
+ popup_bg,
+ border,
+ border_shadow,
+ frame_bg,
+ frame_bg_hovered,
+ frame_bg_active,
+ title_bg,
+ title_bg_active,
+ title_bg_collapsed,
+ menu_bar_bg,
+ scrollbar_bg,
+ scrollbar_grab,
+ scrollbar_grab_hovered,
+ scrollbar_grab_active,
+ check_mark,
+ slider_grab,
+ slider_grab_active,
+ button,
+ button_hovered,
+ button_active,
+ header,
+ header_hovered,
+ header_active,
+ separator,
+ separator_hovered,
+ separator_active,
+ resize_grip,
+ resize_grip_hovered,
+ resize_grip_active,
+ tab,
+ tab_hovered,
+ tab_active,
+ tab_unfocused,
+ tab_unfocused_active,
+ docking_preview,
+ docking_empty_bg,
+ plot_lines,
+ plot_lines_hovered,
+ plot_histogram,
+ plot_histogram_hovered,
+ table_header_bg,
+ table_border_strong,
+ table_border_light,
+ table_row_bg,
+ table_row_bg_alt,
+ text_selected_bg,
+ drag_drop_target,
+ nav_highlight,
+ nav_windowing_highlight,
+ nav_windowing_dim_bg,
+ modal_window_dim_bg,
+};
+
+pub fn pushStyleColor4f(args: struct {
+ idx: StyleCol,
+ c: [4]f32,
+}) void {
+ zguiPushStyleColor4f(args.idx, &args.c);
+}
+extern fn zguiPushStyleColor4f(idx: StyleCol, col: *const [4]f32) void;
+
+pub fn pushStyleColor1u(args: struct {
+ idx: StyleCol,
+ c: u32,
+}) void {
+ zguiPushStyleColor1u(args.idx, args.c);
+}
+extern fn zguiPushStyleColor1u(idx: StyleCol, col: c_uint) void;
+
+pub fn popStyleColor(args: struct {
+ count: i32 = 1,
+}) void {
+ zguiPopStyleColor(args.count);
+}
+extern fn zguiPopStyleColor(count: c_int) void;
+
+/// `fn pushTextWrapPos(wrap_pos_x: f32) void`
+pub const pushTextWrapPos = zguiPushTextWrapPos;
+extern fn zguiPushTextWrapPos(wrap_pos_x: f32) void;
+
+/// `fn popTextWrapPos() void`
+pub const popTextWrapPos = zguiPopTextWrapPos;
+extern fn zguiPopTextWrapPos() void;
+
+//--------------------------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------------------------
+pub const StyleVar = enum(c_int) {
+ alpha, // 1f
+ disabled_alpha, // 1f
+ window_padding, // 2f
+ window_rounding, // 1f
+ window_border_size, // 1f
+ window_min_size, // 2f
+ window_title_align, // 2f
+ child_rounding, // 1f
+ child_border_size, // 1f
+ popup_rounding, // 1f
+ popup_border_size, // 1f
+ frame_padding, // 2f
+ frame_rounding, // 1f
+ frame_border_size, // 1f
+ item_spacing, // 2f
+ item_inner_spacing, // 2f
+ indent_spacing, // 1f
+ cell_padding, // 2f
+ scrollbar_size, // 1f
+ scrollbar_rounding, // 1f
+ grab_min_size, // 1f
+ grab_rounding, // 1f
+ tab_rounding, // 1f
+ tab_bar_border_size, // 1f
+ button_text_align, // 2f
+ selectable_text_align, // 2f
+ separator_text_border_size, // 1f
+ separator_text_align, // 2f
+ separator_text_padding, // 2f
+ docking_separator_size, // 1f
+};
+
+pub fn pushStyleVar1f(args: struct {
+ idx: StyleVar,
+ v: f32,
+}) void {
+ zguiPushStyleVar1f(args.idx, args.v);
+}
+extern fn zguiPushStyleVar1f(idx: StyleVar, v: f32) void;
+
+pub fn pushStyleVar2f(args: struct {
+ idx: StyleVar,
+ v: [2]f32,
+}) void {
+ zguiPushStyleVar2f(args.idx, &args.v);
+}
+extern fn zguiPushStyleVar2f(idx: StyleVar, v: *const [2]f32) void;
+
+pub fn popStyleVar(args: struct {
+ count: i32 = 1,
+}) void {
+ zguiPopStyleVar(args.count);
+}
+extern fn zguiPopStyleVar(count: c_int) void;
+
+//--------------------------------------------------------------------------------------------------
+/// `void pushItemWidth(item_width: f32) void`
+pub const pushItemWidth = zguiPushItemWidth;
+/// `void popItemWidth() void`
+pub const popItemWidth = zguiPopItemWidth;
+/// `void setNextItemWidth(item_width: f32) void`
+pub const setNextItemWidth = zguiSetNextItemWidth;
+/// `void setItemDefaultFocus() void`
+pub const setItemDefaultFocus = zguiSetItemDefaultFocus;
+extern fn zguiPushItemWidth(item_width: f32) void;
+extern fn zguiPopItemWidth() void;
+extern fn zguiSetNextItemWidth(item_width: f32) void;
+extern fn zguiSetItemDefaultFocus() void;
+//--------------------------------------------------------------------------------------------------
+/// `pub fn getFont() Font`
+pub const getFont = zguiGetFont;
+extern fn zguiGetFont() Font;
+/// `pub fn getFontSize() f32`
+pub const getFontSize = zguiGetFontSize;
+extern fn zguiGetFontSize() f32;
+/// `void pushFont(font: Font) void`
+pub const pushFont = zguiPushFont;
+extern fn zguiPushFont(font: Font) void;
+/// `void popFont() void`
+pub const popFont = zguiPopFont;
+extern fn zguiPopFont() void;
+
+pub fn getFontTexUvWhitePixel() [2]f32 {
+ var uv: [2]f32 = undefined;
+ zguiGetFontTexUvWhitePixel(&uv);
+ return uv;
+}
+extern fn zguiGetFontTexUvWhitePixel(uv: *[2]f32) void;
+//--------------------------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------------------------
+const BeginDisabled = struct {
+ disabled: bool = true,
+};
+pub fn beginDisabled(args: BeginDisabled) void {
+ zguiBeginDisabled(args.disabled);
+}
+/// `pub fn endDisabled() void`
+pub const endDisabled = zguiEndDisabled;
+extern fn zguiBeginDisabled(disabled: bool) void;
+extern fn zguiEndDisabled() void;
+//--------------------------------------------------------------------------------------------------
+//
+// Cursor / Layout
+//
+//--------------------------------------------------------------------------------------------------
+/// `pub fn separator() void`
+pub const separator = zguiSeparator;
+extern fn zguiSeparator() void;
+
+pub fn separatorText(label: [:0]const u8) void {
+ zguiSeparatorText(label);
+}
+extern fn zguiSeparatorText(label: [*:0]const u8) void;
+//--------------------------------------------------------------------------------------------------
+const SameLine = struct {
+ offset_from_start_x: f32 = 0.0,
+ spacing: f32 = -1.0,
+};
+pub fn sameLine(args: SameLine) void {
+ zguiSameLine(args.offset_from_start_x, args.spacing);
+}
+extern fn zguiSameLine(offset_from_start_x: f32, spacing: f32) void;
+//--------------------------------------------------------------------------------------------------
+/// `pub fn newLine() void`
+pub const newLine = zguiNewLine;
+extern fn zguiNewLine() void;
+//--------------------------------------------------------------------------------------------------
+/// `pub fn spacing() void`
+pub const spacing = zguiSpacing;
+extern fn zguiSpacing() void;
+//--------------------------------------------------------------------------------------------------
+const Dummy = struct {
+ w: f32,
+ h: f32,
+};
+pub fn dummy(args: Dummy) void {
+ zguiDummy(args.w, args.h);
+}
+extern fn zguiDummy(w: f32, h: f32) void;
+//--------------------------------------------------------------------------------------------------
+const Indent = struct {
+ indent_w: f32 = 0.0,
+};
+pub fn indent(args: Indent) void {
+ zguiIndent(args.indent_w);
+}
+const Unindent = struct {
+ indent_w: f32 = 0.0,
+};
+pub fn unindent(args: Unindent) void {
+ zguiUnindent(args.indent_w);
+}
+extern fn zguiIndent(indent_w: f32) void;
+extern fn zguiUnindent(indent_w: f32) void;
+//--------------------------------------------------------------------------------------------------
+/// `pub fn beginGroup() void`
+pub const beginGroup = zguiBeginGroup;
+extern fn zguiBeginGroup() void;
+/// `pub fn endGroup() void`
+pub const endGroup = zguiEndGroup;
+extern fn zguiEndGroup() void;
+//--------------------------------------------------------------------------------------------------
+pub fn getCursorPos() [2]f32 {
+ var pos: [2]f32 = undefined;
+ zguiGetCursorPos(&pos);
+ return pos;
+}
+/// `pub fn getCursorPosX() f32`
+pub const getCursorPosX = zguiGetCursorPosX;
+/// `pub fn getCursorPosY() f32`
+pub const getCursorPosY = zguiGetCursorPosY;
+extern fn zguiGetCursorPos(pos: *[2]f32) void;
+extern fn zguiGetCursorPosX() f32;
+extern fn zguiGetCursorPosY() f32;
+//--------------------------------------------------------------------------------------------------
+pub fn setCursorPos(local_pos: [2]f32) void {
+ zguiSetCursorPos(local_pos[0], local_pos[1]);
+}
+/// `pub fn setCursorPosX(local_x: f32) void`
+pub const setCursorPosX = zguiSetCursorPosX;
+/// `pub fn setCursorPosY(local_y: f32) void`
+pub const setCursorPosY = zguiSetCursorPosY;
+extern fn zguiSetCursorPos(local_x: f32, local_y: f32) void;
+extern fn zguiSetCursorPosX(local_x: f32) void;
+extern fn zguiSetCursorPosY(local_y: f32) void;
+//--------------------------------------------------------------------------------------------------
+pub fn getCursorStartPos() [2]f32 {
+ var pos: [2]f32 = undefined;
+ zguiGetCursorStartPos(&pos);
+ return pos;
+}
+pub fn getCursorScreenPos() [2]f32 {
+ var pos: [2]f32 = undefined;
+ zguiGetCursorScreenPos(&pos);
+ return pos;
+}
+pub fn setCursorScreenPos(screen_pos: [2]f32) void {
+ zguiSetCursorPos(screen_pos[0], screen_pos[1]);
+}
+extern fn zguiGetCursorStartPos(pos: *[2]f32) void;
+extern fn zguiGetCursorScreenPos(pos: *[2]f32) void;
+extern fn zguiSetCursorScreenPos(screen_x: f32, screen_y: f32) void;
+//--------------------------------------------------------------------------------------------------
+pub const Cursor = enum(c_int) {
+ none = -1,
+ arrow = 0,
+ text_input,
+ resize_all,
+ resize_ns,
+ resize_ew,
+ resize_nesw,
+ resize_nwse,
+ hand,
+ not_allowed,
+ count,
+};
+/// `pub fn getMouseCursor() MouseCursor`
+pub const getMouseCursor = zguiGetMouseCursor;
+/// `pub fn setMouseCursor(cursor: MouseCursor) void`
+pub const setMouseCursor = zguiSetMouseCursor;
+extern fn zguiGetMouseCursor() Cursor;
+extern fn zguiSetMouseCursor(cursor: Cursor) void;
+//--------------------------------------------------------------------------------------------------
+pub fn getMousePos() [2]f32 {
+ var pos: [2]f32 = undefined;
+ zguiGetMousePos(&pos);
+ return pos;
+}
+extern fn zguiGetMousePos(pos: *[2]f32) void;
+//--------------------------------------------------------------------------------------------------
+/// `pub fn alignTextToFramePadding() void`
+pub const alignTextToFramePadding = zguiAlignTextToFramePadding;
+/// `pub fn getTextLineHeight() f32`
+pub const getTextLineHeight = zguiGetTextLineHeight;
+/// `pub fn getTextLineHeightWithSpacing() f32`
+pub const getTextLineHeightWithSpacing = zguiGetTextLineHeightWithSpacing;
+/// `pub fn getFrameHeight() f32`
+pub const getFrameHeight = zguiGetFrameHeight;
+/// `pub fn getFrameHeightWithSpacing() f32`
+pub const getFrameHeightWithSpacing = zguiGetFrameHeightWithSpacing;
+extern fn zguiAlignTextToFramePadding() void;
+extern fn zguiGetTextLineHeight() f32;
+extern fn zguiGetTextLineHeightWithSpacing() f32;
+extern fn zguiGetFrameHeight() f32;
+extern fn zguiGetFrameHeightWithSpacing() f32;
+//--------------------------------------------------------------------------------------------------
+pub fn getItemRectMax() [2]f32 {
+ var rect: [2]f32 = undefined;
+ zguiGetItemRectMax(&rect);
+ return rect;
+}
+pub fn getItemRectMin() [2]f32 {
+ var rect: [2]f32 = undefined;
+ zguiGetItemRectMin(&rect);
+ return rect;
+}
+pub fn getItemRectSize() [2]f32 {
+ var rect: [2]f32 = undefined;
+ zguiGetItemRectSize(&rect);
+ return rect;
+}
+extern fn zguiGetItemRectMax(rect: *[2]f32) void;
+extern fn zguiGetItemRectMin(rect: *[2]f32) void;
+extern fn zguiGetItemRectSize(rect: *[2]f32) void;
+//--------------------------------------------------------------------------------------------------
+//
+// ID stack/scopes
+//
+//--------------------------------------------------------------------------------------------------
+pub fn pushStrId(str_id: []const u8) void {
+ zguiPushStrId(str_id.ptr, str_id.ptr + str_id.len);
+}
+extern fn zguiPushStrId(str_id_begin: [*]const u8, str_id_end: [*]const u8) void;
+
+pub fn pushStrIdZ(str_id: [:0]const u8) void {
+ zguiPushStrIdZ(str_id);
+}
+extern fn zguiPushStrIdZ(str_id: [*:0]const u8) void;
+
+pub fn pushPtrId(ptr_id: *const anyopaque) void {
+ zguiPushPtrId(ptr_id);
+}
+extern fn zguiPushPtrId(ptr_id: *const anyopaque) void;
+
+pub fn pushIntId(int_id: i32) void {
+ zguiPushIntId(int_id);
+}
+extern fn zguiPushIntId(int_id: c_int) void;
+
+/// `pub fn popId() void`
+pub const popId = zguiPopId;
+extern fn zguiPopId() void;
+
+pub fn getStrId(str_id: []const u8) Ident {
+ return zguiGetStrId(str_id.ptr, str_id.ptr + str_id.len);
+}
+extern fn zguiGetStrId(str_id_begin: [*]const u8, str_id_end: [*]const u8) Ident;
+
+pub fn getStrIdZ(str_id: [:0]const u8) Ident {
+ return zguiGetStrIdZ(str_id);
+}
+extern fn zguiGetStrIdZ(str_id: [*:0]const u8) Ident;
+
+pub fn getPtrId(ptr_id: *const anyopaque) Ident {
+ return zguiGetPtrId(ptr_id);
+}
+extern fn zguiGetPtrId(ptr_id: *const anyopaque) Ident;
+
+//--------------------------------------------------------------------------------------------------
+//
+// Widgets: Text
+//
+//--------------------------------------------------------------------------------------------------
+pub fn textUnformatted(txt: []const u8) void {
+ zguiTextUnformatted(txt.ptr, txt.ptr + txt.len);
+}
+pub fn textUnformattedColored(color: [4]f32, txt: []const u8) void {
+ pushStyleColor4f(.{ .idx = .text, .c = color });
+ textUnformatted(txt);
+ popStyleColor(.{});
+}
+//--------------------------------------------------------------------------------------------------
+pub fn text(comptime fmt: []const u8, args: anytype) void {
+ const result = format(fmt, args);
+ zguiTextUnformatted(result.ptr, result.ptr + result.len);
+}
+pub fn textColored(color: [4]f32, comptime fmt: []const u8, args: anytype) void {
+ pushStyleColor4f(.{ .idx = .text, .c = color });
+ text(fmt, args);
+ popStyleColor(.{});
+}
+extern fn zguiTextUnformatted(txt: [*]const u8, txt_end: [*]const u8) void;
+//--------------------------------------------------------------------------------------------------
+pub fn textDisabled(comptime fmt: []const u8, args: anytype) void {
+ zguiTextDisabled("%s", formatZ(fmt, args).ptr);
+}
+extern fn zguiTextDisabled(fmt: [*:0]const u8, ...) void;
+//--------------------------------------------------------------------------------------------------
+pub fn textWrapped(comptime fmt: []const u8, args: anytype) void {
+ zguiTextWrapped("%s", formatZ(fmt, args).ptr);
+}
+extern fn zguiTextWrapped(fmt: [*:0]const u8, ...) void;
+//--------------------------------------------------------------------------------------------------
+pub fn bulletText(comptime fmt: []const u8, args: anytype) void {
+ bullet();
+ text(fmt, args);
+}
+//--------------------------------------------------------------------------------------------------
+pub fn labelText(label: [:0]const u8, comptime fmt: []const u8, args: anytype) void {
+ zguiLabelText(label, "%s", formatZ(fmt, args).ptr);
+}
+extern fn zguiLabelText(label: [*:0]const u8, fmt: [*:0]const u8, ...) void;
+//--------------------------------------------------------------------------------------------------
+const CalcTextSize = struct {
+ hide_text_after_double_hash: bool = false,
+ wrap_width: f32 = -1.0,
+};
+pub fn calcTextSize(txt: []const u8, args: CalcTextSize) [2]f32 {
+ var w: f32 = undefined;
+ var h: f32 = undefined;
+ zguiCalcTextSize(
+ txt.ptr,
+ txt.ptr + txt.len,
+ args.hide_text_after_double_hash,
+ args.wrap_width,
+ &w,
+ &h,
+ );
+ return .{ w, h };
+}
+extern fn zguiCalcTextSize(
+ txt: [*]const u8,
+ txt_end: [*]const u8,
+ hide_text_after_double_hash: bool,
+ wrap_width: f32,
+ out_w: *f32,
+ out_h: *f32,
+) void;
+//--------------------------------------------------------------------------------------------------
+//
+// Widgets: Main
+//
+//--------------------------------------------------------------------------------------------------
+const Button = struct {
+ w: f32 = 0.0,
+ h: f32 = 0.0,
+};
+pub fn button(label: [:0]const u8, args: Button) bool {
+ return zguiButton(label, args.w, args.h);
+}
+extern fn zguiButton(label: [*:0]const u8, w: f32, h: f32) bool;
+//--------------------------------------------------------------------------------------------------
+pub fn smallButton(label: [:0]const u8) bool {
+ return zguiSmallButton(label);
+}
+extern fn zguiSmallButton(label: [*:0]const u8) bool;
+//--------------------------------------------------------------------------------------------------
+const InvisibleButton = struct {
+ w: f32,
+ h: f32,
+ flags: ButtonFlags = .{},
+};
+pub fn invisibleButton(str_id: [:0]const u8, args: InvisibleButton) bool {
+ return zguiInvisibleButton(str_id, args.w, args.h, args.flags);
+}
+extern fn zguiInvisibleButton(str_id: [*:0]const u8, w: f32, h: f32, flags: ButtonFlags) bool;
+//--------------------------------------------------------------------------------------------------
+const ArrowButton = struct {
+ dir: Direction,
+};
+pub fn arrowButton(label: [:0]const u8, args: ArrowButton) bool {
+ return zguiArrowButton(label, args.dir);
+}
+extern fn zguiArrowButton(label: [*:0]const u8, dir: Direction) bool;
+//--------------------------------------------------------------------------------------------------
+const Image = struct {
+ w: f32,
+ h: f32,
+ uv0: [2]f32 = .{ 0.0, 0.0 },
+ uv1: [2]f32 = .{ 1.0, 1.0 },
+ tint_col: [4]f32 = .{ 1.0, 1.0, 1.0, 1.0 },
+ border_col: [4]f32 = .{ 0.0, 0.0, 0.0, 0.0 },
+};
+pub fn image(user_texture_id: TextureIdent, args: Image) void {
+ zguiImage(user_texture_id, args.w, args.h, &args.uv0, &args.uv1, &args.tint_col, &args.border_col);
+}
+extern fn zguiImage(
+ user_texture_id: TextureIdent,
+ w: f32,
+ h: f32,
+ uv0: *const [2]f32,
+ uv1: *const [2]f32,
+ tint_col: *const [4]f32,
+ border_col: *const [4]f32,
+) void;
+//--------------------------------------------------------------------------------------------------
+const ImageButton = struct {
+ w: f32,
+ h: f32,
+ uv0: [2]f32 = .{ 0.0, 0.0 },
+ uv1: [2]f32 = .{ 1.0, 1.0 },
+ bg_col: [4]f32 = .{ 0.0, 0.0, 0.0, 0.0 },
+ tint_col: [4]f32 = .{ 1.0, 1.0, 1.0, 1.0 },
+};
+pub fn imageButton(str_id: [:0]const u8, user_texture_id: TextureIdent, args: ImageButton) bool {
+ return zguiImageButton(
+ str_id,
+ user_texture_id,
+ args.w,
+ args.h,
+ &args.uv0,
+ &args.uv1,
+ &args.bg_col,
+ &args.tint_col,
+ );
+}
+extern fn zguiImageButton(
+ str_id: [*:0]const u8,
+ user_texture_id: TextureIdent,
+ w: f32,
+ h: f32,
+ uv0: *const [2]f32,
+ uv1: *const [2]f32,
+ bg_col: *const [4]f32,
+ tint_col: *const [4]f32,
+) bool;
+//--------------------------------------------------------------------------------------------------
+/// `pub fn bullet() void`
+pub const bullet = zguiBullet;
+extern fn zguiBullet() void;
+//--------------------------------------------------------------------------------------------------
+pub fn radioButton(label: [:0]const u8, args: struct {
+ active: bool,
+}) bool {
+ return zguiRadioButton(label, args.active);
+}
+extern fn zguiRadioButton(label: [*:0]const u8, active: bool) bool;
+//--------------------------------------------------------------------------------------------------
+pub fn radioButtonStatePtr(label: [:0]const u8, args: struct {
+ v: *i32,
+ v_button: i32,
+}) bool {
+ return zguiRadioButtonStatePtr(label, args.v, args.v_button);
+}
+extern fn zguiRadioButtonStatePtr(label: [*:0]const u8, v: *c_int, v_button: c_int) bool;
+//--------------------------------------------------------------------------------------------------
+pub fn checkbox(label: [:0]const u8, args: struct {
+ v: *bool,
+}) bool {
+ return zguiCheckbox(label, args.v);
+}
+extern fn zguiCheckbox(label: [*:0]const u8, v: *bool) bool;
+//--------------------------------------------------------------------------------------------------
+pub fn checkboxBits(label: [:0]const u8, args: struct {
+ bits: *u32,
+ bits_value: u32,
+}) bool {
+ return zguiCheckboxBits(label, args.bits, args.bits_value);
+}
+extern fn zguiCheckboxBits(label: [*:0]const u8, bits: *c_uint, bits_value: c_uint) bool;
+//--------------------------------------------------------------------------------------------------
+const ProgressBar = struct {
+ fraction: f32,
+ w: f32 = -f32_min,
+ h: f32 = 0.0,
+ overlay: ?[:0]const u8 = null,
+};
+pub fn progressBar(args: ProgressBar) void {
+ zguiProgressBar(args.fraction, args.w, args.h, if (args.overlay) |o| o else null);
+}
+extern fn zguiProgressBar(fraction: f32, w: f32, h: f32, overlay: ?[*:0]const u8) void;
+//--------------------------------------------------------------------------------------------------
+//
+// Widgets: Combo Box
+//
+//--------------------------------------------------------------------------------------------------
+pub fn combo(label: [:0]const u8, args: struct {
+ current_item: *i32,
+ items_separated_by_zeros: [:0]const u8,
+ popup_max_height_in_items: i32 = -1,
+}) bool {
+ return zguiCombo(
+ label,
+ args.current_item,
+ args.items_separated_by_zeros,
+ args.popup_max_height_in_items,
+ );
+}
+/// creates a combo box directly from a pointer to an enum value using zig's
+/// comptime mechanics to infer the items for the list at compile time
+pub fn comboFromEnum(
+ label: [:0]const u8,
+ /// must be a pointer to an enum value (var my_enum: *FoodKinds = .Banana)
+ /// that is backed by some kind of integer that can safely cast into an
+ /// i32 (the underlying imgui restriction)
+ current_item: anytype,
+) bool {
+ const EnumType = @TypeOf(current_item.*);
+ const enum_type_info = switch (@typeInfo(EnumType)) {
+ .Enum => |enum_type_info| enum_type_info,
+ else => @compileError("Error: current_item must be a pointer-to-an-enum, not a " ++ @TypeOf(current_item)),
+ };
+
+ const FieldNameIndex = std.meta.Tuple(&.{ []const u8, i32 });
+ comptime var item_names: [:0]const u8 = "";
+ comptime var field_name_to_index_list: [enum_type_info.fields.len]FieldNameIndex = undefined;
+ comptime var index_to_enum: [enum_type_info.fields.len]EnumType = undefined;
+
+ comptime {
+ for (enum_type_info.fields, 0..) |f, i| {
+ item_names = item_names ++ f.name ++ "\x00";
+ const e: EnumType = @enumFromInt(f.value);
+ field_name_to_index_list[i] = .{ f.name, @intCast(i) };
+ index_to_enum[i] = e;
+ }
+ }
+
+ const field_name_to_index = std.StaticStringMap(i32).initComptime(&field_name_to_index_list);
+ var item: i32 = field_name_to_index.get(@tagName(current_item.*)).?;
+
+ const result = combo(label, .{
+ .items_separated_by_zeros = item_names,
+ .current_item = &item,
+ });
+
+ current_item.* = index_to_enum[@intCast(item)];
+
+ return result;
+}
+extern fn zguiCombo(
+ label: [*:0]const u8,
+ current_item: *c_int,
+ items_separated_by_zeros: [*:0]const u8,
+ popup_max_height_in_items: c_int,
+) bool;
+//--------------------------------------------------------------------------------------------------
+pub const ComboFlags = packed struct(c_int) {
+ popup_align_left: bool = false,
+ height_small: bool = false,
+ height_regular: bool = false,
+ height_large: bool = false,
+ height_largest: bool = false,
+ no_arrow_button: bool = false,
+ no_preview: bool = false,
+ width_fit_preview: bool = false,
+ _padding: u24 = 0,
+};
+//--------------------------------------------------------------------------------------------------
+const BeginCombo = struct {
+ preview_value: [*:0]const u8,
+ flags: ComboFlags = .{},
+};
+pub fn beginCombo(label: [:0]const u8, args: BeginCombo) bool {
+ return zguiBeginCombo(label, args.preview_value, args.flags);
+}
+extern fn zguiBeginCombo(label: [*:0]const u8, preview_value: ?[*:0]const u8, flags: ComboFlags) bool;
+//--------------------------------------------------------------------------------------------------
+/// `pub fn endCombo() void`
+pub const endCombo = zguiEndCombo;
+extern fn zguiEndCombo() void;
+//--------------------------------------------------------------------------------------------------
+//
+// Widgets: Drag Sliders
+//
+//--------------------------------------------------------------------------------------------------
+fn DragFloatGen(comptime T: type) type {
+ return struct {
+ v: *T,
+ speed: f32 = 1.0,
+ min: f32 = 0.0,
+ max: f32 = 0.0,
+ cfmt: [:0]const u8 = "%.3f",
+ flags: SliderFlags = .{},
+ };
+}
+//--------------------------------------------------------------------------------------------------
+const DragFloat = DragFloatGen(f32);
+pub fn dragFloat(label: [:0]const u8, args: DragFloat) bool {
+ return zguiDragFloat(
+ label,
+ args.v,
+ args.speed,
+ args.min,
+ args.max,
+ args.cfmt,
+ args.flags,
+ );
+}
+extern fn zguiDragFloat(
+ label: [*:0]const u8,
+ v: *f32,
+ speed: f32,
+ min: f32,
+ max: f32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+const DragFloat2 = DragFloatGen([2]f32);
+pub fn dragFloat2(label: [:0]const u8, args: DragFloat2) bool {
+ return zguiDragFloat2(label, args.v, args.speed, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiDragFloat2(
+ label: [*:0]const u8,
+ v: *[2]f32,
+ speed: f32,
+ min: f32,
+ max: f32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+const DragFloat3 = DragFloatGen([3]f32);
+pub fn dragFloat3(label: [:0]const u8, args: DragFloat3) bool {
+ return zguiDragFloat3(label, args.v, args.speed, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiDragFloat3(
+ label: [*:0]const u8,
+ v: *[3]f32,
+ speed: f32,
+ min: f32,
+ max: f32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+const DragFloat4 = DragFloatGen([4]f32);
+pub fn dragFloat4(label: [:0]const u8, args: DragFloat4) bool {
+ return zguiDragFloat4(label, args.v, args.speed, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiDragFloat4(
+ label: [*:0]const u8,
+ v: *[4]f32,
+ speed: f32,
+ min: f32,
+ max: f32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+const DragFloatRange2 = struct {
+ current_min: *f32,
+ current_max: *f32,
+ speed: f32 = 1.0,
+ min: f32 = 0.0,
+ max: f32 = 0.0,
+ cfmt: [:0]const u8 = "%.3f",
+ cfmt_max: ?[:0]const u8 = null,
+ flags: SliderFlags = .{},
+};
+pub fn dragFloatRange2(label: [:0]const u8, args: DragFloatRange2) bool {
+ return zguiDragFloatRange2(
+ label,
+ args.current_min,
+ args.current_max,
+ args.speed,
+ args.min,
+ args.max,
+ args.cfmt,
+ if (args.cfmt_max) |fm| fm else null,
+ args.flags,
+ );
+}
+extern fn zguiDragFloatRange2(
+ label: [*:0]const u8,
+ current_min: *f32,
+ current_max: *f32,
+ speed: f32,
+ min: f32,
+ max: f32,
+ cfmt: [*:0]const u8,
+ cfmt_max: ?[*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+fn DragIntGen(comptime T: type) type {
+ return struct {
+ v: *T,
+ speed: f32 = 1.0,
+ min: i32 = 0.0,
+ max: i32 = 0.0,
+ cfmt: [:0]const u8 = "%d",
+ flags: SliderFlags = .{},
+ };
+}
+//--------------------------------------------------------------------------------------------------
+const DragInt = DragIntGen(i32);
+pub fn dragInt(label: [:0]const u8, args: DragInt) bool {
+ return zguiDragInt(label, args.v, args.speed, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiDragInt(
+ label: [*:0]const u8,
+ v: *i32,
+ speed: f32,
+ min: i32,
+ max: i32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+const DragInt2 = DragIntGen([2]i32);
+pub fn dragInt2(label: [:0]const u8, args: DragInt2) bool {
+ return zguiDragInt2(label, args.v, args.speed, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiDragInt2(
+ label: [*:0]const u8,
+ v: *[2]i32,
+ speed: f32,
+ min: i32,
+ max: i32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+const DragInt3 = DragIntGen([3]i32);
+pub fn dragInt3(label: [:0]const u8, args: DragInt3) bool {
+ return zguiDragInt3(label, args.v, args.speed, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiDragInt3(
+ label: [*:0]const u8,
+ v: *[3]i32,
+ speed: f32,
+ min: i32,
+ max: i32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+const DragInt4 = DragIntGen([4]i32);
+pub fn dragInt4(label: [:0]const u8, args: DragInt4) bool {
+ return zguiDragInt4(label, args.v, args.speed, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiDragInt4(
+ label: [*:0]const u8,
+ v: *[4]i32,
+ speed: f32,
+ min: i32,
+ max: i32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+const DragIntRange2 = struct {
+ current_min: *i32,
+ current_max: *i32,
+ speed: f32 = 1.0,
+ min: i32 = 0.0,
+ max: i32 = 0.0,
+ cfmt: [:0]const u8 = "%d",
+ cfmt_max: ?[:0]const u8 = null,
+ flags: SliderFlags = .{},
+};
+pub fn dragIntRange2(label: [:0]const u8, args: DragIntRange2) bool {
+ return zguiDragIntRange2(
+ label,
+ args.current_min,
+ args.current_max,
+ args.speed,
+ args.min,
+ args.max,
+ args.cfmt,
+ if (args.cfmt_max) |fm| fm else null,
+ args.flags,
+ );
+}
+extern fn zguiDragIntRange2(
+ label: [*:0]const u8,
+ current_min: *i32,
+ current_max: *i32,
+ speed: f32,
+ min: i32,
+ max: i32,
+ cfmt: [*:0]const u8,
+ cfmt_max: ?[*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+fn DragScalarGen(comptime T: type) type {
+ return struct {
+ v: *T,
+ speed: f32 = 1.0,
+ min: ?T = null,
+ max: ?T = null,
+ cfmt: ?[:0]const u8 = null,
+ flags: SliderFlags = .{},
+ };
+}
+pub fn dragScalar(label: [:0]const u8, comptime T: type, args: DragScalarGen(T)) bool {
+ return zguiDragScalar(
+ label,
+ typeToDataTypeEnum(T),
+ args.v,
+ args.speed,
+ if (args.min) |vm| &vm else null,
+ if (args.max) |vm| &vm else null,
+ if (args.cfmt) |fmt| fmt else null,
+ args.flags,
+ );
+}
+extern fn zguiDragScalar(
+ label: [*:0]const u8,
+ data_type: DataType,
+ pdata: *anyopaque,
+ speed: f32,
+ pmin: ?*const anyopaque,
+ pmax: ?*const anyopaque,
+ cfmt: ?[*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+fn DragScalarNGen(comptime T: type) type {
+ const ScalarType = @typeInfo(T).Array.child;
+ return struct {
+ v: *T,
+ speed: f32 = 1.0,
+ min: ?ScalarType = null,
+ max: ?ScalarType = null,
+ cfmt: ?[:0]const u8 = null,
+ flags: SliderFlags = .{},
+ };
+}
+pub fn dragScalarN(label: [:0]const u8, comptime T: type, args: DragScalarNGen(T)) bool {
+ const ScalarType = @typeInfo(T).Array.child;
+ const components = @typeInfo(T).Array.len;
+ return zguiDragScalarN(
+ label,
+ typeToDataTypeEnum(ScalarType),
+ args.v,
+ components,
+ args.speed,
+ if (args.min) |vm| &vm else null,
+ if (args.max) |vm| &vm else null,
+ if (args.cfmt) |fmt| fmt else null,
+ args.flags,
+ );
+}
+extern fn zguiDragScalarN(
+ label: [*:0]const u8,
+ data_type: DataType,
+ pdata: *anyopaque,
+ components: i32,
+ speed: f32,
+ pmin: ?*const anyopaque,
+ pmax: ?*const anyopaque,
+ cfmt: ?[*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+//
+// Widgets: Regular Sliders
+//
+//--------------------------------------------------------------------------------------------------
+fn SliderFloatGen(comptime T: type) type {
+ return struct {
+ v: *T,
+ min: f32,
+ max: f32,
+ cfmt: [:0]const u8 = "%.3f",
+ flags: SliderFlags = .{},
+ };
+}
+
+pub fn sliderFloat(label: [:0]const u8, args: SliderFloatGen(f32)) bool {
+ return zguiSliderFloat(label, args.v, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiSliderFloat(
+ label: [*:0]const u8,
+ v: *f32,
+ min: f32,
+ max: f32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+
+pub fn sliderFloat2(label: [:0]const u8, args: SliderFloatGen([2]f32)) bool {
+ return zguiSliderFloat2(label, args.v, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiSliderFloat2(
+ label: [*:0]const u8,
+ v: *[2]f32,
+ min: f32,
+ max: f32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+
+pub fn sliderFloat3(label: [:0]const u8, args: SliderFloatGen([3]f32)) bool {
+ return zguiSliderFloat3(label, args.v, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiSliderFloat3(
+ label: [*:0]const u8,
+ v: *[3]f32,
+ min: f32,
+ max: f32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+
+pub fn sliderFloat4(label: [:0]const u8, args: SliderFloatGen([4]f32)) bool {
+ return zguiSliderFloat4(label, args.v, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiSliderFloat4(
+ label: [*:0]const u8,
+ v: *[4]f32,
+ min: f32,
+ max: f32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+
+//--------------------------------------------------------------------------------------------------
+fn SliderIntGen(comptime T: type) type {
+ return struct {
+ v: *T,
+ min: i32,
+ max: i32,
+ cfmt: [:0]const u8 = "%d",
+ flags: SliderFlags = .{},
+ };
+}
+
+pub fn sliderInt(label: [:0]const u8, args: SliderIntGen(i32)) bool {
+ return zguiSliderInt(label, args.v, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiSliderInt(
+ label: [*:0]const u8,
+ v: *c_int,
+ min: c_int,
+ max: c_int,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+
+pub fn sliderInt2(label: [:0]const u8, args: SliderIntGen([2]i32)) bool {
+ return zguiSliderInt2(label, args.v, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiSliderInt2(
+ label: [*:0]const u8,
+ v: *[2]c_int,
+ min: c_int,
+ max: c_int,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+
+pub fn sliderInt3(label: [:0]const u8, args: SliderIntGen([3]i32)) bool {
+ return zguiSliderInt3(label, args.v, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiSliderInt3(
+ label: [*:0]const u8,
+ v: *[3]c_int,
+ min: c_int,
+ max: c_int,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+
+pub fn sliderInt4(label: [:0]const u8, args: SliderIntGen([4]i32)) bool {
+ return zguiSliderInt4(label, args.v, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiSliderInt4(
+ label: [*:0]const u8,
+ v: *[4]c_int,
+ min: c_int,
+ max: c_int,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+
+//--------------------------------------------------------------------------------------------------
+fn SliderScalarGen(comptime T: type) type {
+ return struct {
+ v: *T,
+ min: T,
+ max: T,
+ cfmt: ?[:0]const u8 = null,
+ flags: SliderFlags = .{},
+ };
+}
+pub fn sliderScalar(label: [:0]const u8, comptime T: type, args: SliderScalarGen(T)) bool {
+ return zguiSliderScalar(
+ label,
+ typeToDataTypeEnum(T),
+ args.v,
+ &args.min,
+ &args.max,
+ if (args.cfmt) |fmt| fmt else null,
+ args.flags,
+ );
+}
+extern fn zguiSliderScalar(
+ label: [*:0]const u8,
+ data_type: DataType,
+ pdata: *anyopaque,
+ pmin: *const anyopaque,
+ pmax: *const anyopaque,
+ cfmt: ?[*:0]const u8,
+ flags: SliderFlags,
+) bool;
+
+//--------------------------------------------------------------------------------------------------
+fn SliderScalarNGen(comptime T: type) type {
+ const ScalarType = @typeInfo(T).Array.child;
+ return struct {
+ v: *T,
+ min: ScalarType,
+ max: ScalarType,
+ cfmt: ?[:0]const u8 = null,
+ flags: SliderFlags = .{},
+ };
+}
+pub fn sliderScalarN(label: [:0]const u8, comptime T: type, args: SliderScalarNGen(T)) bool {
+ const ScalarType = @typeInfo(T).Array.child;
+ const components = @typeInfo(T).Array.len;
+ return zguiSliderScalarN(
+ label,
+ typeToDataTypeEnum(ScalarType),
+ args.v,
+ components,
+ &args.min,
+ &args.max,
+ if (args.cfmt) |fmt| fmt else null,
+ args.flags,
+ );
+}
+extern fn zguiSliderScalarN(
+ label: [*:0]const u8,
+ data_type: DataType,
+ pdata: *anyopaque,
+ components: i32,
+ pmin: *const anyopaque,
+ pmax: *const anyopaque,
+ cfmt: ?[*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+pub fn vsliderFloat(label: [:0]const u8, args: struct {
+ w: f32,
+ h: f32,
+ v: *f32,
+ min: f32,
+ max: f32,
+ cfmt: [:0]const u8 = "%.3f",
+ flags: SliderFlags = .{},
+}) bool {
+ return zguiVSliderFloat(
+ label,
+ args.w,
+ args.h,
+ args.v,
+ args.min,
+ args.max,
+ args.cfmt,
+ args.flags,
+ );
+}
+extern fn zguiVSliderFloat(
+ label: [*:0]const u8,
+ w: f32,
+ h: f32,
+ v: *f32,
+ min: f32,
+ max: f32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+pub fn vsliderInt(label: [:0]const u8, args: struct {
+ w: f32,
+ h: f32,
+ v: *i32,
+ min: i32,
+ max: i32,
+ cfmt: [:0]const u8 = "%d",
+ flags: SliderFlags = .{},
+}) bool {
+ return zguiVSliderInt(label, args.w, args.h, args.v, args.min, args.max, args.cfmt, args.flags);
+}
+extern fn zguiVSliderInt(
+ label: [*:0]const u8,
+ w: f32,
+ h: f32,
+ v: *i32,
+ min: c_int,
+ max: c_int,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+fn VSliderScalarGen(comptime T: type) type {
+ return struct {
+ w: f32,
+ h: f32,
+ v: *T,
+ min: T,
+ max: T,
+ cfmt: ?[:0]const u8 = null,
+ flags: SliderFlags = .{},
+ };
+}
+pub fn vsliderScalar(label: [:0]const u8, comptime T: type, args: VSliderScalarGen(T)) bool {
+ return zguiVSliderScalar(
+ label,
+ args.w,
+ args.h,
+ typeToDataTypeEnum(T),
+ args.v,
+ &args.min,
+ &args.max,
+ if (args.cfmt) |fmt| fmt else null,
+ args.flags,
+ );
+}
+extern fn zguiVSliderScalar(
+ label: [*:0]const u8,
+ w: f32,
+ h: f32,
+ data_type: DataType,
+ pdata: *anyopaque,
+ pmin: *const anyopaque,
+ pmax: *const anyopaque,
+ cfmt: ?[*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+const SliderAngle = struct {
+ vrad: *f32,
+ deg_min: f32 = -360.0,
+ deg_max: f32 = 360.0,
+ cfmt: [:0]const u8 = "%.0f deg",
+ flags: SliderFlags = .{},
+};
+pub fn sliderAngle(label: [:0]const u8, args: SliderAngle) bool {
+ return zguiSliderAngle(
+ label,
+ args.vrad,
+ args.deg_min,
+ args.deg_max,
+ args.cfmt,
+ args.flags,
+ );
+}
+extern fn zguiSliderAngle(
+ label: [*:0]const u8,
+ vrad: *f32,
+ deg_min: f32,
+ deg_max: f32,
+ cfmt: [*:0]const u8,
+ flags: SliderFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+//
+// Widgets: Input with Keyboard
+//
+//--------------------------------------------------------------------------------------------------
+pub const InputTextFlags = packed struct(c_int) {
+ chars_decimal: bool = false,
+ chars_hexadecimal: bool = false,
+ chars_uppercase: bool = false,
+ chars_no_blank: bool = false,
+ auto_select_all: bool = false,
+ enter_returns_true: bool = false,
+ callback_completion: bool = false,
+ callback_history: bool = false,
+ callback_always: bool = false,
+ callback_char_filter: bool = false,
+ allow_tab_input: bool = false,
+ ctrl_enter_for_new_line: bool = false,
+ no_horizontal_scroll: bool = false,
+ always_overwrite: bool = false,
+ read_only: bool = false,
+ password: bool = false,
+ no_undo_redo: bool = false,
+ chars_scientific: bool = false,
+ callback_resize: bool = false,
+ callback_edit: bool = false,
+ escape_clears_all: bool = false,
+ _padding: u11 = 0,
+};
+//--------------------------------------------------------------------------------------------------
+pub const InputTextCallbackData = extern struct {
+ ctx: *Context,
+ event_flag: InputTextFlags,
+ flags: InputTextFlags,
+ user_data: ?*anyopaque,
+ event_char: Wchar,
+ event_key: Key,
+ buf: [*]u8,
+ buf_text_len: i32,
+ buf_size: i32,
+ buf_dirty: bool,
+ cursor_pos: i32,
+ selection_start: i32,
+ selection_end: i32,
+
+ /// `pub fn init() InputTextCallbackData`
+ pub const init = zguiInputTextCallbackData_Init;
+ extern fn zguiInputTextCallbackData_Init() InputTextCallbackData;
+
+ /// `pub fn deleteChars(data: *InputTextCallbackData, pos: i32, bytes_count: i32) void`
+ pub const deleteChars = zguiInputTextCallbackData_DeleteChars;
+ extern fn zguiInputTextCallbackData_DeleteChars(
+ data: *InputTextCallbackData,
+ pos: c_int,
+ bytes_count: c_int,
+ ) void;
+
+ pub fn insertChars(data: *InputTextCallbackData, pos: i32, txt: []const u8) void {
+ zguiInputTextCallbackData_InsertChars(data, pos, txt.ptr, txt.ptr + txt.len);
+ }
+ extern fn zguiInputTextCallbackData_InsertChars(
+ data: *InputTextCallbackData,
+ pos: c_int,
+ text: [*]const u8,
+ text_end: [*]const u8,
+ ) void;
+
+ pub fn selectAll(data: *InputTextCallbackData) void {
+ data.selection_start = 0;
+ data.selection_end = data.buf_text_len;
+ }
+
+ pub fn clearSelection(data: *InputTextCallbackData) void {
+ data.selection_start = data.buf_text_len;
+ data.selection_end = data.buf_text_len;
+ }
+
+ pub fn hasSelection(data: InputTextCallbackData) bool {
+ return data.selection_start != data.selection_end;
+ }
+};
+
+pub const InputTextCallback = *const fn (data: *InputTextCallbackData) i32;
+//--------------------------------------------------------------------------------------------------
+pub fn inputText(label: [:0]const u8, args: struct {
+ buf: [:0]u8,
+ flags: InputTextFlags = .{},
+ callback: ?InputTextCallback = null,
+ user_data: ?*anyopaque = null,
+}) bool {
+ return zguiInputText(
+ label,
+ args.buf.ptr,
+ args.buf.len + 1, // + 1 for sentinel
+ args.flags,
+ if (args.callback) |cb| cb else null,
+ args.user_data,
+ );
+}
+extern fn zguiInputText(
+ label: [*:0]const u8,
+ buf: [*]u8,
+ buf_size: usize,
+ flags: InputTextFlags,
+ callback: ?*const anyopaque,
+ user_data: ?*anyopaque,
+) bool;
+//--------------------------------------------------------------------------------------------------
+pub fn inputTextMultiline(label: [:0]const u8, args: struct {
+ buf: [:0]u8,
+ w: f32 = 0.0,
+ h: f32 = 0.0,
+ flags: InputTextFlags = .{},
+ callback: ?InputTextCallback = null,
+ user_data: ?*anyopaque = null,
+}) bool {
+ return zguiInputTextMultiline(
+ label,
+ args.buf.ptr,
+ args.buf.len + 1, // + 1 for sentinel
+ args.w,
+ args.h,
+ args.flags,
+ if (args.callback) |cb| cb else null,
+ args.user_data,
+ );
+}
+extern fn zguiInputTextMultiline(
+ label: [*:0]const u8,
+ buf: [*]u8,
+ buf_size: usize,
+ w: f32,
+ h: f32,
+ flags: InputTextFlags,
+ callback: ?*const anyopaque,
+ user_data: ?*anyopaque,
+) bool;
+//--------------------------------------------------------------------------------------------------
+pub fn inputTextWithHint(label: [:0]const u8, args: struct {
+ hint: [:0]const u8,
+ buf: [:0]u8,
+ flags: InputTextFlags = .{},
+ callback: ?InputTextCallback = null,
+ user_data: ?*anyopaque = null,
+}) bool {
+ return zguiInputTextWithHint(
+ label,
+ args.hint,
+ args.buf.ptr,
+ args.buf.len + 1, // + 1 for sentinel
+ args.flags,
+ if (args.callback) |cb| cb else null,
+ args.user_data,
+ );
+}
+extern fn zguiInputTextWithHint(
+ label: [*:0]const u8,
+ hint: [*:0]const u8,
+ buf: [*]u8,
+ buf_size: usize,
+ flags: InputTextFlags,
+ callback: ?*const anyopaque,
+ user_data: ?*anyopaque,
+) bool;
+//--------------------------------------------------------------------------------------------------
+pub fn inputFloat(label: [:0]const u8, args: struct {
+ v: *f32,
+ step: f32 = 0.0,
+ step_fast: f32 = 0.0,
+ cfmt: [:0]const u8 = "%.3f",
+ flags: InputTextFlags = .{},
+}) bool {
+ return zguiInputFloat(
+ label,
+ args.v,
+ args.step,
+ args.step_fast,
+ args.cfmt,
+ args.flags,
+ );
+}
+extern fn zguiInputFloat(
+ label: [*:0]const u8,
+ v: *f32,
+ step: f32,
+ step_fast: f32,
+ cfmt: [*:0]const u8,
+ flags: InputTextFlags,
+) bool;
+
+//--------------------------------------------------------------------------------------------------
+fn InputFloatGen(comptime T: type) type {
+ return struct {
+ v: *T,
+ cfmt: [:0]const u8 = "%.3f",
+ flags: InputTextFlags = .{},
+ };
+}
+pub fn inputFloat2(label: [:0]const u8, args: InputFloatGen([2]f32)) bool {
+ return zguiInputFloat2(label, args.v, args.cfmt, args.flags);
+}
+extern fn zguiInputFloat2(
+ label: [*:0]const u8,
+ v: *[2]f32,
+ cfmt: [*:0]const u8,
+ flags: InputTextFlags,
+) bool;
+
+pub fn inputFloat3(label: [:0]const u8, args: InputFloatGen([3]f32)) bool {
+ return zguiInputFloat3(label, args.v, args.cfmt, args.flags);
+}
+extern fn zguiInputFloat3(
+ label: [*:0]const u8,
+ v: *[3]f32,
+ cfmt: [*:0]const u8,
+ flags: InputTextFlags,
+) bool;
+
+pub fn inputFloat4(label: [:0]const u8, args: InputFloatGen([4]f32)) bool {
+ return zguiInputFloat4(label, args.v, args.cfmt, args.flags);
+}
+extern fn zguiInputFloat4(
+ label: [*:0]const u8,
+ v: *[4]f32,
+ cfmt: [*:0]const u8,
+ flags: InputTextFlags,
+) bool;
+
+//--------------------------------------------------------------------------------------------------
+pub fn inputInt(label: [:0]const u8, args: struct {
+ v: *i32,
+ step: i32 = 1,
+ step_fast: i32 = 100,
+ flags: InputTextFlags = .{},
+}) bool {
+ return zguiInputInt(label, args.v, args.step, args.step_fast, args.flags);
+}
+extern fn zguiInputInt(
+ label: [*:0]const u8,
+ v: *c_int,
+ step: c_int,
+ step_fast: c_int,
+ flags: InputTextFlags,
+) bool;
+
+//--------------------------------------------------------------------------------------------------
+fn InputIntGen(comptime T: type) type {
+ return struct {
+ v: *T,
+ flags: InputTextFlags = .{},
+ };
+}
+pub fn inputInt2(label: [:0]const u8, args: InputIntGen([2]i32)) bool {
+ return zguiInputInt2(label, args.v, args.flags);
+}
+extern fn zguiInputInt2(label: [*:0]const u8, v: *[2]c_int, flags: InputTextFlags) bool;
+
+pub fn inputInt3(label: [:0]const u8, args: InputIntGen([3]i32)) bool {
+ return zguiInputInt3(label, args.v, args.flags);
+}
+extern fn zguiInputInt3(label: [*:0]const u8, v: *[3]c_int, flags: InputTextFlags) bool;
+
+pub fn inputInt4(label: [:0]const u8, args: InputIntGen([4]i32)) bool {
+ return zguiInputInt4(label, args.v, args.flags);
+}
+extern fn zguiInputInt4(label: [*:0]const u8, v: *[4]c_int, flags: InputTextFlags) bool;
+
+//--------------------------------------------------------------------------------------------------
+const InputDouble = struct {
+ v: *f64,
+ step: f64 = 0.0,
+ step_fast: f64 = 0.0,
+ cfmt: [:0]const u8 = "%.6f",
+ flags: InputTextFlags = .{},
+};
+pub fn inputDouble(label: [:0]const u8, args: InputDouble) bool {
+ return zguiInputDouble(label, args.v, args.step, args.step_fast, args.cfmt, args.flags);
+}
+extern fn zguiInputDouble(
+ label: [*:0]const u8,
+ v: *f64,
+ step: f64,
+ step_fast: f64,
+ cfmt: [*:0]const u8,
+ flags: InputTextFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+fn InputScalarGen(comptime T: type) type {
+ return struct {
+ v: *T,
+ step: ?T = null,
+ step_fast: ?T = null,
+ cfmt: ?[:0]const u8 = null,
+ flags: InputTextFlags = .{},
+ };
+}
+pub fn inputScalar(label: [:0]const u8, comptime T: type, args: InputScalarGen(T)) bool {
+ return zguiInputScalar(
+ label,
+ typeToDataTypeEnum(T),
+ args.v,
+ if (args.step) |s| &s else null,
+ if (args.step_fast) |sf| &sf else null,
+ if (args.cfmt) |fmt| fmt else null,
+ args.flags,
+ );
+}
+extern fn zguiInputScalar(
+ label: [*:0]const u8,
+ data_type: DataType,
+ pdata: *anyopaque,
+ pstep: ?*const anyopaque,
+ pstep_fast: ?*const anyopaque,
+ cfmt: ?[*:0]const u8,
+ flags: InputTextFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+fn InputScalarNGen(comptime T: type) type {
+ const ScalarType = @typeInfo(T).Array.child;
+ return struct {
+ v: *T,
+ step: ?ScalarType = null,
+ step_fast: ?ScalarType = null,
+ cfmt: ?[:0]const u8 = null,
+ flags: InputTextFlags = .{},
+ };
+}
+pub fn inputScalarN(label: [:0]const u8, comptime T: type, args: InputScalarNGen(T)) bool {
+ const ScalarType = @typeInfo(T).Array.child;
+ const components = @typeInfo(T).Array.len;
+ return zguiInputScalarN(
+ label,
+ typeToDataTypeEnum(ScalarType),
+ args.v,
+ components,
+ if (args.step) |s| &s else null,
+ if (args.step_fast) |sf| &sf else null,
+ if (args.cfmt) |fmt| fmt else null,
+ args.flags,
+ );
+}
+extern fn zguiInputScalarN(
+ label: [*:0]const u8,
+ data_type: DataType,
+ pdata: *anyopaque,
+ components: i32,
+ pstep: ?*const anyopaque,
+ pstep_fast: ?*const anyopaque,
+ cfmt: ?[*:0]const u8,
+ flags: InputTextFlags,
+) bool;
+//--------------------------------------------------------------------------------------------------
+//
+// Widgets: Color Editor/Picker
+//
+//--------------------------------------------------------------------------------------------------
+pub const ColorEditFlags = packed struct(c_int) {
+ _reserved0: bool = false,
+ no_alpha: bool = false,
+ no_picker: bool = false,
+ no_options: bool = false,
+ no_small_preview: bool = false,
+ no_inputs: bool = false,
+ no_tooltip: bool = false,
+ no_label: bool = false,
+ no_side_preview: bool = false,
+ no_drag_drop: bool = false,
+ no_border: bool = false,
+
+ _reserved1: bool = false,
+ _reserved2: bool = false,
+ _reserved3: bool = false,
+ _reserved4: bool = false,
+ _reserved5: bool = false,
+
+ alpha_bar: bool = false,
+ alpha_preview: bool = false,
+ alpha_preview_half: bool = false,
+ hdr: bool = false,
+ display_rgb: bool = false,
+ display_hsv: bool = false,
+ display_hex: bool = false,
+ uint8: bool = false,
+ float: bool = false,
+ picker_hue_bar: bool = false,
+ picker_hue_wheel: bool = false,
+ input_rgb: bool = false,
+ input_hsv: bool = false,
+
+ _padding: u3 = 0,
+
+ pub const default_options = ColorEditFlags{
+ .uint8 = true,
+ .display_rgb = true,
+ .input_rgb = true,
+ .picker_hue_bar = true,
+ };
+};
+//--------------------------------------------------------------------------------------------------
+const ColorEdit3 = struct {
+ col: *[3]f32,
+ flags: ColorEditFlags = .{},
+};
+pub fn colorEdit3(label: [:0]const u8, args: ColorEdit3) bool {
+ return zguiColorEdit3(label, args.col, args.flags);
+}
+extern fn zguiColorEdit3(label: [*:0]const u8, col: *[3]f32, flags: ColorEditFlags) bool;
+//--------------------------------------------------------------------------------------------------
+const ColorEdit4 = struct {
+ col: *[4]f32,
+ flags: ColorEditFlags = .{},
+};
+pub fn colorEdit4(label: [:0]const u8, args: ColorEdit4) bool {
+ return zguiColorEdit4(label, args.col, args.flags);
+}
+extern fn zguiColorEdit4(label: [*:0]const u8, col: *[4]f32, flags: ColorEditFlags) bool;
+//--------------------------------------------------------------------------------------------------
+const ColorPicker3 = struct {
+ col: *[3]f32,
+ flags: ColorEditFlags = .{},
+};
+pub fn colorPicker3(label: [:0]const u8, args: ColorPicker3) bool {
+ return zguiColorPicker3(label, args.col, args.flags);
+}
+extern fn zguiColorPicker3(label: [*:0]const u8, col: *[3]f32, flags: ColorEditFlags) bool;
+//--------------------------------------------------------------------------------------------------
+const ColorPicker4 = struct {
+ col: *[4]f32,
+ flags: ColorEditFlags = .{},
+ ref_col: ?[*]const f32 = null,
+};
+pub fn colorPicker4(label: [:0]const u8, args: ColorPicker4) bool {
+ return zguiColorPicker4(
+ label,
+ args.col,
+ args.flags,
+ if (args.ref_col) |rc| rc else null,
+ );
+}
+extern fn zguiColorPicker4(
+ label: [*:0]const u8,
+ col: *[4]f32,
+ flags: ColorEditFlags,
+ ref_col: ?[*]const f32,
+) bool;
+//--------------------------------------------------------------------------------------------------
+const ColorButton = struct {
+ col: [4]f32,
+ flags: ColorEditFlags = .{},
+ w: f32 = 0.0,
+ h: f32 = 0.0,
+};
+pub fn colorButton(desc_id: [:0]const u8, args: ColorButton) bool {
+ return zguiColorButton(desc_id, &args.col, args.flags, args.w, args.h);
+}
+extern fn zguiColorButton(
+ desc_id: [*:0]const u8,
+ col: *const [4]f32,
+ flags: ColorEditFlags,
+ w: f32,
+ h: f32,
+) bool;
+//--------------------------------------------------------------------------------------------------
+//
+// Widgets: Trees
+//
+//--------------------------------------------------------------------------------------------------
+pub const TreeNodeFlags = packed struct(c_int) {
+ selected: bool = false,
+ framed: bool = false,
+ allow_overlap: bool = false,
+ no_tree_push_on_open: bool = false,
+ no_auto_open_on_log: bool = false,
+ default_open: bool = false,
+ open_on_double_click: bool = false,
+ open_on_arrow: bool = false,
+ leaf: bool = false,
+ bullet: bool = false,
+ frame_padding: bool = false,
+ span_avail_width: bool = false,
+ span_full_width: bool = false,
+ span_all_columns: bool = false,
+ nav_left_jumps_back_here: bool = false,
+ _padding: u17 = 0,
+
+ pub const collapsing_header = TreeNodeFlags{
+ .framed = true,
+ .no_tree_push_on_open = true,
+ .no_auto_open_on_log = true,
+ };
+};
+//--------------------------------------------------------------------------------------------------
+pub fn treeNode(label: [:0]const u8) bool {
+ return zguiTreeNode(label);
+}
+pub fn treeNodeFlags(label: [:0]const u8, flags: TreeNodeFlags) bool {
+ return zguiTreeNodeFlags(label, flags);
+}
+extern fn zguiTreeNode(label: [*:0]const u8) bool;
+extern fn zguiTreeNodeFlags(label: [*:0]const u8, flags: TreeNodeFlags) bool;
+//--------------------------------------------------------------------------------------------------
+pub fn treeNodeStrId(str_id: [:0]const u8, comptime fmt: []const u8, args: anytype) bool {
+ return zguiTreeNodeStrId(str_id, "%s", formatZ(fmt, args).ptr);
+}
+pub fn treeNodeStrIdFlags(
+ str_id: [:0]const u8,
+ flags: TreeNodeFlags,
+ comptime fmt: []const u8,
+ args: anytype,
+) bool {
+ return zguiTreeNodeStrIdFlags(str_id, flags, "%s", formatZ(fmt, args).ptr);
+}
+extern fn zguiTreeNodeStrId(str_id: [*:0]const u8, fmt: [*:0]const u8, ...) bool;
+extern fn zguiTreeNodeStrIdFlags(
+ str_id: [*:0]const u8,
+ flags: TreeNodeFlags,
+ fmt: [*:0]const u8,
+ ...,
+) bool;
+//--------------------------------------------------------------------------------------------------
+pub fn treeNodePtrId(ptr_id: *const anyopaque, comptime fmt: []const u8, args: anytype) bool {
+ return zguiTreeNodePtrId(ptr_id, "%s", formatZ(fmt, args).ptr);
+}
+pub fn treeNodePtrIdFlags(
+ ptr_id: *const anyopaque,
+ flags: TreeNodeFlags,
+ comptime fmt: []const u8,
+ args: anytype,
+) bool {
+ return zguiTreeNodePtrIdFlags(ptr_id, flags, "%s", formatZ(fmt, args).ptr);
+}
+extern fn zguiTreeNodePtrId(ptr_id: *const anyopaque, fmt: [*:0]const u8, ...) bool;
+extern fn zguiTreeNodePtrIdFlags(
+ ptr_id: *const anyopaque,
+ flags: TreeNodeFlags,
+ fmt: [*:0]const u8,
+ ...,
+) bool;
+//--------------------------------------------------------------------------------------------------
+pub fn treePushStrId(str_id: [:0]const u8) void {
+ zguiTreePushStrId(str_id);
+}
+pub fn treePushPtrId(ptr_id: *const anyopaque) void {
+ zguiTreePushPtrId(ptr_id);
+}
+extern fn zguiTreePushStrId(str_id: [*:0]const u8) void;
+extern fn zguiTreePushPtrId(ptr_id: *const anyopaque) void;
+//--------------------------------------------------------------------------------------------------
+/// `pub fn treePop() void`
+pub const treePop = zguiTreePop;
+extern fn zguiTreePop() void;
+//--------------------------------------------------------------------------------------------------
+const CollapsingHeaderStatePtr = struct {
+ pvisible: *bool,
+ flags: TreeNodeFlags = .{},
+};
+pub fn collapsingHeader(label: [:0]const u8, flags: TreeNodeFlags) bool {
+ return zguiCollapsingHeader(label, flags);
+}
+pub fn collapsingHeaderStatePtr(label: [:0]const u8, args: CollapsingHeaderStatePtr) bool {
+ return zguiCollapsingHeaderStatePtr(label, args.pvisible, args.flags);
+}
+extern fn zguiCollapsingHeader(label: [*:0]const u8, flags: TreeNodeFlags) bool;
+extern fn zguiCollapsingHeaderStatePtr(label: [*:0]const u8, pvisible: *bool, flags: TreeNodeFlags) bool;
+//--------------------------------------------------------------------------------------------------
+const SetNextItemOpen = struct {
+ is_open: bool,
+ cond: Condition = .none,
+};
+pub fn setNextItemOpen(args: SetNextItemOpen) void {
+ zguiSetNextItemOpen(args.is_open, args.cond);
+}
+extern fn zguiSetNextItemOpen(is_open: bool, cond: Condition) void;
+//--------------------------------------------------------------------------------------------------
+//
+// Selectables
+//
+//--------------------------------------------------------------------------------------------------
+pub const SelectableFlags = packed struct(c_int) {
+ dont_close_popups: bool = false,
+ span_all_columns: bool = false,
+ allow_double_click: bool = false,
+ disabled: bool = false,
+ allow_overlap: bool = false,
+ _padding: u27 = 0,
+};
+//--------------------------------------------------------------------------------------------------
+const Selectable = struct {
+ selected: bool = false,
+ flags: SelectableFlags = .{},
+ w: f32 = 0,
+ h: f32 = 0,
+};
+pub fn selectable(label: [:0]const u8, args: Selectable) bool {
+ return zguiSelectable(label, args.selected, args.flags, args.w, args.h);
+}
+extern fn zguiSelectable(
+ label: [*:0]const u8,
+ selected: bool,
+ flags: SelectableFlags,
+ w: f32,
+ h: f32,
+) bool;
+//--------------------------------------------------------------------------------------------------
+const SelectableStatePtr = struct {
+ pselected: *bool,
+ flags: SelectableFlags = .{},
+ w: f32 = 0,
+ h: f32 = 0,
+};
+pub fn selectableStatePtr(label: [:0]const u8, args: SelectableStatePtr) bool {
+ return zguiSelectableStatePtr(label, args.pselected, args.flags, args.w, args.h);
+}
+extern fn zguiSelectableStatePtr(
+ label: [*:0]const u8,
+ pselected: *bool,
+ flags: SelectableFlags,
+ w: f32,
+ h: f32,
+) bool;
+//--------------------------------------------------------------------------------------------------
+//
+// Widgets: List Boxes
+//
+//--------------------------------------------------------------------------------------------------
+const BeginListBox = struct {
+ w: f32 = 0.0,
+ h: f32 = 0.0,
+};
+pub fn beginListBox(label: [:0]const u8, args: BeginListBox) bool {
+ return zguiBeginListBox(label, args.w, args.h);
+}
+/// `pub fn endListBox() void`
+pub const endListBox = zguiEndListBox;
+extern fn zguiBeginListBox(label: [*:0]const u8, w: f32, h: f32) bool;
+extern fn zguiEndListBox() void;
+//--------------------------------------------------------------------------------------------------
+//
+// Widgets: Tables
+//
+//--------------------------------------------------------------------------------------------------
+pub const TableBorderFlags = packed struct(u4) {
+ inner_h: bool = false,
+ outer_h: bool = false,
+ inner_v: bool = false,
+ outer_v: bool = false,
+
+ pub const h = TableBorderFlags{
+ .inner_h = true,
+ .outer_h = true,
+ }; // Draw horizontal borders.
+ pub const v = TableBorderFlags{
+ .inner_v = true,
+ .outer_v = true,
+ }; // Draw vertical borders.
+ pub const inner = TableBorderFlags{
+ .inner_v = true,
+ .inner_h = true,
+ }; // Draw inner borders.
+ pub const outer = TableBorderFlags{
+ .outer_v = true,
+ .outer_h = true,
+ }; // Draw outer borders.
+ pub const all = TableBorderFlags{
+ .inner_v = true,
+ .inner_h = true,
+ .outer_v = true,
+ .outer_h = true,
+ }; // Draw all borders.
+};
+pub const TableFlags = packed struct(c_int) {
+ resizable: bool = false,
+ reorderable: bool = false,
+ hideable: bool = false,
+ sortable: bool = false,
+ no_saved_settings: bool = false,
+ context_menu_in_body: bool = false,
+ row_bg: bool = false,
+ borders: TableBorderFlags = .{},
+ no_borders_in_body: bool = false,
+ no_borders_in_body_until_resize: bool = false,
+
+ // Sizing Policy
+ sizing: enum(u3) {
+ none = 0,
+ fixed_fit = 1,
+ fixed_same = 2,
+ stretch_prop = 3,
+ stretch_same = 4,
+ } = .none,
+
+ // Sizing Extra Options
+ no_host_extend_x: bool = false,
+ no_host_extend_y: bool = false,
+ no_keep_columns_visible: bool = false,
+ precise_widths: bool = false,
+
+ // Clipping
+ no_clip: bool = false,
+
+ // Padding
+ pad_outer_x: bool = false,
+ no_pad_outer_x: bool = false,
+ no_pad_inner_x: bool = false,
+
+ // Scrolling
+ scroll_x: bool = false,
+ scroll_y: bool = false,
+
+ // Sorting
+ sort_multi: bool = false,
+ sort_tristate: bool = false,
+
+ _padding: u4 = 0,
+};
+
+pub const TableRowFlags = packed struct(c_int) {
+ headers: bool = false,
+
+ _padding: u31 = 0,
+};
+
+pub const TableColumnFlags = packed struct(c_int) {
+ // Input configuration flags
+ disabled: bool = false,
+ default_hide: bool = false,
+ default_sort: bool = false,
+ width_stretch: bool = false,
+ width_fixed: bool = false,
+ no_resize: bool = false,
+ no_reorder: bool = false,
+ no_hide: bool = false,
+ no_clip: bool = false,
+ no_sort: bool = false,
+ no_sort_ascending: bool = false,
+ no_sort_descending: bool = false,
+ no_header_label: bool = false,
+ no_header_width: bool = false,
+ prefer_sort_ascending: bool = false,
+ prefer_sort_descending: bool = false,
+ indent_enable: bool = false,
+ indent_disable: bool = false,
+
+ _padding0: u6 = 0,
+
+ // Output status flags, read-only via TableGetColumnFlags()
+ is_enabled: bool = false,
+ is_visible: bool = false,
+ is_sorted: bool = false,
+ is_hovered: bool = false,
+
+ _padding1: u4 = 0,
+};
+
+pub const TableColumnSortSpecs = extern struct {
+ user_id: Ident,
+ index: i16,
+ sort_order: i16,
+ sort_direction: enum(u8) {
+ none = 0,
+ ascending = 1, // Ascending = 0->9, A->Z etc.
+ descending = 2, // Descending = 9->0, Z->A etc.
+ },
+};
+
+pub const TableSortSpecs = *extern struct {
+ specs: [*]TableColumnSortSpecs,
+ count: c_int,
+ dirty: bool,
+};
+
+pub const TableBgTarget = enum(c_int) {
+ none = 0,
+ row_bg0 = 1,
+ row_bg1 = 2,
+ cell_bg = 3,
+};
+
+pub fn beginTable(name: [:0]const u8, args: struct {
+ column: i32,
+ flags: TableFlags = .{},
+ outer_size: [2]f32 = .{ 0, 0 },
+ inner_width: f32 = 0,
+}) bool {
+ return zguiBeginTable(name, args.column, args.flags, &args.outer_size, args.inner_width);
+}
+extern fn zguiBeginTable(
+ str_id: [*:0]const u8,
+ column: c_int,
+ flags: TableFlags,
+ outer_size: *const [2]f32,
+ inner_width: f32,
+) bool;
+
+pub fn endTable() void {
+ zguiEndTable();
+}
+extern fn zguiEndTable() void;
+
+pub const TableNextRow = struct {
+ row_flags: TableRowFlags = .{},
+ min_row_height: f32 = 0,
+};
+pub fn tableNextRow(args: TableNextRow) void {
+ zguiTableNextRow(args.row_flags, args.min_row_height);
+}
+extern fn zguiTableNextRow(row_flags: TableRowFlags, min_row_height: f32) void;
+
+pub const tableNextColumn = zguiTableNextColumn;
+extern fn zguiTableNextColumn() bool;
+
+pub const tableSetColumnIndex = zguiTableSetColumnIndex;
+extern fn zguiTableSetColumnIndex(column_n: i32) bool;
+
+pub const TableSetupColumn = struct {
+ flags: TableColumnFlags = .{},
+ init_width_or_height: f32 = 0,
+ user_id: Ident = 0,
+};
+pub fn tableSetupColumn(label: [:0]const u8, args: TableSetupColumn) void {
+ zguiTableSetupColumn(label, args.flags, args.init_width_or_height, args.user_id);
+}
+extern fn zguiTableSetupColumn(label: [*:0]const u8, flags: TableColumnFlags, init_width_or_height: f32, user_id: Ident) void;
+
+pub const tableSetupScrollFreeze = zguiTableSetupScrollFreeze;
+extern fn zguiTableSetupScrollFreeze(cols: i32, rows: i32) void;
+
+pub const tableHeadersRow = zguiTableHeadersRow;
+extern fn zguiTableHeadersRow() void;
+
+pub fn tableHeader(label: [:0]const u8) void {
+ zguiTableHeader(label);
+}
+extern fn zguiTableHeader(label: [*:0]const u8) void;
+
+pub const tableGetSortSpecs = zguiTableGetSortSpecs;
+extern fn zguiTableGetSortSpecs() ?TableSortSpecs;
+
+pub const tableGetColumnCount = zguiTableGetColumnCount;
+extern fn zguiTableGetColumnCount() i32;
+
+pub const tableGetColumnIndex = zguiTableGetColumnIndex;
+extern fn zguiTableGetColumnIndex() i32;
+
+pub const tableGetRowIndex = zguiTableGetRowIndex;
+extern fn zguiTableGetRowIndex() i32;
+
+pub const TableGetColumnName = struct {
+ column_n: i32 = -1,
+};
+pub fn tableGetColumnName(args: TableGetColumnName) [*:0]const u8 {
+ return zguiTableGetColumnName(args.column_n);
+}
+extern fn zguiTableGetColumnName(column_n: i32) [*:0]const u8;
+
+pub const TableGetColumnFlags = struct {
+ column_n: i32 = -1,
+};
+pub fn tableGetColumnFlags(args: TableGetColumnFlags) TableColumnFlags {
+ return zguiTableGetColumnFlags(args.column_n);
+}
+extern fn zguiTableGetColumnFlags(column_n: i32) TableColumnFlags;
+
+pub const tableSetColumnEnabled = zguiTableSetColumnEnabled;
+extern fn zguiTableSetColumnEnabled(column_n: i32, v: bool) void;
+
+pub fn tableSetBgColor(args: struct {
+ target: TableBgTarget,
+ color: u32,
+ column_n: i32 = -1,
+}) void {
+ zguiTableSetBgColor(args.target, args.color, args.column_n);
+}
+extern fn zguiTableSetBgColor(target: TableBgTarget, color: c_uint, column_n: c_int) void;
+
+//--------------------------------------------------------------------------------------------------
+//
+// Item/Widgets Utilities and Query Functions
+//
+//--------------------------------------------------------------------------------------------------
+pub fn isItemHovered(flags: HoveredFlags) bool {
+ return zguiIsItemHovered(flags);
+}
+/// `pub fn isItemActive() bool`
+pub const isItemActive = zguiIsItemActive;
+/// `pub fn isItemFocused() bool`
+pub const isItemFocused = zguiIsItemFocused;
+pub const MouseButton = enum(u32) {
+ left = 0,
+ right = 1,
+ middle = 2,
+};
+
+/// `pub fn isMouseDown(mouse_button: MouseButton) bool`
+pub const isMouseDown = zguiIsMouseDown;
+/// `pub fn isMouseClicked(mouse_button: MouseButton) bool`
+pub const isMouseClicked = zguiIsMouseClicked;
+/// `pub fn isMouseDoubleClicked(mouse_button: MouseButton) bool`
+pub const isMouseDoubleClicked = zguiIsMouseDoubleClicked;
+/// `pub fn isItemClicked(mouse_button: MouseButton) bool`
+pub const isItemClicked = zguiIsItemClicked;
+/// `pub fn isItemVisible() bool`
+pub const isItemVisible = zguiIsItemVisible;
+/// `pub fn isItemEdited() bool`
+pub const isItemEdited = zguiIsItemEdited;
+/// `pub fn isItemActivated() bool`
+pub const isItemActivated = zguiIsItemActivated;
+/// `pub fn isItemDeactivated bool`
+pub const isItemDeactivated = zguiIsItemDeactivated;
+/// `pub fn isItemDeactivatedAfterEdit() bool`
+pub const isItemDeactivatedAfterEdit = zguiIsItemDeactivatedAfterEdit;
+/// `pub fn isItemToggledOpen() bool`
+pub const isItemToggledOpen = zguiIsItemToggledOpen;
+/// `pub fn isAnyItemHovered() bool`
+pub const isAnyItemHovered = zguiIsAnyItemHovered;
+/// `pub fn isAnyItemActive() bool`
+pub const isAnyItemActive = zguiIsAnyItemActive;
+/// `pub fn isAnyItemFocused() bool`
+pub const isAnyItemFocused = zguiIsAnyItemFocused;
+extern fn zguiIsMouseDown(mouse_button: MouseButton) bool;
+extern fn zguiIsMouseClicked(mouse_button: MouseButton) bool;
+extern fn zguiIsMouseDoubleClicked(mouse_button: MouseButton) bool;
+extern fn zguiIsItemHovered(flags: HoveredFlags) bool;
+extern fn zguiIsItemActive() bool;
+extern fn zguiIsItemFocused() bool;
+extern fn zguiIsItemClicked(mouse_button: MouseButton) bool;
+extern fn zguiIsItemVisible() bool;
+extern fn zguiIsItemEdited() bool;
+extern fn zguiIsItemActivated() bool;
+extern fn zguiIsItemDeactivated() bool;
+extern fn zguiIsItemDeactivatedAfterEdit() bool;
+extern fn zguiIsItemToggledOpen() bool;
+extern fn zguiIsAnyItemHovered() bool;
+extern fn zguiIsAnyItemActive() bool;
+extern fn zguiIsAnyItemFocused() bool;
+//--------------------------------------------------------------------------------------------------
+//
+// Color Utilities
+//
+//--------------------------------------------------------------------------------------------------
+pub fn colorConvertU32ToFloat4(in: u32) [4]f32 {
+ var rgba: [4]f32 = undefined;
+ zguiColorConvertU32ToFloat4(in, &rgba);
+ return rgba;
+}
+
+pub fn colorConvertU32ToFloat3(in: u32) [3]f32 {
+ var rgba: [4]f32 = undefined;
+ zguiColorConvertU32ToFloat4(in, &rgba);
+ return .{ rgba[0], rgba[1], rgba[2] };
+}
+
+pub fn colorConvertFloat4ToU32(in: [4]f32) u32 {
+ return zguiColorConvertFloat4ToU32(&in);
+}
+
+pub fn colorConvertFloat3ToU32(in: [3]f32) u32 {
+ return colorConvertFloat4ToU32(.{ in[0], in[1], in[2], 1 });
+}
+
+pub fn colorConvertRgbToHsv(r: f32, g: f32, b: f32) [3]f32 {
+ var hsv: [3]f32 = undefined;
+ zguiColorConvertRGBtoHSV(r, g, b, &hsv[0], &hsv[1], &hsv[2]);
+ return hsv;
+}
+
+pub fn colorConvertHsvToRgb(h: f32, s: f32, v: f32) [3]f32 {
+ var rgb: [3]f32 = undefined;
+ zguiColorConvertHSVtoRGB(h, s, v, &rgb[0], &rgb[1], &rgb[2]);
+ return rgb;
+}
+
+extern fn zguiColorConvertU32ToFloat4(in: u32, rgba: *[4]f32) void;
+extern fn zguiColorConvertFloat4ToU32(in: *const [4]f32) u32;
+extern fn zguiColorConvertRGBtoHSV(r: f32, g: f32, b: f32, out_h: *f32, out_s: *f32, out_v: *f32) void;
+extern fn zguiColorConvertHSVtoRGB(h: f32, s: f32, v: f32, out_r: *f32, out_g: *f32, out_b: *f32) void;
+//--------------------------------------------------------------------------------------------------
+//
+// Inputs Utilities: Keyboard
+//
+//--------------------------------------------------------------------------------------------------
+pub fn isKeyDown(key: Key) bool {
+ return zguiIsKeyDown(key);
+}
+
+extern fn zguiIsKeyDown(key: Key) bool;
+//--------------------------------------------------------------------------------------------------
+//
+// Helpers
+//
+//--------------------------------------------------------------------------------------------------
+var temp_buffer: ?std.ArrayList(u8) = null;
+
+pub fn format(comptime fmt: []const u8, args: anytype) []const u8 {
+ const len = std.fmt.count(fmt, args);
+ if (len > temp_buffer.?.items.len) temp_buffer.?.resize(len + 64) catch unreachable;
+ return std.fmt.bufPrint(temp_buffer.?.items, fmt, args) catch unreachable;
+}
+pub fn formatZ(comptime fmt: []const u8, args: anytype) [:0]const u8 {
+ const len = std.fmt.count(fmt ++ "\x00", args);
+ if (len > temp_buffer.?.items.len) temp_buffer.?.resize(len + 64) catch unreachable;
+ return std.fmt.bufPrintZ(temp_buffer.?.items, fmt, args) catch unreachable;
+}
+//--------------------------------------------------------------------------------------------------
+pub fn typeToDataTypeEnum(comptime T: type) DataType {
+ return switch (T) {
+ i8 => .I8,
+ u8 => .U8,
+ i16 => .I16,
+ u16 => .U16,
+ i32 => .I32,
+ u32 => .U32,
+ i64 => .I64,
+ u64 => .U64,
+ f32 => .F32,
+ f64 => .F64,
+ usize => switch (@sizeOf(usize)) {
+ 1 => .U8,
+ 2 => .U16,
+ 4 => .U32,
+ 8 => .U64,
+ else => @compileError("Unsupported usize length"),
+ },
+ else => @compileError("Only fundamental scalar types allowed: " ++ @typeName(T)),
+ };
+}
+//--------------------------------------------------------------------------------------------------
+//
+// Menus
+//
+//--------------------------------------------------------------------------------------------------
+/// `pub fn beginMenuBar() bool`
+pub const beginMenuBar = zguiBeginMenuBar;
+/// `pub fn endMenuBar() void`
+pub const endMenuBar = zguiEndMenuBar;
+/// `pub fn beginMainMenuBar() bool`
+pub const beginMainMenuBar = zguiBeginMainMenuBar;
+/// `pub fn endMainMenuBar() void`
+pub const endMainMenuBar = zguiEndMainMenuBar;
+
+pub fn beginMenu(label: [:0]const u8, enabled: bool) bool {
+ return zguiBeginMenu(label, enabled);
+}
+/// `pub fn endMenu() void`
+pub const endMenu = zguiEndMenu;
+
+const MenuItem = struct {
+ shortcut: ?[:0]const u8 = null,
+ selected: bool = false,
+ enabled: bool = true,
+};
+pub fn menuItem(label: [:0]const u8, args: MenuItem) bool {
+ return zguiMenuItem(label, if (args.shortcut) |s| s.ptr else null, args.selected, args.enabled);
+}
+
+const MenuItemPtr = struct {
+ shortcut: ?[:0]const u8 = null,
+ selected: *bool,
+ enabled: bool = true,
+};
+pub fn menuItemPtr(label: [:0]const u8, args: MenuItemPtr) bool {
+ return zguiMenuItemPtr(label, if (args.shortcut) |s| s.ptr else null, args.selected, args.enabled);
+}
+
+extern fn zguiBeginMenuBar() bool;
+extern fn zguiEndMenuBar() void;
+extern fn zguiBeginMainMenuBar() bool;
+extern fn zguiEndMainMenuBar() void;
+extern fn zguiBeginMenu(label: [*:0]const u8, enabled: bool) bool;
+extern fn zguiEndMenu() void;
+extern fn zguiMenuItem(label: [*:0]const u8, shortcut: ?[*:0]const u8, selected: bool, enabled: bool) bool;
+extern fn zguiMenuItemPtr(label: [*:0]const u8, shortcut: ?[*:0]const u8, selected: *bool, enabled: bool) bool;
+//--------------------------------------------------------------------------------------------------
+//
+// Popups
+//
+//--------------------------------------------------------------------------------------------------
+/// `pub fn beginTooltip() bool`
+pub const beginTooltip = zguiBeginTooltip;
+/// `pub fn endTooltip() void`
+pub const endTooltip = zguiEndTooltip;
+extern fn zguiBeginTooltip() bool;
+extern fn zguiEndTooltip() void;
+
+/// `pub fn beginPopupContextWindow() bool`
+pub const beginPopupContextWindow = zguiBeginPopupContextWindow;
+/// `pub fn beginPopupContextItem() bool`
+pub const beginPopupContextItem = zguiBeginPopupContextItem;
+pub const PopupFlags = packed struct(c_int) {
+ mouse_button_left: bool = false,
+ mouse_button_right: bool = false,
+ mouse_button_middle: bool = false,
+
+ _reserved0: bool = false,
+ _reserved1: bool = false,
+
+ no_reopen: bool = false,
+ _reserved2: bool = false,
+ no_open_over_existing_popup: bool = false,
+ no_open_over_items: bool = false,
+ any_popup_id: bool = false,
+ any_popup_level: bool = false,
+ _padding: u21 = 0,
+
+ pub const any_popup = PopupFlags{ .any_popup_id = true, .any_popup_level = true };
+};
+pub fn beginPopupModal(name: [:0]const u8, args: Begin) bool {
+ return zguiBeginPopupModal(name, args.popen, args.flags);
+}
+pub fn openPopup(str_id: [:0]const u8, flags: PopupFlags) void {
+ zguiOpenPopup(str_id, flags);
+}
+/// `pub fn beginPopup(str_id: [:0]const u8, flags: WindowFlags) bool`
+pub const beginPopup = zguiBeginPopup;
+/// `pub fn endPopup() void`
+pub const endPopup = zguiEndPopup;
+/// `pub fn closeCurrentPopup() void`
+pub const closeCurrentPopup = zguiCloseCurrentPopup;
+extern fn zguiBeginPopupContextWindow() bool;
+extern fn zguiBeginPopupContextItem() bool;
+extern fn zguiBeginPopupModal(name: [*:0]const u8, popen: ?*bool, flags: WindowFlags) bool;
+extern fn zguiBeginPopup(str_id: [*:0]const u8, flags: WindowFlags) bool;
+extern fn zguiEndPopup() void;
+extern fn zguiOpenPopup(str_id: [*:0]const u8, flags: PopupFlags) void;
+extern fn zguiCloseCurrentPopup() void;
+//--------------------------------------------------------------------------------------------------
+//
+// Tabs
+//
+//--------------------------------------------------------------------------------------------------
+pub const TabBarFlags = packed struct(c_int) {
+ reorderable: bool = false,
+ auto_select_new_tabs: bool = false,
+ tab_list_popup_button: bool = false,
+ no_close_with_middle_mouse_button: bool = false,
+ no_tab_list_scrolling_buttons: bool = false,
+ no_tooltip: bool = false,
+ fitting_policy_resize_down: bool = false,
+ fitting_policy_scroll: bool = false,
+ _padding: u24 = 0,
+};
+pub const TabItemFlags = packed struct(c_int) {
+ unsaved_document: bool = false,
+ set_selected: bool = false,
+ no_close_with_middle_mouse_button: bool = false,
+ no_push_id: bool = false,
+ no_tooltip: bool = false,
+ no_reorder: bool = false,
+ leading: bool = false,
+ trailing: bool = false,
+ no_assumed_closure: bool = false,
+ _padding: u23 = 0,
+};
+pub fn beginTabBar(label: [:0]const u8, flags: TabBarFlags) bool {
+ return zguiBeginTabBar(label, flags);
+}
+const BeginTabItem = struct {
+ p_open: ?*bool = null,
+ flags: TabItemFlags = .{},
+};
+pub fn beginTabItem(label: [:0]const u8, args: BeginTabItem) bool {
+ return zguiBeginTabItem(label, args.p_open, args.flags);
+}
+/// `void endTabItem() void`
+pub const endTabItem = zguiEndTabItem;
+/// `void endTabBar() void`
+pub const endTabBar = zguiEndTabBar;
+pub fn setTabItemClosed(tab_or_docked_window_label: [:0]const u8) void {
+ zguiSetTabItemClosed(tab_or_docked_window_label);
+}
+
+extern fn zguiBeginTabBar(label: [*:0]const u8, flags: TabBarFlags) bool;
+extern fn zguiBeginTabItem(label: [*:0]const u8, p_open: ?*bool, flags: TabItemFlags) bool;
+extern fn zguiEndTabItem() void;
+extern fn zguiEndTabBar() void;
+extern fn zguiSetTabItemClosed(tab_or_docked_window_label: [*:0]const u8) void;
+//--------------------------------------------------------------------------------------------------
+//
+// Viewport
+//
+//--------------------------------------------------------------------------------------------------
+pub const Viewport = *opaque {
+ pub fn getPos(viewport: Viewport) [2]f32 {
+ var pos: [2]f32 = undefined;
+ zguiViewport_GetPos(viewport, &pos);
+ return pos;
+ }
+ extern fn zguiViewport_GetPos(viewport: Viewport, pos: *[2]f32) void;
+
+ pub fn getSize(viewport: Viewport) [2]f32 {
+ var pos: [2]f32 = undefined;
+ zguiViewport_GetSize(viewport, &pos);
+ return pos;
+ }
+ extern fn zguiViewport_GetSize(viewport: Viewport, size: *[2]f32) void;
+
+ pub fn getWorkPos(viewport: Viewport) [2]f32 {
+ var pos: [2]f32 = undefined;
+ zguiViewport_GetWorkPos(viewport, &pos);
+ return pos;
+ }
+ extern fn zguiViewport_GetWorkPos(viewport: Viewport, pos: *[2]f32) void;
+
+ pub fn getWorkSize(viewport: Viewport) [2]f32 {
+ var pos: [2]f32 = undefined;
+ zguiViewport_GetWorkSize(viewport, &pos);
+ return pos;
+ }
+ extern fn zguiViewport_GetWorkSize(viewport: Viewport, size: *[2]f32) void;
+
+ pub fn getCenter(viewport: Viewport) [2]f32 {
+ const pos = viewport.getPos();
+ const size = viewport.getSize();
+ return .{
+ pos[0] + size[0] * 0.5,
+ pos[1] + size[1] * 0.5,
+ };
+ }
+
+ pub fn getWorkCenter(viewport: Viewport) [2]f32 {
+ const pos = viewport.getWorkPos();
+ const size = viewport.getWorkSize();
+ return .{
+ pos[0] + size[0] * 0.5,
+ pos[1] + size[1] * 0.5,
+ };
+ }
+};
+pub const getMainViewport = zguiGetMainViewport;
+extern fn zguiGetMainViewport() Viewport;
+//--------------------------------------------------------------------------------------------------
+//
+// Mouse Input
+//
+//--------------------------------------------------------------------------------------------------
+pub const MouseDragDelta = struct {
+ lock_threshold: f32 = -1.0,
+};
+pub fn getMouseDragDelta(drag_button: MouseButton, args: MouseDragDelta) [2]f32 {
+ var delta: [2]f32 = undefined;
+ zguiGetMouseDragDelta(drag_button, args.lock_threshold, &delta);
+ return delta;
+}
+pub const resetMouseDragDelta = zguiResetMouseDragDelta;
+extern fn zguiGetMouseDragDelta(button: MouseButton, lock_threshold: f32, delta: *[2]f32) void;
+extern fn zguiResetMouseDragDelta(button: MouseButton) void;
+//--------------------------------------------------------------------------------------------------
+//
+// Drag and Drop
+//
+//--------------------------------------------------------------------------------------------------
+pub const DragDropFlags = packed struct(c_int) {
+ source_no_preview_tooltip: bool = false,
+ source_no_disable_hover: bool = false,
+ source_no_hold_open_to_others: bool = false,
+ source_allow_null_id: bool = false,
+ source_extern: bool = false,
+ source_auto_expire_payload: bool = false,
+
+ _padding0: u4 = 0,
+
+ accept_before_delivery: bool = false,
+ accept_no_draw_default_rect: bool = false,
+ accept_no_preview_tooltip: bool = false,
+
+ _padding1: u19 = 0,
+
+ pub const accept_peek_only = @This(){ .accept_before_delivery = true, .accept_no_draw_default_rect = true };
+};
+
+const Payload = extern struct {
+ data: *anyopaque = null,
+ data_size: c_int = 0,
+ source_id: c_uint = 0,
+ source_parent_id: c_uint = 0,
+ data_frame_count: c_int = -1,
+ data_type: [32:0]c_char,
+ preview: bool = false,
+ delivery: bool = false,
+
+ pub fn init() Payload {
+ var payload = Payload{};
+ payload.clear();
+ return payload;
+ }
+
+ /// `pub fn clear(payload: *Payload) void`
+ pub const clear = zguiImGuiPayload_Clear;
+ extern fn zguiImGuiPayload_Clear(payload: *Payload) void;
+
+ /// `pub fn isDataType(payload: *const Payload, type: [*:0]const u8) bool`
+ pub const isDataType = zguiImGuiPayload_IsDataType;
+ extern fn zguiImGuiPayload_IsDataType(payload: *const Payload, type: [*:0]const u8) bool;
+
+ /// `pub fn isPreview(payload: *const Payload) bool`
+ pub const isPreview = zguiImGuiPayload_IsPreview;
+ extern fn zguiImGuiPayload_IsPreview(payload: *const Payload) bool;
+
+ /// `pub fn isDelivery(payload: *const Payload) bool;
+ pub const isDelivery = zguiImGuiPayload_IsDelivery;
+ extern fn zguiImGuiPayload_IsDelivery(payload: *const Payload) bool;
+};
+
+pub fn beginDragDropSource(flags: DragDropFlags) bool {
+ return zguiBeginDragDropSource(flags);
+}
+
+/// Note: `payload_type` can be at most 32 characters long
+pub fn setDragDropPayload(payload_type: [*:0]const u8, data: []const u8, cond: Condition) bool {
+ return zguiSetDragDropPayload(payload_type, @alignCast(@ptrCast(data.ptr)), data.len, cond);
+}
+pub fn endDragDropSource() void {
+ zguiEndDragDropSource();
+}
+pub fn beginDragDropTarget() bool {
+ return zguiBeginDragDropTarget();
+}
+
+/// Note: `payload_type` can be at most 32 characters long
+pub fn acceptDragDropPayload(payload_type: [*:0]const u8, flags: DragDropFlags) ?*Payload {
+ return zguiAcceptDragDropPayload(payload_type, flags);
+}
+pub fn endDragDropTarget() void {
+ zguiEndDragDropTarget();
+}
+pub fn getDragDropPayload() ?*Payload {
+ return zguiGetDragDropPayload();
+}
+extern fn zguiBeginDragDropSource(flags: DragDropFlags) bool;
+extern fn zguiSetDragDropPayload(type: [*:0]const u8, data: *const anyopaque, sz: usize, cond: Condition) bool;
+extern fn zguiEndDragDropSource() void;
+extern fn zguiBeginDragDropTarget() bool;
+extern fn zguiAcceptDragDropPayload(type: [*:0]const u8, flags: DragDropFlags) [*c]Payload;
+extern fn zguiEndDragDropTarget() void;
+extern fn zguiGetDragDropPayload() [*c]Payload;
+//--------------------------------------------------------------------------------------------------
+//
+// DrawFlags
+//
+//--------------------------------------------------------------------------------------------------
+pub const DrawFlags = packed struct(c_int) {
+ closed: bool = false,
+ _padding0: u3 = 0,
+ round_corners_top_left: bool = false,
+ round_corners_top_right: bool = false,
+ round_corners_bottom_left: bool = false,
+ round_corners_bottom_right: bool = false,
+ round_corners_none: bool = false,
+ _padding1: u23 = 0,
+
+ pub const round_corners_top = DrawFlags{
+ .round_corners_top_left = true,
+ .round_corners_top_right = true,
+ };
+
+ pub const round_corners_bottom = DrawFlags{
+ .round_corners_bottom_left = true,
+ .round_corners_bottom_right = true,
+ };
+
+ pub const round_corners_left = DrawFlags{
+ .round_corners_top_left = true,
+ .round_corners_bottom_left = true,
+ };
+
+ pub const round_corners_right = DrawFlags{
+ .round_corners_top_right = true,
+ .round_corners_bottom_right = true,
+ };
+
+ pub const round_corners_all = DrawFlags{
+ .round_corners_top_left = true,
+ .round_corners_top_right = true,
+ .round_corners_bottom_left = true,
+ .round_corners_bottom_right = true,
+ };
+};
+
+pub const DrawCmd = extern struct {
+ clip_rect: [4]f32,
+ texture_id: TextureIdent,
+ vtx_offset: c_uint,
+ idx_offset: c_uint,
+ elem_count: c_uint,
+ user_callback: ?DrawCallback,
+ user_callback_data: ?*anyopaque,
+};
+
+pub const DrawCallback = *const fn (*const anyopaque, *const DrawCmd) callconv(.C) void;
+
+pub const getWindowDrawList = zguiGetWindowDrawList;
+pub const getBackgroundDrawList = zguiGetBackgroundDrawList;
+pub const getForegroundDrawList = zguiGetForegroundDrawList;
+
+pub const createDrawList = zguiCreateDrawList;
+pub fn destroyDrawList(draw_list: DrawList) void {
+ if (draw_list.getOwnerName()) |owner| {
+ @panic(format("zgui: illegally destroying DrawList of {s}", .{owner}));
+ }
+ zguiDestroyDrawList(draw_list);
+}
+
+extern fn zguiGetWindowDrawList() DrawList;
+extern fn zguiGetBackgroundDrawList() DrawList;
+extern fn zguiGetForegroundDrawList() DrawList;
+extern fn zguiCreateDrawList() DrawList;
+extern fn zguiDestroyDrawList(draw_list: DrawList) void;
+
+pub const DrawList = *opaque {
+ pub const getOwnerName = zguiDrawList_GetOwnerName;
+ extern fn zguiDrawList_GetOwnerName(draw_list: DrawList) ?[*:0]const u8;
+
+ pub fn reset(draw_list: DrawList) void {
+ if (draw_list.getOwnerName()) |owner| {
+ @panic(format("zgui: illegally resetting DrawList of {s}", .{owner}));
+ }
+ zguiDrawList_ResetForNewFrame(draw_list);
+ }
+ extern fn zguiDrawList_ResetForNewFrame(draw_list: DrawList) void;
+
+ pub fn clearMemory(draw_list: DrawList) void {
+ if (draw_list.getOwnerName()) |owner| {
+ @panic(format("zgui: illegally clearing memory DrawList of {s}", .{owner}));
+ }
+ zguiDrawList_ClearFreeMemory(draw_list);
+ }
+ extern fn zguiDrawList_ClearFreeMemory(draw_list: DrawList) void;
+
+ //----------------------------------------------------------------------------------------------
+ pub fn getVertexBufferLength(draw_list: DrawList) i32 {
+ return zguiDrawList_GetVertexBufferLength(draw_list);
+ }
+ extern fn zguiDrawList_GetVertexBufferLength(draw_list: DrawList) c_int;
+
+ pub const getVertexBufferData = zguiDrawList_GetVertexBufferData;
+ extern fn zguiDrawList_GetVertexBufferData(draw_list: DrawList) [*]DrawVert;
+ pub fn getVertexBuffer(draw_list: DrawList) []DrawVert {
+ const len: usize = @intCast(draw_list.getVertexBufferLength());
+ return draw_list.getVertexBufferData()[0..len];
+ }
+
+ pub fn getIndexBufferLength(draw_list: DrawList) i32 {
+ return zguiDrawList_GetIndexBufferLength(draw_list);
+ }
+ extern fn zguiDrawList_GetIndexBufferLength(draw_list: DrawList) c_int;
+
+ pub const getIndexBufferData = zguiDrawList_GetIndexBufferData;
+ extern fn zguiDrawList_GetIndexBufferData(draw_list: DrawList) [*]DrawIdx;
+ pub fn getIndexBuffer(draw_list: DrawList) []DrawIdx {
+ const len: usize = @intCast(draw_list.getIndexBufferLength());
+ return draw_list.getIndexBufferData()[0..len];
+ }
+
+ pub fn getCurrentIndex(draw_list: DrawList) u32 {
+ return zguiDrawList_GetCurrentIndex(draw_list);
+ }
+ extern fn zguiDrawList_GetCurrentIndex(draw_list: DrawList) c_uint;
+
+ pub fn getCmdBufferLength(draw_list: DrawList) i32 {
+ return zguiDrawList_GetCmdBufferLength(draw_list);
+ }
+ extern fn zguiDrawList_GetCmdBufferLength(draw_list: DrawList) c_int;
+
+ pub const getCmdBufferData = zguiDrawList_GetCmdBufferData;
+ extern fn zguiDrawList_GetCmdBufferData(draw_list: DrawList) [*]DrawCmd;
+ pub fn getCmdBuffer(draw_list: DrawList) []DrawCmd {
+ const len: usize = @intCast(draw_list.getCmdBufferLength());
+ return draw_list.getCmdBufferData()[0..len];
+ }
+
+ pub const DrawListFlags = packed struct(c_int) {
+ anti_aliased_lines: bool = false,
+ anti_aliased_lines_use_tex: bool = false,
+ anti_aliased_fill: bool = false,
+ allow_vtx_offset: bool = false,
+
+ _padding: u28 = 0,
+ };
+
+ pub const setDrawListFlags = zguiDrawList_SetFlags;
+ extern fn zguiDrawList_SetFlags(draw_list: DrawList, flags: DrawListFlags) void;
+ pub const getDrawListFlags = zguiDrawList_GetFlags;
+ extern fn zguiDrawList_GetFlags(draw_list: DrawList) DrawListFlags;
+
+ //----------------------------------------------------------------------------------------------
+ const ClipRect = struct {
+ pmin: [2]f32,
+ pmax: [2]f32,
+ intersect_with_current: bool = false,
+ };
+ pub fn pushClipRect(draw_list: DrawList, args: ClipRect) void {
+ zguiDrawList_PushClipRect(
+ draw_list,
+ &args.pmin,
+ &args.pmax,
+ args.intersect_with_current,
+ );
+ }
+ extern fn zguiDrawList_PushClipRect(
+ draw_list: DrawList,
+ clip_rect_min: *const [2]f32,
+ clip_rect_max: *const [2]f32,
+ intersect_with_current_clip_rect: bool,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub const pushClipRectFullScreen = zguiDrawList_PushClipRectFullScreen;
+ extern fn zguiDrawList_PushClipRectFullScreen(draw_list: DrawList) void;
+
+ pub const popClipRect = zguiDrawList_PopClipRect;
+ extern fn zguiDrawList_PopClipRect(draw_list: DrawList) void;
+ //----------------------------------------------------------------------------------------------
+ pub const pushTextureId = zguiDrawList_PushTextureId;
+ extern fn zguiDrawList_PushTextureId(draw_list: DrawList, texture_id: TextureIdent) void;
+
+ pub const popTextureId = zguiDrawList_PopTextureId;
+ extern fn zguiDrawList_PopTextureId(draw_list: DrawList) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn getClipRectMin(draw_list: DrawList) [2]f32 {
+ var v: [2]f32 = undefined;
+ zguiDrawList_GetClipRectMin(draw_list, &v);
+ return v;
+ }
+ extern fn zguiDrawList_GetClipRectMin(draw_list: DrawList, clip_min: *[2]f32) void;
+
+ pub fn getClipRectMax(draw_list: DrawList) [2]f32 {
+ var v: [2]f32 = undefined;
+ zguiDrawList_GetClipRectMax(draw_list, &v);
+ return v;
+ }
+ extern fn zguiDrawList_GetClipRectMax(draw_list: DrawList, clip_min: *[2]f32) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addLine(draw_list: DrawList, args: struct {
+ p1: [2]f32,
+ p2: [2]f32,
+ col: u32,
+ thickness: f32,
+ }) void {
+ zguiDrawList_AddLine(draw_list, &args.p1, &args.p2, args.col, args.thickness);
+ }
+ extern fn zguiDrawList_AddLine(
+ draw_list: DrawList,
+ p1: *const [2]f32,
+ p2: *const [2]f32,
+ col: u32,
+ thickness: f32,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addRect(draw_list: DrawList, args: struct {
+ pmin: [2]f32,
+ pmax: [2]f32,
+ col: u32,
+ rounding: f32 = 0.0,
+ flags: DrawFlags = .{},
+ thickness: f32 = 1.0,
+ }) void {
+ zguiDrawList_AddRect(
+ draw_list,
+ &args.pmin,
+ &args.pmax,
+ args.col,
+ args.rounding,
+ args.flags,
+ args.thickness,
+ );
+ }
+ extern fn zguiDrawList_AddRect(
+ draw_list: DrawList,
+ pmin: *const [2]f32,
+ pmax: *const [2]f32,
+ col: u32,
+ rounding: f32,
+ flags: DrawFlags,
+ thickness: f32,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addRectFilled(draw_list: DrawList, args: struct {
+ pmin: [2]f32,
+ pmax: [2]f32,
+ col: u32,
+ rounding: f32 = 0.0,
+ flags: DrawFlags = .{},
+ }) void {
+ zguiDrawList_AddRectFilled(
+ draw_list,
+ &args.pmin,
+ &args.pmax,
+ args.col,
+ args.rounding,
+ args.flags,
+ );
+ }
+ extern fn zguiDrawList_AddRectFilled(
+ draw_list: DrawList,
+ pmin: *const [2]f32,
+ pmax: *const [2]f32,
+ col: u32,
+ rounding: f32,
+ flags: DrawFlags,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addRectFilledMultiColor(draw_list: DrawList, args: struct {
+ pmin: [2]f32,
+ pmax: [2]f32,
+ col_upr_left: u32,
+ col_upr_right: u32,
+ col_bot_right: u32,
+ col_bot_left: u32,
+ }) void {
+ zguiDrawList_AddRectFilledMultiColor(
+ draw_list,
+ &args.pmin,
+ &args.pmax,
+ args.col_upr_left,
+ args.col_upr_right,
+ args.col_bot_right,
+ args.col_bot_left,
+ );
+ }
+ extern fn zguiDrawList_AddRectFilledMultiColor(
+ draw_list: DrawList,
+ pmin: *const [2]f32,
+ pmax: *const [2]f32,
+ col_upr_left: c_uint,
+ col_upr_right: c_uint,
+ col_bot_right: c_uint,
+ col_bot_left: c_uint,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addQuad(draw_list: DrawList, args: struct {
+ p1: [2]f32,
+ p2: [2]f32,
+ p3: [2]f32,
+ p4: [2]f32,
+ col: u32,
+ thickness: f32 = 1.0,
+ }) void {
+ zguiDrawList_AddQuad(
+ draw_list,
+ &args.p1,
+ &args.p2,
+ &args.p3,
+ &args.p4,
+ args.col,
+ args.thickness,
+ );
+ }
+ extern fn zguiDrawList_AddQuad(
+ draw_list: DrawList,
+ p1: *const [2]f32,
+ p2: *const [2]f32,
+ p3: *const [2]f32,
+ p4: *const [2]f32,
+ col: u32,
+ thickness: f32,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addQuadFilled(draw_list: DrawList, args: struct {
+ p1: [2]f32,
+ p2: [2]f32,
+ p3: [2]f32,
+ p4: [2]f32,
+ col: u32,
+ }) void {
+ zguiDrawList_AddQuadFilled(draw_list, &args.p1, &args.p2, &args.p3, &args.p4, args.col);
+ }
+ extern fn zguiDrawList_AddQuadFilled(
+ draw_list: DrawList,
+ p1: *const [2]f32,
+ p2: *const [2]f32,
+ p3: *const [2]f32,
+ p4: *const [2]f32,
+ col: u32,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addTriangle(draw_list: DrawList, args: struct {
+ p1: [2]f32,
+ p2: [2]f32,
+ p3: [2]f32,
+ col: u32,
+ thickness: f32 = 1.0,
+ }) void {
+ zguiDrawList_AddTriangle(draw_list, &args.p1, &args.p2, &args.p3, args.col, args.thickness);
+ }
+ extern fn zguiDrawList_AddTriangle(
+ draw_list: DrawList,
+ p1: *const [2]f32,
+ p2: *const [2]f32,
+ p3: *const [2]f32,
+ col: u32,
+ thickness: f32,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addTriangleFilled(draw_list: DrawList, args: struct {
+ p1: [2]f32,
+ p2: [2]f32,
+ p3: [2]f32,
+ col: u32,
+ }) void {
+ zguiDrawList_AddTriangleFilled(draw_list, &args.p1, &args.p2, &args.p3, args.col);
+ }
+ extern fn zguiDrawList_AddTriangleFilled(
+ draw_list: DrawList,
+ p1: *const [2]f32,
+ p2: *const [2]f32,
+ p3: *const [2]f32,
+ col: u32,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addCircle(draw_list: DrawList, args: struct {
+ p: [2]f32,
+ r: f32,
+ col: u32,
+ num_segments: i32 = 0,
+ thickness: f32 = 1.0,
+ }) void {
+ zguiDrawList_AddCircle(
+ draw_list,
+ &args.p,
+ args.r,
+ args.col,
+ args.num_segments,
+ args.thickness,
+ );
+ }
+ extern fn zguiDrawList_AddCircle(
+ draw_list: DrawList,
+ center: *const [2]f32,
+ radius: f32,
+ col: u32,
+ num_segments: c_int,
+ thickness: f32,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addCircleFilled(draw_list: DrawList, args: struct {
+ p: [2]f32,
+ r: f32,
+ col: u32,
+ num_segments: u16 = 0,
+ }) void {
+ zguiDrawList_AddCircleFilled(draw_list, &args.p, args.r, args.col, args.num_segments);
+ }
+ extern fn zguiDrawList_AddCircleFilled(
+ draw_list: DrawList,
+ center: *const [2]f32,
+ radius: f32,
+ col: u32,
+ num_segments: c_int,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addNgon(draw_list: DrawList, args: struct {
+ p: [2]f32,
+ r: f32,
+ col: u32,
+ num_segments: u32,
+ thickness: f32 = 1.0,
+ }) void {
+ zguiDrawList_AddNgon(
+ draw_list,
+ &args.p,
+ args.r,
+ args.col,
+ args.num_segments,
+ args.thickness,
+ );
+ }
+ extern fn zguiDrawList_AddNgon(
+ draw_list: DrawList,
+ center: *const [2]f32,
+ radius: f32,
+ col: u32,
+ num_segments: c_int,
+ thickness: f32,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addNgonFilled(draw_list: DrawList, args: struct {
+ p: [2]f32,
+ r: f32,
+ col: u32,
+ num_segments: u32,
+ }) void {
+ zguiDrawList_AddNgonFilled(draw_list, &args.p, args.r, args.col, args.num_segments);
+ }
+ extern fn zguiDrawList_AddNgonFilled(
+ draw_list: DrawList,
+ center: *const [2]f32,
+ radius: f32,
+ col: u32,
+ num_segments: c_int,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addText(draw_list: DrawList, pos: [2]f32, col: u32, comptime fmt: []const u8, args: anytype) void {
+ const txt = format(fmt, args);
+ draw_list.addTextUnformatted(pos, col, txt);
+ }
+ pub fn addTextUnformatted(draw_list: DrawList, pos: [2]f32, col: u32, txt: []const u8) void {
+ zguiDrawList_AddText(draw_list, &pos, col, txt.ptr, txt.ptr + txt.len);
+ }
+ extern fn zguiDrawList_AddText(
+ draw_list: DrawList,
+ pos: *const [2]f32,
+ col: u32,
+ text: [*]const u8,
+ text_end: [*]const u8,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addPolyline(draw_list: DrawList, points: []const [2]f32, args: struct {
+ col: u32,
+ flags: DrawFlags = .{},
+ thickness: f32 = 1.0,
+ }) void {
+ zguiDrawList_AddPolyline(
+ draw_list,
+ points.ptr,
+ @intCast(points.len),
+ args.col,
+ args.flags,
+ args.thickness,
+ );
+ }
+ extern fn zguiDrawList_AddPolyline(
+ draw_list: DrawList,
+ points: [*]const [2]f32,
+ num_points: c_int,
+ col: u32,
+ flags: DrawFlags,
+ thickness: f32,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addConvexPolyFilled(
+ draw_list: DrawList,
+ points: []const [2]f32,
+ col: u32,
+ ) void {
+ zguiDrawList_AddConvexPolyFilled(
+ draw_list,
+ points.ptr,
+ @intCast(points.len),
+ col,
+ );
+ }
+ extern fn zguiDrawList_AddConvexPolyFilled(
+ draw_list: DrawList,
+ points: [*]const [2]f32,
+ num_points: c_int,
+ col: u32,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addBezierCubic(draw_list: DrawList, args: struct {
+ p1: [2]f32,
+ p2: [2]f32,
+ p3: [2]f32,
+ p4: [2]f32,
+ col: u32,
+ thickness: f32 = 1.0,
+ num_segments: u32 = 0,
+ }) void {
+ zguiDrawList_AddBezierCubic(
+ draw_list,
+ &args.p1,
+ &args.p2,
+ &args.p3,
+ &args.p4,
+ args.col,
+ args.thickness,
+ args.num_segments,
+ );
+ }
+ extern fn zguiDrawList_AddBezierCubic(
+ draw_list: DrawList,
+ p1: *const [2]f32,
+ p2: *const [2]f32,
+ p3: *const [2]f32,
+ p4: *const [2]f32,
+ col: u32,
+ thickness: f32,
+ num_segments: c_int,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addBezierQuadratic(draw_list: DrawList, args: struct {
+ p1: [2]f32,
+ p2: [2]f32,
+ p3: [2]f32,
+ col: u32,
+ thickness: f32 = 1.0,
+ num_segments: u32 = 0,
+ }) void {
+ zguiDrawList_AddBezierQuadratic(
+ draw_list,
+ &args.p1,
+ &args.p2,
+ &args.p3,
+ args.col,
+ args.thickness,
+ args.num_segments,
+ );
+ }
+ extern fn zguiDrawList_AddBezierQuadratic(
+ draw_list: DrawList,
+ p1: *const [2]f32,
+ p2: *const [2]f32,
+ p3: *const [2]f32,
+ col: u32,
+ thickness: f32,
+ num_segments: c_int,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addImage(draw_list: DrawList, user_texture_id: TextureIdent, args: struct {
+ pmin: [2]f32,
+ pmax: [2]f32,
+ uvmin: [2]f32 = .{ 0, 0 },
+ uvmax: [2]f32 = .{ 1, 1 },
+ col: u32 = 0xff_ff_ff_ff,
+ }) void {
+ zguiDrawList_AddImage(
+ draw_list,
+ user_texture_id,
+ &args.pmin,
+ &args.pmax,
+ &args.uvmin,
+ &args.uvmax,
+ args.col,
+ );
+ }
+ extern fn zguiDrawList_AddImage(
+ draw_list: DrawList,
+ user_texture_id: TextureIdent,
+ pmin: *const [2]f32,
+ pmax: *const [2]f32,
+ uvmin: *const [2]f32,
+ uvmax: *const [2]f32,
+ col: u32,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addImageQuad(draw_list: DrawList, user_texture_id: TextureIdent, args: struct {
+ p1: [2]f32,
+ p2: [2]f32,
+ p3: [2]f32,
+ p4: [2]f32,
+ uv1: [2]f32 = .{ 0, 0 },
+ uv2: [2]f32 = .{ 1, 0 },
+ uv3: [2]f32 = .{ 1, 1 },
+ uv4: [2]f32 = .{ 0, 1 },
+ col: u32 = 0xff_ff_ff_ff,
+ }) void {
+ zguiDrawList_AddImageQuad(
+ draw_list,
+ user_texture_id,
+ &args.p1,
+ &args.p2,
+ &args.p3,
+ &args.p4,
+ &args.uv1,
+ &args.uv2,
+ &args.uv3,
+ &args.uv4,
+ args.col,
+ );
+ }
+ extern fn zguiDrawList_AddImageQuad(
+ draw_list: DrawList,
+ user_texture_id: TextureIdent,
+ p1: *const [2]f32,
+ p2: *const [2]f32,
+ p3: *const [2]f32,
+ p4: *const [2]f32,
+ uv1: *const [2]f32,
+ uv2: *const [2]f32,
+ uv3: *const [2]f32,
+ uv4: *const [2]f32,
+ col: u32,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn addImageRounded(draw_list: DrawList, user_texture_id: TextureIdent, args: struct {
+ pmin: [2]f32,
+ pmax: [2]f32,
+ uvmin: [2]f32 = .{ 0, 0 },
+ uvmax: [2]f32 = .{ 1, 1 },
+ col: u32 = 0xff_ff_ff_ff,
+ rounding: f32 = 4.0,
+ flags: DrawFlags = .{},
+ }) void {
+ zguiDrawList_AddImageRounded(
+ draw_list,
+ user_texture_id,
+ &args.pmin,
+ &args.pmax,
+ &args.uvmin,
+ &args.uvmax,
+ args.col,
+ args.rounding,
+ args.flags,
+ );
+ }
+ extern fn zguiDrawList_AddImageRounded(
+ draw_list: DrawList,
+ user_texture_id: TextureIdent,
+ pmin: *const [2]f32,
+ pmax: *const [2]f32,
+ uvmin: *const [2]f32,
+ uvmax: *const [2]f32,
+ col: u32,
+ rounding: f32,
+ flags: DrawFlags,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub const pathClear = zguiDrawList_PathClear;
+ extern fn zguiDrawList_PathClear(draw_list: DrawList) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn pathLineTo(draw_list: DrawList, pos: [2]f32) void {
+ zguiDrawList_PathLineTo(draw_list, &pos);
+ }
+ extern fn zguiDrawList_PathLineTo(draw_list: DrawList, pos: *const [2]f32) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn pathLineToMergeDuplicate(draw_list: DrawList, pos: [2]f32) void {
+ zguiDrawList_PathLineToMergeDuplicate(draw_list, &pos);
+ }
+ extern fn zguiDrawList_PathLineToMergeDuplicate(draw_list: DrawList, pos: *const [2]f32) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn pathFillConvex(draw_list: DrawList, col: u32) void {
+ return zguiDrawList_PathFillConvex(draw_list, col);
+ }
+ extern fn zguiDrawList_PathFillConvex(draw_list: DrawList, col: c_uint) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn pathStroke(draw_list: DrawList, args: struct {
+ col: u32,
+ flags: DrawFlags = .{},
+ thickness: f32 = 1.0,
+ }) void {
+ zguiDrawList_PathStroke(draw_list, args.col, args.flags, args.thickness);
+ }
+ extern fn zguiDrawList_PathStroke(draw_list: DrawList, col: u32, flags: DrawFlags, thickness: f32) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn pathArcTo(draw_list: DrawList, args: struct {
+ p: [2]f32,
+ r: f32,
+ amin: f32,
+ amax: f32,
+ num_segments: u16 = 0,
+ }) void {
+ zguiDrawList_PathArcTo(
+ draw_list,
+ &args.p,
+ args.r,
+ args.amin,
+ args.amax,
+ args.num_segments,
+ );
+ }
+ extern fn zguiDrawList_PathArcTo(
+ draw_list: DrawList,
+ center: *const [2]f32,
+ radius: f32,
+ amin: f32,
+ amax: f32,
+ num_segments: c_int,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn pathArcToFast(draw_list: DrawList, args: struct {
+ p: [2]f32,
+ r: f32,
+ amin_of_12: u16,
+ amax_of_12: u16,
+ }) void {
+ zguiDrawList_PathArcToFast(draw_list, &args.p, args.r, args.amin_of_12, args.amax_of_12);
+ }
+ extern fn zguiDrawList_PathArcToFast(
+ draw_list: DrawList,
+ center: *const [2]f32,
+ radius: f32,
+ a_min_of_12: c_int,
+ a_max_of_12: c_int,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn pathBezierCubicCurveTo(draw_list: DrawList, args: struct {
+ p2: [2]f32,
+ p3: [2]f32,
+ p4: [2]f32,
+ num_segments: u16 = 0,
+ }) void {
+ zguiDrawList_PathBezierCubicCurveTo(
+ draw_list,
+ &args.p2,
+ &args.p3,
+ &args.p4,
+ args.num_segments,
+ );
+ }
+ extern fn zguiDrawList_PathBezierCubicCurveTo(
+ draw_list: DrawList,
+ p2: *const [2]f32,
+ p3: *const [2]f32,
+ p4: *const [2]f32,
+ num_segments: c_int,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub fn pathBezierQuadraticCurveTo(draw_list: DrawList, args: struct {
+ p2: [2]f32,
+ p3: [2]f32,
+ num_segments: u16 = 0,
+ }) void {
+ zguiDrawList_PathBezierQuadraticCurveTo(draw_list, &args.p2, &args.p3, args.num_segments);
+ }
+ extern fn zguiDrawList_PathBezierQuadraticCurveTo(
+ draw_list: DrawList,
+ p2: *const [2]f32,
+ p3: *const [2]f32,
+ num_segments: c_int,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ const PathRect = struct {
+ bmin: [2]f32,
+ bmax: [2]f32,
+ rounding: f32 = 0.0,
+ flags: DrawFlags = .{},
+ };
+ pub fn pathRect(draw_list: DrawList, args: PathRect) void {
+ zguiDrawList_PathRect(draw_list, &args.bmin, &args.bmax, args.rounding, args.flags);
+ }
+ extern fn zguiDrawList_PathRect(
+ draw_list: DrawList,
+ rect_min: *const [2]f32,
+ rect_max: *const [2]f32,
+ rounding: f32,
+ flags: DrawFlags,
+ ) void;
+ //----------------------------------------------------------------------------------------------
+ pub const primReserve = zguiDrawList_PrimReserve;
+ extern fn zguiDrawList_PrimReserve(
+ draw_list: DrawList,
+ idx_count: i32,
+ vtx_count: i32,
+ ) void;
+
+ pub const primUnreserve = zguiDrawList_PrimUnreserve;
+ extern fn zguiDrawList_PrimUnreserve(
+ draw_list: DrawList,
+ idx_count: i32,
+ vtx_count: i32,
+ ) void;
+
+ pub fn primRect(
+ draw_list: DrawList,
+ a: [2]f32,
+ b: [2]f32,
+ col: u32,
+ ) void {
+ return zguiDrawList_PrimRect(draw_list, &a, &b, col);
+ }
+ extern fn zguiDrawList_PrimRect(
+ draw_list: DrawList,
+ a: *const [2]f32,
+ b: *const [2]f32,
+ col: u32,
+ ) void;
+
+ pub fn primRectUV(
+ draw_list: DrawList,
+ a: [2]f32,
+ b: [2]f32,
+ uv_a: [2]f32,
+ uv_b: [2]f32,
+ col: u32,
+ ) void {
+ return zguiDrawList_PrimRectUV(draw_list, &a, &b, &uv_a, &uv_b, col);
+ }
+ extern fn zguiDrawList_PrimRectUV(
+ draw_list: DrawList,
+ a: *const [2]f32,
+ b: *const [2]f32,
+ uv_a: *const [2]f32,
+ uv_b: *const [2]f32,
+ col: u32,
+ ) void;
+
+ pub fn primQuadUV(
+ draw_list: DrawList,
+ a: [2]f32,
+ b: [2]f32,
+ c: [2]f32,
+ d: [2]f32,
+ uv_a: [2]f32,
+ uv_b: [2]f32,
+ uv_c: [2]f32,
+ uv_d: [2]f32,
+ col: u32,
+ ) void {
+ return zguiDrawList_PrimQuadUV(draw_list, &a, &b, &c, &d, &uv_a, &uv_b, &uv_c, &uv_d, col);
+ }
+ extern fn zguiDrawList_PrimQuadUV(
+ draw_list: DrawList,
+ a: *const [2]f32,
+ b: *const [2]f32,
+ c: *const [2]f32,
+ d: *const [2]f32,
+ uv_a: *const [2]f32,
+ uv_b: *const [2]f32,
+ uv_c: *const [2]f32,
+ uv_d: *const [2]f32,
+ col: u32,
+ ) void;
+
+ pub fn primWriteVtx(
+ draw_list: DrawList,
+ pos: [2]f32,
+ uv: [2]f32,
+ col: u32,
+ ) void {
+ return zguiDrawList_PrimWriteVtx(draw_list, &pos, &uv, col);
+ }
+ extern fn zguiDrawList_PrimWriteVtx(
+ draw_list: DrawList,
+ pos: *const [2]f32,
+ uv: *const [2]f32,
+ col: u32,
+ ) void;
+
+ pub const primWriteIdx = zguiDrawList_PrimWriteIdx;
+ extern fn zguiDrawList_PrimWriteIdx(
+ draw_list: DrawList,
+ idx: DrawIdx,
+ ) void;
+
+ //----------------------------------------------------------------------------------------------
+
+ pub fn addCallback(draw_list: DrawList, callback: DrawCallback, callback_data: ?*anyopaque) void {
+ zguiDrawList_AddCallback(draw_list, callback, callback_data);
+ }
+ extern fn zguiDrawList_AddCallback(draw_list: DrawList, callback: DrawCallback, callback_data: ?*anyopaque) void;
+ pub fn addResetRenderStateCallback(draw_list: DrawList) void {
+ zguiDrawList_AddResetRenderStateCallback(draw_list);
+ }
+ extern fn zguiDrawList_AddResetRenderStateCallback(draw_list: DrawList) void;
+};
+
+fn Vector(comptime T: type) type {
+ return extern struct {
+ len: c_int,
+ capacity: c_int,
+ items: [*]T,
+ };
+}
+
+test {
+ const testing = std.testing;
+
+ testing.refAllDeclsRecursive(@This());
+
+ init(testing.allocator);
+ defer deinit();
+
+ io.setIniFilename(null);
+
+ _ = io.getFontsTextDataAsRgba32();
+
+ io.setDisplaySize(1, 1);
+
+ newFrame();
+
+ try testing.expect(begin("testing", .{}));
+ defer end();
+
+ const Testing = enum {
+ one,
+ two,
+ three,
+ };
+ var value = Testing.one;
+ _ = comboFromEnum("comboFromEnum", &value);
+}
diff --git a/vendor/zgui/src/plot.zig b/vendor/zgui/src/plot.zig
new file mode 100644
index 0000000..8d210f4
--- /dev/null
+++ b/vendor/zgui/src/plot.zig
@@ -0,0 +1,596 @@
+//--------------------------------------------------------------------------------------------------
+const assert = @import("std").debug.assert;
+const gui = @import("gui.zig");
+//--------------------------------------------------------------------------------------------------
+pub fn init() void {
+ if (zguiPlot_GetCurrentContext() == null) {
+ _ = zguiPlot_CreateContext();
+ }
+}
+pub fn deinit() void {
+ if (zguiPlot_GetCurrentContext() != null) {
+ zguiPlot_DestroyContext(null);
+ }
+}
+const Context = *opaque {};
+
+extern fn zguiPlot_GetCurrentContext() ?Context;
+extern fn zguiPlot_CreateContext() Context;
+extern fn zguiPlot_DestroyContext(ctx: ?Context) void;
+//--------------------------------------------------------------------------------------------------
+pub const Marker = enum(i32) {
+ none = -1,
+ circle = 0,
+ square,
+ diamond,
+ up,
+ down,
+ left,
+ right,
+ cross,
+ plus,
+ asterisk,
+};
+
+pub const Colormap = enum(u32) {
+ deep,
+ dark,
+ pastel,
+ paired,
+ viridis,
+ plasma,
+ hot,
+ cool,
+ pink,
+ jet,
+ twilight,
+ rd_bu,
+ br_b_g,
+ pi_y_g,
+ spectral,
+ greys,
+};
+
+pub const Style = extern struct {
+ line_weight: f32,
+ marker: Marker,
+ marker_size: f32,
+ marker_weight: f32,
+ fill_alpha: f32,
+ error_bar_size: f32,
+ error_bar_weight: f32,
+ digital_bit_height: f32,
+ digital_bit_gap: f32,
+ plot_border_size: f32,
+ minor_alpha: f32,
+ major_tick_len: [2]f32,
+ minor_tick_len: [2]f32,
+ major_tick_size: [2]f32,
+ minor_tick_size: [2]f32,
+ major_grid_size: [2]f32,
+ minor_grid_size: [2]f32,
+ plot_padding: [2]f32,
+ label_padding: [2]f32,
+ legend_padding: [2]f32,
+ legend_inner_padding: [2]f32,
+ legend_spacing: [2]f32,
+ mouse_pos_padding: [2]f32,
+ annotation_padding: [2]f32,
+ fit_padding: [2]f32,
+ plot_default_size: [2]f32,
+ plot_min_size: [2]f32,
+
+ colors: [@typeInfo(StyleCol).Enum.fields.len][4]f32,
+ colormap: Colormap,
+
+ use_local_time: bool,
+ use_iso_8601: bool,
+ use_24h_clock: bool,
+
+ /// `pub fn init() Style`
+ pub const init = zguiPlotStyle_Init;
+ extern fn zguiPlotStyle_Init() Style;
+
+ pub fn getColor(style: Style, idx: StyleCol) [4]f32 {
+ return style.colors[@intFromEnum(idx)];
+ }
+ pub fn setColor(style: *Style, idx: StyleCol, color: [4]f32) void {
+ style.colors[@intFromEnum(idx)] = color;
+ }
+};
+/// `pub fn getStyle() *Style`
+pub const getStyle = zguiPlot_GetStyle;
+extern fn zguiPlot_GetStyle() *Style;
+//--------------------------------------------------------------------------------------------------
+pub const StyleCol = enum(u32) {
+ line,
+ fill,
+ marker_outline,
+ marker_fill,
+ error_bar,
+ frame_bg,
+ plot_bg,
+ plot_border,
+ legend_bg,
+ legend_border,
+ legend_text,
+ title_text,
+ inlay_text,
+ axis_text,
+ axis_grid,
+ axis_tick,
+ axis_bg,
+ axis_bg_hovered,
+ axis_bg_active,
+ selection,
+ crosshairs,
+};
+const PushStyleColor4f = struct {
+ idx: StyleCol,
+ c: [4]f32,
+};
+pub fn pushStyleColor4f(args: PushStyleColor4f) void {
+ zguiPlot_PushStyleColor4f(args.idx, &args.c);
+}
+const PushStyleColor1u = struct {
+ idx: StyleCol,
+ c: u32,
+};
+pub fn pushStyleColor1u(args: PushStyleColor1u) void {
+ zguiPlot_PushStyleColor1u(args.idx, args.c);
+}
+const PopStyleColor = struct {
+ count: i32 = 1,
+};
+pub fn popStyleColor(args: PopStyleColor) void {
+ zguiPlot_PopStyleColor(args.count);
+}
+extern fn zguiPlot_PushStyleColor4f(idx: StyleCol, col: *const [4]f32) void;
+extern fn zguiPlot_PushStyleColor1u(idx: StyleCol, col: u32) void;
+extern fn zguiPlot_PopStyleColor(count: i32) void;
+//--------------------------------------------------------------------------------------------------
+pub const StyleVar = enum(u32) {
+ line_weight, // 1f
+ marker, // 1i
+ marker_size, // 1f
+ marker_weight, // 1f
+ fill_alpha, // 1f
+ error_bar_size, // 1f
+ error_bar_weight, // 1f
+ digital_bit_height, // 1f
+ digital_bit_gap, // 1f
+ plot_border_size, // 1f
+ minor_alpha, // 1f
+ major_tick_len, // 2f
+ minor_tick_len, // 2f
+ major_tick_size, // 2f
+ minor_tick_size, // 2f
+ major_grid_size, // 2f
+ minor_grid_size, // 2f
+ plot_padding, // 2f
+ label_padding, // 2f
+ legend_padding, // 2f
+ legend_inner_padding, // 2f
+ legend_spacing, // 2f
+ mouse_pos_padding, // 2f
+ annotation_padding, // 2f
+ fit_padding, // 2f
+ plot_default_size, // 2f
+ plot_min_size, // 2f
+};
+const PushStyleVar1i = struct {
+ idx: StyleVar,
+ v: i32,
+};
+pub fn pushStyleVar1i(args: PushStyleVar1i) void {
+ zguiPlot_PushStyleVar1i(args.idx, args.v);
+}
+const PushStyleVar1f = struct {
+ idx: StyleVar,
+ v: f32,
+};
+pub fn pushStyleVar1f(args: PushStyleVar1f) void {
+ zguiPlot_PushStyleVar1f(args.idx, args.v);
+}
+const PushStyleVar2f = struct {
+ idx: StyleVar,
+ v: [2]f32,
+};
+pub fn pushStyleVar2f(args: PushStyleVar2f) void {
+ zguiPlot_PushStyleVar2f(args.idx, &args.v);
+}
+const PopStyleVar = struct {
+ count: i32 = 1,
+};
+pub fn popStyleVar(args: PopStyleVar) void {
+ zguiPlot_PopStyleVar(args.count);
+}
+extern fn zguiPlot_PushStyleVar1i(idx: StyleVar, v: i32) void;
+extern fn zguiPlot_PushStyleVar1f(idx: StyleVar, v: f32) void;
+extern fn zguiPlot_PushStyleVar2f(idx: StyleVar, v: *const [2]f32) void;
+extern fn zguiPlot_PopStyleVar(count: i32) void;
+//--------------------------------------------------------------------------------------------------
+pub const PlotLocation = packed struct(u32) {
+ north: bool = false,
+ south: bool = false,
+ west: bool = false,
+ east: bool = false,
+ _padding: u28 = 0,
+
+ pub const north_west = PlotLocation{ .north = true, .west = true };
+ pub const north_east = PlotLocation{ .north = true, .east = true };
+ pub const south_west = PlotLocation{ .south = true, .west = true };
+ pub const south_east = PlotLocation{ .south = true, .east = true };
+};
+pub const LegendFlags = packed struct(u32) {
+ no_buttons: bool = false,
+ no_highlight_item: bool = false,
+ no_highlight_axis: bool = false,
+ no_menus: bool = false,
+ outside: bool = false,
+ horizontal: bool = false,
+ _padding: u26 = 0,
+};
+pub fn setupLegend(location: PlotLocation, flags: LegendFlags) void {
+ zguiPlot_SetupLegend(location, flags);
+}
+extern fn zguiPlot_SetupLegend(location: PlotLocation, flags: LegendFlags) void;
+//--------------------------------------------------------------------------------------------------
+pub const AxisFlags = packed struct(u32) {
+ no_label: bool = false,
+ no_grid_lines: bool = false,
+ no_tick_marks: bool = false,
+ no_tick_labels: bool = false,
+ no_initial_fit: bool = false,
+ no_menus: bool = false,
+ no_side_switch: bool = false,
+ no_highlight: bool = false,
+ opposite: bool = false,
+ foreground: bool = false,
+ invert: bool = false,
+ auto_fit: bool = false,
+ range_fit: bool = false,
+ pan_stretch: bool = false,
+ lock_min: bool = false,
+ lock_max: bool = false,
+ _padding: u16 = 0,
+
+ pub const lock = AxisFlags{
+ .lock_min = true,
+ .lock_max = true,
+ };
+ pub const no_decorations = AxisFlags{
+ .no_label = true,
+ .no_grid_lines = true,
+ .no_tick_marks = true,
+ .no_tick_labels = true,
+ };
+ pub const aux_default = AxisFlags{
+ .no_grid_lines = true,
+ .opposite = true,
+ };
+};
+pub const Axis = enum(u32) { x1, x2, x3, y1, y2, y3 };
+pub const SetupAxis = struct {
+ label: ?[:0]const u8 = null,
+ flags: AxisFlags = .{},
+};
+pub fn setupAxis(axis: Axis, args: SetupAxis) void {
+ zguiPlot_SetupAxis(axis, if (args.label) |l| l else null, args.flags);
+}
+extern fn zguiPlot_SetupAxis(axis: Axis, label: ?[*:0]const u8, flags: AxisFlags) void;
+//----------------------------------------------------------------------------------------------
+pub const Condition = enum(u32) {
+ none = @intFromEnum(gui.Condition.none),
+ always = @intFromEnum(gui.Condition.always),
+ once = @intFromEnum(gui.Condition.once),
+};
+const SetupAxisLimits = struct {
+ min: f64,
+ max: f64,
+ cond: Condition = .once,
+};
+pub fn setupAxisLimits(axis: Axis, args: SetupAxisLimits) void {
+ zguiPlot_SetupAxisLimits(axis, args.min, args.max, args.cond);
+}
+extern fn zguiPlot_SetupAxisLimits(axis: Axis, min: f64, max: f64, cond: Condition) void;
+//----------------------------------------------------------------------------------------------
+/// `pub fn setupFinish() void`
+pub const setupFinish = zguiPlot_SetupFinish;
+extern fn zguiPlot_SetupFinish() void;
+//----------------------------------------------------------------------------------------------
+pub const Flags = packed struct(u32) {
+ no_title: bool = false,
+ no_legend: bool = false,
+ no_mouse_text: bool = false,
+ no_inputs: bool = false,
+ no_menus: bool = false,
+ no_box_select: bool = false,
+ no_child: bool = false,
+ no_frame: bool = false,
+ equal: bool = false,
+ crosshairs: bool = false,
+ _padding: u22 = 0,
+
+ pub const canvas_only = Flags{
+ .no_title = true,
+ .no_legend = true,
+ .no_menus = true,
+ .no_box_select = true,
+ .no_mouse_text = true,
+ };
+};
+pub const BeginPlot = struct {
+ w: f32 = -1.0,
+ h: f32 = 0.0,
+ flags: Flags = .{},
+};
+pub fn beginPlot(title_id: [:0]const u8, args: BeginPlot) bool {
+ return zguiPlot_BeginPlot(title_id, args.w, args.h, args.flags);
+}
+extern fn zguiPlot_BeginPlot(title_id: [*:0]const u8, width: f32, height: f32, flags: Flags) bool;
+//----------------------------------------------------------------------------------------------
+pub const LineFlags = packed struct(u32) {
+ _reserved0: bool = false,
+ _reserved1: bool = false,
+ _reserved2: bool = false,
+ _reserved3: bool = false,
+ _reserved4: bool = false,
+ _reserved5: bool = false,
+ _reserved6: bool = false,
+ _reserved7: bool = false,
+ _reserved8: bool = false,
+ _reserved9: bool = false,
+ segments: bool = false,
+ loop: bool = false,
+ skip_nan: bool = false,
+ no_clip: bool = false,
+ shaded: bool = false,
+ _padding: u17 = 0,
+};
+fn PlotLineValuesGen(comptime T: type) type {
+ return struct {
+ v: []const T,
+ xscale: f64 = 1.0,
+ xstart: f64 = 0.0,
+ flags: LineFlags = .{},
+ offset: i32 = 0,
+ stride: i32 = @sizeOf(T),
+ };
+}
+pub fn plotLineValues(label_id: [:0]const u8, comptime T: type, args: PlotLineValuesGen(T)) void {
+ zguiPlot_PlotLineValues(
+ label_id,
+ gui.typeToDataTypeEnum(T),
+ args.v.ptr,
+ @as(i32, @intCast(args.v.len)),
+ args.xscale,
+ args.xstart,
+ args.flags,
+ args.offset,
+ args.stride,
+ );
+}
+extern fn zguiPlot_PlotLineValues(
+ label_id: [*:0]const u8,
+ data_type: gui.DataType,
+ values: *const anyopaque,
+ count: i32,
+ xscale: f64,
+ xstart: f64,
+ flags: LineFlags,
+ offset: i32,
+ stride: i32,
+) void;
+//----------------------------------------------------------------------------------------------
+fn PlotLineGen(comptime T: type) type {
+ return struct {
+ xv: []const T,
+ yv: []const T,
+ flags: LineFlags = .{},
+ offset: i32 = 0,
+ stride: i32 = @sizeOf(T),
+ };
+}
+pub fn plotLine(label_id: [:0]const u8, comptime T: type, args: PlotLineGen(T)) void {
+ assert(args.xv.len == args.yv.len);
+ zguiPlot_PlotLine(
+ label_id,
+ gui.typeToDataTypeEnum(T),
+ args.xv.ptr,
+ args.yv.ptr,
+ @as(i32, @intCast(args.xv.len)),
+ args.flags,
+ args.offset,
+ args.stride,
+ );
+}
+extern fn zguiPlot_PlotLine(
+ label_id: [*:0]const u8,
+ data_type: gui.DataType,
+ xv: *const anyopaque,
+ yv: *const anyopaque,
+ count: i32,
+ flags: LineFlags,
+ offset: i32,
+ stride: i32,
+) void;
+//----------------------------------------------------------------------------------------------
+pub const ScatterFlags = packed struct(u32) {
+ _reserved0: bool = false,
+ _reserved1: bool = false,
+ _reserved2: bool = false,
+ _reserved3: bool = false,
+ _reserved4: bool = false,
+ _reserved5: bool = false,
+ _reserved6: bool = false,
+ _reserved7: bool = false,
+ _reserved8: bool = false,
+ _reserved9: bool = false,
+ no_clip: bool = false,
+ _padding: u21 = 0,
+};
+fn PlotScatterValuesGen(comptime T: type) type {
+ return struct {
+ v: []const T,
+ xscale: f64 = 1.0,
+ xstart: f64 = 0.0,
+ flags: ScatterFlags = .{},
+ offset: i32 = 0,
+ stride: i32 = @sizeOf(T),
+ };
+}
+pub fn plotScatterValues(label_id: [:0]const u8, comptime T: type, args: PlotScatterValuesGen(T)) void {
+ zguiPlot_PlotScatterValues(
+ label_id,
+ gui.typeToDataTypeEnum(T),
+ args.v.ptr,
+ @as(i32, @intCast(args.v.len)),
+ args.xscale,
+ args.xstart,
+ args.flags,
+ args.offset,
+ args.stride,
+ );
+}
+extern fn zguiPlot_PlotScatterValues(
+ label_id: [*:0]const u8,
+ data_type: gui.DataType,
+ values: *const anyopaque,
+ count: i32,
+ xscale: f64,
+ xstart: f64,
+ flags: ScatterFlags,
+ offset: i32,
+ stride: i32,
+) void;
+//----------------------------------------------------------------------------------------------
+fn PlotScatterGen(comptime T: type) type {
+ return struct {
+ xv: []const T,
+ yv: []const T,
+ flags: ScatterFlags = .{},
+ offset: i32 = 0,
+ stride: i32 = @sizeOf(T),
+ };
+}
+pub fn plotScatter(label_id: [:0]const u8, comptime T: type, args: PlotScatterGen(T)) void {
+ assert(args.xv.len == args.yv.len);
+ zguiPlot_PlotScatter(
+ label_id,
+ gui.typeToDataTypeEnum(T),
+ args.xv.ptr,
+ args.yv.ptr,
+ @as(i32, @intCast(args.xv.len)),
+ args.flags,
+ args.offset,
+ args.stride,
+ );
+}
+extern fn zguiPlot_PlotScatter(
+ label_id: [*:0]const u8,
+ data_type: gui.DataType,
+ xv: *const anyopaque,
+ yv: *const anyopaque,
+ count: i32,
+ flags: ScatterFlags,
+ offset: i32,
+ stride: i32,
+) void;
+
+pub const ShadedFlags = packed struct(u32) {
+ _padding: u32 = 0,
+};
+fn PlotShadedGen(comptime T: type) type {
+ return struct {
+ xv: []const T,
+ yv: []const T,
+ yref: f64 = 0.0,
+ flags: ShadedFlags = .{},
+ offset: i32 = 0,
+ stride: i32 = @sizeOf(T),
+ };
+}
+pub fn plotShaded(label_id: [:0]const u8, comptime T: type, args: PlotShadedGen(T)) void {
+ assert(args.xv.len == args.yv.len);
+ zguiPlot_PlotShaded(
+ label_id,
+ gui.typeToDataTypeEnum(T),
+ args.xv.ptr,
+ args.yv.ptr,
+ @as(i32, @intCast(args.xv.len)),
+ args.yref,
+ args.flags,
+ args.offset,
+ args.stride,
+ );
+}
+extern fn zguiPlot_PlotShaded(
+ label_id: [*:0]const u8,
+ data_type: gui.DataType,
+ xv: *const anyopaque,
+ yv: *const anyopaque,
+ count: i32,
+ yref: f64,
+ flags: ShadedFlags,
+ offset: i32,
+ stride: i32,
+) void;
+//----------------------------------------------------------------------------------------------
+pub const DragToolFlags = packed struct(u32) {
+ no_cursors: bool = false,
+ no_fit: bool = false,
+ no_no_inputs: bool = false,
+ delayed: bool = false,
+ _padding: u28 = 0,
+};
+const DragPoint = struct {
+ x: *f64,
+ y: *f64,
+ col: [4]f32,
+ size: f32 = 4,
+ flags: DragToolFlags = .{},
+};
+pub fn dragPoint(id: i32, args: DragPoint) bool {
+ return zguiPlot_DragPoint(
+ id,
+ args.x,
+ args.y,
+ &args.col,
+ args.size,
+ args.flags,
+ );
+}
+extern fn zguiPlot_DragPoint(id: i32, x: *f64, y: *f64, *const [4]f32, size: f32, flags: DragToolFlags) bool;
+//----------------------------------------------------------------------------------------------
+// PlotText
+const PlotTextFlags = packed struct(u32) {
+ vertical: bool = false,
+ _padding: u31 = 0,
+};
+const PlotText = struct {
+ x: f64,
+ y: f64,
+ pix_offset: [2]f32 = .{ 0, 0 },
+ flags: PlotTextFlags = .{},
+};
+pub fn plotText(text: [*:0]const u8, args: PlotText) void {
+ zguiPlot_PlotText(text, args.x, args.y, &args.pix_offset, args.flags);
+}
+extern fn zguiPlot_PlotText(
+ text: [*:0]const u8,
+ x: f64,
+ y: f64,
+ pix_offset: *const [2]f32,
+ flags: PlotTextFlags,
+) void;
+
+//----------------------------------------------------------------------------------------------
+/// `pub fn showDemoWindow(popen: ?*bool) void`
+pub const showDemoWindow = zguiPlot_ShowDemoWindow;
+extern fn zguiPlot_ShowDemoWindow(popen: ?*bool) void;
+//----------------------------------------------------------------------------------------------
+/// `pub fn endPlot() void`
+pub const endPlot = zguiPlot_EndPlot;
+extern fn zguiPlot_EndPlot() void;
+//----------------------------------------------------------------------------------------------
diff --git a/vendor/zgui/src/te.zig b/vendor/zgui/src/te.zig
new file mode 100644
index 0000000..efd1eab
--- /dev/null
+++ b/vendor/zgui/src/te.zig
@@ -0,0 +1,255 @@
+const std = @import("std");
+const zgui = @import("gui.zig");
+const te_enabled = @import("zgui_options").with_te;
+
+pub const Actions = enum(c_int) {
+ unknown = 0,
+ /// Move mouse
+ hover,
+ /// Move mouse and click
+ click,
+ /// Move mouse and double-click
+ double_click,
+ /// Check item if unchecked (Checkbox, MenuItem or any widget reporting ImGuiItemStatusFlags_Checkable)
+ check,
+ /// Uncheck item if checked
+ uncheck,
+ /// Open item if closed (TreeNode, BeginMenu or any widget reporting ImGuiItemStatusFlags_Openable)
+ open,
+ /// Close item if opened
+ close,
+ /// Start text inputing into a field (e.g. CTRL+Click on Drags/Slider, click on InputText etc.)
+ input,
+ /// Activate item with navigation
+ nav_activate,
+};
+
+pub const TestRunFlags = packed struct(c_int) {
+ /// Used internally to temporarily disable the GUI func (at the end of a test, etc)
+ gui_func_disable: bool = false,
+ /// Set when user selects "Run GUI func"
+ gui_func_only: bool = false,
+ no_success_mgs: bool = false,
+ no_stop_on_error: bool = false,
+ no_break_on_error: bool = false,
+ /// Disable input submission to let test submission raw input event (in order to test e.g. IO queue)
+ enable_raw_inputs: bool = false,
+ manual_run: bool = false,
+ command_line: bool = false,
+ _padding: u24 = 0,
+};
+
+pub const TestOpFlags = packed struct(c_int) {
+ // Don't check for HoveredId after aiming for a widget. A few situations may want this: while e.g. dragging or another items prevents hovering, or for items that don't use ItemHoverable()
+ no_check_hovered_id: bool = false,
+ /// Don't abort/error e.g. if the item cannot be found or the operation doesn't succeed.
+ no_error: bool = false,
+ /// Don't focus window when aiming at an item
+ no_focus_window: bool = false,
+ /// Disable automatically uncollapsing windows (useful when specifically testing Collapsing behaviors)
+ no_auto_uncollapse: bool = false,
+ /// Disable automatically opening intermediaries (e.g. ItemClick("Hello/OK") will automatically first open "Hello" if "OK" isn't found. Only works if ref is a string path.
+ no_auto_open_full_path: bool = false,
+ /// Used by recursing functions to indicate a second attempt
+ is_second_attempt: bool = false,
+ move_to_edge_l: bool = false, // Simple Dumb aiming helpers to test widget that care about clicking position. May need to replace will better functionalities.
+ move_to_edge_r: bool = false,
+ move_to_edge_u: bool = false,
+ move_to_edge_d: bool = false,
+ _padding: u22 = 0,
+};
+
+pub const CheckFlags = packed struct(c_int) {
+ silent_success: bool = false,
+ _padding: u31 = 0,
+};
+
+pub const RunSpeed = enum(c_int) {
+ /// Run tests as fast as possible (teleport mouse, skip delays, etc.)
+ fast = 0,
+ /// Run tests at human watchable speed (for debugging)
+ normal = 1,
+ /// Run tests with pauses between actions (for e.g. tutorials)
+ cinematic = 2,
+};
+
+pub const TestGroup = enum(c_int) {
+ unknown = -1,
+ tests = 0,
+ perfs = 1,
+};
+
+pub const Test = anyopaque;
+
+pub const TestEngine = opaque {
+ pub fn registerTest(
+ engine: *TestEngine,
+ category: [:0]const u8,
+ name: [:0]const u8,
+ src: std.builtin.SourceLocation,
+ comptime Callbacks: type,
+ ) *Test {
+ return zguiTe_RegisterTest(
+ engine,
+ category.ptr,
+ name.ptr,
+ src.file.ptr,
+ @intCast(src.line),
+ if (std.meta.hasFn(Callbacks, "gui"))
+ struct {
+ fn f(context: *TestContext) callconv(.C) void {
+ Callbacks.gui(context) catch undefined;
+ }
+ }.f
+ else
+ null,
+ if (std.meta.hasFn(Callbacks, "run"))
+ struct {
+ fn f(context: *TestContext) callconv(.C) void {
+ Callbacks.run(context) catch undefined;
+ }
+ }.f
+ else
+ null,
+ );
+ }
+
+ pub const showTestEngineWindows = zguiTe_ShowTestEngineWindows;
+ extern fn zguiTe_ShowTestEngineWindows(engine: *TestEngine, p_open: ?*bool) void;
+
+ pub const setRunSpeed = zguiTe_EngineSetRunSpeed;
+ extern fn zguiTe_EngineSetRunSpeed(engine: *TestEngine, speed: RunSpeed) void;
+
+ pub const stop = zguiTe_Stop;
+ extern fn zguiTe_Stop(engine: *TestEngine) void;
+
+ pub const tryAbortEngine = zguiTe_TryAbortEngine;
+ extern fn zguiTe_TryAbortEngine(engine: *TestEngine) void;
+
+ pub const postSwap = zguiTe_PostSwap;
+ extern fn zguiTe_PostSwap(engine: *TestEngine) void;
+
+ pub const isTestQueueEmpty = zguiTe_IsTestQueueEmpty;
+ extern fn zguiTe_IsTestQueueEmpty(engine: *TestEngine) bool;
+
+ pub const getResult = zguiTe_GetResult;
+ extern fn zguiTe_GetResult(engine: *TestEngine, count_tested: *c_int, count_success: *c_int) void;
+
+ pub const printResultSummary = zguiTe_PrintResultSummary;
+ extern fn zguiTe_PrintResultSummary(engine: *TestEngine) void;
+
+ pub fn queueTests(engine: *TestEngine, group: TestGroup, filter_str: [:0]const u8, run_flags: TestRunFlags) void {
+ zguiTe_QueueTests(engine, group, filter_str.ptr, run_flags);
+ }
+ extern fn zguiTe_QueueTests(engine: *TestEngine, group: TestGroup, filter_str: [*]const u8, run_flags: TestRunFlags) void;
+
+ pub fn exportJunitResult(engine: *TestEngine, filename: [:0]const u8) void {
+ zguiTe_EngineExportJunitResult(engine, filename.ptr);
+ }
+ extern fn zguiTe_EngineExportJunitResult(engine: *TestEngine, filename: [*]const u8) void;
+};
+
+pub const TestContext = opaque {
+ pub fn setRef(ctx: *TestContext, ref: [:0]const u8) void {
+ return zguiTe_ContextSetRef(ctx, ref.ptr);
+ }
+
+ pub fn windowFocus(ctx: *TestContext, ref: [:0]const u8) void {
+ return zguiTe_ContextWindowFocus(ctx, ref.ptr);
+ }
+
+ pub fn yield(ctx: *TestContext, frame_count: i32) void {
+ return zguiTe_ContextYield(ctx, frame_count);
+ }
+
+ pub fn itemAction(ctx: *TestContext, action: Actions, ref: [:0]const u8, flags: TestOpFlags, action_arg: ?*anyopaque) void {
+ return zguiTe_ContextItemAction(ctx, action, ref.ptr, flags, action_arg);
+ }
+
+ pub fn itemInputStrValue(ctx: *TestContext, ref: [:0]const u8, value: [:0]const u8) void {
+ return zguiTe_ContextItemInputStrValue(ctx, ref.ptr, value.ptr);
+ }
+
+ pub fn itemInputIntValue(ctx: *TestContext, ref: [:0]const u8, value: i32) void {
+ return zguiTe_ContextItemInputIntValue(ctx, ref.ptr, value);
+ }
+
+ pub fn itemInputFloatValue(ctx: *TestContext, ref: [:0]const u8, value: f32) void {
+ return zguiTe_ContextItemInputFloatValue(ctx, ref.ptr, value);
+ }
+
+ pub fn menuAction(ctx: *TestContext, action: Actions, ref: [*]const u8) void {
+ return zguiTe_ContextMenuAction(ctx, action, ref);
+ }
+
+ pub fn dragAndDrop(ctx: *TestContext, ref_src: [:0]const u8, ref_dst: [:0]const u8, button: zgui.MouseButton) void {
+ return zguiTe_ContextDragAndDrop(ctx, ref_src.ptr, ref_dst.ptr, button);
+ }
+
+ pub fn keyDown(ctx: *TestContext, key_chord: c_int) void {
+ return zguiTe_ContextKeyDown(ctx, key_chord);
+ }
+
+ pub fn keyUp(ctx: *TestContext, key_chord: c_int) void {
+ return zguiTe_ContextKeyUp(ctx, key_chord);
+ }
+
+ extern fn zguiTe_ContextSetRef(ctx: *TestContext, ref: [*]const u8) void;
+ extern fn zguiTe_ContextWindowFocus(ctx: *TestContext, ref: [*]const u8) void;
+ extern fn zguiTe_ContextYield(ctx: *TestContext, frame_count: c_int) void;
+ extern fn zguiTe_ContextMenuAction(ctx: *TestContext, action: Actions, ref: [*]const u8) void;
+ extern fn zguiTe_ContextItemAction(ctx: *TestContext, action: Actions, ref: [*]const u8, flags: TestOpFlags, action_arg: ?*anyopaque) void;
+ extern fn zguiTe_ContextItemInputStrValue(ctx: *TestContext, ref: [*]const u8, value: [*]const u8) void;
+ extern fn zguiTe_ContextItemInputIntValue(ctx: *TestContext, ref: [*]const u8, value: i32) void;
+ extern fn zguiTe_ContextItemInputFloatValue(ctx: *TestContext, ref: [*]const u8, value: f32) void;
+ extern fn zguiTe_ContextDragAndDrop(ctx: *TestContext, ref_src: [*]const u8, ref_dst: [*]const u8, button: zgui.MouseButton) void;
+ extern fn zguiTe_ContextKeyDown(ctx: *TestContext, key_chord: c_int) void;
+ extern fn zguiTe_ContextKeyUp(ctx: *TestContext, key_chord: c_int) void;
+};
+
+const ImGuiTestGuiFunc = fn (context: *TestContext) callconv(.C) void;
+const ImGuiTestTestFunc = fn (context: *TestContext) callconv(.C) void;
+
+pub const createContext = zguiTe_CreateContext;
+extern fn zguiTe_CreateContext() *TestEngine;
+
+pub const destroyContext = zguiTe_DestroyContext;
+extern fn zguiTe_DestroyContext(engine: *TestEngine) void;
+
+extern fn zguiTe_Check(filename: [*]const u8, func: [*]const u8, line: u32, flags: CheckFlags, resul: bool, expr: [*]const u8) bool;
+
+pub fn check(src: std.builtin.SourceLocation, flags: CheckFlags, resul: bool, expr: [:0]const u8) bool {
+ return zguiTe_Check(src.file.ptr, src.fn_name.ptr, src.line, flags, resul, expr.ptr);
+}
+
+pub extern fn zguiTe_RegisterTest(
+ engine: *TestEngine,
+ category: [*]const u8,
+ name: [*]const u8,
+ src: [*]const u8,
+ src_line: c_int,
+ gui_fce: ?*const ImGuiTestGuiFunc,
+ gui_test_fce: ?*const ImGuiTestTestFunc,
+) *Test;
+
+pub fn checkTestError(
+ src: std.builtin.SourceLocation,
+ err: anyerror,
+) void {
+ var buff: [128:0]u8 = undefined;
+ const msg = std.fmt.bufPrintZ(&buff, "Assert error: {}", .{err}) catch undefined;
+ _ = zguiTe_Check(src.file.ptr, src.fn_name.ptr, src.line, .{}, false, msg.ptr);
+}
+
+var _te_engine: ?*TestEngine = null;
+pub fn getTestEngine() ?*TestEngine {
+ return _te_engine;
+}
+
+pub fn init() void {
+ _te_engine = createContext();
+}
+
+pub fn deinit() void {
+ destroyContext(_te_engine.?);
+}
diff --git a/vendor/zgui/src/zgui.cpp b/vendor/zgui/src/zgui.cpp
new file mode 100644
index 0000000..658b009
--- /dev/null
+++ b/vendor/zgui/src/zgui.cpp
@@ -0,0 +1,2708 @@
+#include "imgui.h"
+
+#if ZGUI_IMPLOT
+#include "implot.h"
+#endif
+
+#if ZGUI_TE
+#include "imgui_te_engine.h"
+#include "imgui_te_context.h"
+#include "imgui_te_ui.h"
+#include "imgui_te_utils.h"
+#include "imgui_te_exporters.h"
+#endif
+
+#include "imgui_internal.h"
+
+#ifndef ZGUI_API
+#define ZGUI_API
+#endif
+
+extern "C" {
+
+/*
+#include <stdio.h>
+
+ZGUI_API float zguiGetFloatMin(void) {
+ printf("__FLT_MIN__ %.32e\n", __FLT_MIN__);
+ return __FLT_MIN__;
+}
+
+ZGUI_API float zguiGetFloatMax(void) {
+ printf("__FLT_MAX__ %.32e\n", __FLT_MAX__);
+ return __FLT_MAX__;
+}
+*/
+
+ZGUI_API void zguiSetAllocatorFunctions(
+ void* (*alloc_func)(size_t, void*),
+ void (*free_func)(void*, void*)
+) {
+ ImGui::SetAllocatorFunctions(alloc_func, free_func, nullptr);
+}
+
+ZGUI_API void zguiSetNextWindowPos(float x, float y, ImGuiCond cond, float pivot_x, float pivot_y) {
+ ImGui::SetNextWindowPos({ x, y }, cond, { pivot_x, pivot_y });
+}
+
+ZGUI_API void zguiSetNextWindowSize(float w, float h, ImGuiCond cond) {
+ ImGui::SetNextWindowSize({ w, h }, cond);
+}
+
+ZGUI_API void zguiSetNextWindowCollapsed(bool collapsed, ImGuiCond cond) {
+ ImGui::SetNextWindowCollapsed(collapsed, cond);
+}
+
+ZGUI_API void zguiSetNextWindowFocus(void) {
+ ImGui::SetNextWindowFocus();
+}
+
+ZGUI_API void zguiSetNextWindowBgAlpha(float alpha) {
+ ImGui::SetNextWindowBgAlpha(alpha);
+}
+
+ZGUI_API void zguiSetWindowFocus(const char* name) {
+ ImGui::SetWindowFocus(name);
+}
+
+ZGUI_API void zguiSetKeyboardFocusHere(int offset) {
+ ImGui::SetKeyboardFocusHere(offset);
+}
+
+ZGUI_API bool zguiBegin(const char* name, bool* p_open, ImGuiWindowFlags flags) {
+ return ImGui::Begin(name, p_open, flags);
+}
+
+ZGUI_API void zguiEnd(void) {
+ ImGui::End();
+}
+
+ZGUI_API bool zguiBeginChild(const char* str_id, float w, float h, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags) {
+ return ImGui::BeginChild(str_id, { w, h }, child_flags, window_flags);
+}
+
+ZGUI_API bool zguiBeginChildId(ImGuiID id, float w, float h, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags) {
+ return ImGui::BeginChild(id, { w, h }, child_flags, window_flags);
+}
+
+ZGUI_API void zguiEndChild(void) {
+ ImGui::EndChild();
+}
+
+ZGUI_API float zguiGetScrollX(void) {
+ return ImGui::GetScrollX();
+}
+
+ZGUI_API float zguiGetScrollY(void) {
+ return ImGui::GetScrollY();
+}
+
+ZGUI_API void zguiSetScrollX(float scroll_x) {
+ ImGui::SetScrollX(scroll_x);
+}
+
+ZGUI_API void zguiSetScrollY(float scroll_y) {
+ ImGui::SetScrollY(scroll_y);
+}
+
+ZGUI_API float zguiGetScrollMaxX(void) {
+ return ImGui::GetScrollMaxX();
+}
+
+ZGUI_API float zguiGetScrollMaxY(void) {
+ return ImGui::GetScrollMaxY();
+}
+
+ZGUI_API void zguiSetScrollHereX(float center_x_ratio) {
+ ImGui::SetScrollHereX(center_x_ratio);
+}
+
+ZGUI_API void zguiSetScrollHereY(float center_y_ratio) {
+ ImGui::SetScrollHereY(center_y_ratio);
+}
+
+ZGUI_API void zguiSetScrollFromPosX(float local_x, float center_x_ratio) {
+ ImGui::SetScrollFromPosX(local_x, center_x_ratio);
+}
+
+ZGUI_API void zguiSetScrollFromPosY(float local_y, float center_y_ratio) {
+ ImGui::SetScrollFromPosY(local_y, center_y_ratio);
+}
+
+ZGUI_API bool zguiIsWindowAppearing(void) {
+ return ImGui::IsWindowAppearing();
+}
+
+ZGUI_API bool zguiIsWindowCollapsed(void) {
+ return ImGui::IsWindowCollapsed();
+}
+
+ZGUI_API bool zguiIsWindowFocused(ImGuiFocusedFlags flags) {
+ return ImGui::IsWindowFocused(flags);
+}
+
+ZGUI_API bool zguiIsWindowHovered(ImGuiHoveredFlags flags) {
+ return ImGui::IsWindowHovered(flags);
+}
+
+ZGUI_API void zguiGetWindowPos(float pos[2]) {
+ const ImVec2 p = ImGui::GetWindowPos();
+ pos[0] = p.x;
+ pos[1] = p.y;
+}
+
+ZGUI_API void zguiGetWindowSize(float size[2]) {
+ const ImVec2 s = ImGui::GetWindowSize();
+ size[0] = s.x;
+ size[1] = s.y;
+}
+
+ZGUI_API float zguiGetWindowWidth(void) {
+ return ImGui::GetWindowWidth();
+}
+
+ZGUI_API float zguiGetWindowHeight(void) {
+ return ImGui::GetWindowHeight();
+}
+
+ZGUI_API void zguiGetMouseDragDelta(ImGuiMouseButton button, float lock_threshold, float delta[2]) {
+ const ImVec2 d = ImGui::GetMouseDragDelta(button, lock_threshold);
+ delta[0] = d.x;
+ delta[1] = d.y;
+}
+
+ZGUI_API void zguiResetMouseDragDelta(ImGuiMouseButton button) {
+ ImGui::ResetMouseDragDelta(button);
+}
+
+ZGUI_API void zguiSpacing(void) {
+ ImGui::Spacing();
+}
+
+ZGUI_API void zguiNewLine(void) {
+ ImGui::NewLine();
+}
+
+ZGUI_API void zguiIndent(float indent_w) {
+ ImGui::Indent(indent_w);
+}
+
+ZGUI_API void zguiUnindent(float indent_w) {
+ ImGui::Unindent(indent_w);
+}
+
+ZGUI_API void zguiSeparator(void) {
+ ImGui::Separator();
+}
+
+ZGUI_API void zguiSeparatorText(const char* label) {
+ ImGui::SeparatorText(label);
+}
+
+ZGUI_API void zguiSameLine(float offset_from_start_x, float spacing) {
+ ImGui::SameLine(offset_from_start_x, spacing);
+}
+
+ZGUI_API void zguiDummy(float w, float h) {
+ ImGui::Dummy({ w, h });
+}
+
+ZGUI_API void zguiBeginGroup(void) {
+ ImGui::BeginGroup();
+}
+
+ZGUI_API void zguiEndGroup(void) {
+ ImGui::EndGroup();
+}
+
+ZGUI_API void zguiGetItemRectMax(float rect[2]) {
+ const ImVec2 r = ImGui::GetItemRectMax();
+ rect[0] = r.x;
+ rect[1] = r.y;
+}
+
+ZGUI_API void zguiGetItemRectMin(float rect[2]) {
+ const ImVec2 r = ImGui::GetItemRectMin();
+ rect[0] = r.x;
+ rect[1] = r.y;
+}
+
+ZGUI_API void zguiGetItemRectSize(float rect[2]) {
+ const ImVec2 r = ImGui::GetItemRectSize();
+ rect[0] = r.x;
+ rect[1] = r.y;
+}
+
+ZGUI_API void zguiGetCursorPos(float pos[2]) {
+ const ImVec2 p = ImGui::GetCursorPos();
+ pos[0] = p.x;
+ pos[1] = p.y;
+}
+
+ZGUI_API float zguiGetCursorPosX(void) {
+ return ImGui::GetCursorPosX();
+}
+
+ZGUI_API float zguiGetCursorPosY(void) {
+ return ImGui::GetCursorPosY();
+}
+
+ZGUI_API void zguiSetCursorPos(float local_x, float local_y) {
+ ImGui::SetCursorPos({ local_x, local_y });
+}
+
+ZGUI_API void zguiSetCursorPosX(float local_x) {
+ ImGui::SetCursorPosX(local_x);
+}
+
+ZGUI_API void zguiSetCursorPosY(float local_y) {
+ ImGui::SetCursorPosY(local_y);
+}
+
+ZGUI_API void zguiGetCursorStartPos(float pos[2]) {
+ const ImVec2 p = ImGui::GetCursorStartPos();
+ pos[0] = p.x;
+ pos[1] = p.y;
+}
+
+ZGUI_API void zguiGetCursorScreenPos(float pos[2]) {
+ const ImVec2 p = ImGui::GetCursorScreenPos();
+ pos[0] = p.x;
+ pos[1] = p.y;
+}
+
+ZGUI_API void zguiSetCursorScreenPos(float screen_x, float screen_y) {
+ ImGui::SetCursorScreenPos({ screen_x, screen_y });
+}
+
+ZGUI_API int zguiGetMouseCursor(void) {
+ return ImGui::GetMouseCursor();
+}
+
+ZGUI_API void zguiSetMouseCursor(int cursor) {
+ ImGui::SetMouseCursor(cursor);
+}
+
+ZGUI_API void zguiGetMousePos(float pos[2]) {
+ const ImVec2 p = ImGui::GetMousePos();
+ pos[0] = p.x;
+ pos[1] = p.y;
+}
+
+ZGUI_API void zguiAlignTextToFramePadding(void) {
+ ImGui::AlignTextToFramePadding();
+}
+
+ZGUI_API float zguiGetTextLineHeight(void) {
+ return ImGui::GetTextLineHeight();
+}
+
+ZGUI_API float zguiGetTextLineHeightWithSpacing(void) {
+ return ImGui::GetTextLineHeightWithSpacing();
+}
+
+ZGUI_API float zguiGetFrameHeight(void) {
+ return ImGui::GetFrameHeight();
+}
+
+ZGUI_API float zguiGetFrameHeightWithSpacing(void) {
+ return ImGui::GetFrameHeightWithSpacing();
+}
+
+ZGUI_API bool zguiDragFloat(
+ const char* label,
+ float* v,
+ float v_speed,
+ float v_min,
+ float v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::DragFloat(label, v, v_speed, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiDragFloat2(
+ const char* label,
+ float v[2],
+ float v_speed,
+ float v_min,
+ float v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::DragFloat2(label, v, v_speed, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiDragFloat3(
+ const char* label,
+ float v[3],
+ float v_speed,
+ float v_min,
+ float v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::DragFloat3(label, v, v_speed, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiDragFloat4(
+ const char* label,
+ float v[4],
+ float v_speed,
+ float v_min,
+ float v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::DragFloat4(label, v, v_speed, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiDragFloatRange2(
+ const char* label,
+ float* v_current_min,
+ float* v_current_max,
+ float v_speed,
+ float v_min,
+ float v_max,
+ const char* format,
+ const char* format_max,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::DragFloatRange2(
+ label,
+ v_current_min,
+ v_current_max,
+ v_speed,
+ v_min,
+ v_max,
+ format,
+ format_max,
+ flags
+ );
+}
+
+ZGUI_API bool zguiDragInt(
+ const char* label,
+ int* v,
+ float v_speed,
+ int v_min,
+ int v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::DragInt(label, v, v_speed, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiDragInt2(
+ const char* label,
+ int v[2],
+ float v_speed,
+ int v_min,
+ int v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::DragInt2(label, v, v_speed, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiDragInt3(
+ const char* label,
+ int v[3],
+ float v_speed,
+ int v_min,
+ int v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::DragInt3(label, v, v_speed, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiDragInt4(
+ const char* label,
+ int v[4],
+ float v_speed,
+ int v_min,
+ int v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::DragInt4(label, v, v_speed, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiDragIntRange2(
+ const char* label,
+ int* v_current_min,
+ int* v_current_max,
+ float v_speed,
+ int v_min,
+ int v_max,
+ const char* format,
+ const char* format_max,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::DragIntRange2(
+ label,
+ v_current_min,
+ v_current_max,
+ v_speed,
+ v_min,
+ v_max,
+ format,
+ format_max,
+ flags
+ );
+}
+
+ZGUI_API bool zguiDragScalar(
+ const char* label,
+ ImGuiDataType data_type,
+ void* p_data,
+ float v_speed,
+ const void* p_min,
+ const void* p_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::DragScalar(label, data_type, p_data, v_speed, p_min, p_max, format, flags);
+}
+
+ZGUI_API bool zguiDragScalarN(
+ const char* label,
+ ImGuiDataType data_type,
+ void* p_data,
+ int components,
+ float v_speed,
+ const void* p_min,
+ const void* p_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::DragScalarN(label, data_type, p_data, components, v_speed, p_min, p_max, format, flags);
+}
+
+ZGUI_API bool zguiBeginDragDropSource(ImGuiDragDropFlags flags = 0) {
+ return ImGui::BeginDragDropSource(flags);
+}
+ZGUI_API bool zguiSetDragDropPayload(
+ const char* type,
+ const void* data,
+ size_t sz,
+ ImGuiCond cond = 0
+) {
+ return ImGui::SetDragDropPayload(type, data, sz, cond);
+}
+ZGUI_API void zguiEndDragDropSource() {
+ return ImGui::EndDragDropSource();
+}
+ZGUI_API bool zguiBeginDragDropTarget() {
+ return ImGui::BeginDragDropTarget();
+}
+ZGUI_API const ImGuiPayload* zguiAcceptDragDropPayload(
+ const char* type,
+ ImGuiDragDropFlags flags = 0
+) {
+ return ImGui::AcceptDragDropPayload(type);
+}
+ZGUI_API void zguiEndDragDropTarget() {
+ return ImGui::EndDragDropTarget();
+}
+ZGUI_API const ImGuiPayload* zguiGetDragDropPayload() {
+ return ImGui::GetDragDropPayload();
+}
+
+ZGUI_API void zguiImGuiPayload_Clear(ImGuiPayload* payload) { payload->Clear(); }
+
+ZGUI_API bool zguiImGuiPayload_IsDataType(const ImGuiPayload* payload, const char* type) {
+ return payload->IsDataType(type);
+}
+
+ZGUI_API bool zguiImGuiPayload_IsPreview(const ImGuiPayload* payload) {
+ return payload->IsPreview();
+}
+
+ZGUI_API bool zguiImGuiPayload_IsDelivery(const ImGuiPayload* payload) {
+ return payload->IsDelivery();
+}
+
+
+ZGUI_API bool zguiCombo(
+ const char* label,
+ int* current_item,
+ const char* items_separated_by_zeros,
+ int popup_max_height_in_items
+) {
+ return ImGui::Combo(label, current_item, items_separated_by_zeros, popup_max_height_in_items);
+}
+
+ZGUI_API bool zguiBeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags) {
+ return ImGui::BeginCombo(label, preview_value, flags);
+}
+
+ZGUI_API void zguiEndCombo(void) {
+ ImGui::EndCombo();
+}
+
+ZGUI_API bool zguiBeginListBox(const char* label, float w, float h) {
+ return ImGui::BeginListBox(label, { w, h });
+}
+
+ZGUI_API void zguiEndListBox(void) {
+ ImGui::EndListBox();
+}
+
+ZGUI_API bool zguiSelectable(const char* label, bool selected, ImGuiSelectableFlags flags, float w, float h) {
+ return ImGui::Selectable(label, selected, flags, { w, h });
+}
+
+ZGUI_API bool zguiSelectableStatePtr(
+ const char* label,
+ bool* p_selected,
+ ImGuiSelectableFlags flags,
+ float w,
+ float h
+) {
+ return ImGui::Selectable(label, p_selected, flags, { w, h });
+}
+
+ZGUI_API bool zguiSliderFloat(
+ const char* label,
+ float* v,
+ float v_min,
+ float v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::SliderFloat(label, v, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiSliderFloat2(
+ const char* label,
+ float v[2],
+ float v_min,
+ float v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::SliderFloat2(label, v, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiSliderFloat3(
+ const char* label,
+ float v[3],
+ float v_min,
+ float v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::SliderFloat3(label, v, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiSliderFloat4(
+ const char* label,
+ float v[4],
+ float v_min,
+ float v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::SliderFloat4(label, v, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiSliderInt(
+ const char* label,
+ int* v,
+ int v_min,
+ int v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::SliderInt(label, v, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiSliderInt2(
+ const char* label,
+ int v[2],
+ int v_min,
+ int v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::SliderInt2(label, v, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiSliderInt3(
+ const char* label,
+ int v[3],
+ int v_min,
+ int v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::SliderInt3(label, v, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiSliderInt4(
+ const char* label,
+ int v[4],
+ int v_min,
+ int v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::SliderInt4(label, v, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiSliderScalar(
+ const char* label,
+ ImGuiDataType data_type,
+ void* p_data,
+ const void* p_min,
+ const void* p_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::SliderScalar(label, data_type, p_data, p_min, p_max, format, flags);
+}
+
+ZGUI_API bool zguiSliderScalarN(
+ const char* label,
+ ImGuiDataType data_type,
+ void* p_data,
+ int components,
+ const void* p_min,
+ const void* p_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::SliderScalarN(label, data_type, p_data, components, p_min, p_max, format, flags);
+}
+
+ZGUI_API bool zguiVSliderFloat(
+ const char* label,
+ float w,
+ float h,
+ float* v,
+ float v_min,
+ float v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::VSliderFloat(label, { w, h }, v, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiVSliderInt(
+ const char* label,
+ float w,
+ float h,
+ int* v,
+ int v_min,
+ int v_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::VSliderInt(label, { w, h }, v, v_min, v_max, format, flags);
+}
+
+ZGUI_API bool zguiVSliderScalar(
+ const char* label,
+ float w,
+ float h,
+ ImGuiDataType data_type,
+ void* p_data,
+ const void* p_min,
+ const void* p_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::VSliderScalar(label, { w, h }, data_type, p_data, p_min, p_max, format, flags);
+}
+
+ZGUI_API bool zguiSliderAngle(
+ const char* label,
+ float* v_rad,
+ float v_degrees_min,
+ float v_degrees_max,
+ const char* format,
+ ImGuiSliderFlags flags
+) {
+ return ImGui::SliderAngle(label, v_rad, v_degrees_min, v_degrees_max, format, flags);
+}
+
+ZGUI_API ImGuiInputTextCallbackData zguiInputTextCallbackData_Init(void) {
+ return ImGuiInputTextCallbackData();
+}
+
+ZGUI_API void zguiInputTextCallbackData_DeleteChars(
+ ImGuiInputTextCallbackData* data,
+ int pos,
+ int bytes_count
+) {
+ data->DeleteChars(pos, bytes_count);
+}
+
+ZGUI_API void zguiInputTextCallbackData_InsertChars(
+ ImGuiInputTextCallbackData* data,
+ int pos,
+ const char* text,
+ const char* text_end
+) {
+ data->InsertChars(pos, text, text_end);
+}
+
+ZGUI_API bool zguiInputText(
+ const char* label,
+ char* buf,
+ size_t buf_size,
+ ImGuiInputTextFlags flags,
+ ImGuiInputTextCallback callback,
+ void* user_data
+) {
+ return ImGui::InputText(label, buf, buf_size, flags, callback, user_data);
+}
+
+ZGUI_API bool zguiInputTextMultiline(
+ const char* label,
+ char* buf,
+ size_t buf_size,
+ float w,
+ float h,
+ ImGuiInputTextFlags flags,
+ ImGuiInputTextCallback callback,
+ void* user_data
+) {
+ return ImGui::InputTextMultiline(label, buf, buf_size, { w, h }, flags, callback, user_data);
+}
+
+ZGUI_API bool zguiInputTextWithHint(
+ const char* label,
+ const char* hint,
+ char* buf,
+ size_t buf_size,
+ ImGuiInputTextFlags flags,
+ ImGuiInputTextCallback callback,
+ void* user_data
+) {
+ return ImGui::InputTextWithHint(label, hint, buf, buf_size, flags, callback, user_data);
+}
+
+ZGUI_API bool zguiInputFloat(
+ const char* label,
+ float* v,
+ float step,
+ float step_fast,
+ const char* format,
+ ImGuiInputTextFlags flags
+) {
+ return ImGui::InputFloat(label, v, step, step_fast, format, flags);
+}
+
+ZGUI_API bool zguiInputFloat2(
+ const char* label,
+ float v[2],
+ const char* format,
+ ImGuiInputTextFlags flags
+) {
+ return ImGui::InputFloat2(label, v, format, flags);
+}
+
+ZGUI_API bool zguiInputFloat3(
+ const char* label,
+ float v[3],
+ const char* format,
+ ImGuiInputTextFlags flags
+) {
+ return ImGui::InputFloat3(label, v, format, flags);
+}
+
+ZGUI_API bool zguiInputFloat4(
+ const char* label,
+ float v[4],
+ const char* format,
+ ImGuiInputTextFlags flags
+) {
+ return ImGui::InputFloat4(label, v, format, flags);
+}
+
+ZGUI_API bool zguiInputInt(
+ const char* label,
+ int* v,
+ int step,
+ int step_fast,
+ ImGuiInputTextFlags flags
+) {
+ return ImGui::InputInt(label, v, step, step_fast, flags);
+}
+
+ZGUI_API bool zguiInputInt2(const char* label, int v[2], ImGuiInputTextFlags flags) {
+ return ImGui::InputInt2(label, v, flags);
+}
+
+ZGUI_API bool zguiInputInt3(const char* label, int v[3], ImGuiInputTextFlags flags) {
+ return ImGui::InputInt3(label, v, flags);
+}
+
+ZGUI_API bool zguiInputInt4(const char* label, int v[4], ImGuiInputTextFlags flags) {
+ return ImGui::InputInt4(label, v, flags);
+}
+
+ZGUI_API bool zguiInputDouble(
+ const char* label,
+ double* v,
+ double step,
+ double step_fast,
+ const char* format,
+ ImGuiInputTextFlags flags
+) {
+ return ImGui::InputDouble(label, v, step, step_fast, format, flags);
+}
+
+ZGUI_API bool zguiInputScalar(
+ const char* label,
+ ImGuiDataType data_type,
+ void* p_data,
+ const void* p_step,
+ const void* p_step_fast,
+ const char* format,
+ ImGuiInputTextFlags flags
+) {
+ return ImGui::InputScalar(label, data_type, p_data, p_step, p_step_fast, format, flags);
+}
+
+ZGUI_API bool zguiInputScalarN(
+ const char* label,
+ ImGuiDataType data_type,
+ void* p_data,
+ int components,
+ const void* p_step,
+ const void* p_step_fast,
+ const char* format,
+ ImGuiInputTextFlags flags
+) {
+ return ImGui::InputScalarN(label, data_type, p_data, components, p_step, p_step_fast, format, flags);
+}
+
+ZGUI_API bool zguiColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags) {
+ return ImGui::ColorEdit3(label, col, flags);
+}
+
+ZGUI_API bool zguiColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags) {
+ return ImGui::ColorEdit4(label, col, flags);
+}
+
+ZGUI_API bool zguiColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags) {
+ return ImGui::ColorPicker3(label, col, flags);
+}
+
+ZGUI_API bool zguiColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags, const float* ref_col) {
+ return ImGui::ColorPicker4(label, col, flags, ref_col);
+}
+
+ZGUI_API bool zguiColorButton(const char* desc_id, const float col[4], ImGuiColorEditFlags flags, float w, float h) {
+ return ImGui::ColorButton(desc_id, { col[0], col[1], col[2], col[3] }, flags, { w, h });
+}
+
+ZGUI_API void zguiTextUnformatted(const char* text, const char* text_end) {
+ ImGui::TextUnformatted(text, text_end);
+}
+
+ZGUI_API void zguiTextColored(const float col[4], const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ ImGui::TextColoredV({ col[0], col[1], col[2], col[3] }, fmt, args);
+ va_end(args);
+}
+
+ZGUI_API void zguiTextDisabled(const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ ImGui::TextDisabledV(fmt, args);
+ va_end(args);
+}
+
+ZGUI_API void zguiTextWrapped(const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ ImGui::TextWrappedV(fmt, args);
+ va_end(args);
+}
+
+ZGUI_API void zguiBulletText(const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ ImGui::BulletTextV(fmt, args);
+ va_end(args);
+}
+
+ZGUI_API void zguiLabelText(const char* label, const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ ImGui::LabelTextV(label, fmt, args);
+ va_end(args);
+}
+
+ZGUI_API void zguiCalcTextSize(
+ const char* txt,
+ const char* txt_end,
+ bool hide_text_after_double_hash,
+ float wrap_width,
+ float* out_w,
+ float* out_h
+) {
+ assert(out_w && out_h);
+ const ImVec2 s = ImGui::CalcTextSize(txt, txt_end, hide_text_after_double_hash, wrap_width);
+ *out_w = s.x;
+ *out_h = s.y;
+}
+
+ZGUI_API bool zguiButton(const char* label, float x, float y) {
+ return ImGui::Button(label, { x, y });
+}
+
+ZGUI_API bool zguiSmallButton(const char* label) {
+ return ImGui::SmallButton(label);
+}
+
+ZGUI_API bool zguiInvisibleButton(const char* str_id, float w, float h, ImGuiButtonFlags flags) {
+ return ImGui::InvisibleButton(str_id, { w, h }, flags);
+}
+
+ZGUI_API bool zguiArrowButton(const char* str_id, ImGuiDir dir) {
+ return ImGui::ArrowButton(str_id, dir);
+}
+
+ZGUI_API void zguiImage(
+ ImTextureID user_texture_id,
+ float w,
+ float h,
+ const float uv0[2],
+ const float uv1[2],
+ const float tint_col[4],
+ const float border_col[4]
+) {
+ ImGui::Image(
+ user_texture_id,
+ { w, h },
+ { uv0[0], uv0[1] },
+ { uv1[0], uv1[1] },
+ { tint_col[0], tint_col[1], tint_col[2], tint_col[3] },
+ { border_col[0], border_col[1], border_col[2], border_col[3] }
+ );
+}
+
+ZGUI_API bool zguiImageButton(
+ const char* str_id,
+ ImTextureID user_texture_id,
+ float w,
+ float h,
+ const float uv0[2],
+ const float uv1[2],
+ const float bg_col[4],
+ const float tint_col[4]
+) {
+ return ImGui::ImageButton(
+ str_id,
+ user_texture_id,
+ { w, h },
+ { uv0[0], uv0[1] },
+ { uv1[0], uv1[1] },
+ { bg_col[0], bg_col[1], bg_col[2], bg_col[3] },
+ { tint_col[0], tint_col[1], tint_col[2], tint_col[3] }
+ );
+}
+
+ZGUI_API void zguiBullet(void) {
+ ImGui::Bullet();
+}
+
+ZGUI_API bool zguiRadioButton(const char* label, bool active) {
+ return ImGui::RadioButton(label, active);
+}
+
+ZGUI_API bool zguiRadioButtonStatePtr(const char* label, int* v, int v_button) {
+ return ImGui::RadioButton(label, v, v_button);
+}
+
+ZGUI_API bool zguiCheckbox(const char* label, bool* v) {
+ return ImGui::Checkbox(label, v);
+}
+
+ZGUI_API bool zguiCheckboxBits(const char* label, unsigned int* bits, unsigned int bits_value) {
+ return ImGui::CheckboxFlags(label, bits, bits_value);
+}
+
+ZGUI_API void zguiProgressBar(float fraction, float w, float h, const char* overlay) {
+ return ImGui::ProgressBar(fraction, { w, h }, overlay);
+}
+
+ZGUI_API ImGuiContext* zguiCreateContext(ImFontAtlas* shared_font_atlas) {
+ return ImGui::CreateContext(shared_font_atlas);
+}
+
+ZGUI_API void zguiDestroyContext(ImGuiContext* ctx) {
+ ImGui::DestroyContext(ctx);
+}
+
+ZGUI_API ImGuiContext* zguiGetCurrentContext(void) {
+ return ImGui::GetCurrentContext();
+}
+
+ZGUI_API void zguiSetCurrentContext(ImGuiContext* ctx) {
+ ImGui::SetCurrentContext(ctx);
+}
+
+ZGUI_API void zguiNewFrame(void) {
+ ImGui::NewFrame();
+}
+
+ZGUI_API void zguiRender(void) {
+ ImGui::Render();
+}
+
+ZGUI_API ImDrawData* zguiGetDrawData(void) {
+ return ImGui::GetDrawData();
+}
+
+ZGUI_API void zguiShowDemoWindow(bool* p_open) {
+ ImGui::ShowDemoWindow(p_open);
+}
+
+ZGUI_API void zguiBeginDisabled(bool disabled) {
+ ImGui::BeginDisabled(disabled);
+}
+
+ZGUI_API void zguiEndDisabled(void) {
+ ImGui::EndDisabled();
+}
+
+ZGUI_API ImGuiStyle* zguiGetStyle(void) {
+ return &ImGui::GetStyle();
+}
+
+ZGUI_API ImGuiStyle zguiStyle_Init(void) {
+ return ImGuiStyle();
+}
+
+ZGUI_API void zguiStyle_ScaleAllSizes(ImGuiStyle* style, float scale_factor) {
+ style->ScaleAllSizes(scale_factor);
+}
+
+ZGUI_API void zguiPushStyleColor4f(ImGuiCol idx, const float col[4]) {
+ ImGui::PushStyleColor(idx, { col[0], col[1], col[2], col[3] });
+}
+
+ZGUI_API void zguiPushStyleColor1u(ImGuiCol idx, ImU32 col) {
+ ImGui::PushStyleColor(idx, col);
+}
+
+ZGUI_API void zguiPopStyleColor(int count) {
+ ImGui::PopStyleColor(count);
+}
+
+ZGUI_API void zguiPushStyleVar1f(ImGuiStyleVar idx, float var) {
+ ImGui::PushStyleVar(idx, var);
+}
+
+ZGUI_API void zguiPushStyleVar2f(ImGuiStyleVar idx, const float var[2]) {
+ ImGui::PushStyleVar(idx, { var[0], var[1] });
+}
+
+ZGUI_API void zguiPopStyleVar(int count) {
+ ImGui::PopStyleVar(count);
+}
+
+ZGUI_API void zguiPushItemWidth(float item_width) {
+ ImGui::PushItemWidth(item_width);
+}
+
+ZGUI_API void zguiPopItemWidth(void) {
+ ImGui::PopItemWidth();
+}
+
+ZGUI_API void zguiSetNextItemWidth(float item_width) {
+ ImGui::SetNextItemWidth(item_width);
+}
+
+ZGUI_API void zguiSetItemDefaultFocus(void) {
+ ImGui::SetItemDefaultFocus();
+}
+
+ZGUI_API ImFont* zguiGetFont(void) {
+ return ImGui::GetFont();
+}
+
+ZGUI_API float zguiGetFontSize(void) {
+ return ImGui::GetFontSize();
+}
+
+ZGUI_API void zguiGetFontTexUvWhitePixel(float uv[2]) {
+ const ImVec2 cs = ImGui::GetFontTexUvWhitePixel();
+ uv[0] = cs[0];
+ uv[1] = cs[1];
+}
+
+ZGUI_API void zguiPushFont(ImFont* font) {
+ ImGui::PushFont(font);
+}
+
+ZGUI_API void zguiPopFont(void) {
+ ImGui::PopFont();
+}
+
+ZGUI_API bool zguiTreeNode(const char* label) {
+ return ImGui::TreeNode(label);
+}
+
+ZGUI_API bool zguiTreeNodeFlags(const char* label, ImGuiTreeNodeFlags flags) {
+ return ImGui::TreeNodeEx(label, flags);
+}
+
+ZGUI_API bool zguiTreeNodeStrId(const char* str_id, const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ const bool ret = ImGui::TreeNodeV(str_id, fmt, args);
+ va_end(args);
+ return ret;
+}
+
+ZGUI_API bool zguiTreeNodeStrIdFlags(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ const bool ret = ImGui::TreeNodeExV(str_id, flags, fmt, args);
+ va_end(args);
+ return ret;
+}
+
+ZGUI_API bool zguiTreeNodePtrId(const void* ptr_id, const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ const bool ret = ImGui::TreeNodeV(ptr_id, fmt, args);
+ va_end(args);
+ return ret;
+}
+
+ZGUI_API bool zguiTreeNodePtrIdFlags(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ const bool ret = ImGui::TreeNodeExV(ptr_id, flags, fmt, args);
+ va_end(args);
+ return ret;
+}
+
+ZGUI_API bool zguiCollapsingHeader(const char* label, ImGuiTreeNodeFlags flags) {
+ return ImGui::CollapsingHeader(label, flags);
+}
+
+ZGUI_API bool zguiCollapsingHeaderStatePtr(const char* label, bool* p_visible, ImGuiTreeNodeFlags flags) {
+ return ImGui::CollapsingHeader(label, p_visible, flags);
+}
+
+ZGUI_API void zguiSetNextItemOpen(bool is_open, ImGuiCond cond) {
+ ImGui::SetNextItemOpen(is_open, cond);
+}
+
+ZGUI_API void zguiTreePushStrId(const char* str_id) {
+ ImGui::TreePush(str_id);
+}
+
+ZGUI_API void zguiTreePushPtrId(const void* ptr_id) {
+ ImGui::TreePush(ptr_id);
+}
+
+ZGUI_API void zguiTreePop(void) {
+ ImGui::TreePop();
+}
+
+ZGUI_API void zguiPushStrId(const char* str_id_begin, const char* str_id_end) {
+ ImGui::PushID(str_id_begin, str_id_end);
+}
+
+ZGUI_API void zguiPushStrIdZ(const char* str_id) {
+ ImGui::PushID(str_id);
+}
+
+ZGUI_API void zguiPushPtrId(const void* ptr_id) {
+ ImGui::PushID(ptr_id);
+}
+
+ZGUI_API void zguiPushIntId(int int_id) {
+ ImGui::PushID(int_id);
+}
+
+ZGUI_API void zguiPopId(void) {
+ ImGui::PopID();
+}
+
+ZGUI_API ImGuiID zguiGetStrId(const char* str_id_begin, const char* str_id_end) {
+ return ImGui::GetID(str_id_begin, str_id_end);
+}
+
+ZGUI_API ImGuiID zguiGetStrIdZ(const char* str_id) {
+ return ImGui::GetID(str_id);
+}
+
+ZGUI_API ImGuiID zguiGetPtrId(const void* ptr_id) {
+ return ImGui::GetID(ptr_id);
+}
+
+ZGUI_API void zguiSetClipboardText(const char* text) {
+ ImGui::SetClipboardText(text);
+}
+
+ZGUI_API const char* zguiGetClipboardText(void) {
+ return ImGui::GetClipboardText();
+}
+
+ZGUI_API ImFont* zguiIoAddFontFromFileWithConfig(
+ const char* filename,
+ float size_pixels,
+ const ImFontConfig* config,
+ const ImWchar* ranges
+) {
+ return ImGui::GetIO().Fonts->AddFontFromFileTTF(filename, size_pixels, config, ranges);
+}
+
+ZGUI_API ImFont* zguiIoAddFontFromFile(const char* filename, float size_pixels) {
+ return ImGui::GetIO().Fonts->AddFontFromFileTTF(filename, size_pixels, nullptr, nullptr);
+}
+
+ZGUI_API ImFont* zguiIoAddFontFromMemoryWithConfig(
+ void* font_data,
+ int font_size,
+ float size_pixels,
+ const ImFontConfig* config,
+ const ImWchar* ranges
+) {
+ return ImGui::GetIO().Fonts->AddFontFromMemoryTTF(font_data, font_size, size_pixels, config, ranges);
+}
+
+ZGUI_API ImFont* zguiIoAddFontFromMemory(void* font_data, int font_size, float size_pixels) {
+ ImFontConfig config = ImFontConfig();
+ config.FontDataOwnedByAtlas = false;
+ return ImGui::GetIO().Fonts->AddFontFromMemoryTTF(font_data, font_size, size_pixels, &config, nullptr);
+}
+
+ZGUI_API ImFontConfig zguiFontConfig_Init(void) {
+ return ImFontConfig();
+}
+
+ZGUI_API ImFont* zguiIoGetFont(unsigned int index) {
+ return ImGui::GetIO().Fonts->Fonts[index];
+}
+
+ZGUI_API void zguiIoSetDefaultFont(ImFont* font) {
+ ImGui::GetIO().FontDefault = font;
+}
+
+ZGUI_API unsigned char *zguiIoGetFontsTexDataAsRgba32(int *width, int *height) {
+ unsigned char *font_pixels;
+ int font_width, font_height;
+ ImGui::GetIO().Fonts->GetTexDataAsRGBA32(&font_pixels, &font_width, &font_height);
+ *width = font_width;
+ *height = font_height;
+ return font_pixels;
+}
+
+ZGUI_API void zguiIoSetFontsTexId(ImTextureID id) {
+ ImGui::GetIO().Fonts->TexID = id;
+}
+
+ZGUI_API ImTextureID zguiIoGetFontsTexId(void) {
+ return ImGui::GetIO().Fonts->TexID;
+}
+
+ZGUI_API void zguiIoSetConfigWindowsMoveFromTitleBarOnly(bool enabled) {
+ ImGui::GetIO().ConfigWindowsMoveFromTitleBarOnly = enabled;
+}
+
+ZGUI_API bool zguiIoGetWantCaptureMouse(void) {
+ return ImGui::GetIO().WantCaptureMouse;
+}
+
+ZGUI_API bool zguiIoGetWantCaptureKeyboard(void) {
+ return ImGui::GetIO().WantCaptureKeyboard;
+}
+
+ZGUI_API bool zguiIoGetWantTextInput(void) {
+ return ImGui::GetIO().WantTextInput;
+}
+
+ZGUI_API void zguiIoSetIniFilename(const char* filename) {
+ ImGui::GetIO().IniFilename = filename;
+}
+
+ZGUI_API void zguiIoSetConfigFlags(ImGuiConfigFlags flags) {
+ ImGui::GetIO().ConfigFlags = flags;
+}
+
+ZGUI_API void zguiIoSetDisplaySize(float width, float height) {
+ ImGui::GetIO().DisplaySize = { width, height };
+}
+
+ZGUI_API void zguiIoGetDisplaySize(float size[2]) {
+ const ImVec2 ds = ImGui::GetIO().DisplaySize;
+ size[0] = ds[0];
+ size[1] = ds[1];
+}
+
+ZGUI_API void zguiIoSetDisplayFramebufferScale(float sx, float sy) {
+ ImGui::GetIO().DisplayFramebufferScale = { sx, sy };
+}
+
+ZGUI_API void zguiIoSetDeltaTime(float delta_time) {
+ ImGui::GetIO().DeltaTime = delta_time;
+}
+
+ZGUI_API void zguiIoAddFocusEvent(bool focused) {
+ ImGui::GetIO().AddFocusEvent(focused);
+}
+
+ZGUI_API void zguiIoAddMousePositionEvent(float x, float y) {
+ ImGui::GetIO().AddMousePosEvent(x, y);
+}
+
+ZGUI_API void zguiIoAddMouseButtonEvent(ImGuiMouseButton button, bool down) {
+ ImGui::GetIO().AddMouseButtonEvent(button, down);
+}
+
+ZGUI_API void zguiIoAddMouseWheelEvent(float x, float y) {
+ ImGui::GetIO().AddMouseWheelEvent(x, y);
+}
+
+ZGUI_API void zguiIoAddKeyEvent(ImGuiKey key, bool down) {
+ ImGui::GetIO().AddKeyEvent(key, down);
+}
+
+ZGUI_API void zguiIoAddInputCharactersUTF8(const char* utf8_chars) {
+ ImGui::GetIO().AddInputCharactersUTF8(utf8_chars);
+}
+
+ZGUI_API void zguiIoSetKeyEventNativeData(ImGuiKey key, int keycode, int scancode) {
+ ImGui::GetIO().SetKeyEventNativeData(key, keycode, scancode);
+}
+
+ZGUI_API void zguiIoAddCharacterEvent(unsigned int c) {
+ ImGui::GetIO().AddInputCharacter(c);
+}
+
+
+ZGUI_API bool zguiIsItemHovered(ImGuiHoveredFlags flags) {
+ return ImGui::IsItemHovered(flags);
+}
+
+ZGUI_API bool zguiIsItemActive(void) {
+ return ImGui::IsItemActive();
+}
+
+ZGUI_API bool zguiIsItemFocused(void) {
+ return ImGui::IsItemFocused();
+}
+
+ZGUI_API bool zguiIsItemClicked(ImGuiMouseButton mouse_button) {
+ return ImGui::IsItemClicked(mouse_button);
+}
+
+ZGUI_API bool zguiIsMouseDown(ImGuiMouseButton button) {
+ return ImGui::IsMouseDown(button);
+}
+
+ZGUI_API bool zguiIsMouseClicked(ImGuiMouseButton button) {
+ return ImGui::IsMouseClicked(button);
+}
+
+ZGUI_API bool zguiIsMouseDoubleClicked(ImGuiMouseButton button) {
+ return ImGui::IsMouseDoubleClicked(button);
+}
+
+ZGUI_API bool zguiIsItemVisible(void) {
+ return ImGui::IsItemVisible();
+}
+
+ZGUI_API bool zguiIsItemEdited(void) {
+ return ImGui::IsItemEdited();
+}
+
+ZGUI_API bool zguiIsItemActivated(void) {
+ return ImGui::IsItemActivated();
+}
+
+ZGUI_API bool zguiIsItemDeactivated(void) {
+ return ImGui::IsItemDeactivated();
+}
+
+ZGUI_API bool zguiIsItemDeactivatedAfterEdit(void) {
+ return ImGui::IsItemDeactivatedAfterEdit();
+}
+
+ZGUI_API bool zguiIsItemToggledOpen(void) {
+ return ImGui::IsItemToggledOpen();
+}
+
+ZGUI_API bool zguiIsAnyItemHovered(void) {
+ return ImGui::IsAnyItemHovered();
+}
+
+ZGUI_API bool zguiIsAnyItemActive(void) {
+ return ImGui::IsAnyItemActive();
+}
+
+ZGUI_API bool zguiIsAnyItemFocused(void) {
+ return ImGui::IsAnyItemFocused();
+}
+
+ZGUI_API void zguiGetContentRegionAvail(float pos[2]) {
+ const ImVec2 p = ImGui::GetContentRegionAvail();
+ pos[0] = p.x;
+ pos[1] = p.y;
+}
+
+ZGUI_API void zguiGetContentRegionMax(float pos[2]) {
+ const ImVec2 p = ImGui::GetContentRegionMax();
+ pos[0] = p.x;
+ pos[1] = p.y;
+}
+
+ZGUI_API void zguiGetWindowContentRegionMin(float pos[2]) {
+ const ImVec2 p = ImGui::GetWindowContentRegionMin();
+ pos[0] = p.x;
+ pos[1] = p.y;
+}
+
+ZGUI_API void zguiGetWindowContentRegionMax(float pos[2]) {
+ const ImVec2 p = ImGui::GetWindowContentRegionMax();
+ pos[0] = p.x;
+ pos[1] = p.y;
+}
+
+ZGUI_API void zguiPushTextWrapPos(float wrap_pos_x) {
+ ImGui::PushTextWrapPos(wrap_pos_x);
+}
+
+ZGUI_API void zguiPopTextWrapPos(void) {
+ ImGui::PopTextWrapPos();
+}
+
+ZGUI_API bool zguiBeginTabBar(const char* string, ImGuiTabBarFlags flags) {
+ return ImGui::BeginTabBar(string, flags);
+}
+
+ZGUI_API bool zguiBeginTabItem(const char* string, bool* p_open, ImGuiTabItemFlags flags) {
+ return ImGui::BeginTabItem(string, p_open, flags);
+}
+
+ZGUI_API void zguiEndTabItem(void) {
+ ImGui::EndTabItem();
+}
+
+ZGUI_API void zguiEndTabBar(void) {
+ ImGui::EndTabBar();
+}
+
+ZGUI_API void zguiSetTabItemClosed(const char* tab_or_docked_window_label) {
+ ImGui::SetTabItemClosed(tab_or_docked_window_label);
+}
+
+ZGUI_API bool zguiBeginMenuBar(void) {
+ return ImGui::BeginMenuBar();
+}
+
+ZGUI_API void zguiEndMenuBar(void) {
+ ImGui::EndMenuBar();
+}
+
+ZGUI_API bool zguiBeginMainMenuBar(void) {
+ return ImGui::BeginMainMenuBar();
+}
+
+ZGUI_API void zguiEndMainMenuBar(void) {
+ ImGui::EndMainMenuBar();
+}
+
+ZGUI_API bool zguiBeginMenu(const char* label, bool enabled) {
+ return ImGui::BeginMenu(label, enabled);
+}
+
+ZGUI_API void zguiEndMenu(void) {
+ ImGui::EndMenu();
+}
+
+ZGUI_API bool zguiMenuItem(const char* label, const char* shortcut, bool selected, bool enabled) {
+ return ImGui::MenuItem(label, shortcut, selected, enabled);
+}
+
+ZGUI_API bool zguiMenuItemPtr(const char* label, const char* shortcut, bool* selected, bool enabled) {
+ return ImGui::MenuItem(label, shortcut, selected, enabled);
+}
+
+ZGUI_API bool zguiBeginTooltip(void) {
+ return ImGui::BeginTooltip();
+}
+
+ZGUI_API void zguiEndTooltip(void) {
+ ImGui::EndTooltip();
+}
+
+ZGUI_API bool zguiBeginPopup(const char* str_id, ImGuiWindowFlags flags){
+ return ImGui::BeginPopup(str_id, flags);
+}
+
+ZGUI_API bool zguiBeginPopupContextWindow(void) {
+ return ImGui::BeginPopupContextWindow();
+}
+
+ZGUI_API bool zguiBeginPopupContextItem(void) {
+ return ImGui::BeginPopupContextItem();
+}
+
+ZGUI_API bool zguiBeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags flags) {
+ return ImGui::BeginPopupModal(name, p_open, flags);
+}
+
+ZGUI_API void zguiEndPopup(void) {
+ ImGui::EndPopup();
+}
+
+ZGUI_API void zguiOpenPopup(const char* str_id, ImGuiPopupFlags popup_flags) {
+ ImGui::OpenPopup(str_id, popup_flags);
+}
+
+ZGUI_API void zguiCloseCurrentPopup(void) {
+ ImGui::CloseCurrentPopup();
+}
+//--------------------------------------------------------------------------------------------------
+//
+// Tables
+//
+//--------------------------------------------------------------------------------------------------
+ZGUI_API bool zguiBeginTable(
+ const char* str_id,
+ int column,
+ ImGuiTableFlags flags,
+ const float outer_size[2],
+ float inner_width
+) {
+ return ImGui::BeginTable(str_id, column, flags, { outer_size[0], outer_size[1] }, inner_width);
+}
+
+ZGUI_API void zguiEndTable(void) {
+ ImGui::EndTable();
+}
+
+ZGUI_API void zguiTableNextRow(ImGuiTableRowFlags row_flags, float min_row_height) {
+ ImGui::TableNextRow(row_flags, min_row_height);
+}
+
+ZGUI_API bool zguiTableNextColumn(void) {
+ return ImGui::TableNextColumn();
+}
+
+ZGUI_API bool zguiTableSetColumnIndex(int column_n) {
+ return ImGui::TableSetColumnIndex(column_n);
+}
+
+ZGUI_API void zguiTableSetupColumn(
+ const char* label,
+ ImGuiTableColumnFlags flags,
+ float init_width_or_height,
+ ImGuiID user_id
+) {
+ ImGui::TableSetupColumn(label, flags, init_width_or_height, user_id);
+}
+
+ZGUI_API void zguiTableSetupScrollFreeze(int cols, int rows) {
+ ImGui::TableSetupScrollFreeze(cols, rows);
+}
+
+ZGUI_API void zguiTableHeadersRow(void) {
+ ImGui::TableHeadersRow();
+}
+
+ZGUI_API void zguiTableHeader(const char* label) {
+ ImGui::TableHeader(label);
+}
+
+ZGUI_API ImGuiTableSortSpecs* zguiTableGetSortSpecs(void) {
+ return ImGui::TableGetSortSpecs();
+}
+
+ZGUI_API int zguiTableGetColumnCount(void) {
+ return ImGui::TableGetColumnCount();
+}
+
+ZGUI_API int zguiTableGetColumnIndex(void) {
+ return ImGui::TableGetColumnIndex();
+}
+
+ZGUI_API int zguiTableGetRowIndex(void) {
+ return ImGui::TableGetRowIndex();
+}
+
+ZGUI_API const char* zguiTableGetColumnName(int column_n) {
+ return ImGui::TableGetColumnName(column_n);
+}
+
+ZGUI_API ImGuiTableColumnFlags zguiTableGetColumnFlags(int column_n) {
+ return ImGui::TableGetColumnFlags(column_n);
+}
+
+ZGUI_API void zguiTableSetColumnEnabled(int column_n, bool v) {
+ ImGui::TableSetColumnEnabled(column_n, v);
+}
+
+ZGUI_API void zguiTableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n) {
+ ImGui::TableSetBgColor(target, color, column_n);
+}
+//--------------------------------------------------------------------------------------------------
+//
+// Color Utilities
+//
+//--------------------------------------------------------------------------------------------------
+ZGUI_API void zguiColorConvertU32ToFloat4(ImU32 in, float rgba[4]) {
+ const ImVec4 c = ImGui::ColorConvertU32ToFloat4(in);
+ rgba[0] = c.x;
+ rgba[1] = c.y;
+ rgba[2] = c.z;
+ rgba[3] = c.w;
+}
+
+ZGUI_API ImU32 zguiColorConvertFloat4ToU32(const float in[4]) {
+ return ImGui::ColorConvertFloat4ToU32({ in[0], in[1], in[2], in[3] });
+}
+
+ZGUI_API void zguiColorConvertRGBtoHSV(float r, float g, float b, float* out_h, float* out_s, float* out_v) {
+ return ImGui::ColorConvertRGBtoHSV(r, g, b, *out_h, *out_s, *out_v);
+}
+
+ZGUI_API void zguiColorConvertHSVtoRGB(float h, float s, float v, float* out_r, float* out_g, float* out_b) {
+ return ImGui::ColorConvertHSVtoRGB(h, s, v, *out_r, *out_g, *out_b);
+}
+//--------------------------------------------------------------------------------------------------
+//
+// Inputs Utilities: Keyboard
+//
+//--------------------------------------------------------------------------------------------------
+ZGUI_API bool zguiIsKeyDown(ImGuiKey key) {
+ return ImGui::IsKeyDown(key);
+}
+//--------------------------------------------------------------------------------------------------
+//
+// DrawList
+//
+//--------------------------------------------------------------------------------------------------
+ZGUI_API ImDrawList *zguiGetWindowDrawList(void) {
+ return ImGui::GetWindowDrawList();
+}
+
+ZGUI_API ImDrawList *zguiGetBackgroundDrawList(void) {
+ return ImGui::GetBackgroundDrawList();
+}
+
+ZGUI_API ImDrawList *zguiGetForegroundDrawList(void) {
+ return ImGui::GetForegroundDrawList();
+}
+
+ZGUI_API ImDrawList *zguiCreateDrawList(void) {
+ return IM_NEW(ImDrawList)(ImGui::GetDrawListSharedData());
+}
+
+ZGUI_API void zguiDestroyDrawList(ImDrawList *draw_list) {
+ IM_DELETE(draw_list);
+}
+
+ZGUI_API const char *zguiDrawList_GetOwnerName(ImDrawList *draw_list) {
+ return draw_list->_OwnerName;
+}
+
+ZGUI_API void zguiDrawList_ResetForNewFrame(ImDrawList *draw_list) {
+ draw_list->_ResetForNewFrame();
+}
+
+ZGUI_API void zguiDrawList_ClearFreeMemory(ImDrawList *draw_list) {
+ draw_list->_ClearFreeMemory();
+}
+
+ZGUI_API int zguiDrawList_GetVertexBufferLength(ImDrawList *draw_list) {
+ return draw_list->VtxBuffer.size();
+}
+ZGUI_API ImDrawVert *zguiDrawList_GetVertexBufferData(ImDrawList *draw_list) {
+ return draw_list->VtxBuffer.begin();
+}
+
+ZGUI_API int zguiDrawList_GetIndexBufferLength(ImDrawList *draw_list) {
+ return draw_list->IdxBuffer.size();
+}
+ZGUI_API ImDrawIdx *zguiDrawList_GetIndexBufferData(ImDrawList *draw_list) {
+ return draw_list->IdxBuffer.begin();
+}
+ZGUI_API unsigned int zguiDrawList_GetCurrentIndex(ImDrawList *draw_list) {
+ return draw_list->_VtxCurrentIdx;
+}
+
+ZGUI_API int zguiDrawList_GetCmdBufferLength(ImDrawList *draw_list) {
+ return draw_list->CmdBuffer.size();
+}
+ZGUI_API ImDrawCmd *zguiDrawList_GetCmdBufferData(ImDrawList *draw_list) {
+ return draw_list->CmdBuffer.begin();
+}
+
+ZGUI_API void zguiDrawList_SetFlags(ImDrawList *draw_list, ImDrawListFlags flags) {
+ draw_list->Flags = flags;
+}
+ZGUI_API ImDrawListFlags zguiDrawList_GetFlags(ImDrawList *draw_list) {
+ return draw_list->Flags;
+}
+
+ZGUI_API void zguiDrawList_PushClipRect(
+ ImDrawList* draw_list,
+ const float clip_rect_min[2],
+ const float clip_rect_max[2],
+ bool intersect_with_current_clip_rect
+) {
+ draw_list->PushClipRect(
+ { clip_rect_min[0], clip_rect_min[1] },
+ { clip_rect_max[0], clip_rect_max[1] },
+ intersect_with_current_clip_rect
+ );
+}
+
+ZGUI_API void zguiDrawList_PushClipRectFullScreen(ImDrawList* draw_list) {
+ draw_list->PushClipRectFullScreen();
+}
+
+ZGUI_API void zguiDrawList_PopClipRect(ImDrawList* draw_list) {
+ draw_list->PopClipRect();
+}
+
+ZGUI_API void zguiDrawList_PushTextureId(ImDrawList* draw_list, ImTextureID texture_id) {
+ draw_list->PushTextureID(texture_id);
+}
+
+ZGUI_API void zguiDrawList_PopTextureId(ImDrawList* draw_list) {
+ draw_list->PopTextureID();
+}
+
+ZGUI_API void zguiDrawList_GetClipRectMin(ImDrawList* draw_list, float clip_min[2]) {
+ const ImVec2 c = draw_list->GetClipRectMin();
+ clip_min[0] = c.x;
+ clip_min[1] = c.y;
+}
+
+ZGUI_API void zguiDrawList_GetClipRectMax(ImDrawList* draw_list, float clip_max[2]) {
+ const ImVec2 c = draw_list->GetClipRectMax();
+ clip_max[0] = c.x;
+ clip_max[1] = c.y;
+}
+
+ZGUI_API void zguiDrawList_AddLine(
+ ImDrawList* draw_list,
+ const float p1[2],
+ const float p2[2],
+ ImU32 col,
+ float thickness
+) {
+ draw_list->AddLine({ p1[0], p1[1] }, { p2[0], p2[1] }, col, thickness);
+}
+
+ZGUI_API void zguiDrawList_AddRect(
+ ImDrawList* draw_list,
+ const float pmin[2],
+ const float pmax[2],
+ ImU32 col,
+ float rounding,
+ ImDrawFlags flags,
+ float thickness
+) {
+ draw_list->AddRect({ pmin[0], pmin[1] }, { pmax[0], pmax[1] }, col, rounding, flags, thickness);
+}
+
+ZGUI_API void zguiDrawList_AddRectFilled(
+ ImDrawList* draw_list,
+ const float pmin[2],
+ const float pmax[2],
+ ImU32 col,
+ float rounding,
+ ImDrawFlags flags
+) {
+ draw_list->AddRectFilled({ pmin[0], pmin[1] }, { pmax[0], pmax[1] }, col, rounding, flags);
+}
+
+ZGUI_API void zguiDrawList_AddRectFilledMultiColor(
+ ImDrawList* draw_list,
+ const float pmin[2],
+ const float pmax[2],
+ ImU32 col_upr_left,
+ ImU32 col_upr_right,
+ ImU32 col_bot_right,
+ ImU32 col_bot_left
+) {
+ draw_list->AddRectFilledMultiColor(
+ { pmin[0], pmin[1] },
+ { pmax[0], pmax[1] },
+ col_upr_left,
+ col_upr_right,
+ col_bot_right,
+ col_bot_left
+ );
+}
+
+ZGUI_API void zguiDrawList_AddQuad(
+ ImDrawList* draw_list,
+ const float p1[2],
+ const float p2[2],
+ const float p3[2],
+ const float p4[2],
+ ImU32 col,
+ float thickness
+) {
+ draw_list->AddQuad({ p1[0], p1[1] }, { p2[0], p2[1] }, { p3[0], p3[1] }, { p4[0], p4[1] }, col, thickness);
+}
+
+ZGUI_API void zguiDrawList_AddQuadFilled(
+ ImDrawList* draw_list,
+ const float p1[2],
+ const float p2[2],
+ const float p3[2],
+ const float p4[2],
+ ImU32 col
+) {
+ draw_list->AddQuadFilled({ p1[0], p1[1] }, { p2[0], p2[1] }, { p3[0], p3[1] }, { p4[0], p4[1] }, col);
+}
+
+ZGUI_API void zguiDrawList_AddTriangle(
+ ImDrawList* draw_list,
+ const float p1[2],
+ const float p2[2],
+ const float p3[2],
+ ImU32 col,
+ float thickness
+) {
+ draw_list->AddTriangle({ p1[0], p1[1] }, { p2[0], p2[1] }, { p3[0], p3[1] }, col, thickness);
+}
+
+ZGUI_API void zguiDrawList_AddTriangleFilled(
+ ImDrawList* draw_list,
+ const float p1[2],
+ const float p2[2],
+ const float p3[2],
+ ImU32 col
+) {
+ draw_list->AddTriangleFilled({ p1[0], p1[1] }, { p2[0], p2[1] }, { p3[0], p3[1] }, col);
+}
+
+ZGUI_API void zguiDrawList_AddCircle(
+ ImDrawList* draw_list,
+ const float center[2],
+ float radius,
+ ImU32 col,
+ int num_segments,
+ float thickness
+) {
+ draw_list->AddCircle({ center[0], center[1] }, radius, col, num_segments, thickness);
+}
+
+ZGUI_API void zguiDrawList_AddCircleFilled(
+ ImDrawList* draw_list,
+ const float center[2],
+ float radius,
+ ImU32 col,
+ int num_segments
+) {
+ draw_list->AddCircleFilled({ center[0], center[1] }, radius, col, num_segments);
+}
+
+ZGUI_API void zguiDrawList_AddNgon(
+ ImDrawList* draw_list,
+ const float center[2],
+ float radius,
+ ImU32 col,
+ int num_segments,
+ float thickness
+) {
+ draw_list->AddNgon({ center[0], center[1] }, radius, col, num_segments, thickness);
+}
+
+ZGUI_API void zguiDrawList_AddNgonFilled(
+ ImDrawList* draw_list,
+ const float center[2],
+ float radius,
+ ImU32 col,
+ int num_segments
+) {
+ draw_list->AddNgonFilled({ center[0], center[1] }, radius, col, num_segments);
+}
+
+ZGUI_API void zguiDrawList_AddText(
+ ImDrawList* draw_list,
+ const float pos[2],
+ ImU32 col,
+ const char* text_begin,
+ const char* text_end
+) {
+ draw_list->AddText({ pos[0], pos[1] }, col, text_begin, text_end);
+}
+
+ZGUI_API void zguiDrawList_AddPolyline(
+ ImDrawList* draw_list,
+ const float points[][2],
+ int num_points,
+ ImU32 col,
+ ImDrawFlags flags,
+ float thickness
+) {
+ draw_list->AddPolyline((const ImVec2*)&points[0][0], num_points, col, flags, thickness);
+}
+
+ZGUI_API void zguiDrawList_AddConvexPolyFilled(
+ ImDrawList* draw_list,
+ const float points[][2],
+ int num_points,
+ ImU32 col
+) {
+ draw_list->AddConvexPolyFilled((const ImVec2*)&points[0][0], num_points, col);
+}
+
+ZGUI_API void zguiDrawList_AddBezierCubic(
+ ImDrawList* draw_list,
+ const float p1[2],
+ const float p2[2],
+ const float p3[2],
+ const float p4[2],
+ ImU32 col,
+ float thickness,
+ int num_segments
+) {
+ draw_list->AddBezierCubic(
+ { p1[0], p1[1] }, { p2[0], p2[1] }, { p3[0], p3[1] }, { p4[0], p4[1] }, col, thickness, num_segments
+ );
+}
+
+ZGUI_API void zguiDrawList_AddBezierQuadratic(
+ ImDrawList* draw_list,
+ const float p1[2],
+ const float p2[2],
+ const float p3[2],
+ ImU32 col,
+ float thickness,
+ int num_segments
+) {
+ draw_list->AddBezierQuadratic(
+ { p1[0], p1[1] }, { p2[0], p2[1] }, { p3[0], p3[1] }, col, thickness, num_segments
+ );
+}
+
+ZGUI_API void zguiDrawList_AddImage(
+ ImDrawList* draw_list,
+ ImTextureID user_texture_id,
+ const float pmin[2],
+ const float pmax[2],
+ const float uvmin[2],
+ const float uvmax[2],
+ ImU32 col
+) {
+ draw_list->AddImage(
+ user_texture_id,
+ { pmin[0], pmin[1] },
+ { pmax[0], pmax[1] },
+ { uvmin[0], uvmin[1] },
+ { uvmax[0], uvmax[1] },
+ col
+ );
+}
+
+ZGUI_API void zguiDrawList_AddImageQuad(
+ ImDrawList* draw_list,
+ ImTextureID user_texture_id,
+ const float p1[2],
+ const float p2[2],
+ const float p3[2],
+ const float p4[2],
+ const float uv1[2],
+ const float uv2[2],
+ const float uv3[2],
+ const float uv4[2],
+ ImU32 col
+) {
+ draw_list->AddImageQuad(
+ user_texture_id,
+ { p1[0], p1[1] },
+ { p2[0], p2[1] },
+ { p3[0], p3[1] },
+ { p4[0], p4[1] },
+ { uv1[0], uv1[1] },
+ { uv2[0], uv2[1] },
+ { uv3[0], uv3[1] },
+ { uv4[0], uv4[1] },
+ col
+ );
+}
+
+ZGUI_API void zguiDrawList_AddImageRounded(
+ ImDrawList* draw_list,
+ ImTextureID user_texture_id,
+ const float pmin[2],
+ const float pmax[2],
+ const float uvmin[2],
+ const float uvmax[2],
+ ImU32 col,
+ float rounding,
+ ImDrawFlags flags
+) {
+ draw_list->AddImageRounded(
+ user_texture_id,
+ { pmin[0], pmin[1] },
+ { pmax[0], pmax[1] },
+ { uvmin[0], uvmin[1] },
+ { uvmax[0], uvmax[1] },
+ col,
+ rounding,
+ flags
+ );
+}
+
+ZGUI_API void zguiDrawList_PathClear(ImDrawList* draw_list) {
+ draw_list->PathClear();
+}
+
+ZGUI_API void zguiDrawList_PathLineTo(ImDrawList* draw_list, const float pos[2]) {
+ draw_list->PathLineTo({ pos[0], pos[1] });
+}
+
+ZGUI_API void zguiDrawList_PathLineToMergeDuplicate(ImDrawList* draw_list, const float pos[2]) {
+ draw_list->PathLineToMergeDuplicate({ pos[0], pos[1] });
+}
+
+ZGUI_API void zguiDrawList_PathFillConvex(ImDrawList* draw_list, ImU32 col) {
+ draw_list->PathFillConvex(col);
+}
+
+ZGUI_API void zguiDrawList_PathStroke(ImDrawList* draw_list, ImU32 col, ImDrawFlags flags, float thickness) {
+ draw_list->PathStroke(col, flags, thickness);
+}
+
+ZGUI_API void zguiDrawList_PathArcTo(
+ ImDrawList* draw_list,
+ const float center[2],
+ float radius,
+ float a_min,
+ float a_max,
+ int num_segments
+) {
+ draw_list->PathArcTo({ center[0], center[1] }, radius, a_min, a_max, num_segments);
+}
+
+ZGUI_API void zguiDrawList_PathArcToFast(
+ ImDrawList* draw_list,
+ const float center[2],
+ float radius,
+ int a_min_of_12,
+ int a_max_of_12
+) {
+ draw_list->PathArcToFast({ center[0], center[1] }, radius, a_min_of_12, a_max_of_12);
+}
+
+ZGUI_API void zguiDrawList_PathBezierCubicCurveTo(
+ ImDrawList* draw_list,
+ const float p2[2],
+ const float p3[2],
+ const float p4[2],
+ int num_segments
+) {
+ draw_list->PathBezierCubicCurveTo({ p2[0], p2[1] }, { p3[0], p3[1] }, { p4[0], p4[1] }, num_segments);
+}
+
+ZGUI_API void zguiDrawList_PathBezierQuadraticCurveTo(
+ ImDrawList* draw_list,
+ const float p2[2],
+ const float p3[2],
+ int num_segments
+) {
+ draw_list->PathBezierQuadraticCurveTo({ p2[0], p2[1] }, { p3[0], p3[1] }, num_segments);
+}
+
+ZGUI_API void zguiDrawList_PathRect(
+ ImDrawList* draw_list,
+ const float rect_min[2],
+ const float rect_max[2],
+ float rounding,
+ ImDrawFlags flags
+) {
+ draw_list->PathRect({ rect_min[0], rect_min[1] }, { rect_max[0], rect_max[1] }, rounding, flags);
+}
+
+ZGUI_API void zguiDrawList_PrimReserve( ImDrawList* draw_list, int idx_count, int vtx_count) {
+ draw_list->PrimReserve(idx_count, vtx_count);
+}
+
+ZGUI_API void zguiDrawList_PrimUnreserve( ImDrawList* draw_list, int idx_count, int vtx_count) {
+ draw_list->PrimUnreserve(idx_count, vtx_count);
+}
+
+ZGUI_API void zguiDrawList_PrimRect(
+ ImDrawList* draw_list,
+ const float a[2],
+ const float b[2],
+ ImU32 col
+) {
+ draw_list->PrimRect({ a[0], a[1] }, { b[0], b[1] }, col);
+}
+
+ZGUI_API void zguiDrawList_PrimRectUV(
+ ImDrawList* draw_list,
+ const float a[2],
+ const float b[2],
+ const float uv_a[2],
+ const float uv_b[2],
+ ImU32 col
+) {
+ draw_list->PrimRectUV({ a[0], a[1] }, { b[0], b[1] }, { uv_a[0], uv_a[1] }, { uv_b[0], uv_b[1] }, col);
+}
+
+ZGUI_API void zguiDrawList_PrimQuadUV(
+ ImDrawList* draw_list,
+ const float a[2],
+ const float b[2],
+ const float c[2],
+ const float d[2],
+ const float uv_a[2],
+ const float uv_b[2],
+ const float uv_c[2],
+ const float uv_d[2],
+ ImU32 col
+) {
+ draw_list->PrimQuadUV(
+ { a[0], a[1] }, { b[0], b[1] }, { c[0], c[1] }, { d[0], d[1] },
+ { uv_a[0], uv_a[1] }, { uv_b[0], uv_b[1] }, { uv_c[0], uv_c[1] }, { uv_d[0], uv_d[1] },
+ col
+ );
+}
+
+ZGUI_API void zguiDrawList_PrimWriteVtx(
+ ImDrawList* draw_list,
+ const float pos[2],
+ const float uv[2],
+ ImU32 col
+) {
+ draw_list->PrimWriteVtx({ pos[0], pos[1] }, { uv[0], uv[1] }, col);
+}
+
+ZGUI_API void zguiDrawList_PrimWriteIdx( ImDrawList* draw_list, ImDrawIdx idx) {
+ draw_list->PrimWriteIdx(idx);
+}
+
+ZGUI_API void zguiDrawList_AddCallback(ImDrawList* draw_list, ImDrawCallback callback, void* callback_data) {
+ draw_list->AddCallback(callback, callback_data);
+}
+
+ZGUI_API void zguiDrawList_AddResetRenderStateCallback(ImDrawList* draw_list) {
+ draw_list->AddCallback(ImDrawCallback_ResetRenderState, NULL);
+}
+//--------------------------------------------------------------------------------------------------
+//
+// Viewport
+//
+//--------------------------------------------------------------------------------------------------
+ZGUI_API ImGuiViewport* zguiGetMainViewport(void) {
+ return ImGui::GetMainViewport();
+}
+
+ZGUI_API void zguiViewport_GetPos(ImGuiViewport* viewport, float p[2]) {
+ const ImVec2 pos = viewport->Pos;
+ p[0] = pos.x;
+ p[1] = pos.y;
+}
+
+ZGUI_API void zguiViewport_GetSize(ImGuiViewport* viewport, float p[2]) {
+ const ImVec2 sz = viewport->Size;
+ p[0] = sz.x;
+ p[1] = sz.y;
+}
+
+ZGUI_API void zguiViewport_GetWorkPos(ImGuiViewport* viewport, float p[2]) {
+ const ImVec2 pos = viewport->WorkPos;
+ p[0] = pos.x;
+ p[1] = pos.y;
+}
+
+ZGUI_API void zguiViewport_GetWorkSize(ImGuiViewport* viewport, float p[2]) {
+ const ImVec2 sz = viewport->WorkSize;
+ p[0] = sz.x;
+ p[1] = sz.y;
+}
+
+//--------------------------------------------------------------------------------------------------
+//
+// Docking
+//
+//--------------------------------------------------------------------------------------------------
+ZGUI_API ImGuiID zguiDockSpace(const char* str_id, float size[2], ImGuiDockNodeFlags flags) {
+ return ImGui::DockSpace(ImGui::GetID(str_id), {size[0], size[1]}, flags);
+}
+
+ZGUI_API ImGuiID zguiDockSpaceOverViewport(const ImGuiViewport* viewport, ImGuiDockNodeFlags dockspace_flags) {
+ return ImGui::DockSpaceOverViewport(viewport, dockspace_flags);
+}
+
+
+//--------------------------------------------------------------------------------------------------
+//
+// DockBuilder (Unstable internal imgui API, subject to change, use at own risk)
+//
+//--------------------------------------------------------------------------------------------------
+ZGUI_API void zguiDockBuilderDockWindow(const char* window_name, ImGuiID node_id) {
+ ImGui::DockBuilderDockWindow(window_name, node_id);
+}
+
+ZGUI_API ImGuiID zguiDockBuilderAddNode(ImGuiID node_id, ImGuiDockNodeFlags flags) {
+ return ImGui::DockBuilderAddNode(node_id, flags);
+}
+
+ZGUI_API void zguiDockBuilderRemoveNode(ImGuiID node_id) {
+ ImGui::DockBuilderRemoveNode(node_id);
+}
+
+ZGUI_API void zguiDockBuilderSetNodePos(ImGuiID node_id, float pos[2]) {
+ ImGui::DockBuilderSetNodePos(node_id, {pos[0], pos[1]});
+}
+
+ZGUI_API void zguiDockBuilderSetNodeSize(ImGuiID node_id, float size[2]) {
+ ImGui::DockBuilderSetNodeSize(node_id, {size[0], size[1]});
+}
+
+ZGUI_API ImGuiID zguiDockBuilderSplitNode(
+ ImGuiID node_id,
+ ImGuiDir split_dir,
+ float size_ratio_for_node_at_dir,
+ ImGuiID* out_id_at_dir,
+ ImGuiID* out_id_at_opposite_dir
+) {
+ return ImGui::DockBuilderSplitNode(
+ node_id,
+ split_dir,
+ size_ratio_for_node_at_dir,
+ out_id_at_dir,
+ out_id_at_opposite_dir
+ );
+}
+
+ZGUI_API void zguiDockBuilderFinish(ImGuiID node_id) {
+ ImGui::DockBuilderFinish(node_id);
+}
+
+
+#if ZGUI_IMPLOT
+//--------------------------------------------------------------------------------------------------
+//
+// ImPlot
+//
+//--------------------------------------------------------------------------------------------------
+ZGUI_API ImPlotContext* zguiPlot_CreateContext(void) {
+ return ImPlot::CreateContext();
+}
+
+ZGUI_API void zguiPlot_DestroyContext(ImPlotContext* ctx) {
+ ImPlot::DestroyContext(ctx);
+}
+
+ZGUI_API ImPlotContext* zguiPlot_GetCurrentContext(void) {
+ return ImPlot::GetCurrentContext();
+}
+
+ZGUI_API ImPlotStyle zguiPlotStyle_Init(void) {
+ return ImPlotStyle();
+}
+
+ZGUI_API ImPlotStyle* zguiPlot_GetStyle(void) {
+ return &ImPlot::GetStyle();
+}
+
+ZGUI_API void zguiPlot_PushStyleColor4f(ImPlotCol idx, const float col[4]) {
+ ImPlot::PushStyleColor(idx, { col[0], col[1], col[2], col[3] });
+}
+
+ZGUI_API void zguiPlot_PushStyleColor1u(ImPlotCol idx, ImU32 col) {
+ ImPlot::PushStyleColor(idx, col);
+}
+
+ZGUI_API void zguiPlot_PopStyleColor(int count) {
+ ImPlot::PopStyleColor(count);
+}
+
+ZGUI_API void zguiPlot_PushStyleVar1i(ImPlotStyleVar idx, int var) {
+ ImPlot::PushStyleVar(idx, var);
+}
+
+ZGUI_API void zguiPlot_PushStyleVar1f(ImPlotStyleVar idx, float var) {
+ ImPlot::PushStyleVar(idx, var);
+}
+
+ZGUI_API void zguiPlot_PushStyleVar2f(ImPlotStyleVar idx, const float var[2]) {
+ ImPlot::PushStyleVar(idx, { var[0], var[1] });
+}
+
+ZGUI_API void zguiPlot_PopStyleVar(int count) {
+ ImPlot::PopStyleVar(count);
+}
+
+ZGUI_API void zguiPlot_SetupLegend(ImPlotLocation location, ImPlotLegendFlags flags) {
+ ImPlot::SetupLegend(location, flags);
+}
+
+ZGUI_API void zguiPlot_SetupAxis(ImAxis axis, const char* label, ImPlotAxisFlags flags) {
+ ImPlot::SetupAxis(axis, label, flags);
+}
+
+ZGUI_API void zguiPlot_SetupAxisLimits(ImAxis axis, double v_min, double v_max, ImPlotCond cond) {
+ ImPlot::SetupAxisLimits(axis, v_min, v_max, cond);
+}
+
+ZGUI_API void zguiPlot_SetupFinish(void) {
+ ImPlot::SetupFinish();
+}
+
+ZGUI_API bool zguiPlot_BeginPlot(const char* title_id, float width, float height, ImPlotFlags flags) {
+ return ImPlot::BeginPlot(title_id, { width, height }, flags);
+}
+
+ZGUI_API void zguiPlot_PlotLineValues(
+ const char* label_id,
+ ImGuiDataType data_type,
+ const void* values,
+ int count,
+ double xscale,
+ double x0,
+ ImPlotLineFlags flags,
+ int offset,
+ int stride
+) {
+ if (data_type == ImGuiDataType_S8)
+ ImPlot::PlotLine(label_id, (const ImS8*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U8)
+ ImPlot::PlotLine(label_id, (const ImU8*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_S16)
+ ImPlot::PlotLine(label_id, (const ImS16*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U16)
+ ImPlot::PlotLine(label_id, (const ImU16*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_S32)
+ ImPlot::PlotLine(label_id, (const ImS32*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U32)
+ ImPlot::PlotLine(label_id, (const ImU32*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_Float)
+ ImPlot::PlotLine(label_id, (const float*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_Double)
+ ImPlot::PlotLine(label_id, (const double*)values, count, xscale, x0, flags, offset, stride);
+ else
+ assert(false);
+}
+
+ZGUI_API void zguiPlot_PlotLine(
+ const char* label_id,
+ ImGuiDataType data_type,
+ const void* xv,
+ const void* yv,
+ int count,
+ ImPlotLineFlags flags,
+ int offset,
+ int stride
+) {
+ if (data_type == ImGuiDataType_S8)
+ ImPlot::PlotLine(label_id, (const ImS8*)xv, (const ImS8*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U8)
+ ImPlot::PlotLine(label_id, (const ImU8*)xv, (const ImU8*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_S16)
+ ImPlot::PlotLine(label_id, (const ImS16*)xv, (const ImS16*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U16)
+ ImPlot::PlotLine(label_id, (const ImU16*)xv, (const ImU16*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_S32)
+ ImPlot::PlotLine(label_id, (const ImS32*)xv, (const ImS32*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U32)
+ ImPlot::PlotLine(label_id, (const ImU32*)xv, (const ImU32*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_Float)
+ ImPlot::PlotLine(label_id, (const float*)xv, (const float*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_Double)
+ ImPlot::PlotLine(label_id, (const double*)xv, (const double*)yv, count, flags, offset, stride);
+ else
+ assert(false);
+}
+
+ZGUI_API void zguiPlot_PlotScatter(
+ const char* label_id,
+ ImGuiDataType data_type,
+ const void* xv,
+ const void* yv,
+ int count,
+ ImPlotScatterFlags flags,
+ int offset,
+ int stride
+) {
+ if (data_type == ImGuiDataType_S8)
+ ImPlot::PlotScatter(label_id, (const ImS8*)xv, (const ImS8*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U8)
+ ImPlot::PlotScatter(label_id, (const ImU8*)xv, (const ImU8*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_S16)
+ ImPlot::PlotScatter(label_id, (const ImS16*)xv, (const ImS16*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U16)
+ ImPlot::PlotScatter(label_id, (const ImU16*)xv, (const ImU16*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_S32)
+ ImPlot::PlotScatter(label_id, (const ImS32*)xv, (const ImS32*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U32)
+ ImPlot::PlotScatter(label_id, (const ImU32*)xv, (const ImU32*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_Float)
+ ImPlot::PlotScatter(label_id, (const float*)xv, (const float*)yv, count, flags, offset, stride);
+ else if (data_type == ImGuiDataType_Double)
+ ImPlot::PlotScatter(label_id, (const double*)xv, (const double*)yv, count, flags, offset, stride);
+ else
+ assert(false);
+}
+
+ZGUI_API void zguiPlot_PlotScatterValues(
+ const char* label_id,
+ ImGuiDataType data_type,
+ const void* values,
+ int count,
+ double xscale,
+ double x0,
+ ImPlotScatterFlags flags,
+ int offset,
+ int stride
+) {
+ if (data_type == ImGuiDataType_S8)
+ ImPlot::PlotScatter(label_id, (const ImS8*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U8)
+ ImPlot::PlotScatter(label_id, (const ImU8*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_S16)
+ ImPlot::PlotScatter(label_id, (const ImS16*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U16)
+ ImPlot::PlotScatter(label_id, (const ImU16*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_S32)
+ ImPlot::PlotScatter(label_id, (const ImS32*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U32)
+ ImPlot::PlotScatter(label_id, (const ImU32*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_Float)
+ ImPlot::PlotScatter(label_id, (const float*)values, count, xscale, x0, flags, offset, stride);
+ else if (data_type == ImGuiDataType_Double)
+ ImPlot::PlotScatter(label_id, (const double*)values, count, xscale, x0, flags, offset, stride);
+ else
+ assert(false);
+}
+
+ZGUI_API void zguiPlot_PlotShaded(
+ const char* label_id,
+ ImGuiDataType data_type,
+ const void* xv,
+ const void* yv,
+ int count,
+ double yref,
+ ImPlotShadedFlags flags,
+ int offset,
+ int stride
+) {
+ if (data_type == ImGuiDataType_S8)
+ ImPlot::PlotShaded(label_id, (const ImS8*)xv, (const ImS8*)yv, count, yref, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U8)
+ ImPlot::PlotShaded(label_id, (const ImU8*)xv, (const ImU8*)yv, count, yref, flags, offset, stride);
+ else if (data_type == ImGuiDataType_S16)
+ ImPlot::PlotShaded(label_id, (const ImS16*)xv, (const ImS16*)yv, count, yref, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U16)
+ ImPlot::PlotShaded(label_id, (const ImU16*)xv, (const ImU16*)yv, count, yref, flags, offset, stride);
+ else if (data_type == ImGuiDataType_S32)
+ ImPlot::PlotShaded(label_id, (const ImS32*)xv, (const ImS32*)yv, count, yref, flags, offset, stride);
+ else if (data_type == ImGuiDataType_U32)
+ ImPlot::PlotShaded(label_id, (const ImU32*)xv, (const ImU32*)yv, count, yref, flags, offset, stride);
+ else if (data_type == ImGuiDataType_Float)
+ ImPlot::PlotShaded(label_id, (const float*)xv, (const float*)yv, count, yref, flags, offset, stride);
+ else if (data_type == ImGuiDataType_Double)
+ ImPlot::PlotShaded(label_id, (const double*)xv, (const double*)yv, count, yref, flags, offset, stride);
+ else
+ assert(false);
+}
+
+ZGUI_API void zguiPlot_ShowDemoWindow(bool* p_open) {
+ ImPlot::ShowDemoWindow(p_open);
+}
+
+ZGUI_API void zguiPlot_EndPlot(void) {
+ ImPlot::EndPlot();
+}
+ZGUI_API bool zguiPlot_DragPoint(
+ int id,
+ double* x,
+ double* y,
+ float col[4],
+ float size,
+ ImPlotDragToolFlags flags
+) {
+ return ImPlot::DragPoint(
+ id,
+ x,
+ y,
+ (*(const ImVec4*)&(col[0])),
+ size,
+ flags
+ );
+}
+
+ZGUI_API void zguiPlot_PlotText(
+ const char* text,
+ double x, double y,
+ const float pix_offset[2],
+ ImPlotTextFlags flags=0
+) {
+ const ImVec2 p(pix_offset[0], pix_offset[1]);
+ ImPlot::PlotText(text, x, y, p, flags);
+}
+#endif /* #ifdef ZGUI_IMPLOT */
+
+//--------------------------------------------------------------------------------------------------
+} /* extern "C" */
+
+
+#if ZGUI_TE
+//--------------------------------------------------------------------------------------------------
+//
+// ImGUI Test Engine
+//
+//--------------------------------------------------------------------------------------------------
+extern "C"
+{
+
+ ZGUI_API void *zguiTe_CreateContext(void)
+ {
+ ImGuiTestEngine *e = ImGuiTestEngine_CreateContext();
+
+ ImGuiTestEngine_Start(e, ImGui::GetCurrentContext());
+ ImGuiTestEngine_InstallDefaultCrashHandler();
+
+ return e;
+ }
+
+ ZGUI_API void zguiTe_DestroyContext(ImGuiTestEngine *engine)
+ {
+ ImGuiTestEngine_DestroyContext(engine);
+ }
+
+ ZGUI_API void zguiTe_EngineSetRunSpeed(ImGuiTestEngine *engine, ImGuiTestRunSpeed speed)
+ {
+ ImGuiTestEngine_GetIO(engine).ConfigRunSpeed = speed;
+ }
+
+ ZGUI_API void zguiTe_EngineExportJunitResult(ImGuiTestEngine *engine, const char *filename)
+ {
+ ImGuiTestEngine_GetIO(engine).ExportResultsFilename = filename;
+ ImGuiTestEngine_GetIO(engine).ExportResultsFormat = ImGuiTestEngineExportFormat_JUnitXml;
+ }
+
+ ZGUI_API void zguiTe_TryAbortEngine(ImGuiTestEngine *engine)
+ {
+ ImGuiTestEngine_TryAbortEngine(engine);
+ }
+
+ ZGUI_API void zguiTe_Stop(ImGuiTestEngine *engine)
+ {
+ ImGuiTestEngine_Stop(engine);
+ }
+
+ ZGUI_API void zguiTe_PostSwap(ImGuiTestEngine *engine)
+ {
+ ImGuiTestEngine_PostSwap(engine);
+ }
+
+ ZGUI_API bool zguiTe_IsTestQueueEmpty(ImGuiTestEngine *engine)
+ {
+ return ImGuiTestEngine_IsTestQueueEmpty(engine);
+ }
+
+ ZGUI_API void zguiTe_GetResult(ImGuiTestEngine *engine, int *count_tested, int *count_success)
+ {
+ int ct = 0;
+ int cs = 0;
+ ImGuiTestEngine_GetResult(engine, ct, cs);
+ *count_tested = ct;
+ *count_success = cs;
+ }
+
+ ZGUI_API void zguiTe_PrintResultSummary(ImGuiTestEngine *engine)
+ {
+ ImGuiTestEngine_PrintResultSummary(engine);
+ }
+
+ ZGUI_API void zguiTe_QueueTests(ImGuiTestEngine *engine, ImGuiTestGroup group, const char *filter_str, ImGuiTestRunFlags run_flags)
+ {
+ ImGuiTestEngine_QueueTests(engine, group, filter_str, run_flags);
+ }
+
+ ZGUI_API void zguiTe_ShowTestEngineWindows(ImGuiTestEngine *engine, bool *p_open)
+ {
+ ImGuiTestEngine_ShowTestEngineWindows(engine, p_open);
+ }
+
+ ZGUI_API void *zguiTe_RegisterTest(ImGuiTestEngine *engine, const char *category, const char *name, const char *src_file, int src_line, ImGuiTestGuiFunc *gui_fce, ImGuiTestTestFunc *gui_test_fce)
+ {
+ auto t = ImGuiTestEngine_RegisterTest(engine, category, name, src_file, src_line);
+ t->GuiFunc = gui_fce;
+ t->TestFunc = gui_test_fce;
+ return t;
+ }
+
+ ZGUI_API bool zguiTe_Check(const char *file, const char *func, int line, ImGuiTestCheckFlags flags, bool result, const char *expr)
+ {
+ return ImGuiTestEngine_Check(file, func, line, flags, result, expr);
+ }
+
+ // CONTEXT
+
+ ZGUI_API void zguiTe_ContextSetRef(ImGuiTestContext *ctx, const char *ref)
+ {
+ ctx->SetRef(ref);
+ }
+
+ ZGUI_API void zguiTe_ContextWindowFocus(ImGuiTestContext *ctx, const char *ref)
+ {
+ ctx->WindowFocus(ref);
+ }
+
+ ZGUI_API void zguiTe_ContextItemAction(ImGuiTestContext *ctx, ImGuiTestAction action, const char *ref, ImGuiTestOpFlags flags = 0, void *action_arg = NULL)
+ {
+ ctx->ItemAction(action, ref, flags, action_arg);
+ }
+
+ ZGUI_API void zguiTe_ContextItemInputStrValue(ImGuiTestContext *ctx, const char *ref, const char *value)
+ {
+ ctx->ItemInputValue(ref, value);
+ }
+
+ ZGUI_API void zguiTe_ContextItemInputIntValue(ImGuiTestContext *ctx, const char *ref, int value)
+ {
+ ctx->ItemInputValue(ref, value);
+ }
+
+ ZGUI_API void zguiTe_ContextItemInputFloatValue(ImGuiTestContext *ctx, const char *ref, float value)
+ {
+ ctx->ItemInputValue(ref, value);
+ }
+
+ ZGUI_API void zguiTe_ContextYield(ImGuiTestContext *ctx, int frame_count)
+ {
+ ctx->Yield(frame_count);
+ }
+
+ ZGUI_API void zguiTe_ContextMenuAction(ImGuiTestContext *ctx, ImGuiTestAction action, const char *ref)
+ {
+ ctx->MenuAction(action, ref);
+ }
+
+ ZGUI_API void zguiTe_ContextDragAndDrop(ImGuiTestContext *ctx, const char *ref_src, const char *ref_dst, ImGuiMouseButton button)
+ {
+ ctx->ItemDragAndDrop(ref_src, ref_dst, button);
+ }
+
+ ZGUI_API void zguiTe_ContextKeyDown(ImGuiTestContext *ctx, ImGuiKeyChord key_chord)
+ {
+ ctx->KeyDown(key_chord);
+ }
+
+ ZGUI_API void zguiTe_ContextKeyUp(ImGuiTestContext *ctx, ImGuiKeyChord key_chord)
+ {
+ ctx->KeyUp(key_chord);
+ }
+
+} /* extern "C" */
+#endif