Skip to content

Commit

Permalink
[API] Implement ImGuiFileDialog extension (#89)
Browse files Browse the repository at this point in the history
* Initial setup for ImGuiFileDialog extension

* Need to resolve linker errors. Working on PaneFun callback.

* Remove jni callback code that is not compiling to expose linker error.

* Callbacks for paneFun not yet implemented. Linker error still present, seems that some header is being included multiple times.

* Fixed linker errors. Added example for demo.

* Add support for multiple callbacks

* Callbacks work
  • Loading branch information
tlf30 committed Nov 16, 2021
1 parent ec68f20 commit 0bbbc2e
Show file tree
Hide file tree
Showing 11 changed files with 444 additions and 1 deletion.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,6 @@
[submodule "include/ImGuiColorTextEdit"]
path = include/ImGuiColorTextEdit
url = https://github.com/BalazsJako/ImGuiColorTextEdit
[submodule "include/ImGuiFileDialog"]
path = include/ImGuiFileDialog
url = https://github.com/aiekick/ImGuiFileDialog
11 changes: 10 additions & 1 deletion buildSrc/src/main/groovy/tool/generator/GenerateLibs.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,22 @@ class GenerateLibs extends DefaultTask {
// Copy ImGui h/cpp files
project.copy { CopySpec spec ->
['include/imgui', 'include/imnodes', 'include/imgui-node-editor',
'include/imguizmo', 'include/implot', 'include/ImGuiColorTextEdit'].each {
'include/imguizmo', 'include/implot', 'include/ImGuiColorTextEdit',
'include/ImGuiFileDialog'].each {
spec.from(project.rootProject.file(it)) { CopySpec s -> s.include('*.h', '*.cpp', '*.inl') }
}
spec.from(project.rootProject.file('imgui-binding/src/main/native'))
spec.into(jniDir)
}

//Copy dirent for ImGuiFileDialog
project.copy { CopySpec spec ->
['include/ImGuiFileDialog/dirent'].each {
spec.from(project.rootProject.file(it)) { CopySpec s -> s.include('*.h', '*.cpp', '*.inl') }
}
spec.into(jniDir + '/dirent')
}

if (withFreeType) {
project.copy { CopySpec spec ->
spec.from(project.rootProject.file('include/imgui/misc/freetype')) { CopySpec it -> it.include('*.h', '*.cpp') }
Expand Down
61 changes: 61 additions & 0 deletions example/src/main/java/ExampleImGuiFileDialog.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import imgui.extension.imguifiledialog.ImGuiFileDialog;
import imgui.extension.imguifiledialog.callback.ImGuiFileDialogPaneFun;
import imgui.extension.imguifiledialog.flag.ImGuiFileDialogFlags;
import imgui.flag.ImGuiCond;
import imgui.internal.ImGui;
import imgui.type.ImBoolean;

import java.awt.*;
import java.net.URI;
import java.util.Map;

public class ExampleImGuiFileDialog {
private static final String URL = "https://github.com/aiekick/ImGuiFileDialog";

private static Map<String, String> selection = null;
private static long userData = 0;
private static ImGuiFileDialogPaneFun callback = new ImGuiFileDialogPaneFun() {
@Override
public void paneFun(String filter, long userDatas, boolean canContinue) {
ImGui.text("Filter: " + filter);
}
};

public static void show(ImBoolean showImGuiFileDialogDemo) {
ImGui.setNextWindowSize(800, 200, ImGuiCond.Once);
ImGui.setNextWindowPos(ImGui.getMainViewport().getPosX() + 100, ImGui.getMainViewport().getPosY() + 100, ImGuiCond.Once);
if (ImGui.begin("ImGuiFileDialogDemo Demo", showImGuiFileDialogDemo)) {
ImGui.text("This a demo for ImGuiFileDialog");

ImGui.alignTextToFramePadding();
ImGui.text("Repo:");
ImGui.sameLine();
if (ImGui.button(URL)) {
try {
Desktop.getDesktop().browse(new URI(URL));
} catch (Exception e) {
e.printStackTrace();
}
}

if (ImGui.button("Browse File")) {
ImGuiFileDialog.openModal("browse-key", "Choose File", ".java", ".", callback, 250, 1, 42, ImGuiFileDialogFlags.None);
}

if (ImGuiFileDialog.display("browse-key", ImGuiFileDialogFlags.None, 200, 400, 800, 600)) {
if (ImGuiFileDialog.isOk()) {
selection = ImGuiFileDialog.getSelection();
userData = ImGuiFileDialog.getUserDatas();
}
ImGuiFileDialog.close();
}
}

if (selection != null && !selection.isEmpty()) {
ImGui.text("Selected: " + selection.values().stream().findFirst().get());
ImGui.text("User Data: " + userData);
}

ImGui.end();
}
}
6 changes: 6 additions & 0 deletions example/src/main/java/Extra.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public class Extra {
private static final ImBoolean SHOW_IMPLOT_DEMO_WINDOW = new ImBoolean(false);
private static final ImBoolean SHOW_IMGUIZMO_DEMO = new ImBoolean(false);
private static final ImBoolean SHOW_IMGUI_COLOR_TEXT_EDIT_WINDOW = new ImBoolean(false);
private static final ImBoolean SHOW_IMGUI_FILE_DIALOG_WINDOW = new ImBoolean(false);

private static final Graph GRAPH = new Graph();

Expand All @@ -22,6 +23,7 @@ public static void show(final Application app) {
ImGui.checkbox("Show ImPlot Demo Window", SHOW_IMPLOT_DEMO_WINDOW);
ImGui.checkbox("Show ImGuizmo Demo Window", SHOW_IMGUIZMO_DEMO);
ImGui.checkbox("Show ImGuiColorTextEdit Demo Window", SHOW_IMGUI_COLOR_TEXT_EDIT_WINDOW);
ImGui.checkbox("Show ImGuiFileDialog Demo Window", SHOW_IMGUI_FILE_DIALOG_WINDOW);

if (SHOW_DEMO_WINDOW.get()) {
ImGui.showDemoWindow(SHOW_DEMO_WINDOW);
Expand Down Expand Up @@ -50,5 +52,9 @@ public static void show(final Application app) {
if (SHOW_IMGUI_COLOR_TEXT_EDIT_WINDOW.get()) {
ExampleImGuiColorTextEdit.show(SHOW_IMGUI_COLOR_TEXT_EDIT_WINDOW);
}

if (SHOW_IMGUI_FILE_DIALOG_WINDOW.get()) {
ExampleImGuiFileDialog.show(SHOW_IMGUI_FILE_DIALOG_WINDOW);
}
}
}
Loading

0 comments on commit 0bbbc2e

Please sign in to comment.