cabal-version: 3.0

name: dear-imgui
version: 2.3.0
author: Oliver Charles
maintainer: ollie@ocharles.org.uk, aenor.realm@gmail.com
license: BSD-3-Clause

category: Graphics
synopsis: Haskell bindings for Dear ImGui.
description:
  The package supports multiple rendering backends.
  Set package flags according to your needs.

build-type: Simple
extra-source-files:
  README.md,
  ChangeLog.md

extra-source-files:
  imgui/*.h,
  imgui/backends/*.h,
  imgui/backends/*.mm,
  imgui/imconfig.h,
  imgui/LICENSE.txt

common exe-flags
  if flag(debug)
    if os(linux)
      ghc-options: -Wall -g -rtsopts -dcore-lint -debug
      cc-options: -g -O0 -fsanitize=address -fno-omit-frame-pointer
      cxx-options: -g -O0 -fsanitize=address -fno-omit-frame-pointer -std=c++11
    if os(darwin)
      ghc-options: -Wall -g -rtsopts -dcore-lint -debug
      cc-options: -g -O0 -fsanitize=address -fno-omit-frame-pointer
      cxx-options: -g -O0 -fsanitize=address -fno-omit-frame-pointer -std=c++11
    if os(windows)
      ghc-options: -Wall -g -rtsopts -dcore-lint -debug
      cc-options: -g -O0
      cxx-options: -g -O0 -std=c++11
  else
    if os(linux)
      ghc-options: -Wall -O2
      cc-options: -O2
      cxx-options: -std=c++11 -O2
    if os(darwin)
      ghc-options: -Wall -O2
      cc-options: -O2
    if os(windows)
      ghc-options: -Wall -O2
      cc-options: -O2

source-repository head
  type: git
  location: https://github.com/haskell-game/dear-imgui.hs

flag debug
  description:
    Enable debug mode.
  default:
    False
  manual:
    True

flag opengl2
  description:
    Enable OpenGL 2 backend.
  default:
    False
  manual:
    True

flag opengl3
  description:
    Enable OpenGL 3 backend.
  default:
    True
  manual:
    True

flag vulkan
  description:
    Enable Vulkan backend.
  default:
    False
  manual:
    True

flag sdl
  description:
    Enable SDL backend.
  default:
    True
  manual:
    True

flag sdl-renderer
  description:
    Enable SDL Renderer backend (requires the SDL_RenderGeometry function available in SDL 2.0.18+).
    The sdl configuration flag must also be enabled when using this flag.
  default:
    False
  manual:
    True

flag glfw
  description:
    Enable GLFW backend.
  default:
    False
  manual:
    True

flag examples
  description:
    Build executable examples.
  default:
    False
  manual:
    True

flag disable-obsolete
  description:
    Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names.
  default:
    False
  manual:
    True

flag use-wchar32
  description:
    Use 32-bit for ImWchar (default is 16-bit) to support unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...)
  default:
    True
  manual:
    True

flag use-ImDrawIdx32
  description:
    Use 32-bit vertex indices (default is 16-bit) is one way to allow large meshes with more than 64K vertices.
    Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices).
    Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer.
    Read about ImGuiBackendFlags_RendererHasVtxOffset for details.
  default:
    True
  manual:
    True

common common
  build-depends:
      base
        >= 4.12 && < 4.20
  default-language:
      Haskell2010

library
  import: common
  hs-source-dirs:
    src
  exposed-modules:
    DearImGui
    DearImGui.FontAtlas
    DearImGui.Internal.Text
    DearImGui.Raw
    DearImGui.Raw.DragDrop
    DearImGui.Raw.DrawList
    DearImGui.Raw.Font
    DearImGui.Raw.Font.Config
    DearImGui.Raw.Font.GlyphRanges
    DearImGui.Raw.IO
    DearImGui.Raw.ListClipper
    DearImGui.Raw.Context
  other-modules:
    DearImGui.Enums
    DearImGui.Structs
  cxx-options: -std=c++11
  cxx-sources:
    imgui/imgui.cpp
    imgui/imgui_demo.cpp
    imgui/imgui_draw.cpp
    imgui/imgui_tables.cpp
    imgui/imgui_widgets.cpp
  if impl(ghc >= 9.4)
    build-depends: system-cxx-std-lib
  else
    extra-libraries: stdc++
  include-dirs:
    imgui
  build-depends:
      dear-imgui-generator
    , containers
    , managed
    , inline-c
    , inline-c-cpp
    , StateVar
    , unliftio
    , vector
    , text

  if os(darwin)
    ghc-options:
      -optcxx-std=c++11

  if flag(disable-obsolete)
    cxx-options: -DIMGUI_DISABLE_OBSOLETE_FUNCTIONS

  if flag(use-wchar32)
    cxx-options: -DIMGUI_USE_WCHAR32
    cpp-options: -DIMGUI_USE_WCHAR32

  if flag(use-ImDrawIdx32)
    cxx-options: "-DImDrawIdx=unsigned int"
    cpp-options: "-DImDrawIdx=unsigned int"

  if flag(opengl2)
    exposed-modules:
      DearImGui.OpenGL2
    cxx-sources:
      imgui/backends/imgui_impl_opengl2.cpp
    build-depends:
      gl

  if flag(opengl3)
    exposed-modules:
      DearImGui.OpenGL3
    cxx-sources:
      imgui/backends/imgui_impl_opengl3.cpp
    pkgconfig-depends:
      glew

  if flag(vulkan)
    exposed-modules:
      DearImGui.Vulkan
    other-modules:
      DearImGui.Vulkan.Types
    build-depends:
        vulkan >= 3.20
      , unliftio
    cxx-sources:
      imgui/backends/imgui_impl_vulkan.cpp
    if os(windows)
      extra-libraries:
        vulkan-1
    else
      if os(darwin)
        extra-libraries:
          vulkan
      else
        pkgconfig-depends:
          vulkan

  if flag(sdl)
    exposed-modules:
      DearImGui.SDL
    build-depends:
      sdl2 >= 2
    cxx-sources:
      imgui/backends/imgui_impl_sdl2.cpp

    if os(windows) || os(darwin)
      extra-libraries:
        SDL2
    else
      pkgconfig-depends:
        sdl2

    if flag(opengl2) || flag(opengl3)
      exposed-modules:
        DearImGui.SDL.OpenGL

    if flag(vulkan)
      exposed-modules:
        DearImGui.SDL.Vulkan

    if flag(sdl-renderer)
      exposed-modules:
        DearImGui.SDL.Renderer
      cxx-sources:
        imgui/backends/imgui_impl_sdlrenderer2.cpp

  if flag(glfw)
    exposed-modules:
      DearImGui.GLFW
    build-depends:
      GLFW-b,
      bindings-GLFW
    cxx-sources:
      imgui/backends/imgui_impl_glfw.cpp

    if os(linux) || os(darwin)
      pkgconfig-depends:
        glfw3

    if flag(opengl2) || flag(opengl3)
      exposed-modules:
        DearImGui.GLFW.OpenGL

    if flag(vulkan)
      exposed-modules:
        DearImGui.GLFW.Vulkan

library dear-imgui-generator
  import: common
  hs-source-dirs: generator
  exposed-modules:
      DearImGui.Generator
    , DearImGui.Generator.Parser
    , DearImGui.Generator.Tokeniser
    , DearImGui.Generator.Types
  build-depends:
      template-haskell
        >= 2.15 && < 2.22
    , containers
        >= 0.6.2.1 && < 0.8
    , directory
        >= 1.3 && < 1.4
    , filepath
        >= 1.4 && < 1.6
    , inline-c
        >= 0.9.0.0 && < 0.10
    , megaparsec
        >= 9.0 && < 9.7
    , parser-combinators
        >= 1.2.0 && < 1.4
    , scientific
        >= 0.3.6.2 && < 0.3.8
    , text
        >= 1.2.4 && < 2.2
    , th-lift
        >= 0.7 && < 0.9
    , transformers
        >= 0.5.6 && < 0.7
    , unordered-containers
        >= 0.2.11 && < 0.3

executable test
  import: common, exe-flags
  main-is: Main.hs
  default-language: Haskell2010
  if (!flag(examples) || !flag(sdl) || !flag(opengl2))
    buildable: False
  else
    build-depends: base, sdl2, gl, dear-imgui, vector

executable glfw
  import: common, exe-flags
  main-is: Main.hs
  hs-source-dirs: examples/glfw
  default-language: Haskell2010
  if (!flag(examples) || !flag(glfw) || !flag(opengl2))
    buildable: False
  else
    build-depends: base, GLFW-b, gl, dear-imgui, managed, text

executable readme
  import: common, exe-flags
  main-is: Readme.hs
  hs-source-dirs: examples
  build-depends: sdl2, gl, dear-imgui, managed
  if (!flag(examples) || !flag(sdl) || !flag(opengl2))
    buildable: False

executable fonts
  import: common, exe-flags
  main-is: Main.hs
  hs-source-dirs: examples/fonts
  build-depends: sdl2, gl, dear-imgui, managed
  if (!flag(examples) || !flag(sdl) || !flag(opengl2))
    buildable: False

executable image
  import: common, exe-flags
  main-is: Image.hs
  hs-source-dirs: examples/sdl
  build-depends: sdl2, gl, dear-imgui, managed, vector
  if (!flag(examples) || !flag(sdl) || !flag(opengl3))
    buildable: False

executable sdlrenderer
  import: common, exe-flags
  main-is: Renderer.hs
  hs-source-dirs: examples/sdl
  build-depends: sdl2, dear-imgui, managed, text
  if (!flag(examples) || !flag(sdl) || !flag(sdl-renderer))
    buildable: False

executable vulkan
  import: common, exe-flags
  main-is: Main.hs
  other-modules: Attachments, Backend, Input, Util
  hs-source-dirs: examples/vulkan
  default-language: Haskell2010
  if (!flag(examples) || !flag(sdl) || !flag(vulkan))
    buildable: False
  else
    build-depends:
        dear-imgui
      , bytestring
          >= 0.10.10.0 && < 0.13
      , containers
          >= 0.6.2.1 && < 0.7
      , logging-effect
          >= 1.3.12 && < 1.5
      , resourcet
          >= 1.2.4.2 && < 1.3
      , sdl2
          >= 2.5.3.0 && < 2.6
      , text
          >= 1.2.4 && < 2.2
      , transformers
          >= 0.5.6 && < 0.7
      , unliftio
          >= 0.2.13 && < 0.3
      , unliftio-core
          >= 0.2.0.1 && < 0.3
      , vector
         >= 0.12.1.2 && < 0.14
      , vulkan
         >= 3.20
      , vulkan-utils
         >= 0.5
      , VulkanMemoryAllocator
         >= 0.7.1
      , JuicyPixels