From a1a398be4d5a97b3ce74c8b09f4f7073b95a1128 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 21 Oct 2023 15:47:22 -0700 Subject: [PATCH] inspector: setup basic modes window (empty), dock --- src/Inspector.zig | 40 ++++++++++++++++++++++++++++++----- src/apprt/gtk/ImguiWidget.zig | 28 +++++++++++++----------- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/Inspector.zig b/src/Inspector.zig index 49d0d11ba..beb10d282 100644 --- a/src/Inspector.zig +++ b/src/Inspector.zig @@ -6,6 +6,11 @@ const Inspector = @This(); const cimgui = @import("cimgui"); const Surface = @import("Surface.zig"); +/// The window names. These are used with docking so we need to have access. +const window_modes = "Modes"; + +show_modes_window: bool = true, + /// Setup the ImGui state. This requires an ImGui context to be set. pub fn setup() void { const io: *cimgui.c.ImGuiIO = cimgui.c.igGetIO(); @@ -16,6 +21,10 @@ pub fn setup() void { // Our colorspace is sRGB. io.ConfigFlags |= cimgui.c.ImGuiConfigFlags_IsSRGB; + // Disable the ini file to save layout + io.IniFilename = null; + io.LogFilename = null; + // Use our own embedded font { // TODO: This will have to be recalculated for different screen DPIs. @@ -46,14 +55,35 @@ pub fn deinit(self: *Inspector) void { /// Render the frame. pub fn render(self: *Inspector) void { - _ = self; - - _ = cimgui.c.igDockSpaceOverViewport( + const dock_id = cimgui.c.igDockSpaceOverViewport( cimgui.c.igGetMainViewport(), cimgui.c.ImGuiDockNodeFlags_None, null, ); - var show: bool = true; - cimgui.c.igShowDemoWindow(&show); + // Flip this boolean to true whenever you want to see the ImGui demo + // window which can help you figure out how to use various ImGui widgets. + if (false) { + var show: bool = true; + cimgui.c.igShowDemoWindow(&show); + } + + self.renderModesWindow(); + + // Setup our dock. We want all our main windows to be tabs in the main bar. + cimgui.c.igDockBuilderDockWindow(window_modes, dock_id); +} + +/// The modes window shows the currently active terminal modes and allows +/// users to toggle them on and off. +fn renderModesWindow(self: *Inspector) void { + if (!self.show_modes_window) return; + + // Start our window. If we're collapsed we do nothing. + defer cimgui.c.igEnd(); + if (!cimgui.c.igBegin( + window_modes, + &self.show_modes_window, + cimgui.c.ImGuiWindowFlags_None, + )) return; } diff --git a/src/apprt/gtk/ImguiWidget.zig b/src/apprt/gtk/ImguiWidget.zig index 1432dc9e7..38efad289 100644 --- a/src/apprt/gtk/ImguiWidget.zig +++ b/src/apprt/gtk/ImguiWidget.zig @@ -201,21 +201,25 @@ fn gtkRender(area: *c.GtkGLArea, ctx: *c.GdkGLContext, ud: ?*anyopaque) callconv _ = area; _ = ctx; const self: *ImguiWidget = @ptrCast(@alignCast(ud.?)); - - // Setup our frame cimgui.c.igSetCurrentContext(self.ig_ctx); - cimgui.c.ImGui_ImplOpenGL3_NewFrame(); - self.newFrame() catch |err| { - log.err("failed to setup frame: {}", .{err}); - return 0; - }; - cimgui.c.igNewFrame(); - // Build our UI - if (self.render_callback) |cb| cb(self.render_userdata); + // Setup our frame. We render twice because some ImGui behaviors + // take multiple renders to process. I don't know how to make this + // more efficient. + for (0..2) |_| { + cimgui.c.ImGui_ImplOpenGL3_NewFrame(); + self.newFrame() catch |err| { + log.err("failed to setup frame: {}", .{err}); + return 0; + }; + cimgui.c.igNewFrame(); - // Render - cimgui.c.igRender(); + // Build our UI + if (self.render_callback) |cb| cb(self.render_userdata); + + // Render + cimgui.c.igRender(); + } // OpenGL final render gl.clearColor(0x28 / 0xFF, 0x2C / 0xFF, 0x34 / 0xFF, 1.0);