From 6ab2d0e5731d9353cd574f6e00215bc0b043761b Mon Sep 17 00:00:00 2001 From: Eric Mellino Date: Fri, 6 Nov 2015 12:39:29 -0800 Subject: [PATCH] More additions from my assemblybrowser side project --- src/ImGui.NET/ImGui.NET.csproj | 3 +- src/ImGui.NET/ImGui.cs | 229 ++++++++++++++++++++++++++++++- src/ImGui.NET/ImGuiNative.cs | 43 +----- src/ImGui.NET/TextInputBuffer.cs | 49 +++++++ src/ImGui.NET/project.json | 3 +- 5 files changed, 286 insertions(+), 41 deletions(-) create mode 100644 src/ImGui.NET/TextInputBuffer.cs diff --git a/src/ImGui.NET/ImGui.NET.csproj b/src/ImGui.NET/ImGui.NET.csproj index 0ca1b77..a4b413d 100644 --- a/src/ImGui.NET/ImGui.NET.csproj +++ b/src/ImGui.NET/ImGui.NET.csproj @@ -5,7 +5,7 @@ 14.0 {2665014F-0FEC-4268-8F77-7B029921AB09} Library - ImGui + ImGuiNET ImGui.NET true @@ -15,6 +15,7 @@ + diff --git a/src/ImGui.NET/ImGui.cs b/src/ImGui.NET/ImGui.cs index 87b192d..4704086 100644 --- a/src/ImGui.NET/ImGui.cs +++ b/src/ImGui.NET/ImGui.cs @@ -1,4 +1,6 @@ -using System.Numerics; +using System; +using System.Numerics; +using System.Runtime.InteropServices; namespace ImGuiNET { @@ -25,6 +27,16 @@ namespace ImGuiNET ImGuiNative.igText(message); } + public static void PushId(string id) + { + ImGuiNative.igPushIdStr(id); + } + + public static void PopId() + { + ImGuiNative.igPopId(); + } + public static void Text(string message, Vector4 color) { ImGuiNative.igTextColored(color, message); @@ -35,6 +47,16 @@ namespace ImGuiNET return ImGuiNative.igButton(message, size); } + public static void SetNextWindowSize(Vector2 size, SetCondition condition) + { + ImGuiNative.igSetNextWindowSize(size, condition); + } + + public static void SetNextWindowPosCenter(SetCondition condition) + { + ImGuiNative.igSetNextWindowPosCenter(condition); + } + /// /// Helper to scale the ClipRect field of each ImDrawCmd. /// Use if your final output buffer is at a different scale than ImGui expects, @@ -55,5 +77,210 @@ namespace ImGuiNET } } } + + public static float GetWindowHeight() + { + return ImGuiNative.igGetWindowHeight(); + } + + public static bool ColorButton(Vector4 color, bool smallHeight, bool outlineBorder) + { + return ImGuiNative.igColorButton(color, smallHeight, outlineBorder); + } + + public static float GetWindowWidth() + { + return ImGuiNative.igGetWindowWidth(); + } + + public static bool BeginWindow(string windowTitle) => BeginWindow(windowTitle, WindowFlags.Default); + + public static bool BeginWindow(string windowTitle, WindowFlags flags) + { + bool opened = true; + return ImGuiNative.igBegin(windowTitle, ref opened, flags); + } + + public static bool BeginWindow(string windowTitle, ref bool opened, WindowFlags flags) + { + return ImGuiNative.igBegin(windowTitle, ref opened, flags); + } + + public static bool BeginWindow(string windowTitle, ref bool opened, float backgroundAlpha, WindowFlags flags) + { + return ImGuiNative.igBegin2(windowTitle, ref opened, new Vector2(), backgroundAlpha, flags); + } + + public static bool BeginMenu(string label, bool enabled) + { + return ImGuiNative.igBeginMenu(label, enabled); + } + + public static void BeginMenuBar() + { + ImGuiNative.igBeginMenuBar(); + } + + public static bool BeginWindow(string windowTitle, ref bool opened, Vector2 startingSize, WindowFlags flags) + { + return ImGuiNative.igBegin2(windowTitle, ref opened, startingSize, 1f, flags); + } + + public static void EndMenuBar() + { + ImGuiNative.igEndMenuBar(); + } + + public static void EndMenu() + { + ImGuiNative.igEndMenu(); + } + + public static bool BeginWindow(string windowTitle, ref bool opened, Vector2 startingSize, float backgroundAlpha, WindowFlags flags) + { + return ImGuiNative.igBegin2(windowTitle, ref opened, startingSize, backgroundAlpha, flags); + } + + public static void Separator() + { + ImGuiNative.igSeparator(); + } + + public static bool MenuItem(string label, string shortcut) + { + return MenuItem(label, shortcut, false, true); + } + + public static unsafe bool InputText(string label, IntPtr textBuffer, uint bufferSize, InputTextFlags flags, TextEditCallback textEditCallback) + { + return InputText(label, textBuffer, bufferSize, flags, textEditCallback, IntPtr.Zero); + } + + public static unsafe bool InputText(string label, IntPtr textBuffer, uint bufferSize, InputTextFlags flags, TextEditCallback textEditCallback, IntPtr userData) + { + return ImGuiNative.igInputText(label, textBuffer, bufferSize, flags, textEditCallback, userData.ToPointer()); + } + + public static bool MenuItem(string label, string shortcut, bool selected, bool enabled) + { + return ImGuiNative.igMenuItem(label, shortcut, selected, enabled); + } + + public static void EndWindow() + { + ImGuiNative.igEnd(); + } + + public static void PushStyleColor(ColorTarget target, Vector4 color) + { + ImGuiNative.igPushStyleColor(target, color); + } + + public static unsafe void InputTextMultiline(string label, IntPtr textBuffer, uint bufferSize, Vector2 size, InputTextFlags flags, TextEditCallback callback, IntPtr userData) + { + ImGuiNative.igInputTextMultiline(label, textBuffer, bufferSize, size, flags, callback, userData.ToPointer()); + } + + public static void PopStyleColor() + { + PopStyleColor(1); + } + + public static void PopStyleColor(int numStyles) + { + ImGuiNative.igPopStyleColor(numStyles); + } + + public static bool BeginChildFrame(uint id, Vector2 size, WindowFlags flags) + { + return ImGuiNative.igBeginChildFrame(id, size, flags); + } + + public static void EndChildFrame() + { + ImGuiNative.igEndChildFrame(); + } + + public static bool BeginChild(string id, Vector2 size, bool border, WindowFlags flags) + { + return ImGuiNative.igBeginChild(id, size, border, flags); + } + + public static bool BeginChild(uint id, Vector2 size, bool border, WindowFlags flags) + { + return ImGuiNative.igBeginChildEx(id, size, border, flags); + } + + public static void EndChild() + { + ImGuiNative.igEndChild(); + } + + public static bool Selectable(string label, bool isSelected) + { + return Selectable(label, isSelected, SelectableFlags.Default); + } + + public static bool Selectable(string label, bool isSelected, SelectableFlags flags) + { + return Selectable(label, isSelected, flags, new Vector2()); + } + + public static bool Selectable(string label, bool isSelected, SelectableFlags flags, Vector2 size) + { + return ImGuiNative.igSelectable(label, isSelected, flags, size); + } + + public static unsafe Vector2 GetTextSize(string text, float wrapWidth = Int32.MaxValue) + { + Vector2 result; + IntPtr buffer = Marshal.StringToHGlobalAnsi(text); + byte* textStart = (byte*)buffer.ToPointer(); + byte* textEnd = textStart + text.Length; + ImGuiNative.igCalcTextSize(out result, (char*)textStart, (char*)textEnd, false, wrapWidth); + return result; + } + + public static void SameLine() + { + ImGuiNative.igSameLine(0, 0); + } + + public static void SameLine(float localPositionX, float spacingW) + { + ImGuiNative.igSameLine(localPositionX, spacingW); + } + + public static bool IsLastItemHovered() + { + return ImGuiNative.igIsItemHovered(); + } + + public static void ShowTooltip(string text) + { + ImGuiNative.igSetTooltip(text); + } + + public static void SetNextTreeNodeOpened(bool opened) + { + ImGuiNative.igSetNextTreeNodeOpened(opened, SetCondition.Always); + } + + public static bool TreeNode(string label) + { + return ImGuiNative.igTreeNode(label); + } + + public static void TreePop() + { + ImGuiNative.igTreePop(); + } + + public static Vector2 GetLastItemRect() + { + Vector2 result; + ImGuiNative.igGetItemRectSize(out result); + return result; + } } } diff --git a/src/ImGui.NET/ImGuiNative.cs b/src/ImGui.NET/ImGuiNative.cs index 0ee1a33..38b73ef 100644 --- a/src/ImGui.NET/ImGuiNative.cs +++ b/src/ImGui.NET/ImGuiNative.cs @@ -31,16 +31,6 @@ namespace ImGuiNET [DllImport(cimguiLib)] public static extern void igShowStyleEditor(ref Style @ref); - public static void igBegin(string v, ref object _mainWindowOpened, WindowFlags windowFlags) - { - throw new NotImplementedException(); - } - - public static void igBeginChildFrame(uint _leftFrameId, Vector2 vector2) - { - throw new NotImplementedException(); - } - [DllImport(cimguiLib)] public static extern void igShowTestWindow(ref bool opened); [DllImport(cimguiLib)] @@ -64,11 +54,6 @@ namespace ImGuiNET [DllImport(cimguiLib)] public static extern void igGetContentRegionAvail(out Vector2 @out); - public static void igSliderFloat(string v1, ref object _sliderVal, float v2, float v3, string v4, int v5) - { - throw new NotImplementedException(); - } - [DllImport(cimguiLib)] public static extern float igGetContentRegionAvailWidth(); [DllImport(cimguiLib)] @@ -416,20 +401,11 @@ namespace ImGuiNET public static extern bool igTreeNode(string str_label_id); [DllImport(cimguiLib)] - //public static extern bool igTreeNodeStr(string str_id, string fmt, ...); public static extern bool igTreeNodeStr(string str_id, string fmt); [DllImport(cimguiLib)] - //public static extern bool igTreeNodePtr(void* ptr_id, string fmt, ...); public static extern bool igTreeNodePtr(void* ptr_id, string fmt); - /* - [DllImport(LibName)] - public static extern bool igTreeNodeStrV(string str_id, string fmt, va_list args); - [DllImport(LibName)] - public static extern bool igTreeNodePtrV(void* ptr_id, string fmt, va_list args); - */ - [DllImport(cimguiLib)] public static extern void igTreePushStr(string str_id); [DllImport(cimguiLib)] @@ -443,7 +419,7 @@ namespace ImGuiNET [DllImport(cimguiLib)] public static extern bool igSelectable(string label, bool selected, SelectableFlags flags, Vector2 size); [DllImport(cimguiLib)] - public static extern bool igSelectableEx(string label, bool* p_selected, SelectableFlags flags, Vector2 size); + public static extern bool igSelectableEx(string label, ref bool p_selected, SelectableFlags flags, Vector2 size); [DllImport(cimguiLib)] public static extern bool igListBox(string label, int* current_item, char** items, int items_count, int height_in_items); @@ -473,14 +449,7 @@ namespace ImGuiNET // Tooltip [DllImport(cimguiLib)] - //public static extern void igSetTooltip(string fmt, ...); public static extern void igSetTooltip(string fmt); - - /* - [DllImport(LibName)] - public static extern void igSetTooltipV(string fmt, va_list args); - */ - [DllImport(cimguiLib)] public static extern void igBeginTooltip(); [DllImport(cimguiLib)] @@ -569,11 +538,11 @@ namespace ImGuiNET [DllImport(cimguiLib)] public static extern bool igIsAnyItemActive(); [DllImport(cimguiLib)] - public static extern void igGetItemRectMin(Vector2* pOut); + public static extern void igGetItemRectMin(out Vector2 pOut); [DllImport(cimguiLib)] - public static extern void igGetItemRectMax(Vector2* pOut); + public static extern void igGetItemRectMax(out Vector2 pOut); [DllImport(cimguiLib)] - public static extern void igGetItemRectSize(Vector2* pOut); + public static extern void igGetItemRectSize(out Vector2 pOut); [DllImport(cimguiLib)] public static extern bool igIsWindowHovered(); [DllImport(cimguiLib)] @@ -593,9 +562,9 @@ namespace ImGuiNET [DllImport(cimguiLib)] public static extern string igGetStyleColName(ColorTarget idx); [DllImport(cimguiLib)] - public static extern void igCalcItemRectClosestPoint(Vector2* pOut, Vector2 pos, bool on_edge, float outward); + public static extern void igCalcItemRectClosestPoint(out Vector2 pOut, Vector2 pos, bool on_edge, float outward); [DllImport(cimguiLib)] - public static extern void igCalcTextSize(Vector2* pOut, string text, string text_end, bool hide_text_after_double_hash, float wrap_width); + public static extern void igCalcTextSize(out Vector2 pOut, char* text, char* text_end, bool hide_text_after_double_hash, float wrap_width); [DllImport(cimguiLib)] public static extern void igCalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end); diff --git a/src/ImGui.NET/TextInputBuffer.cs b/src/ImGui.NET/TextInputBuffer.cs new file mode 100644 index 0000000..2c37169 --- /dev/null +++ b/src/ImGui.NET/TextInputBuffer.cs @@ -0,0 +1,49 @@ +using System; +using System.Runtime.InteropServices; + +namespace ImGuiNET +{ + public class TextInputBuffer : IDisposable + { + public IntPtr Buffer { get; private set; } + public uint Length { get; private set; } + + public TextInputBuffer(int length) + { + CreateBuffer(length); + } + + public TextInputBuffer(string initialText) + { + Buffer = Marshal.StringToHGlobalAnsi(initialText); + Length = (uint)initialText.Length; + } + + public void Resize(int newSize) + { + ClearBuffer(); + CreateBuffer(newSize); + } + + private void CreateBuffer(int size) + { + Buffer = Marshal.AllocHGlobal(size); + Length = Length; + } + + private void ClearBuffer() + { + Marshal.FreeHGlobal(Buffer); + Buffer = IntPtr.Zero; + Length = 0; + } + + public void Dispose() + { + if (Buffer != IntPtr.Zero) + { + ClearBuffer(); + } + } + } +} diff --git a/src/ImGui.NET/project.json b/src/ImGui.NET/project.json index 4b4e5e9..4e48cce 100644 --- a/src/ImGui.NET/project.json +++ b/src/ImGui.NET/project.json @@ -1,7 +1,6 @@ { "dependencies": { - "Microsoft.NETCore.Console": "1.0.0-beta-23413", - "System.Console": "4.0.0-beta-23427" + "Microsoft.NETCore.Console": "1.0.0-beta-23504" }, "runtimes": { "win10-x64": { },