GetLastItemRectMin/Max, SetWindowFontScale

* Also some improvements in TextInputBuffer"
internals
Eric Mellino 8 years ago
parent 7f1bc8c6f2
commit c09777c4e3
  1. 21
      src/ImGui.NET/ImGui.cs
  2. 52
      src/ImGui.NET/TextInputBuffer.cs
  3. 2
      src/ImGui.NET/project.json

@ -962,11 +962,30 @@ namespace ImGuiNET
ImGuiNative.igTreePop(); ImGuiNative.igTreePop();
} }
public static Vector2 GetLastItemRect() public static Vector2 GetLastItemRectSize()
{ {
Vector2 result; Vector2 result;
ImGuiNative.igGetItemRectSize(out result); ImGuiNative.igGetItemRectSize(out result);
return result; return result;
} }
public static Vector2 GetLastItemRectMin()
{
Vector2 result;
ImGuiNative.igGetItemRectMin(out result);
return result;
}
public static Vector2 GetLastItemRectMax()
{
Vector2 result;
ImGuiNative.igGetItemRectMax(out result);
return result;
}
public static void SetWindowFontScale(float scale)
{
ImGuiNative.igSetWindowFontScale(scale);
}
} }
} }

@ -1,15 +1,39 @@
using System; using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace ImGuiNET namespace ImGuiNET
{ {
public class TextInputBuffer : IDisposable public class TextInputBuffer : IDisposable
{ {
private uint _length;
public IntPtr Buffer { get; private set; } public IntPtr Buffer { get; private set; }
public uint Length { get; private set; }
public uint Length
{
get
{
return _length;
}
set
{
if (value > int.MaxValue)
{
throw new ArgumentOutOfRangeException("Length cannot be greater that Int32.MaxValue.");
}
Resize((int)value);
}
}
public TextInputBuffer(int length) public TextInputBuffer(int length)
{ {
if (length < 0)
{
throw new ArgumentOutOfRangeException(nameof(length));
}
CreateBuffer(length); CreateBuffer(length);
} }
@ -19,10 +43,13 @@ namespace ImGuiNET
Length = (uint)initialText.Length; Length = (uint)initialText.Length;
} }
public void Resize(int newSize) private unsafe void Resize(int newSize)
{ {
FreeNativeBuffer(); IntPtr newBuffer = Marshal.AllocHGlobal(newSize);
CreateBuffer(newSize); Unsafe.CopyBlock(newBuffer.ToPointer(), Buffer.ToPointer(), Length);
Marshal.FreeHGlobal(Buffer);
Buffer = newBuffer;
_length = (uint)newSize;
} }
private unsafe void CreateBuffer(int size) private unsafe void CreateBuffer(int size)
@ -53,7 +80,7 @@ namespace ImGuiNET
{ {
Marshal.FreeHGlobal(Buffer); Marshal.FreeHGlobal(Buffer);
Buffer = IntPtr.Zero; Buffer = IntPtr.Zero;
Length = 0; _length = 0;
} }
public string StringValue public string StringValue
@ -63,10 +90,23 @@ namespace ImGuiNET
return Marshal.PtrToStringAnsi(Buffer); return Marshal.PtrToStringAnsi(Buffer);
} }
set set
{
if (value.Length > Length) // Doesn't fit into current buffer
{ {
FreeNativeBuffer(); FreeNativeBuffer();
Buffer = Marshal.StringToHGlobalAnsi(value); Buffer = Marshal.StringToHGlobalAnsi(value);
Length = (uint)value.Length; _length = (uint)value.Length;
}
else // Fits in current buffer, just copy data in.
{
IntPtr tempNativeString = Marshal.StringToHGlobalAnsi(value);
uint bytesToCopy = (uint)Math.Min(Length, value.Length);
unsafe
{
Unsafe.CopyBlock(Buffer.ToPointer(), tempNativeString.ToPointer(), bytesToCopy);
}
Marshal.FreeHGlobal(tempNativeString);
}
} }
} }

@ -16,6 +16,8 @@
}, },
"dependencies": { "dependencies": {
"System.Numerics.Vectors": "4.1.1", "System.Numerics.Vectors": "4.1.1",
"System.Runtime.CompilerServices.Unsafe": "4.0.0",
"System.Runtime.Extensions": "4.1.0",
"System.Runtime.InteropServices": "4.1.0" "System.Runtime.InteropServices": "4.1.0"
}, },
"frameworks": { "frameworks": {

Loading…
Cancel
Save