|
@@ -2,9 +2,11 @@
|
|
|
// (Info: Allegro 5 is a cross-platform general purpose library for handling windows, inputs, graphics, etc.)
|
|
|
|
|
|
// Implemented features:
|
|
|
-// [X] User texture binding. Use 'ALLEGRO_BITMAP*' as ImTextureID. Read the FAQ about ImTextureID in imgui.cpp.
|
|
|
-// Missing features:
|
|
|
-// [ ] Clipboard support via al_set_clipboard_text/al_clipboard_has_text.
|
|
|
+// [X] Renderer: User texture binding. Use 'ALLEGRO_BITMAP*' as ImTextureID. Read the FAQ about ImTextureID in imgui.cpp.
|
|
|
+// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
|
|
|
+// Issues:
|
|
|
+// [ ] Renderer: The renderer is suboptimal as we need to convert vertices.
|
|
|
+// [ ] Platform: Clipboard support via al_set_clipboard_text/al_clipboard_has_text.
|
|
|
|
|
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
|
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
|
@@ -13,6 +15,7 @@
|
|
|
|
|
|
// CHANGELOG
|
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
|
+// 2018-06-11: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors flag + honor ImGuiConfigFlags_NoMouseCursorChange flag.
|
|
|
// 2018-04-18: Misc: Renamed file from imgui_impl_a5.cpp to imgui_impl_allegro5.cpp.
|
|
|
// 2018-04-18: Misc: Added support for 32-bits vertex indices to avoid conversion at runtime. Added imconfig_allegro5.h to enforce 32-bit indices when included from imgui.h.
|
|
|
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplAllegro5_RenderDrawData() in the .h file so you can call it yourself.
|
|
@@ -175,6 +178,10 @@ bool ImGui_ImplAllegro5_Init(ALLEGRO_DISPLAY* display)
|
|
|
{
|
|
|
g_Display = display;
|
|
|
|
|
|
+ // Setup back-end capabilities flags
|
|
|
+ ImGuiIO& io = ImGui::GetIO();
|
|
|
+ io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)
|
|
|
+
|
|
|
// Create custom vertex declaration.
|
|
|
// Unfortunately Allegro doesn't support 32-bits packed colors so we have to convert them to 4 floats.
|
|
|
// We still use a custom declaration to use 'ALLEGRO_PRIM_TEX_COORD' instead of 'ALLEGRO_PRIM_TEX_COORD_PIXEL' else we can't do a reliable conversion.
|
|
@@ -187,7 +194,6 @@ bool ImGui_ImplAllegro5_Init(ALLEGRO_DISPLAY* display)
|
|
|
};
|
|
|
g_VertexDecl = al_create_vertex_decl(elems, sizeof(ImDrawVertAllegro));
|
|
|
|
|
|
- ImGuiIO& io = ImGui::GetIO();
|
|
|
io.KeyMap[ImGuiKey_Tab] = ALLEGRO_KEY_TAB;
|
|
|
io.KeyMap[ImGuiKey_LeftArrow] = ALLEGRO_KEY_LEFT;
|
|
|
io.KeyMap[ImGuiKey_RightArrow] = ALLEGRO_KEY_RIGHT;
|
|
@@ -224,7 +230,7 @@ void ImGui_ImplAllegro5_Shutdown()
|
|
|
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
|
|
bool ImGui_ImplAllegro5_ProcessEvent(ALLEGRO_EVENT *ev)
|
|
|
{
|
|
|
- ImGuiIO &io = ImGui::GetIO();
|
|
|
+ ImGuiIO& io = ImGui::GetIO();
|
|
|
|
|
|
switch (ev->type)
|
|
|
{
|
|
@@ -246,6 +252,34 @@ bool ImGui_ImplAllegro5_ProcessEvent(ALLEGRO_EVENT *ev)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+static void ImGui_ImplAllegro5_UpdateMouseCursor()
|
|
|
+{
|
|
|
+ ImGuiIO& io = ImGui::GetIO();
|
|
|
+ if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange)
|
|
|
+ return;
|
|
|
+
|
|
|
+ ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor();
|
|
|
+ if (io.MouseDrawCursor || imgui_cursor == ImGuiMouseCursor_None)
|
|
|
+ {
|
|
|
+ // Hide OS mouse cursor if imgui is drawing it or if it wants no cursor
|
|
|
+ al_set_mouse_cursor(g_Display, g_MouseCursorInvisible);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ALLEGRO_SYSTEM_MOUSE_CURSOR cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_DEFAULT;
|
|
|
+ switch (imgui_cursor)
|
|
|
+ {
|
|
|
+ case ImGuiMouseCursor_TextInput: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_EDIT; break;
|
|
|
+ case ImGuiMouseCursor_ResizeAll: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_MOVE; break;
|
|
|
+ case ImGuiMouseCursor_ResizeNS: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_N; break;
|
|
|
+ case ImGuiMouseCursor_ResizeEW: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_E; break;
|
|
|
+ case ImGuiMouseCursor_ResizeNESW: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NE; break;
|
|
|
+ case ImGuiMouseCursor_ResizeNWSE: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NW; break;
|
|
|
+ }
|
|
|
+ al_set_system_mouse_cursor(g_Display, cursor_id);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void ImGui_ImplAllegro5_NewFrame()
|
|
|
{
|
|
|
if (!g_Texture)
|
|
@@ -288,23 +322,5 @@ void ImGui_ImplAllegro5_NewFrame()
|
|
|
io.MouseDown[1] = mouse.buttons & (1 << 1);
|
|
|
io.MouseDown[2] = mouse.buttons & (1 << 2);
|
|
|
|
|
|
- // Hide OS mouse cursor if ImGui is drawing it
|
|
|
- if (io.MouseDrawCursor)
|
|
|
- {
|
|
|
- al_set_mouse_cursor(g_Display, g_MouseCursorInvisible);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ALLEGRO_SYSTEM_MOUSE_CURSOR cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_DEFAULT;
|
|
|
- switch (ImGui::GetMouseCursor())
|
|
|
- {
|
|
|
- case ImGuiMouseCursor_TextInput: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_EDIT; break;
|
|
|
- case ImGuiMouseCursor_ResizeAll: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_MOVE; break;
|
|
|
- case ImGuiMouseCursor_ResizeNS: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_N; break;
|
|
|
- case ImGuiMouseCursor_ResizeEW: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_E; break;
|
|
|
- case ImGuiMouseCursor_ResizeNESW: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NE; break;
|
|
|
- case ImGuiMouseCursor_ResizeNWSE: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NW; break;
|
|
|
- }
|
|
|
- al_set_system_mouse_cursor(g_Display, cursor_id);
|
|
|
- }
|
|
|
+ ImGui_ImplAllegro5_UpdateMouseCursor();
|
|
|
}
|