11{-# LANGUAGE BlockArguments #-}
22{-# LANGUAGE DuplicateRecordFields #-}
33{-# LANGUAGE FlexibleContexts #-}
4+ {-# LANGUAGE LambdaCase #-}
45{-# LANGUAGE NamedFieldPuns #-}
56{-# LANGUAGE OverloadedStrings #-}
67{-# LANGUAGE PatternSynonyms #-}
@@ -27,6 +28,9 @@ module DearImGui
2728 , getDrawData
2829 , checkVersion
2930
31+ -- ** @ImGUIIO@
32+ , iniFilename
33+
3034 -- * Demo, Debug, Information
3135 , showDemoWindow
3236 , showMetricsWindow
@@ -126,7 +130,7 @@ import qualified Language.C.Inline.Cpp as Cpp
126130
127131-- StateVar
128132import Data.StateVar
129- ( HasGetter (get ), HasSetter , ($=!) )
133+ ( HasGetter (get ), HasSetter , StateVar ( .. ), ($=!) )
130134
131135-- transformers
132136import Control.Monad.IO.Class
@@ -195,6 +199,22 @@ checkVersion :: MonadIO m => m ()
195199checkVersion = liftIO do
196200 [C. exp | void { IMGUI_CHECKVERSION(); } |]
197201
202+ -- | Path to @.ini@ file. Set to 'Nothing' to disable automatic .ini
203+ -- loading/saving, if e.g. you want to manually load/save from memory.
204+ iniFilename :: StateVar (Maybe String )
205+ iniFilename = StateVar getter setter
206+ where
207+ getter = do
208+ cStr <- [C. exp | const char* { GetIO().IniFilename } |]
209+ if cStr == nullPtr then return Nothing else Just <$> peekCString cStr
210+
211+ setter = \ case
212+ Nothing ->
213+ [C. block | void { GetIO().IniFilename = $(char* nullPtr); } |]
214+
215+ Just str -> do
216+ strPtr <- newCString str
217+ [C. block | void { GetIO().IniFilename = $(char* strPtr); } |]
198218
199219-- | Create demo window. Demonstrate most ImGui features. Call this to learn
200220-- about the library! Try to make it always available in your application!
0 commit comments