From 5458a03757ac0980d17c2d718ca5053bb4dffa78 Mon Sep 17 00:00:00 2001 From: SpaiR Date: Sat, 30 May 2020 16:06:00 +0300 Subject: [PATCH] Expose docking API --- .../src/main/java/imgui/ImFontGlyph.java | 1 - imgui-binding/src/main/java/imgui/ImGui.java | 80 +++++++++- .../src/main/java/imgui/ImGuiIO.java | 62 ++++++++ .../src/main/java/imgui/ImGuiWindowClass.java | 145 ++++++++++++++++++ .../src/main/java/imgui/enums/ImGuiCol.java | 33 ++-- .../java/imgui/enums/ImGuiConfigFlags.java | 6 + .../java/imgui/enums/ImGuiDockNodeFlags.java | 44 ++++++ .../java/imgui/enums/ImGuiWindowFlags.java | 4 + 8 files changed, 360 insertions(+), 15 deletions(-) create mode 100644 imgui-binding/src/main/java/imgui/ImGuiWindowClass.java create mode 100644 imgui-binding/src/main/java/imgui/enums/ImGuiDockNodeFlags.java diff --git a/imgui-binding/src/main/java/imgui/ImFontGlyph.java b/imgui-binding/src/main/java/imgui/ImFontGlyph.java index f791f86..7122f45 100644 --- a/imgui-binding/src/main/java/imgui/ImFontGlyph.java +++ b/imgui-binding/src/main/java/imgui/ImFontGlyph.java @@ -28,7 +28,6 @@ public final class ImFontGlyph implements ImDestroyable { /*JNI #include #include - #include "jni_common.h" jfieldID imFontGlyphPtrID; diff --git a/imgui-binding/src/main/java/imgui/ImGui.java b/imgui-binding/src/main/java/imgui/ImGui.java index cda104c..8ce2645 100644 --- a/imgui-binding/src/main/java/imgui/ImGui.java +++ b/imgui-binding/src/main/java/imgui/ImGui.java @@ -50,6 +50,7 @@ public final class ImGui { ImFontGlyph.nInit(); ImFont.nInit(); ImGuiStyle.nInit(); + ImGuiWindowClass.nInit(); nInitInputTextData(); } @@ -474,6 +475,13 @@ public final class ImGui { return (intptr_t)ImGui::GetWindowDrawList(); */ + /** + * Get DPI scale currently associated to the current window's viewport. + */ + public static native float getWindowDpiScale(); /* + return ImGui::GetWindowDpiScale(); + */ + /** * Get current window position in screen space (useful if you want to do your own drawing via the DrawList API) */ @@ -3989,6 +3997,7 @@ public final class ImGui { */ // Tab Bars, Tabs + // Note: Tabs are automatically created by the docking system. Use this to create tab bars/tabs yourself without docking being involved. /** * Create and append into a TabBar @@ -4062,6 +4071,73 @@ public final class ImGui { ImGui::SetTabItemClosed(tabOrDockedWindowLabel); */ + // Docking + // [BETA API] Enable with io.ConfigFlags |= ImGuiConfigFlags_DockingEnable. + // Note: You can use most Docking facilities without calling any API. You DO NOT need to call DockSpace() to use Docking! + // - To dock windows: if io.ConfigDockingWithShift == false (default) drag window from their title bar. + // - To dock windows: if io.ConfigDockingWithShift == true: hold SHIFT anywhere while moving windows. + // About DockSpace: + // - Use DockSpace() to create an explicit dock node _within_ an existing window. See Docking demo for details. + // - DockSpace() needs to be submitted _before_ any window they can host. If you use a dockspace, submit it early in your app. + + public static void dockSpace(int imGuiID) { + nDockSpace(imGuiID, 0, 0, 0, 0); + } + + public static void dockSpace(int imGuiID, float sizeX, float sizeY) { + nDockSpace(imGuiID, sizeX, sizeY, 0, 0); + } + + public static void dockSpace(int imGuiID, float sizeX, float sizeY, int imGuiDockNodeFlags) { + nDockSpace(imGuiID, sizeX, sizeY, imGuiDockNodeFlags, 0); + } + + public static void dockSpace(int imGuiID, float sizeX, float sizeY, int imGuiDockNodeFlags, ImGuiWindowClass imGuiWindowClass) { + nDockSpace(imGuiID, sizeX, sizeY, imGuiDockNodeFlags, imGuiWindowClass.ptr); + } + + private static native void nDockSpace(int imGuiID, float sizeX, float sizeY, int imGuiDockNodeFlags, long windowClassPtr); /* + ImGui::DockSpace(imGuiID, ImVec2(sizeX, sizeY), imGuiDockNodeFlags, windowClassPtr != 0 ? (ImGuiWindowClass*)windowClassPtr : NULL); + */ + + // TODO: DockSpaceOverViewport + + /** + * Set next window dock id + */ + public static native void setNextWindowDockID(int dockId); /* + ImGui::SetNextWindowDockID(dockId); + */ + + /** + * Set next window dock id + */ + public static native void setNextWindowDockID(int dockId, int imGuiCond); /* + ImGui::SetNextWindowDockID(dockId, imGuiCond); + */ + + /** + * set next window class (rare/advanced uses: provide hints to the platform back-end via altered viewport flags and parent/child info) + */ + public static void setNextWindowClass(ImGuiWindowClass windowClass) { + nSetNextWindowClass(windowClass.ptr); + } + + private static native void nSetNextWindowClass(long windowClassPtr); /* + ImGui::SetNextWindowClass((ImGuiWindowClass*)windowClassPtr); + */ + + public static native int getWindowDockID(); /* + return ImGui::GetWindowDockID(); + */ + + /** + * Is current window docked into another window? + */ + public static native boolean isWindowDocked(); /* + return ImGui::IsWindowDocked(); + */ + // Logging/Capture // - All text output from the interface can be captured into tty/file/clipboard. By default, tree nodes are automatically opened during logging. @@ -4432,6 +4508,7 @@ public final class ImGui { */ /** + * Get background draw list for the viewport associated to the current window. * This draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents. */ public static ImDrawList getBackgroundDrawList() { @@ -4446,7 +4523,8 @@ public final class ImGui { */ /** - * This draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents. + * Get foreground draw list for the viewport associated to the current window. + * This draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents. */ public static ImDrawList getForegroundDrawList() { if (foregroundDrawList == null) { diff --git a/imgui-binding/src/main/java/imgui/ImGuiIO.java b/imgui-binding/src/main/java/imgui/ImGuiIO.java index 7a65446..6ed1199 100644 --- a/imgui-binding/src/main/java/imgui/ImGuiIO.java +++ b/imgui-binding/src/main/java/imgui/ImGuiIO.java @@ -465,6 +465,68 @@ public final class ImGuiIO { ImGui::GetIO().DisplayFramebufferScale.y = y; */ + // Docking options (when ImGuiConfigFlags_DockingEnable is set) + + /** + * Simplified docking mode: disable window splitting, so docking is limited to merging multiple windows together into tab-bars. + */ + public native boolean getConfigDockingNoSplit(); /* + return ImGui::GetIO().ConfigDockingNoSplit; + */ + + /** + * Simplified docking mode: disable window splitting, so docking is limited to merging multiple windows together into tab-bars. + */ + public native void setConfigDockingNoSplit(boolean value); /* + ImGui::GetIO().ConfigDockingNoSplit = value; + */ + + /** + * Enable docking with holding Shift key (reduce visual noise, allows dropping in wider space) + */ + public native boolean getConfigDockingWithShift(); /* + return ImGui::GetIO().ConfigDockingWithShift; + */ + + /** + * Enable docking with holding Shift key (reduce visual noise, allows dropping in wider space) + */ + public native void setConfigDockingWithShift(boolean value); /* + ImGui::GetIO().ConfigDockingWithShift = value; + */ + + /** + * [BETA] [FIXME: This currently creates regression with auto-sizing and general overhead] + * Make every single floating window display within a docking node. + */ + public native boolean getConfigDockingAlwaysTabBar(); /* + return ImGui::GetIO().ConfigDockingAlwaysTabBar; + */ + + /** + * [BETA] [FIXME: This currently creates regression with auto-sizing and general overhead] + * Make every single floating window display within a docking node. + */ + public native void setConfigDockingAlwaysTabBar(boolean value); /* + ImGui::GetIO().ConfigDockingAlwaysTabBar = value; + */ + + /** + * [BETA] Make window or viewport transparent when docking and only display docking boxes on the target viewport. + * Useful if rendering of multiple viewport cannot be synced. Best used with ConfigViewportsNoAutoMerge. + */ + public native boolean getConfigDockingTransparentPayload(); /* + return ImGui::GetIO().ConfigDockingTransparentPayload; + */ + + /** + * [BETA] Make window or viewport transparent when docking and only display docking boxes on the target viewport. + * Useful if rendering of multiple viewport cannot be synced. Best used with ConfigViewportsNoAutoMerge. + */ + public native void setConfigDockingTransparentPayload(boolean value); /* + ImGui::GetIO().ConfigDockingTransparentPayload = value; + */ + /** * Time elapsed since last frame, in seconds. *

diff --git a/imgui-binding/src/main/java/imgui/ImGuiWindowClass.java b/imgui-binding/src/main/java/imgui/ImGuiWindowClass.java new file mode 100644 index 0000000..ff5031c --- /dev/null +++ b/imgui-binding/src/main/java/imgui/ImGuiWindowClass.java @@ -0,0 +1,145 @@ +package imgui; + +/** + * [ALPHA] Rarely used / very advanced uses only. Use with SetNextWindowClass() and DockSpace() functions. + * Important: the content of this class is still highly WIP and likely to change and be refactored + * before we stabilize Docking features. Please be mindful if using this. + * Provide hints: + * - To the platform back-end via altered viewport flags (enable/disable OS decoration, OS task bar icons, etc.) + * - To the platform back-end for OS level parent/child relationships of viewport. + * - To the docking system for various options and filtering. + */ +public final class ImGuiWindowClass implements ImDestroyable { + final long ptr; + + /** + * This class will create a native structure. + * Call {@link #destroy()} method to manually free used memory. + */ + public ImGuiWindowClass() { + ImGui.touch(); + ptr = nCreate(); + } + + ImGuiWindowClass(final long ptr) { + this.ptr = ptr; + } + + @Override + public void destroy() { + nDestroy(ptr); + } + + /*JNI + #include + #include + + jfieldID imGuiWindowClassPtrID; + + #define IMGUI_WINDOW_CLASS ((ImGuiWindowClass*)env->GetLongField(object, imGuiWindowClassPtrID)) + */ + + static native void nInit(); /* + jclass jImGuiWindowClassClass = env->FindClass("imgui/ImGuiWindowClass"); + imGuiWindowClassPtrID = env->GetFieldID(jImGuiWindowClassClass, "ptr", "J"); + */ + + private native long nCreate(); /* + ImGuiWindowClass* imGuiWindowClass = new ImGuiWindowClass(); + return (intptr_t)imGuiWindowClass; + */ + + private native void nDestroy(long ptr); /* + delete (ImGuiWindowClass*)ptr; + */ + + /** + * User data. 0 = Default class (unclassed). Windows of different classes cannot be docked with each others. + */ + public native int geClassId(); /* + return IMGUI_WINDOW_CLASS->ClassId; + */ + + /** + * User data. 0 = Default class (unclassed). Windows of different classes cannot be docked with each others. + */ + public native void setClassId(int classId); /* + IMGUI_WINDOW_CLASS->ClassId = classId; + */ + + /** + * Hint for the platform back-end. If non-zero, the platform back-end can create a parent<>child relationship between the platform windows. + * Not conforming back-ends are free to e.g. parent every viewport to the main viewport or not. + */ + public native int getParentViewportId(); /* + return IMGUI_WINDOW_CLASS->ParentViewportId; + */ + + /** + * Hint for the platform back-end. If non-zero, the platform back-end can create a parent<>child relationship between the platform windows. + * Not conforming back-ends are free to e.g. parent every viewport to the main viewport or not. + */ + public native void setParentViewportId(int parentViewportId); /* + IMGUI_WINDOW_CLASS->ParentViewportId = parentViewportId; + */ + + // TODO: ViewportFlagsOverrideSet, ViewportFlagsOverrideClear + + /** + * [EXPERIMENTAL] Dock node flags to set when a window of this class is hosted by a dock node (it doesn't have to be selected!) + */ + public native int getDockNodeFlagsOverrideSet(); /* + return IMGUI_WINDOW_CLASS->DockNodeFlagsOverrideSet; + */ + + /** + * [EXPERIMENTAL] Dock node flags to set when a window of this class is hosted by a dock node (it doesn't have to be selected!) + */ + public native void setDockNodeFlagsOverrideSet(int dockNodeFlagsOverrideSet); /* + IMGUI_WINDOW_CLASS->DockNodeFlagsOverrideSet = dockNodeFlagsOverrideSet; + */ + + /** + * [EXPERIMENTAL] + */ + public native int getDockNodeFlagsOverrideClear(); /* + return IMGUI_WINDOW_CLASS->DockNodeFlagsOverrideClear; + */ + + /** + * [EXPERIMENTAL] + */ + public native void setDockNodeFlagsOverrideClear(int dockNodeFlagsOverrideClear); /* + IMGUI_WINDOW_CLASS->DockNodeFlagsOverrideClear = dockNodeFlagsOverrideClear; + */ + + /** + * Set to true to enforce single floating windows of this class always having their own docking node + * (equivalent of setting the global io.ConfigDockingAlwaysTabBar) + */ + public native boolean getDockingAlwaysTabBar(); /* + return IMGUI_WINDOW_CLASS->DockingAlwaysTabBar; + */ + + /** + * Set to true to enforce single floating windows of this class always having their own docking node + * (equivalent of setting the global io.ConfigDockingAlwaysTabBar) + */ + public native void setDockingAlwaysTabBar(boolean dockingAlwaysTabBar); /* + IMGUI_WINDOW_CLASS->DockingAlwaysTabBar = dockingAlwaysTabBar; + */ + + /** + * Set to true to allow windows of this class to be docked/merged with an unclassed window. + */ + public native boolean getDockingAllowUnclassed(); /* + return IMGUI_WINDOW_CLASS->DockingAllowUnclassed; + */ + + /** + * Set to true to allow windows of this class to be docked/merged with an unclassed window. + */ + public native void setDockingAllowUnclassed(boolean dockingAllowUnclassed); /* + IMGUI_WINDOW_CLASS->DockingAllowUnclassed = dockingAllowUnclassed; + */ +} diff --git a/imgui-binding/src/main/java/imgui/enums/ImGuiCol.java b/imgui-binding/src/main/java/imgui/enums/ImGuiCol.java index 608bd2c..133ebf5 100644 --- a/imgui-binding/src/main/java/imgui/enums/ImGuiCol.java +++ b/imgui-binding/src/main/java/imgui/enums/ImGuiCol.java @@ -12,7 +12,7 @@ public final class ImGuiCol { /** * Background of normal windows */ - public static final int WindowBg = 2; // + public static final int WindowBg = 2; /** * Background of child windows */ @@ -60,28 +60,35 @@ public final class ImGuiCol { public static final int TabActive = 35; public static final int TabUnfocused = 36; public static final int TabUnfocusedActive = 37; - public static final int PlotLines = 38; - public static final int PlotLinesHovered = 39; - public static final int PlotHistogram = 40; - public static final int PlotHistogramHovered = 41; - public static final int TextSelectedBg = 42; - public static final int DragDropTarget = 43; + /** + * Preview overlay color when about to docking something + */ + public static final int DockingPreview = 38; + /** + * Background color for empty node (e.g. CentralNode with no window docked into it) + */ + public static final int DockingEmptyBg = 39; + public static final int PlotLines = 40; + public static final int PlotLinesHovered = 41; + public static final int PlotHistogram = 42; + public static final int PlotHistogramHovered = 43; + public static final int TextSelectedBg = 44; + public static final int DragDropTarget = 45; /** * Gamepad/keyboard: current highlighted item */ - public static final int NavHighlight = 44; + public static final int NavHighlight = 46; /** * Highlight window when using CTRL+TAB */ - public static final int NavWindowingHighlight = 45; + public static final int NavWindowingHighlight = 47; /** * Darken/colorize entire screen behind the CTRL+TAB window list, when active */ - public static final int NavWindowingDimBg = 46; + public static final int NavWindowingDimBg = 48; /** * Darken/colorize entire screen behind a modal window, when one is active */ - public static final int ModalWindowDimBg = 47; - public static final int COUNT = 48; - + public static final int ModalWindowDimBg = 49; + public static final int COUNT = 49; } diff --git a/imgui-binding/src/main/java/imgui/enums/ImGuiConfigFlags.java b/imgui-binding/src/main/java/imgui/enums/ImGuiConfigFlags.java index dd512f2..829c68c 100644 --- a/imgui-binding/src/main/java/imgui/enums/ImGuiConfigFlags.java +++ b/imgui-binding/src/main/java/imgui/enums/ImGuiConfigFlags.java @@ -37,6 +37,12 @@ public final class ImGuiConfigFlags { */ public static final int NoMouseCursorChange = 1 << 5; + /** + * [BETA] Docking + * Docking enable flags. + */ + public static final int DockingEnable = 1 << 6; + // User storage (to allow your back-end/engine to communicate to code that may be shared between multiple projects. Those flags are not used by core Dear ImGui) /** diff --git a/imgui-binding/src/main/java/imgui/enums/ImGuiDockNodeFlags.java b/imgui-binding/src/main/java/imgui/enums/ImGuiDockNodeFlags.java new file mode 100644 index 0000000..7a87f4a --- /dev/null +++ b/imgui-binding/src/main/java/imgui/enums/ImGuiDockNodeFlags.java @@ -0,0 +1,44 @@ +package imgui.enums; + +/** + * Flags for ImGui::DockSpace(), shared/inherited by child nodes. + * (Some flags can be applied to individual nodes directly) + */ +public final class ImGuiDockNodeFlags { + private ImGuiDockNodeFlags() { + } + + public static final int None = 0; + /** + * Don't display the dockspace node but keep it alive. Windows docked into this dockspace node won't be undocked. + */ + public static final int KeepAliveOnly = 1; + /** + * Disable Central Node (the node which can stay empty) + */ + public static final int NoCentralNode = 1 << 1; + /** + * Disable docking inside the Central Node, which will be always kept empty. + */ + public static final int NoDockingInCentralNode = 1 << 2; + /** + * Enable passthru dockspace: 1) DockSpace() will render a ImGuiCol_WindowBg background covering everything excepted the Central + * Node when empty. Meaning the host window should probably use SetNextWindowBgAlpha(0.0f) prior to Begin() when using this. 2) + * When Central Node is empty: let inputs pass-through + won't display a DockingEmptyBg background. See demo for details. + */ + public static final int PassthruCentralNode = 1 << 3; + /** + * Disable splitting the node into smaller nodes. + * Useful e.g. when embedding dockspaces into a main root one (the root one may have splitting disabled to reduce confusion). + * Note: when turned off, existing splits will be preserved. + */ + public static final int NoSplit = 1 << 4; + /** + * Disable resizing node using the splitter/separators. Useful with programatically setup dockspaces. + */ + public static final int NoResize = 1 << 5; + /** + * Tab bar will automatically hide when there is a single window in the dock node. + */ + public static final int AutoHideTabBar = 1 << 6; +} diff --git a/imgui-binding/src/main/java/imgui/enums/ImGuiWindowFlags.java b/imgui-binding/src/main/java/imgui/enums/ImGuiWindowFlags.java index 0915c4a..0de66f7 100644 --- a/imgui-binding/src/main/java/imgui/enums/ImGuiWindowFlags.java +++ b/imgui-binding/src/main/java/imgui/enums/ImGuiWindowFlags.java @@ -85,6 +85,10 @@ public final class ImGuiWindowFlags { * Append '*' to title without affecting the ID, as a convenience to avoid using the ### operator. When used in a tab/docking context, tab is selected on closure and closure is deferred by one frame to allow code to cancel the closure (with a confirmation popup, etc.) without flicker. */ public static final int UnsavedDocument = 1 << 20; + /** + * Disable docking of this window + */ + public static final int NoDocking = 1 << 21; public static final int NoNav = NoNavInputs | NoNavFocus; public static final int NoDecoration = NoTitleBar | NoResize | NoScrollbar | NoCollapse; public static final int NoInputs = NoMouseInputs | NoNavInputs | NoNavFocus;