27 Commits

Author SHA1 Message Date
ddaf41bf88 Upgrade imgui to v1.89.7 2023-07-17 19:13:23 +03:00
8368192370 Allow base-4.19 for ghc-9.6 (#177)
Co-authored-by: Alexander Bondarenko <486682+dpwiz@users.noreply.github.com>
2023-07-02 21:54:03 +00:00
ea3ad959f9 Add getCursorPos (#176) 2023-07-03 00:48:44 +03:00
0cc654f190 Update bound for ghc-9.6 (#174)
* Update bound for ghc-9.6

* Update ci action versions
2023-05-07 17:44:13 +03:00
8697aa3a0a Expose DearImGui.Raw.Context (#172) 2023-01-15 15:27:15 +02:00
802bdb72fe Fix cabal flag for image example (#170) 2022-12-24 12:21:51 +02:00
69a463d98b Fix vulkan versions to a fresh set (#168)
vulkan, vulkan-utils and VMA can be too old/new for each other.
This cuts a fresh, known-to-work set of lower bounds.
2022-12-12 18:33:48 +00:00
9bb66f0113 Fix the text fix and prepare 2.1.3 (#167) 2022-12-12 19:57:54 +02:00
68e30d98ad Fix off-by-one bug in string null termination (#166)
Backport withCString fix and use text version when available
2022-12-12 18:20:39 +03:00
52142bbf7e Add formatPtr to Raw.dragFloat* and Raw.sliderFloat* (#165) 2022-12-05 17:47:21 +03:00
d933248a2c This change fixes the high level API to use the right Raw call (#164) 2022-12-02 17:50:04 +02:00
258777f8c7 Fix sdl flag in cabal.project (#163) 2022-11-30 17:08:06 +00:00
cd99938f97 Prepare v2.1.2 (#162) 2022-11-30 16:32:44 +00:00
48486ee8c2 Add setNextItemOpen (#161)
This change enables starting a new TreeNode open.
2022-11-28 15:56:27 +03:00
a2feb73fa5 Fix the glfw example build condition (#159)
The example needs the opengl2 flag.
2022-11-22 21:13:18 +02:00
051a17a1c5 Add plotLines (#158) 2022-11-20 17:57:15 +02:00
9dac0f9fbe Prepare 2.1.1 (#157) 2022-08-30 21:13:04 +00:00
dab5937eee Fix compilation on MacOS / GHC 8.10.7 (#156)
Fixes errors along the lines of:
dear-imgui  > [ 2 of 17] Compiling DearImGui.GLFW
dear-imgui  > error: unknown type name 'constexpr'

So the "-std=c++11" option is not being passed to the C++ compiler on
MacOS.
The issue seems related to https://github.com/haskell/cabal/issues/6421
2022-08-30 21:57:08 +03:00
7795b3d838 Prepare 2.1.0 (#153)
Breaking change in upstream.
2022-07-25 18:14:21 +00:00
3a5abb2037 Update to 1.88 (#152) 2022-07-25 17:58:22 +00:00
06eb052cc5 added flag_ImDrawIdx (#151)
Co-authored-by: Stefan Dresselhaus <stefan@dresselhaus.cloud>
2022-07-23 15:42:13 +03:00
cf87988336 Prepare 2.0.0 (#148) 2022-05-15 23:37:43 +03:00
3c1d381c14 Replace String arguments with Text (#138)
Shave a few allocations and pointer-chasing due to conversion.
2022-05-15 22:41:10 +03:00
04fe618871 Prepare 1.5.0 (#140) 2022-03-28 13:22:11 +00:00
08d4b423ad Fix GHC-9.2 build (#145) 2022-03-28 13:04:22 +00:00
7d4f3a8b93 Make value and read-only range types distinct (#143)
Fixes #142
2022-03-23 21:22:05 +03:00
bc590d97c5 Tweak tables and add an example (#139)
Previously: #135
2022-03-22 22:36:19 +03:00
26 changed files with 784 additions and 467 deletions

View File

@ -4,16 +4,16 @@ jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2.3.4 - uses: actions/checkout@v2.4.0
with: with:
persist-credentials: false persist-credentials: false
submodules: true submodules: true
- uses: cachix/install-nix-action@v16 - uses: cachix/install-nix-action@v20
with: with:
nix_path: nixpkgs=channel:nixos-unstable nix_path: nixpkgs=channel:nixos-unstable
- uses: cachix/cachix-action@v10 - uses: cachix/cachix-action@v12
with: with:
name: hs-dear-imgui name: hs-dear-imgui
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'

View File

@ -1,5 +1,38 @@
# Changelog for dear-imgui # Changelog for dear-imgui
## [2.1.3]
- Fixed off-by-1 in internal Text wrapper.
- Fixed sliderFloat* Raw calls
- Added `formatPtr` to Raw.dragFloat* and Raw.sliderFloat*
## [2.1.2]
- Fixed glfw example build flags.
- Added `plotLines`.
- Added `setNextItemOpen`.
## [2.1.1]
- Build flag fix for MacOS.
## [2.1.0]
- `imgui` updated to [1.88].
* Breaking: `ImGuiKeyModFlags` renamed to `ImGuiModFlags`.
## [2.0.0]
- `String` arguments replaced with `Text`.
* Upgrading to `text-2` recommended to reap the UTF-8 benefits.
## [1.5.0]
- Added table wrappers.
- Added popup wrappers.
- Added `selectableWith`/`SelectableOptions` to expose optional arguments.
- Fix GHC-9.2 compatibility.
## [1.4.0] ## [1.4.0]
- `imgui` updated to [1.87]. - `imgui` updated to [1.87].
@ -68,6 +101,12 @@ Initial Hackage release based on [1.83].
[1.3.0]: https://github.com/haskell-game/dear-imgui.hs/tree/v1.3.0 [1.3.0]: https://github.com/haskell-game/dear-imgui.hs/tree/v1.3.0
[1.3.1]: https://github.com/haskell-game/dear-imgui.hs/tree/v1.3.1 [1.3.1]: https://github.com/haskell-game/dear-imgui.hs/tree/v1.3.1
[1.4.0]: https://github.com/haskell-game/dear-imgui.hs/tree/v1.4.0 [1.4.0]: https://github.com/haskell-game/dear-imgui.hs/tree/v1.4.0
[1.5.0]: https://github.com/haskell-game/dear-imgui.hs/tree/v1.5.0
[2.0.0]: https://github.com/haskell-game/dear-imgui.hs/tree/v2.0.0
[2.1.0]: https://github.com/haskell-game/dear-imgui.hs/tree/v2.1.0
[2.1.1]: https://github.com/haskell-game/dear-imgui.hs/tree/v2.1.1
[2.1.2]: https://github.com/haskell-game/dear-imgui.hs/tree/v2.1.2
[2.1.3]: https://github.com/haskell-game/dear-imgui.hs/tree/v2.1.3
[1.87]: https://github.com/ocornut/imgui/releases/tag/v1.87 [1.87]: https://github.com/ocornut/imgui/releases/tag/v1.87
[1.86]: https://github.com/ocornut/imgui/releases/tag/v1.86 [1.86]: https://github.com/ocornut/imgui/releases/tag/v1.86

View File

@ -10,6 +10,7 @@ import Data.IORef
import qualified Data.Vector as Vector import qualified Data.Vector as Vector
import DearImGui import DearImGui
import DearImGui.OpenGL3 import DearImGui.OpenGL3
import DearImGui.Internal.Text (pack)
import DearImGui.SDL import DearImGui.SDL
import DearImGui.SDL.OpenGL import DearImGui.SDL.OpenGL
import Control.Exception import Control.Exception
@ -134,18 +135,18 @@ loop window checked color slider r pos size' selected tab1Ref tab2Ref = do
text "ListClipper" text "ListClipper"
withChildOpen "##fixed" (ImVec2 0 200) True ImGuiWindowFlags_None do withChildOpen "##fixed" (ImVec2 0 200) True ImGuiWindowFlags_None do
let lotsOfItems = Vector.generate 50 (mappend "Item " . show) let lotsOfItems = Vector.generate 50 (pack . mappend "Item " . show)
withListClipper Nothing lotsOfItems text withListClipper Nothing lotsOfItems text
text "ListClipper, Haskell-powered" text "ListClipper, Haskell-powered"
withChildOpen "##infinite" (ImVec2 0 200) True ImGuiWindowFlags_None do withChildOpen "##infinite" (ImVec2 0 200) True ImGuiWindowFlags_None do
let infiniteItems = map (mappend "Item " . show) [0 :: Int ..] let infiniteItems = map (pack . mappend "Item " . show) [0 :: Int ..]
withListClipper Nothing infiniteItems text withListClipper Nothing infiniteItems text
text "Ethereal ListClipper" text "Ethereal ListClipper"
withChildOpen "##ethereal" (ImVec2 0 200) True ImGuiWindowFlags_None do withChildOpen "##ethereal" (ImVec2 0 200) True ImGuiWindowFlags_None do
withListClipper Nothing (ClipRange (0 :: Int) 1000) $ withListClipper Nothing (ClipRange (0 :: Int) 1000) $
text . mappend "Item " . show text . pack . mappend "Item " . show
plotHistogram "A histogram" [ 10, 10, 20, 30, 90 ] plotHistogram "A histogram" [ 10, 10, 20, 30, 90 ]

View File

@ -1,4 +1,4 @@
packages: *.cabal packages: *.cabal
package dear-imgui package dear-imgui
flags: +sdl2 +glfw +opengl2 +opengl3 +vulkan +examples flags: +sdl +glfw +opengl2 +opengl3 +vulkan +examples
ghc-options: -Wall -Wcompat -fno-warn-unused-do-bind ghc-options: -Wall -Wcompat -fno-warn-unused-do-bind

View File

@ -1,7 +1,7 @@
cabal-version: 3.0 cabal-version: 3.0
name: dear-imgui name: dear-imgui
version: 1.4.0 version: 2.1.3
author: Oliver Charles author: Oliver Charles
maintainer: ollie@ocharles.org.uk, aenor.realm@gmail.com maintainer: ollie@ocharles.org.uk, aenor.realm@gmail.com
license: BSD-3-Clause license: BSD-3-Clause
@ -126,10 +126,21 @@ flag use-wchar32
manual: manual:
True 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 common common
build-depends: build-depends:
base base
>= 4.12 && < 4.17 >= 4.12 && < 4.19
default-language: default-language:
Haskell2010 Haskell2010
@ -140,15 +151,16 @@ library
exposed-modules: exposed-modules:
DearImGui DearImGui
DearImGui.FontAtlas DearImGui.FontAtlas
DearImGui.Internal.Text
DearImGui.Raw DearImGui.Raw
DearImGui.Raw.DrawList DearImGui.Raw.DrawList
DearImGui.Raw.Font DearImGui.Raw.Font
DearImGui.Raw.Font.Config DearImGui.Raw.Font.Config
DearImGui.Raw.Font.GlyphRanges DearImGui.Raw.Font.GlyphRanges
DearImGui.Raw.ListClipper
DearImGui.Raw.IO DearImGui.Raw.IO
DearImGui.Raw.ListClipper
DearImGui.Raw.Context
other-modules: other-modules:
DearImGui.Context
DearImGui.Enums DearImGui.Enums
DearImGui.Structs DearImGui.Structs
cxx-options: -std=c++11 cxx-options: -std=c++11
@ -171,6 +183,11 @@ library
, StateVar , StateVar
, unliftio , unliftio
, vector , vector
, text
if os(darwin)
ghc-options:
-optcxx-std=c++11
if flag(disable-obsolete) if flag(disable-obsolete)
cxx-options: -DIMGUI_DISABLE_OBSOLETE_FUNCTIONS cxx-options: -DIMGUI_DISABLE_OBSOLETE_FUNCTIONS
@ -179,6 +196,10 @@ library
cxx-options: -DIMGUI_USE_WCHAR32 cxx-options: -DIMGUI_USE_WCHAR32
cpp-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) if flag(opengl2)
exposed-modules: exposed-modules:
DearImGui.OpenGL2 DearImGui.OpenGL2
@ -222,7 +243,7 @@ library
build-depends: build-depends:
sdl2 sdl2
cxx-sources: cxx-sources:
imgui/backends/imgui_impl_sdl.cpp imgui/backends/imgui_impl_sdl2.cpp
if os(windows) || os(darwin) if os(windows) || os(darwin)
extra-libraries: extra-libraries:
@ -270,7 +291,7 @@ library dear-imgui-generator
, DearImGui.Generator.Types , DearImGui.Generator.Types
build-depends: build-depends:
template-haskell template-haskell
>= 2.15 && < 2.19 >= 2.15 && < 2.21
, containers , containers
^>= 0.6.2.1 ^>= 0.6.2.1
, directory , directory
@ -286,11 +307,11 @@ library dear-imgui-generator
, scientific , scientific
>= 0.3.6.2 && < 0.3.8 >= 0.3.6.2 && < 0.3.8
, text , text
>= 1.2.4 && < 1.3 >= 1.2.4 && < 2.1
, th-lift , th-lift
>= 0.7 && < 0.9 >= 0.7 && < 0.9
, transformers , transformers
>= 0.5.6 && < 0.6 >= 0.5.6 && < 0.7
, unordered-containers , unordered-containers
>= 0.2.11 && < 0.3 >= 0.2.11 && < 0.3
@ -311,7 +332,7 @@ executable glfw
if (!flag(examples) || !flag(glfw) || !flag(opengl2)) if (!flag(examples) || !flag(glfw) || !flag(opengl2))
buildable: False buildable: False
else else
build-depends: base, GLFW-b, gl, dear-imgui, managed build-depends: base, GLFW-b, gl, dear-imgui, managed, text
executable readme executable readme
import: common, exe-flags import: common, exe-flags
@ -334,7 +355,7 @@ executable image
main-is: Image.hs main-is: Image.hs
hs-source-dirs: examples/sdl hs-source-dirs: examples/sdl
build-depends: sdl2, gl, dear-imgui, managed, vector build-depends: sdl2, gl, dear-imgui, managed, vector
if (!flag(examples) || !flag(sdl) || !flag(opengl2)) if (!flag(examples) || !flag(sdl) || !flag(opengl3))
buildable: False buildable: False
executable vulkan executable vulkan
@ -361,7 +382,7 @@ executable vulkan
, text-short , text-short
^>= 0.1.3 ^>= 0.1.3
, transformers , transformers
^>= 0.5.6.2 >= 0.5.6 && < 0.7
, unliftio , unliftio
>= 0.2.13 && < 0.2.19 >= 0.2.13 && < 0.2.19
, unliftio-core , unliftio-core
@ -369,8 +390,9 @@ executable vulkan
, vector , vector
^>= 0.12.1.2 ^>= 0.12.1.2
, vulkan , vulkan
^>= 3.9 >= 3.12
, vulkan-utils , vulkan-utils
^>= 0.4.1 >= 0.5
, VulkanMemoryAllocator , VulkanMemoryAllocator
>= 0.7.1
, JuicyPixels , JuicyPixels

View File

@ -1,6 +1,7 @@
{-# language BlockArguments #-} {-# language BlockArguments #-}
{-# language LambdaCase #-} {-# language LambdaCase #-}
{-# language OverloadedStrings #-} {-# language OverloadedStrings #-}
{-# language RecordWildCards #-}
module Main ( main ) where module Main ( main ) where
@ -8,6 +9,12 @@ import Control.Exception
import Control.Monad import Control.Monad
import Control.Monad.IO.Class import Control.Monad.IO.Class
import Control.Monad.Managed import Control.Monad.Managed
import Data.Bits ((.|.))
import Data.IORef
import Data.List (sortBy)
import Data.Foldable (traverse_)
import Data.Text (Text, pack)
import DearImGui import DearImGui
import DearImGui.OpenGL2 import DearImGui.OpenGL2
import DearImGui.GLFW import DearImGui.GLFW
@ -40,14 +47,23 @@ main = do
-- Initialize ImGui's OpenGL backend -- Initialize ImGui's OpenGL backend
_ <- managed_ $ bracket_ openGL2Init openGL2Shutdown _ <- managed_ $ bracket_ openGL2Init openGL2Shutdown
liftIO $ mainLoop win tableRef <- liftIO $ newIORef
[ (1, "foo")
, (2, "bar")
, (3, "baz")
, (10, "spam")
, (11, "spam")
, (12, "spam")
]
liftIO $ mainLoop win tableRef
Nothing -> do Nothing -> do
error "GLFW createWindow failed" error "GLFW createWindow failed"
GLFW.terminate GLFW.terminate
mainLoop :: Window -> IO () mainLoop :: Window -> IORef [(Integer, Text)] -> IO ()
mainLoop win = do mainLoop win tableRef = do
-- Process the event loop -- Process the event loop
GLFW.pollEvents GLFW.pollEvents
close <- GLFW.windowShouldClose win close <- GLFW.windowShouldClose win
@ -73,8 +89,9 @@ mainLoop win = do
when clicked $ when clicked $
closeCurrentPopup closeCurrentPopup
-- Show the ImGui demo window newLine
showDemoWindow
mkTable tableRef
-- Render -- Render
glClear GL_COLOR_BUFFER_BIT glClear GL_COLOR_BUFFER_BIT
@ -84,4 +101,41 @@ mainLoop win = do
GLFW.swapBuffers win GLFW.swapBuffers win
mainLoop win mainLoop win tableRef
mkTable :: IORef [(Integer, Text)] -> IO ()
mkTable tableRef =
withTableOpen sortable "MyTable" 3 $ do
tableSetupColumn "Hello"
tableSetupColumnWith defTableColumnOptions "World"
withSortableTable \isDirty sortSpecs ->
when (isDirty && not (null sortSpecs)) do
-- XXX: do your sorting & cache it. Dont sort every frame.
putStrLn "So dirty!"
print sortSpecs
modifyIORef' tableRef . sortBy $
foldMap mkCompare sortSpecs
tableHeadersRow
readIORef tableRef >>=
traverse_ \(ix, title) -> do
tableNextRow
tableNextColumn $ text (pack $ show ix)
tableNextColumn $ text title
tableNextColumn $ void (button "")
where
mkCompare TableSortingSpecs{..} a b =
let
dir = if tableSortingReverse then flip else id
in
case tableSortingColumn of
0 -> dir compare (fst a) (fst b)
1 -> dir compare (snd a) (snd b)
_ -> EQ
sortable = defTableOptions
{ tableFlags =
ImGuiTableFlags_Sortable .|.
ImGuiTableFlags_SortMulti
}

View File

@ -374,10 +374,9 @@ chooseSwapchainFormat
case sortOn ( Down . score ) ( Boxed.Vector.toList surfaceFormats ) of case sortOn ( Down . score ) ( Boxed.Vector.toList surfaceFormats ) of
[] -> error "No formats found." [] -> error "No formats found."
( best : _ ) Vulkan.SurfaceFormatKHR{format=Vulkan.FORMAT_UNDEFINED} : _rest ->
| Vulkan.FORMAT_UNDEFINED <- ( Vulkan.format :: Vulkan.SurfaceFormatKHR -> Vulkan.Format ) best pure preferredFormat
-> pure preferredFormat best : _rest
| otherwise
-> pure best -> pure best
where where
@ -415,11 +414,8 @@ createSwapchain physicalDevice device surface surfaceFormat imageUsage imageCoun
| otherwise | otherwise
= Vulkan.PRESENT_MODE_FIFO_KHR = Vulkan.PRESENT_MODE_FIFO_KHR
currentExtent :: Vulkan.Extent2D Vulkan.SurfaceCapabilitiesKHR{currentExtent, currentTransform} = surfaceCapabilities
currentExtent = ( Vulkan.currentExtent :: Vulkan.SurfaceCapabilitiesKHR -> Vulkan.Extent2D ) surfaceCapabilities Vulkan.SurfaceFormatKHR{format=fmt, colorSpace=csp} = surfaceFormat
currentTransform :: Vulkan.SurfaceTransformFlagBitsKHR
currentTransform = ( Vulkan.currentTransform :: Vulkan.SurfaceCapabilitiesKHR -> Vulkan.SurfaceTransformFlagBitsKHR ) surfaceCapabilities
swapchainCreateInfo :: Vulkan.SwapchainCreateInfoKHR '[] swapchainCreateInfo :: Vulkan.SwapchainCreateInfoKHR '[]
swapchainCreateInfo = swapchainCreateInfo =
@ -428,8 +424,8 @@ createSwapchain physicalDevice device surface surfaceFormat imageUsage imageCoun
, Vulkan.flags = Vulkan.zero , Vulkan.flags = Vulkan.zero
, Vulkan.surface = Vulkan.SurfaceKHR surface , Vulkan.surface = Vulkan.SurfaceKHR surface
, Vulkan.minImageCount = imageCount , Vulkan.minImageCount = imageCount
, Vulkan.imageFormat = ( Vulkan.format :: Vulkan.SurfaceFormatKHR -> Vulkan.Format ) surfaceFormat , Vulkan.imageFormat = fmt
, Vulkan.imageColorSpace = ( Vulkan.colorSpace :: Vulkan.SurfaceFormatKHR -> Vulkan.ColorSpaceKHR ) surfaceFormat , Vulkan.imageColorSpace = csp
, Vulkan.imageExtent = currentExtent , Vulkan.imageExtent = currentExtent
, Vulkan.imageArrayLayers = 1 , Vulkan.imageArrayLayers = 1
, Vulkan.imageUsage = imageUsage , Vulkan.imageUsage = imageUsage
@ -591,7 +587,7 @@ createFramebuffer
-> Vulkan.Extent2D -> Vulkan.Extent2D
-> f Vulkan.ImageView -> f Vulkan.ImageView
-> m ( ResourceT.ReleaseKey, Vulkan.Framebuffer ) -> m ( ResourceT.ReleaseKey, Vulkan.Framebuffer )
createFramebuffer dev renderPass extent attachments = Vulkan.withFramebuffer dev createInfo Nothing ResourceT.allocate createFramebuffer dev renderPass Vulkan.Extent2D{width, height} attachments = Vulkan.withFramebuffer dev createInfo Nothing ResourceT.allocate
where where
createInfo :: Vulkan.FramebufferCreateInfo '[] createInfo :: Vulkan.FramebufferCreateInfo '[]
createInfo = createInfo =
@ -600,8 +596,8 @@ createFramebuffer dev renderPass extent attachments = Vulkan.withFramebuffer dev
, Vulkan.flags = Vulkan.zero , Vulkan.flags = Vulkan.zero
, Vulkan.renderPass = renderPass , Vulkan.renderPass = renderPass
, Vulkan.attachments = Boxed.Vector.fromList . toList $ attachments , Vulkan.attachments = Boxed.Vector.fromList . toList $ attachments
, Vulkan.width = ( Vulkan.width :: Vulkan.Extent2D -> Word32 ) extent , Vulkan.width = width
, Vulkan.height = ( Vulkan.height :: Vulkan.Extent2D -> Word32 ) extent , Vulkan.height = height
, Vulkan.layers = 1 , Vulkan.layers = 1
} }

View File

@ -201,9 +201,7 @@ app = do
surfaceCapabilities <- Vulkan.getPhysicalDeviceSurfaceCapabilitiesKHR physicalDevice ( Vulkan.SurfaceKHR surface ) surfaceCapabilities <- Vulkan.getPhysicalDeviceSurfaceCapabilitiesKHR physicalDevice ( Vulkan.SurfaceKHR surface )
let let
minImageCount, maxImageCount, imageCount :: Word32 Vulkan.SurfaceCapabilitiesKHR{minImageCount, maxImageCount} = surfaceCapabilities
minImageCount = ( Vulkan.minImageCount :: Vulkan.SurfaceCapabilitiesKHR -> Word32 ) surfaceCapabilities
maxImageCount = ( Vulkan.maxImageCount :: Vulkan.SurfaceCapabilitiesKHR -> Word32 ) surfaceCapabilities
imageCount imageCount
| maxImageCount == 0 = minImageCount + 1 | maxImageCount == 0 = minImageCount + 1
| otherwise = ( minImageCount + 1 ) `min` maxImageCount | otherwise = ( minImageCount + 1 ) `min` maxImageCount
@ -213,31 +211,30 @@ app = do
swapchainResources :: Maybe SwapchainResources -> m ( m (), SwapchainResources ) swapchainResources :: Maybe SwapchainResources -> m ( m (), SwapchainResources )
swapchainResources mbOldResources = do swapchainResources mbOldResources = do
( surfaceFormat, imGuiRenderPass ) <- case mbOldResources of ( colFmt, surfaceFormat, imGuiRenderPass ) <- case mbOldResources of
Nothing -> do Nothing -> do
logDebug "Choosing swapchain format & color space" logDebug "Choosing swapchain format & color space"
surfaceFormat <- chooseSwapchainFormat preferredFormat physicalDevice surface surfaceFormat <- chooseSwapchainFormat preferredFormat physicalDevice surface
let let Vulkan.SurfaceFormatKHR{format=colFmt} = surfaceFormat
colFmt :: Vulkan.Format
colFmt = ( Vulkan.format :: Vulkan.SurfaceFormatKHR -> Vulkan.Format ) surfaceFormat
logDebug "Creating Dear ImGui render pass" logDebug "Creating Dear ImGui render pass"
( _, imGuiRenderPass ) <- ( _, imGuiRenderPass ) <-
simpleRenderPass device simpleRenderPass device
( noAttachments ( noAttachments
{ colorAttachments = Boxed.Vector.singleton $ presentableColorAttachmentDescription colFmt } { colorAttachments = Boxed.Vector.singleton $ presentableColorAttachmentDescription colFmt }
) )
pure ( surfaceFormat, imGuiRenderPass ) pure ( colFmt, surfaceFormat, imGuiRenderPass )
Just oldResources -> pure ( surfaceFormat oldResources, imGuiRenderPass oldResources ) Just oldResources -> do
let surFmt = surfaceFormat oldResources
let let Vulkan.SurfaceFormatKHR{format=colFmt} = surFmt
colFmt :: Vulkan.Format pure ( colFmt, surFmt, imGuiRenderPass oldResources )
colFmt = ( Vulkan.format :: Vulkan.SurfaceFormatKHR -> Vulkan.Format ) surfaceFormat
logDebug "Creating swapchain" logDebug "Creating swapchain"
( swapchainKey, swapchain, swapchainExtent ) <- ( swapchainKey, swapchain, swapchainExtent ) <-
createSwapchain createSwapchain
physicalDevice device physicalDevice
surface surfaceFormat device
surface
surfaceFormat
surfaceUsage surfaceUsage
imageCount imageCount
( swapchain <$> mbOldResources ) ( swapchain <$> mbOldResources )

View File

@ -24,6 +24,10 @@ import Data.Traversable
( for ) ( for )
import Foreign.Storable import Foreign.Storable
( Storable ) ( Storable )
#if MIN_VERSION_template_haskell(2,18,0)
import Data.Coerce
( coerce )
#endif
-- containers -- containers
import Data.Map.Strict import Data.Map.Strict
@ -171,7 +175,7 @@ declareEnumeration finiteEnumName countName ( Enumeration {..} ) = do
else else
\ nm args dir pat -> \ nm args dir pat ->
TH.patSynD_doc nm args dir pat TH.patSynD_doc nm args dir pat
( Just $ Text.unpack patDoc ) [] ( Just $ Text.unpack _patDoc ) []
) )
#else #else
TH.patSynD TH.patSynD

View File

@ -60,7 +60,7 @@ import Data.Text
( Text ) ( Text )
import qualified Data.Text as Text import qualified Data.Text as Text
( all, any, breakOn, drop, dropWhile, dropWhileEnd ( all, any, breakOn, drop, dropWhile, dropWhileEnd
, length, stripPrefix, unlines, unpack , length, stripPrefix, unlines, unpack, pack
) )
-- transformers -- transformers
@ -81,6 +81,8 @@ import DearImGui.Generator.Tokeniser
import DearImGui.Generator.Types import DearImGui.Generator.Types
( Comment(..), Enumeration(..), Headers(..) ) ( Comment(..), Enumeration(..), Headers(..) )
import qualified Text.Show as Text
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- Parse error type. -- Parse error type.
@ -90,7 +92,9 @@ data CustomParseError
, problems :: ![Text] , problems :: ![Text]
} }
| MissingForwardDeclaration | MissingForwardDeclaration
{ enumName :: !Text } { enumName :: !Text
, library :: HashMap Text ( TH.Name, Comment )
}
| UnexpectedSection | UnexpectedSection
{ sectionName :: !Text { sectionName :: !Text
, problem :: ![Text] , problem :: ![Text]
@ -101,8 +105,9 @@ instance ShowErrorComponent CustomParseError where
showErrorComponent ( Couldn'tLookupEnumValues { enumName, problems } ) = Text.unpack $ showErrorComponent ( Couldn'tLookupEnumValues { enumName, problems } ) = Text.unpack $
"Couldn't lookup the following values in enum " <> enumName <> ":\n" "Couldn't lookup the following values in enum " <> enumName <> ":\n"
<> Text.unlines ( map ( " - " <> ) problems ) <> Text.unlines ( map ( " - " <> ) problems )
showErrorComponent ( MissingForwardDeclaration { enumName } ) = Text.unpack $ showErrorComponent ( MissingForwardDeclaration { enumName, library } ) = Text.unpack $
"Missing forward declaration for enum named " <> enumName "Missing forward declaration for enum named " <> enumName <> "\n"
<> "In Library: " <> Text.pack ( Text.show library)
showErrorComponent ( UnexpectedSection { sectionName, problem } ) = Text.unpack $ showErrorComponent ( UnexpectedSection { sectionName, problem } ) = Text.unpack $
"Unexpected section name.\n\ "Unexpected section name.\n\
\Expected: " <> sectionName <> "\n\ \Expected: " <> sectionName <> "\n\
@ -124,6 +129,7 @@ headers = do
( _defines, basicEnums ) <- partitionEithers <$> ( _defines, basicEnums ) <- partitionEithers <$>
manyTill manyTill
( ( Left <$> try ignoreDefine ) ( ( Left <$> try ignoreDefine )
<|> ( Left <$> try cppConditional )
<|> ( Right <$> enumeration enumNamesAndTypes ) <|> ( Right <$> enumeration enumNamesAndTypes )
) )
( namedSection "Helpers: Memory allocations macros, ImVector<>" ) ( namedSection "Helpers: Memory allocations macros, ImVector<>" )
@ -134,7 +140,7 @@ headers = do
_ <- skipManyTill anySingle ( namedSection "Misc data structures" ) _ <- skipManyTill anySingle ( namedSection "Misc data structures" )
_ <- skipManyTill anySingle ( namedSection "Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor)" ) _ <- skipManyTill anySingle ( namedSection "Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, Math Operators, ImColor)" )
_ <- skipManyTill anySingle ( namedSection "Drawing API (ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawListFlags, ImDrawList, ImDrawData)" ) _ <- skipManyTill anySingle ( namedSection "Drawing API (ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawListFlags, ImDrawList, ImDrawData)" )
skipManyTill anySingle ( try . lookAhead $ many comment *> keyword "enum" ) skipManyTill anySingle ( try . lookAhead $ many comment *> keyword "enum" )
@ -171,14 +177,24 @@ forwardDeclarations = do
pure ( structName, doc ) pure ( structName, doc )
_ <- many comment _ <- many comment
enums <- many do enums <- many do
keyword "enum"
enumName <- identifier
symbol ":"
ty <- cTypeName
reservedSymbol ';'
doc <- commentText <$> comment
pure ( enumName, ( ty, CommentText <$> Text.drop 2 . snd $ Text.breakOn "//" doc ) )
_ <- many comment
typedefs <- many do
keyword "typedef" keyword "typedef"
ty <- cTypeName ty <- cTypeName
enumName <- identifier enumName <- identifier
reservedSymbol ';' reservedSymbol ';'
doc <- commentText <$> comment doc <- commentText <$> comment
_ <- many comment
pure ( enumName, ( ty, CommentText <$> Text.drop 2 . snd $ Text.breakOn "//" doc ) ) pure ( enumName, ( ty, CommentText <$> Text.drop 2 . snd $ Text.breakOn "//" doc ) )
-- Stopping after simple structs and enums for now. -- Stopping after simple structs and enums for now.
pure ( HashMap.fromList structs, HashMap.fromList enums ) pure ( HashMap.fromList structs, HashMap.fromList (enums <> typedefs) )
cTypeName :: MonadParsec e [Tok] m => m TH.Name cTypeName :: MonadParsec e [Tok] m => m TH.Name
cTypeName = keyword "int" $> ''CInt cTypeName = keyword "int" $> ''CInt
@ -200,6 +216,7 @@ enumeration enumNamesAndTypes = do
keyword "enum" keyword "enum"
pure inlineDocs pure inlineDocs
fullEnumName <- identifier fullEnumName <- identifier
_ <- try $ (symbol ":" >> cTypeName >> pure ()) <|> pure ()
let let
enumName :: Text enumName :: Text
enumName = Text.dropWhileEnd ( == '_' ) fullEnumName enumName = Text.dropWhileEnd ( == '_' ) fullEnumName
@ -207,7 +224,7 @@ enumeration enumNamesAndTypes = do
enumTypeName = () enumTypeName = ()
( underlyingType, forwardDoc ) <- case HashMap.lookup enumName enumNamesAndTypes of ( underlyingType, forwardDoc ) <- case HashMap.lookup enumName enumNamesAndTypes of
Just res -> pure res Just res -> pure res
Nothing -> customFailure ( MissingForwardDeclaration { enumName } ) Nothing -> customFailure ( MissingForwardDeclaration { enumName, library=enumNamesAndTypes } )
let let
docs :: [Comment] docs :: [Comment]
docs = forwardDoc : CommentText "" : inlineDocs docs = forwardDoc : CommentText "" : inlineDocs

2
imgui

Submodule imgui updated: c71a50deb5...d4ddc46e77

File diff suppressed because it is too large Load Diff

View File

@ -119,6 +119,8 @@ import DearImGui.Raw.Font.Config (FontConfig(..))
import qualified DearImGui.Raw.Font.Config as FontConfig import qualified DearImGui.Raw.Font.Config as FontConfig
import DearImGui.Raw.Font.GlyphRanges (GlyphRanges(..), GlyphRangesBuilder(..)) import DearImGui.Raw.Font.GlyphRanges (GlyphRanges(..), GlyphRangesBuilder(..))
import qualified DearImGui.Raw.Font.GlyphRanges as GlyphRanges import qualified DearImGui.Raw.Font.GlyphRanges as GlyphRanges
import DearImGui.Internal.Text (Text)
import qualified DearImGui.Internal.Text as Text
import DearImGui.Structs (ImVec2(..), ImWchar) import DearImGui.Structs (ImVec2(..), ImWchar)
@ -332,10 +334,10 @@ addChar char =
GlyphRanges.addChar builder char GlyphRanges.addChar builder char
-- | UTF-8 string -- | UTF-8 string
addText :: String -> RangesBuilderSetup addText :: Text -> RangesBuilderSetup
addText str = addText str =
RangesBuilderSetup \builder -> RangesBuilderSetup \builder ->
withCString str (GlyphRanges.addText builder) Text.withCString str (GlyphRanges.addText builder)
-- | Existing ranges (as is) -- | Existing ranges (as is)
addRangesRaw :: GlyphRanges -> RangesBuilderSetup addRangesRaw :: GlyphRanges -> RangesBuilderSetup

View File

@ -0,0 +1,76 @@
{-# LANGUAGE CPP #-}
module DearImGui.Internal.Text
( withCString
, withCStringOrNull
, withCStringLen
, withCStringEnd
, peekCString
, Text
, pack
, unpack
) where
-- base
import Foreign (nullPtr, plusPtr)
import Foreign.C.String (CString)
import qualified GHC.Foreign as Foreign
import System.IO (utf8)
-- text
import Data.Text (Text, pack, unpack)
import Data.Text.Foreign (withCStringLen)
-- unliftio-core
import UnliftIO (MonadUnliftIO, UnliftIO(..), withUnliftIO)
#if MIN_VERSION_text(2,0,1)
-- XXX: just wrap the provided combinator
import qualified Data.Text.Foreign as Text
withCString :: MonadUnliftIO m => Text -> (CString -> m a) -> m a
withCString text action =
withUnliftIO $ \(UnliftIO unlift) ->
Text.withCString text $ \buf ->
unlift $ action buf
#elif MIN_VERSION_text(2,0,0)
-- XXX: the text is UTF-8, alas no withCString is available
import Data.Text.Foreign (lengthWord8, unsafeCopyToPtr)
import Data.Word (Word8)
import Foreign (allocaBytes, castPtr, pokeByteOff)
withCString :: MonadUnliftIO m => Text -> (CString -> m a) -> m a
withCString t@(Text _arr _off len) action =
withUnliftIO $ \(UnliftIO unlift) ->
allocaBytes (len + 1) $ \buf -> do
unsafeCopyToPtr t buf
pokeByteOff buf len (0 :: Word8)
unlift $ action (castPtr buf)
#else
-- XXX: the text is UTF-16, let GHC do it
withCString :: MonadUnliftIO m => Text -> (CString -> m a) -> m a
withCString t action = do
withUnliftIO $ \(UnliftIO unlift) ->
Foreign.withCString utf8 (unpack t) $ \textPtr ->
unlift $ action textPtr
#endif
peekCString :: CString -> IO Text
peekCString = fmap pack . Foreign.peekCString utf8
withCStringOrNull :: Maybe Text -> (CString -> IO a) -> IO a
withCStringOrNull Nothing k = k nullPtr
withCStringOrNull (Just s) k = withCString s k
withCStringEnd :: MonadUnliftIO m => Text -> (CString -> CString -> m a) -> m a
withCStringEnd t action =
withUnliftIO $ \(UnliftIO unlift) ->
withCStringLen t $ \(textPtr, size) ->
unlift $ action textPtr (textPtr `plusPtr` size)

View File

@ -6,6 +6,7 @@
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ViewPatterns #-} {-# LANGUAGE ViewPatterns #-}
@ -89,6 +90,7 @@ module DearImGui.Raw
, popItemWidth , popItemWidth
, beginGroup , beginGroup
, endGroup , endGroup
, getCursorPos
, setCursorPos , setCursorPos
, getCursorScreenPos , getCursorScreenPos
, alignTextToFramePadding , alignTextToFramePadding
@ -170,6 +172,7 @@ module DearImGui.Raw
, tableHeader , tableHeader
, tableGetSortSpecs , tableGetSortSpecs
, tableClearSortSpecsDirty
, tableGetColumnCount , tableGetColumnCount
, tableGetColumnIndex , tableGetColumnIndex
@ -183,6 +186,7 @@ module DearImGui.Raw
, treeNode , treeNode
, treePush , treePush
, treePop , treePop
, setNextItemOpen
-- ** Selectables -- ** Selectables
, selectable , selectable
@ -191,6 +195,7 @@ module DearImGui.Raw
, listBox , listBox
-- * Data Plotting -- * Data Plotting
, plotLines
, plotHistogram , plotHistogram
-- ** Menus -- ** Menus
@ -260,7 +265,7 @@ import System.IO.Unsafe
( unsafePerformIO ) ( unsafePerformIO )
-- dear-imgui -- dear-imgui
import DearImGui.Context import DearImGui.Raw.Context
( imguiContext ) ( imguiContext )
import DearImGui.Enums import DearImGui.Enums
import DearImGui.Structs import DearImGui.Structs
@ -689,27 +694,27 @@ combo labelPtr iPtr itemsPtr itemsLen = liftIO do
-- | Wraps @ImGui::DragFloat()@ -- | Wraps @ImGui::DragFloat()@
dragFloat :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> m Bool dragFloat :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> CString -> m Bool
dragFloat descPtr floatPtr speed minValue maxValue = liftIO do dragFloat descPtr floatPtr speed minValue maxValue formatPtr = liftIO do
(0 /=) <$> [C.exp| bool { DragFloat( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue)) } |] (0 /=) <$> [C.exp| bool { DragFloat( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
-- | Wraps @ImGui::DragFloat2()@ -- | Wraps @ImGui::DragFloat2()@
dragFloat2 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> m Bool dragFloat2 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> CString -> m Bool
dragFloat2 descPtr floatPtr speed minValue maxValue = liftIO do dragFloat2 descPtr floatPtr speed minValue maxValue formatPtr = liftIO do
(0 /=) <$> [C.exp| bool { DragFloat2( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue)) } |] (0 /=) <$> [C.exp| bool { DragFloat2( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
-- | Wraps @ImGui::DragFloat3()@ -- | Wraps @ImGui::DragFloat3()@
dragFloat3 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> m Bool dragFloat3 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> CString -> m Bool
dragFloat3 descPtr floatPtr speed minValue maxValue = liftIO do dragFloat3 descPtr floatPtr speed minValue maxValue formatPtr = liftIO do
(0 /=) <$> [C.exp| bool { DragFloat3( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue)) } |] (0 /=) <$> [C.exp| bool { DragFloat3( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
-- | Wraps @ImGui::DragFloat4()@ -- | Wraps @ImGui::DragFloat4()@
dragFloat4 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> m Bool dragFloat4 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> CString -> m Bool
dragFloat4 descPtr floatPtr speed minValue maxValue = liftIO do dragFloat4 descPtr floatPtr speed minValue maxValue formatPtr = liftIO do
(0 /=) <$> [C.exp| bool { DragFloat4( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue)) } |] (0 /=) <$> [C.exp| bool { DragFloat4( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
-- | Wraps @ImGui::DragFloatRange2()@ -- | Wraps @ImGui::DragFloatRange2()@
@ -849,27 +854,27 @@ dragScalarN labelPtr dataType dataPtr components vSpeed minPtr maxPtr formatPtr
maxPtr_ = castPtr maxPtr maxPtr_ = castPtr maxPtr
-- | Wraps @ImGui::SliderFloat()@ -- | Wraps @ImGui::SliderFloat()@
sliderFloat :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> m Bool sliderFloat :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CString -> m Bool
sliderFloat descPtr floatPtr minValue maxValue = liftIO do sliderFloat descPtr floatPtr minValue maxValue formatPtr = liftIO do
(0 /=) <$> [C.exp| bool { SliderFloat( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue)) } |] (0 /=) <$> [C.exp| bool { SliderFloat( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
-- | Wraps @ImGui::SliderFloat2()@ -- | Wraps @ImGui::SliderFloat2()@
sliderFloat2 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> m Bool sliderFloat2 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CString -> m Bool
sliderFloat2 descPtr floatPtr minValue maxValue = liftIO do sliderFloat2 descPtr floatPtr minValue maxValue formatPtr = liftIO do
(0 /=) <$> [C.exp| bool { SliderFloat2( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue)) } |] (0 /=) <$> [C.exp| bool { SliderFloat2( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
-- | Wraps @ImGui::SliderFloat3()@ -- | Wraps @ImGui::SliderFloat3()@
sliderFloat3 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> m Bool sliderFloat3 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CString -> m Bool
sliderFloat3 descPtr floatPtr minValue maxValue = liftIO do sliderFloat3 descPtr floatPtr minValue maxValue formatPtr = liftIO do
(0 /=) <$> [C.exp| bool { SliderFloat3( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue)) } |] (0 /=) <$> [C.exp| bool { SliderFloat3( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
-- | Wraps @ImGui::SliderFloat4()@ -- | Wraps @ImGui::SliderFloat4()@
sliderFloat4 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> m Bool sliderFloat4 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CString -> m Bool
sliderFloat4 descPtr floatPtr minValue maxValue = liftIO do sliderFloat4 descPtr floatPtr minValue maxValue formatPtr = liftIO do
(0 /=) <$> [C.exp| bool { SliderFloat4( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue)) } |] (0 /=) <$> [C.exp| bool { SliderFloat4( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
-- | Wraps @ImGui::SliderAngle()@ -- | Wraps @ImGui::SliderAngle()@
sliderAngle :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CString -> ImGuiSliderFlags -> m Bool sliderAngle :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CString -> ImGuiSliderFlags -> m Bool
@ -1165,6 +1170,12 @@ tableGetSortSpecs = liftIO do
else else
return $ Just ptr return $ Just ptr
tableClearSortSpecsDirty :: MonadIO m => Ptr ImGuiTableSortSpecs -> m ()
tableClearSortSpecsDirty specsPtr = liftIO do
[C.block| void {
$(ImGuiTableSortSpecs* specsPtr)->SpecsDirty = false;
} |]
-- | Wraps @ImGui::TableGetColumnCount()@. -- | Wraps @ImGui::TableGetColumnCount()@.
tableGetColumnCount :: MonadIO m => m CInt tableGetColumnCount :: MonadIO m => m CInt
tableGetColumnCount = liftIO do tableGetColumnCount = liftIO do
@ -1224,6 +1235,11 @@ treePop = liftIO do
[C.exp| void { TreePop() } |] [C.exp| void { TreePop() } |]
-- | Wraps @ImGui::SetNextItemOpen()@.
setNextItemOpen :: (MonadIO m) => CBool -> m ()
setNextItemOpen is_open = liftIO do
[C.exp| void { SetNextItemOpen($(bool is_open)) } |]
-- -- | Wraps @ImGui::Selectable()@. -- -- | Wraps @ImGui::Selectable()@.
-- selectable :: (MonadIO m) => CString -> m Bool -- selectable :: (MonadIO m) => CString -> m Bool
-- selectable labelPtr = liftIO do -- selectable labelPtr = liftIO do
@ -1242,6 +1258,10 @@ listBox :: (MonadIO m) => CString -> Ptr CInt -> Ptr CString -> CInt -> m Bool
listBox labelPtr iPtr itemsPtr itemsLen = liftIO do listBox labelPtr iPtr itemsPtr itemsLen = liftIO do
(0 /=) <$> [C.exp| bool { ListBox($(char* labelPtr), $(int* iPtr), $(char** itemsPtr), $(int itemsLen)) }|] (0 /=) <$> [C.exp| bool { ListBox($(char* labelPtr), $(int* iPtr), $(char** itemsPtr), $(int itemsLen)) }|]
-- | Wraps @ImGui::PlotLines()@.
plotLines :: (MonadIO m) => CString -> Ptr CFloat -> CInt -> m ()
plotLines labelPtr valuesPtr valuesLen = liftIO do
[C.exp| void { PlotLines($(char* labelPtr), $(float* valuesPtr), $(int valuesLen)) } |]
-- | Wraps @ImGui::PlotHistogram()@. -- | Wraps @ImGui::PlotHistogram()@.
plotHistogram :: (MonadIO m) => CString -> Ptr CFloat -> CInt -> m () plotHistogram :: (MonadIO m) => CString -> Ptr CFloat -> CInt -> m ()
@ -1652,6 +1672,20 @@ setCursorPos :: (MonadIO m) => Ptr ImVec2 -> m ()
setCursorPos posPtr = liftIO do setCursorPos posPtr = liftIO do
[C.exp| void { SetCursorPos(*$(ImVec2* posPtr)) } |] [C.exp| void { SetCursorPos(*$(ImVec2* posPtr)) } |]
-- | Get cursor position in window-local coordinates.
--
-- Useful to overlap draw using 'setCursorPos'.
--
-- Wraps @ImGui::SetCursorPos()@
getCursorPos :: (MonadIO m) => m ImVec2
getCursorPos = liftIO do
C.withPtr_ \ptr ->
[C.block|
void {
*$(ImVec2 * ptr) = GetCursorPos();
}
|]
-- | Cursor position in absolute coordinates. -- | Cursor position in absolute coordinates.
-- --
-- Useful to work with 'DrawList' API. -- Useful to work with 'DrawList' API.

View File

@ -6,7 +6,7 @@
{-# language PatternSynonyms #-} {-# language PatternSynonyms #-}
{-# language TemplateHaskell #-} {-# language TemplateHaskell #-}
module DearImGui.Context where module DearImGui.Raw.Context where
-- containers -- containers
import qualified Data.Map.Strict as Map import qualified Data.Map.Strict as Map

View File

@ -115,7 +115,7 @@ import Foreign hiding (new)
import Foreign.C import Foreign.C
-- dear-imgui -- dear-imgui
import DearImGui.Context import DearImGui.Raw.Context
( imguiContext ) ( imguiContext )
import DearImGui.Enums import DearImGui.Enums
import DearImGui.Structs import DearImGui.Structs

View File

@ -41,7 +41,7 @@ import Foreign ( Ptr, castPtr )
import Foreign.C import Foreign.C
-- dear-imgui -- dear-imgui
import DearImGui.Context import DearImGui.Raw.Context
( imguiContext ) ( imguiContext )
import DearImGui.Structs import DearImGui.Structs
import DearImGui.Raw.Font.Config import DearImGui.Raw.Font.Config

View File

@ -46,7 +46,7 @@ import Foreign ( Ptr )
import Foreign.C import Foreign.C
-- dear-imgui -- dear-imgui
import DearImGui.Context import DearImGui.Raw.Context
( imguiContext ) ( imguiContext )
import DearImGui.Structs import DearImGui.Structs
import DearImGui.Raw.Font.GlyphRanges import DearImGui.Raw.Font.GlyphRanges

View File

@ -75,7 +75,7 @@ import Foreign.C
import System.IO.Unsafe (unsafePerformIO) import System.IO.Unsafe (unsafePerformIO)
-- dear-imgui -- dear-imgui
import DearImGui.Context import DearImGui.Raw.Context
( imguiContext ) ( imguiContext )
import DearImGui.Structs import DearImGui.Structs

View File

@ -39,7 +39,7 @@ import Foreign.C
) )
-- dear-imgui -- dear-imgui
import DearImGui.Context import DearImGui.Raw.Context
( imguiContext ) ( imguiContext )
-- import DearImGui.Enums -- import DearImGui.Enums
-- import DearImGui.Structs -- import DearImGui.Structs

View File

@ -59,7 +59,7 @@ import Foreign.C
import System.IO.Unsafe (unsafePerformIO) import System.IO.Unsafe (unsafePerformIO)
-- dear-imgui -- dear-imgui
import DearImGui.Context import DearImGui.Raw.Context
( imguiContext ) ( imguiContext )
import DearImGui.Structs import DearImGui.Structs
( ImGuiListClipper ) ( ImGuiListClipper )

View File

@ -50,7 +50,7 @@ import Control.Monad.IO.Class
C.context (Cpp.cppCtx <> C.bsCtx) C.context (Cpp.cppCtx <> C.bsCtx)
C.include "imgui.h" C.include "imgui.h"
C.include "backends/imgui_impl_sdl.h" C.include "backends/imgui_impl_sdl2.h"
C.include "SDL.h" C.include "SDL.h"
Cpp.using "namespace ImGui" Cpp.using "namespace ImGui"

View File

@ -42,7 +42,7 @@ import Control.Monad.IO.Class
C.context (Cpp.cppCtx <> C.bsCtx) C.context (Cpp.cppCtx <> C.bsCtx)
C.include "imgui.h" C.include "imgui.h"
C.include "backends/imgui_impl_opengl2.h" C.include "backends/imgui_impl_opengl2.h"
C.include "backends/imgui_impl_sdl.h" C.include "backends/imgui_impl_sdl2.h"
C.include "SDL.h" C.include "SDL.h"
C.include "SDL_opengl.h" C.include "SDL_opengl.h"
Cpp.using "namespace ImGui" Cpp.using "namespace ImGui"

View File

@ -33,7 +33,7 @@ import Control.Monad.IO.Class ( MonadIO, liftIO )
C.context Cpp.cppCtx C.context Cpp.cppCtx
C.include "imgui.h" C.include "imgui.h"
C.include "backends/imgui_impl_vulkan.h" C.include "backends/imgui_impl_vulkan.h"
C.include "backends/imgui_impl_sdl.h" C.include "backends/imgui_impl_sdl2.h"
C.include "SDL.h" C.include "SDL.h"
C.include "SDL_vulkan.h" C.include "SDL_vulkan.h"
Cpp.using "namespace ImGui" Cpp.using "namespace ImGui"

View File

@ -1,5 +1,6 @@
{-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE CPP #-} {-# LANGUAGE CPP #-}
module DearImGui.Structs where module DearImGui.Structs where
@ -13,11 +14,12 @@ import Data.Word
) )
import Foreign import Foreign
( Storable(..), castPtr, plusPtr, Ptr, Int16 ) ( Storable(..), castPtr, plusPtr, Ptr, Int16, nullPtr )
import Foreign.C import Foreign.C
( CInt, CBool ) ( CInt, CBool )
import DearImGui.Enums import DearImGui.Enums
import Data.Bits ((.&.))
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
data ImVec2 = ImVec2 { x, y :: {-# unpack #-} !Float } data ImVec2 = ImVec2 { x, y :: {-# unpack #-} !Float }
@ -104,7 +106,7 @@ data ImGuiListClipper
-- | A unique ID used by widgets (typically the result of hashing a stack of string) -- | A unique ID used by widgets (typically the result of hashing a stack of string)
-- unsigned Integer (same as ImU32) -- unsigned Integer (same as ImU32)
type ImGuiID = Word32 type ImGuiID = ImU32
-- | 32-bit unsigned integer (often used to store packed colors). -- | 32-bit unsigned integer (often used to store packed colors).
type ImU32 = Word32 type ImU32 = Word32
@ -125,62 +127,88 @@ type ImWchar = Word16
-- When @SpecsDirty == true@ you can sort your data. It will be true with sorting specs have changed since last call, or the first time. -- When @SpecsDirty == true@ you can sort your data. It will be true with sorting specs have changed since last call, or the first time.
-- Make sure to set @SpecsDirty = false@ after sorting, else you may wastefully sort your data every frame! -- Make sure to set @SpecsDirty = false@ after sorting, else you may wastefully sort your data every frame!
data ImGuiTableSortSpecs = ImGuiTableSortSpecs data ImGuiTableSortSpecs = ImGuiTableSortSpecs
{ imGuiTableColumnSortSpecs :: Ptr ImGuiTableColumnSortSpecs { specs :: Ptr ImGuiTableColumnSortSpecs
, imGuiTableSortSpecsCount :: CInt , specsCount :: CInt
, imGuiTableSortSpecsDirty :: CBool , specsDirty :: CBool
} } deriving (Show, Eq)
instance Storable ImGuiTableSortSpecs where instance Storable ImGuiTableSortSpecs where
sizeOf _ = sizeOf (undefined :: Ptr ImGuiTableColumnSortSpecs) sizeOf _ =
+ sizeOf (undefined :: CInt) sizeOf (undefined :: Ptr ImGuiTableColumnSortSpecs) +
+ sizeOf (undefined :: CBool) sizeOf (undefined :: CInt) +
sizeOf (undefined :: CBool)
alignment _ = 0 alignment _ =
alignment nullPtr
poke ptr (ImGuiTableSortSpecs s c d) = do poke ptr ImGuiTableSortSpecs{..} = do
poke ( castPtr ptr ) s let specsPtr = castPtr ptr
poke ( castPtr ptr `plusPtr` sizeOf s) c poke specsPtr specs
poke ((castPtr ptr `plusPtr` sizeOf s)
`plusPtr` sizeOf c) d let specsCountPtr = castPtr $ specsPtr `plusPtr` sizeOf specs
poke specsCountPtr specsCount
let specsDirtyPtr = castPtr $ specsCountPtr `plusPtr` sizeOf specsCount
poke specsDirtyPtr specsDirty
peek ptr = do peek ptr = do
s <- peek ( castPtr ptr ) let specsPtr = castPtr ptr
c <- peek ( castPtr ptr `plusPtr` sizeOf s) specs <- peek specsPtr
d <- peek ((castPtr ptr `plusPtr` sizeOf s)
`plusPtr` sizeOf c) let specsCountPtr = castPtr $ specsPtr `plusPtr` sizeOf specs
return (ImGuiTableSortSpecs s c d) specsCount <- peek specsCountPtr
let specsDirtyPtr = castPtr $ specsCountPtr `plusPtr` sizeOf specsCount
specsDirty <- peek specsDirtyPtr
pure ImGuiTableSortSpecs{..}
-- | Sorting specification for one column of a table -- | Sorting specification for one column of a table
data ImGuiTableColumnSortSpecs = ImGuiTableColumnSortSpecs data ImGuiTableColumnSortSpecs = ImGuiTableColumnSortSpecs
{ imGuiTableColumnSortUserID :: ImGuiID -- ^ User id of the column (if specified by a TableSetupColumn() call) { columnUserID :: ImGuiID -- ^ User id of the column (if specified by a TableSetupColumn() call)
, imGuiTableColumnSortColumnIndex :: ImS16 -- ^ Index of the column , columnIndex :: ImS16 -- ^ Index of the column
, imGuiTableColumnSortOrder :: ImS16 -- ^ Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here) , sortOrder :: ImS16 -- ^ Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here)
, imGuiTableColumnSortDirection :: ImGuiSortDirection -- ^ 'ImGuiSortDirection_Ascending' or 'ImGuiSortDirection_Descending' , sortDirection :: ImGuiSortDirection -- ^ 'ImGuiSortDirection_Ascending' or 'ImGuiSortDirection_Descending'
} deriving (Show, Eq) } deriving (Show, Eq)
instance Storable ImGuiTableColumnSortSpecs where instance Storable ImGuiTableColumnSortSpecs where
sizeOf _ = sizeOf (undefined :: ImGuiID) sizeOf _ = 12
+ sizeOf (undefined :: ImS16) alignment _ = 4
+ sizeOf (undefined :: ImS16)
+ sizeOf (undefined :: ImGuiSortDirection)
alignment _ = 0 poke ptr ImGuiTableColumnSortSpecs{..} = do
let columnUserIDPtr = castPtr ptr
poke columnUserIDPtr columnUserID
poke ptr (ImGuiTableColumnSortSpecs a b c d) = do let columnIndexPtr = castPtr $ columnUserIDPtr `plusPtr` sizeOf columnUserID
poke ( castPtr ptr ) a poke columnIndexPtr columnIndex
poke ( castPtr ptr `plusPtr` sizeOf a) b
poke (( castPtr ptr `plusPtr` sizeOf a) let sortOrderPtr = castPtr $ columnIndexPtr `plusPtr` sizeOf columnIndex
`plusPtr` sizeOf b) c poke sortOrderPtr sortOrder
poke (((castPtr ptr `plusPtr` sizeOf a)
`plusPtr` sizeOf b) let sortDirectionPtr = castPtr $ sortOrderPtr `plusPtr` sizeOf sortOrder
`plusPtr` sizeOf c) d poke sortDirectionPtr sortDirection
peek ptr = do peek ptr = do
a <- peek ( castPtr ptr ) let columnUserIDPtr = castPtr ptr
b <- peek ( castPtr ptr `plusPtr` sizeOf a) columnUserID <- peek columnUserIDPtr
c <- peek (( castPtr ptr `plusPtr` sizeOf a)
`plusPtr` sizeOf b) let columnIndexPtr = castPtr $ columnUserIDPtr `plusPtr` sizeOf columnUserID
d <- peek (((castPtr ptr `plusPtr` sizeOf a) columnIndex <- peek columnIndexPtr
`plusPtr` sizeOf b)
`plusPtr` sizeOf c) let sortOrderPtr = castPtr $ columnIndexPtr `plusPtr` sizeOf columnIndex
return (ImGuiTableColumnSortSpecs a b c d) sortOrder <- peek sortOrderPtr
let sortDirectionPtr = castPtr $ sortOrderPtr `plusPtr` sizeOf sortOrder
sortDirection' <- peek sortDirectionPtr :: IO CInt
-- XXX: Specs struct uses trimmed field: @SortDirection : 8@
let sortDirection = case sortDirection' .&. 0xFF of
0 ->
ImGuiSortDirection_None
1 ->
ImGuiSortDirection_Ascending
2 ->
ImGuiSortDirection_Descending
_ ->
error $ "Unexpected value for ImGuiSortDirection: " <> show sortDirection
pure ImGuiTableColumnSortSpecs{..}