diff --git a/bin/binding.sha1 b/bin/binding.sha1 index 59c85b78..b401b807 100644 --- a/bin/binding.sha1 +++ b/bin/binding.sha1 @@ -35,7 +35,7 @@ cc7fa0c44d9e29152d0daa98f33dcbaca40c2905 imgui-binding/src/main/java/imgui/flag 0bf24ffb2f866d2c39cd09613221041b32b0d9de imgui-binding/src/main/java/imgui/flag/ImGuiConfigFlags.java fbc4da75a042b92d932fa33e23e810694bd9de50 imgui-binding/src/main/java/imgui/flag/ImGuiCond.java e8ad9c463f84e2c4114812a51e29a6532920b811 imgui-binding/src/main/java/imgui/flag/ImGuiTabItemFlags.java -1cf4f701034dc89eda227b4daf0c816bc207b294 imgui-binding/src/main/java/imgui/flag/ImGuiInputTextFlags.java +0e41a3b0075f366dc68fdfd9c8c6e03e8619e34b imgui-binding/src/main/java/imgui/flag/ImGuiInputTextFlags.java 1fb3c88bd67ccff92a819238458b4e40986f0451 imgui-binding/src/main/java/imgui/flag/ImGuiDragDropFlags.java ef785a6b3d150ce55f7e76862613d38ad1222f1c imgui-binding/src/main/java/imgui/flag/ImGuiMouseCursor.java 748a1b46ed7f2e122612230e3c6ddfff7fa6ad96 imgui-binding/src/main/java/imgui/flag/ImGuiStyleVar.java @@ -133,15 +133,17 @@ b569f7c5d3f18c6912271208dac92f8756606678 imgui-binding/src/main/java/imgui/ImFo da23c429ca5d187d897254dbfa8667a7bc42f03f imgui-binding/src/main/java/imgui/callback/ImPlatformFuncViewportFloat.java 5e85edbef6ed664a5c3d1c012fccc394a11a4db5 imgui-binding/src/main/java/imgui/callback/ImPlatformFuncViewportSuppImVec2.java 9313a23686de8e42891b20a20da1c0dfe08a2dec imgui-binding/src/main/java/imgui/callback/ImPlatformFuncViewport.java +0524d1252793d8ac62abd760f76169fc5daf8766 imgui-binding/src/main/java/imgui/callback/ImGuiInputTextCallback.java edf6350a062c899e4eea0b1e5cf40fc31b208265 imgui-binding/src/main/java/imgui/callback/ImStrConsumer.java 7ef829868f2466cce9bee83553ad16e69ea3bdfc imgui-binding/src/main/java/imgui/callback/ImPlatformFuncViewportSuppBoolean.java 1efce30b9442dd8e04bd7953e018ae744a0d6b23 imgui-binding/src/main/java/imgui/callback/ImPlatformFuncViewportImVec2.java ae803d26bd4c8c5a57460147014c96013e8a77a6 imgui-binding/src/main/java/imgui/callback/ImStrSupplier.java 3799e554b90b5537e06f34379ecd97102e84c9f0 imgui-binding/src/main/java/imgui/callback/ImListClipperCallback.java e8a97ce01e03a5e01c0824d5c9217bac30987b2e imgui-binding/src/main/java/imgui/ImDrawList.java +557a7d9f185646bef28a8e4bb19278ba56379ab6 imgui-binding/src/main/java/imgui/ImGuiInputTextCallbackData.java 8f13cd9a050fdd5cbbf46d0c535dc87e6f949293 imgui-binding/src/main/java/imgui/ImGuiListClipper.java 17fc9bcee006e1b029d0948e27003aff44d4e905 imgui-binding/src/main/java/imgui/ImGuiStyle.java -1f1bbf68e4f80871b3a0ffb772707dd1f5941210 imgui-binding/src/main/java/imgui/ImGui.java +4114b93419026f805e74078ef6a16abe6e719c88 imgui-binding/src/main/java/imgui/ImGui.java 47a690530a965c51ea580cd7b9760b55836ab4f3 imgui-binding/src/main/java/imgui/assertion/ImAssertCallback.java c936b4904bf3f636c3458c32497790b3b73b2efc imgui-binding/src/main/java/imgui/ImFontConfig.java 4c4192df50d3dc3a65d30ff44ca838ac138b5a97 imgui-binding/src/main/java/imgui/ImFontAtlas.java diff --git a/bin/freetype/imgui-java64.dll b/bin/freetype/imgui-java64.dll index 3776d2f3..19e1ae69 100644 Binary files a/bin/freetype/imgui-java64.dll and b/bin/freetype/imgui-java64.dll differ diff --git a/bin/freetype/libimgui-java64.dylib b/bin/freetype/libimgui-java64.dylib index a0bd0ab9..c20ab41f 100644 Binary files a/bin/freetype/libimgui-java64.dylib and b/bin/freetype/libimgui-java64.dylib differ diff --git a/bin/freetype/libimgui-java64.so b/bin/freetype/libimgui-java64.so index 5d3b28bc..3e9020c2 100644 Binary files a/bin/freetype/libimgui-java64.so and b/bin/freetype/libimgui-java64.so differ diff --git a/bin/imgui-java64.dll b/bin/imgui-java64.dll index c35d69d7..79da4eba 100644 Binary files a/bin/imgui-java64.dll and b/bin/imgui-java64.dll differ diff --git a/bin/libimgui-java64.dylib b/bin/libimgui-java64.dylib index 5299ab9c..acae63f1 100644 Binary files a/bin/libimgui-java64.dylib and b/bin/libimgui-java64.dylib differ diff --git a/bin/libimgui-java64.so b/bin/libimgui-java64.so index af33a0bc..7228c5fa 100644 Binary files a/bin/libimgui-java64.so and b/bin/libimgui-java64.so differ diff --git a/example/src/main/java/ExampleInputTextCallback.java b/example/src/main/java/ExampleInputTextCallback.java new file mode 100644 index 00000000..de6b23da --- /dev/null +++ b/example/src/main/java/ExampleInputTextCallback.java @@ -0,0 +1,44 @@ +import imgui.ImGui; +import imgui.ImGuiInputTextCallbackData; +import imgui.callback.ImGuiInputTextCallback; +import imgui.flag.ImGuiCond; +import imgui.flag.ImGuiInputTextFlags; +import imgui.type.ImBoolean; +import imgui.type.ImString; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class ExampleInputTextCallback { + private static final ImString STR = new ImString(); + private static final StringBuilder OUTPUT = new StringBuilder(); + private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); + + private static final ImGuiInputTextCallback CALLBACK = new ImGuiInputTextCallback() { + @Override + public void accept(final ImGuiInputTextCallbackData data) { + final char c = (char) data.getEventChar(); + if (c == 'h' || c == 'H') { + data.setEventChar('!'); + OUTPUT.append(DATE_FORMAT.format(LocalDateTime.now())).append(" :: Replaced!\n"); + } else if (c == 'w' || c == 'W') { + data.setEventChar(0); + OUTPUT.append(DATE_FORMAT.format(LocalDateTime.now())).append(" :: Discarded!\n"); + } else { + OUTPUT.append(DATE_FORMAT.format(LocalDateTime.now())).append(" :: Typed: ").append(c).append('\n'); + } + } + }; + + public static void show(final ImBoolean showInputTextCallback) { + ImGui.setNextWindowSize(400, 300, ImGuiCond.Once); + if (ImGui.begin("Input Text Callback Demo", showInputTextCallback)) { + ImGui.alignTextToFramePadding(); + ImGui.text("Try to input \"Hello World!\":"); + ImGui.sameLine(); + ImGui.inputText("##input", STR, ImGuiInputTextFlags.CallbackCharFilter, CALLBACK); + ImGui.text(OUTPUT.toString()); + } + ImGui.end(); + } +} diff --git a/example/src/main/java/Extra.java b/example/src/main/java/Extra.java index bc9ce4c7..6f1d5991 100644 --- a/example/src/main/java/Extra.java +++ b/example/src/main/java/Extra.java @@ -13,6 +13,7 @@ public class Extra { private static final ImBoolean SHOW_IMGUI_FILE_DIALOG_WINDOW = new ImBoolean(false); private static final ImBoolean SHOW_IMGUI_MEMORY_EDITOR_WINDOW = new ImBoolean(false); private static final ImBoolean SHOW_IMGUI_CANVAS_EDITOR_WINDOW = new ImBoolean(false); + private static final ImBoolean SHOW_IMGUI_INPUT_CALLBACK_WINDOW = new ImBoolean(false); private static final Graph GRAPH = new Graph(); @@ -28,6 +29,7 @@ public static void show(final Application app) { ImGui.checkbox("Show ImGuiFileDialog Demo Window", SHOW_IMGUI_FILE_DIALOG_WINDOW); ImGui.checkbox("Show ImGui MemoryEditor Demo Window", SHOW_IMGUI_MEMORY_EDITOR_WINDOW); ImGui.checkbox("Show ImGui Canvas Demo Window", SHOW_IMGUI_CANVAS_EDITOR_WINDOW); + ImGui.checkbox("Show Imgui InputText Callback Window", SHOW_IMGUI_INPUT_CALLBACK_WINDOW); if (SHOW_DEMO_WINDOW.get()) { ImGui.showDemoWindow(SHOW_DEMO_WINDOW); @@ -68,5 +70,9 @@ public static void show(final Application app) { if (SHOW_IMGUI_CANVAS_EDITOR_WINDOW.get()) { ExampleCanvasEditor.show(SHOW_IMGUI_CANVAS_EDITOR_WINDOW); } + + if (SHOW_IMGUI_INPUT_CALLBACK_WINDOW.get()) { + ExampleInputTextCallback.show(SHOW_IMGUI_INPUT_CALLBACK_WINDOW); + } } } diff --git a/imgui-binding/src/main/java/imgui/ImGui.java b/imgui-binding/src/main/java/imgui/ImGui.java index 05dacdaa..39947802 100644 --- a/imgui-binding/src/main/java/imgui/ImGui.java +++ b/imgui-binding/src/main/java/imgui/ImGui.java @@ -1,6 +1,7 @@ package imgui; import imgui.assertion.ImAssertCallback; +import imgui.callback.ImGuiInputTextCallback; import imgui.flag.ImGuiCond; import imgui.flag.ImGuiDragDropFlags; import imgui.flag.ImGuiInputTextFlags; @@ -2988,11 +2989,13 @@ public static boolean vSliderScalar(String label, float sizeX, float sizeY, int /*JNI jmethodID jImStringResizeInternalMID; + jmethodID jInputTextCallbackMID; jfieldID inputDataSizeID; jfieldID inputDataIsDirtyID; jfieldID inputDataIsResizedID; + struct InputTextCallbackUserData { JNIEnv* env; jobject* imString; @@ -3001,6 +3004,7 @@ public static boolean vSliderScalar(String label, float sizeX, float sizeY, int char* resizedBuf; jobject* textInputData; char* allowedChars; + jobject* handler; }; static int TextEditCallbackStub(ImGuiInputTextCallbackData* data) { @@ -3033,6 +3037,11 @@ static int TextEditCallbackStub(ImGuiInputTextCallbackData* data) { } } + if (userData->handler != NULL) { + JNIEnv* env = userData->env; + env->CallObjectMethod(*userData->handler, jInputTextCallbackMID, data); + } + return 0; } */ @@ -3045,41 +3054,68 @@ static int TextEditCallbackStub(ImGuiInputTextCallbackData* data) { jclass jImString = env->FindClass("imgui/type/ImString"); jImStringResizeInternalMID = env->GetMethodID(jImString, "resizeInternal", "(I)[B"); + + jclass jCallback = env->FindClass("imgui/callback/ImGuiInputTextCallback"); + jInputTextCallbackMID = env->GetMethodID(jCallback, "accept", "(J)V"); */ public static boolean inputText(String label, ImString text) { - return preInputText(false, label, null, text, 0, 0, ImGuiInputTextFlags.None); + return preInputText(false, label, null, text); } public static boolean inputText(String label, ImString text, int imGuiInputTextFlags) { return preInputText(false, label, null, text, 0, 0, imGuiInputTextFlags); } + public static boolean inputText(String label, ImString text, int imGuiInputTextFlags, ImGuiInputTextCallback callback) { + return preInputText(false, label, null, text, 0, 0, imGuiInputTextFlags, callback); + } + public static boolean inputTextMultiline(String label, ImString text) { - return preInputText(true, label, null, text, 0, 0, ImGuiInputTextFlags.None); + return preInputText(true, label, null, text); } public static boolean inputTextMultiline(String label, ImString text, float width, float height) { - return preInputText(true, label, null, text, width, height, ImGuiInputTextFlags.None); + return preInputText(true, label, null, text, width, height); } public static boolean inputTextMultiline(String label, ImString text, int imGuiInputTextFlags) { return preInputText(true, label, null, text, 0, 0, imGuiInputTextFlags); } + public static boolean inputTextMultiline(String label, ImString text, int imGuiInputTextFlags, ImGuiInputTextCallback callback) { + return preInputText(true, label, null, text, 0, 0, imGuiInputTextFlags, callback); + } + public static boolean inputTextMultiline(String label, ImString text, float width, float height, int imGuiInputTextFlags) { return preInputText(true, label, null, text, width, height, imGuiInputTextFlags); } + public static boolean inputTextMultiline(String label, ImString text, float width, float height, int imGuiInputTextFlags, ImGuiInputTextCallback callback) { + return preInputText(true, label, null, text, width, height, imGuiInputTextFlags, callback); + } + public static boolean inputTextWithHint(String label, String hint, ImString text) { - return preInputText(false, label, hint, text, 0, 0, ImGuiInputTextFlags.None); + return preInputText(false, label, hint, text); } public static boolean inputTextWithHint(String label, String hint, ImString text, int imGuiInputTextFlags) { return preInputText(false, label, hint, text, 0, 0, imGuiInputTextFlags); } + private static boolean preInputText(boolean multiline, String label, String hint, ImString text) { + return preInputText(multiline, label, hint, text, 0, 0); + } + + private static boolean preInputText(boolean multiline, String label, String hint, ImString text, float width, float height) { + return preInputText(multiline, label, hint, text, width, height, ImGuiInputTextFlags.None); + } + private static boolean preInputText(boolean multiline, String label, String hint, ImString text, float width, float height, int flags) { + return preInputText(multiline, label, hint, text, width, height, flags, null); + } + + private static boolean preInputText(boolean multiline, String label, String hint, ImString text, float width, float height, int flags, ImGuiInputTextCallback callback) { final ImString.InputData inputData = text.inputData; if (inputData.isResizable) { @@ -3095,10 +3131,10 @@ private static boolean preInputText(boolean multiline, String label, String hint hintLabel = ""; } - return nInputText(multiline, hint != null, label, hintLabel, text, text.getData(), text.getData().length, width, height, flags, inputData, inputData.allowedChars); + return nInputText(multiline, hint != null, label, hintLabel, text, text.getData(), text.getData().length, width, height, flags, inputData, inputData.allowedChars, callback); } - private static native boolean nInputText(boolean multiline, boolean hint, String label, String hintLabel, ImString imString, byte[] buf, int maxSize, float width, float height, int flags, ImString.InputData textInputData, String allowedChars); /* + private static native boolean nInputText(boolean multiline, boolean hint, String label, String hintLabel, ImString imString, byte[] buf, int maxSize, float width, float height, int flags, ImString.InputData textInputData, String allowedChars, ImGuiInputTextCallback callback); /* InputTextCallbackUserData userData; userData.imString = &imString; userData.maxSize = maxSize; @@ -3107,6 +3143,7 @@ private static boolean preInputText(boolean multiline, String label, String hint userData.textInputData = &textInputData; userData.env = env; userData.allowedChars = allowedChars; + userData.handler = &callback; bool valueChanged; diff --git a/imgui-binding/src/main/java/imgui/ImGuiInputTextCallbackData.java b/imgui-binding/src/main/java/imgui/ImGuiInputTextCallbackData.java new file mode 100644 index 00000000..c5943eb4 --- /dev/null +++ b/imgui-binding/src/main/java/imgui/ImGuiInputTextCallbackData.java @@ -0,0 +1,182 @@ +package imgui; + +import imgui.binding.ImGuiStruct; + +/** + * Shared state of InputText(), passed as an argument to your callback when a ImGuiInputTextFlags_Callback* flag is used.

+ * The callback function should return 0 by default.

+ * Callbacks (follow a flag name and see comments in ImGuiInputTextFlags_ declarations for more details)

+ * - ImGuiInputTextFlags_CallbackEdit: Callback on buffer edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active)

+ * - ImGuiInputTextFlags_CallbackAlways: Callback on each iteration

+ * - ImGuiInputTextFlags_CallbackCompletion: Callback on pressing TAB

+ * - ImGuiInputTextFlags_CallbackHistory: Callback on pressing Up/Down arrows

+ * - ImGuiInputTextFlags_CallbackCharFilter: Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard.

+ * - ImGuiInputTextFlags_CallbackResize: Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow.

+ */ +public class ImGuiInputTextCallbackData extends ImGuiStruct { + public ImGuiInputTextCallbackData(final long ptr) { + super(ptr); + } + + /*JNI + #include "_common.h" + + #define IMGUI_CALLBACK_DATA ((ImGuiInputTextCallbackData*)STRUCT_PTR) + */ + + /** + * One ImGuiInputTextFlags_Callback* + * + * @return ImGuiInputTextFlags + */ + public native int getEventFlag(); /* + return IMGUI_CALLBACK_DATA->EventFlag; + */ + + /** + * What user passed to InputText() + * + * @return ImGuiInputTextFlags + */ + public native int getFlags(); /* + return IMGUI_CALLBACK_DATA->Flags; + */ + + /** + * [CharFilter] Character input; + * + * @return Character input + */ + public native int getEventChar(); /* + return IMGUI_CALLBACK_DATA->EventChar; + */ + + /** + * [CharFilter] Replace character with another one, or set to zero to drop. return 1 is equivalent to setting EventChar=0; + * + * @param c Replaced characters + */ + public void setEventChar(final char c) { + setEventChar((int) c); + } + + /** + * [CharFilter] Replace character with another one, or set to zero to drop. return 1 is equivalent to setting EventChar=0; + * + * @param c Replaced characters + */ + public native void setEventChar(int c); /* + IMGUI_CALLBACK_DATA->EventChar = c; + */ + + /** + * [Completion,History] + * + * @return Key pressed (Up/Down/TAB) + */ + public native int getEventKey(); /* + return IMGUI_CALLBACK_DATA->EventKey; + */ + + /** + * [Resize] Can replace pointer

+ * [Completion,History,Always] Only write to pointed data, don't replace the actual pointer! + * + * @return Buf + */ + public native String getBuf(); /* + return env->NewStringUTF(IMGUI_CALLBACK_DATA->Buf); + */ + + /** + * Set if you modify Buf/BufTextLen! + * + * @return Dirty + */ + public native boolean getBufDirty(); /* + return IMGUI_CALLBACK_DATA->BufDirty; + */ + + /** + * Set if you modify Buf/BufTextLen! + * + * @param dirty Dirty + */ + public native void setBufDirty(boolean dirty); /* + IMGUI_CALLBACK_DATA->BufDirty = dirty; + */ + + /** + * Current cursor position + * + * @return Current cursor position + */ + public native int getCursorPos(); /* + return IMGUI_CALLBACK_DATA->CursorPos; + */ + + /** + * Set the current cursor position + * + * @param pos Set the current cursor position + */ + public native void setCursorPos(int pos); /* + IMGUI_CALLBACK_DATA->CursorPos = pos; + */ + + /** + * Selection Start + * + * @return Selection Start + */ + public native int getSelectionStart(); /* + return IMGUI_CALLBACK_DATA->SelectionStart; + */ + + /** + * Set Selection Start + * + * @param pos Selection Start + */ + public native void setSelectionStart(int pos); /* + IMGUI_CALLBACK_DATA->SelectionStart = pos; + */ + + /** + * Selection End + * + * @return Selection End + */ + public native int getSelectionEnd(); /* + return IMGUI_CALLBACK_DATA->SelectionEnd; + */ + + /** + * Set Selection End + * + * @param pos Selection End + */ + public native void setSelectionEnd(int pos); /* + IMGUI_CALLBACK_DATA->SelectionEnd = pos; + */ + + /** + * Delete Chars + * + * @param pos Start Delete Pos + * @param bytesCount Delete Char Count + */ + public native void deleteChars(int pos, int bytesCount); /* + IMGUI_CALLBACK_DATA->DeleteChars(pos, bytesCount); + */ + + /** + * Insert Chars + * + * @param pos insert Psos + * @param str insert String + */ + public native void insertChars(int pos, String str); /* + IMGUI_CALLBACK_DATA->InsertChars(pos, str); + */ +} diff --git a/imgui-binding/src/main/java/imgui/callback/ImGuiInputTextCallback.java b/imgui-binding/src/main/java/imgui/callback/ImGuiInputTextCallback.java new file mode 100644 index 00000000..7cbc0475 --- /dev/null +++ b/imgui-binding/src/main/java/imgui/callback/ImGuiInputTextCallback.java @@ -0,0 +1,17 @@ +package imgui.callback; + +import imgui.ImGuiInputTextCallbackData; + +import java.util.function.Consumer; + +/** + * Callback to use in {@link imgui.ImGui#inputText(String, imgui.type.ImString, int, ImGuiInputTextCallback)}. + */ +public abstract class ImGuiInputTextCallback implements Consumer { + /** + * This function will be called by the native Callback and wrapped. + */ + public final void accept(final long ptr) { + accept(new ImGuiInputTextCallbackData(ptr)); + } +} diff --git a/imgui-binding/src/main/java/imgui/flag/ImGuiInputTextFlags.java b/imgui-binding/src/main/java/imgui/flag/ImGuiInputTextFlags.java index 79d1b694..1f16cbe6 100644 --- a/imgui-binding/src/main/java/imgui/flag/ImGuiInputTextFlags.java +++ b/imgui-binding/src/main/java/imgui/flag/ImGuiInputTextFlags.java @@ -86,4 +86,8 @@ private ImGuiInputTextFlags() { * You will be provided a new BufSize in the callback and NEED to honor it. (see misc/cpp/imgui_stdlib.h for an example of using this) */ public static final int CallbackResize = 1 << 18; + /** + * Callback on any edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active). + */ + public static final int CallbackEdit = 1 << 19; }