diff --git a/Main.hs b/Main.hs index 5485202..b71ae94 100644 --- a/Main.hs +++ b/Main.hs @@ -5,6 +5,7 @@ module Main (main) where +import Data.StateVar import Data.IORef import DearImGui import DearImGui.OpenGL @@ -23,6 +24,11 @@ main = do bracket createContext destroyContext \_imguiContext -> bracket_ (sdl2InitForOpenGL w glContext) sdl2Shutdown $ bracket_ openGL2Init openGL2Shutdown do + iniFilename $= Just "imgui_state.ini" + + putStr "State stored in: " + get iniFilename >>= print + checkVersion styleColorsLight diff --git a/dear-imgui.cabal b/dear-imgui.cabal index 1de71bd..99466dc 100644 --- a/dear-imgui.cabal +++ b/dear-imgui.cabal @@ -120,7 +120,7 @@ library executable test main-is: Main.hs default-language: Haskell2010 - build-depends: base, sdl2, gl, dear-imgui + build-depends: base, sdl2, gl, dear-imgui, StateVar ghc-options: -Wall diff --git a/src/DearImGui.hs b/src/DearImGui.hs index a796b22..e5df870 100644 --- a/src/DearImGui.hs +++ b/src/DearImGui.hs @@ -1,6 +1,7 @@ {-# LANGUAGE BlockArguments #-} {-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE LambdaCase #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PatternSynonyms #-} @@ -27,6 +28,9 @@ module DearImGui , getDrawData , checkVersion + -- ** @ImGUIIO@ + , iniFilename + -- * Demo, Debug, Information , showDemoWindow , showMetricsWindow @@ -126,7 +130,7 @@ import qualified Language.C.Inline.Cpp as Cpp -- StateVar import Data.StateVar - ( HasGetter(get), HasSetter, ($=!) ) + ( HasGetter(get), HasSetter, StateVar(..), ($=!) ) -- transformers import Control.Monad.IO.Class @@ -196,6 +200,24 @@ checkVersion = liftIO do [C.exp| void { IMGUI_CHECKVERSION(); } |] +-- | Path to @.ini@ file. Set to 'Nothing' to disable automatic .ini +-- loading/saving, if e.g. you want to manually load/save from memory. +iniFilename :: StateVar (Maybe String) +iniFilename = StateVar getter setter + where + getter = do + cStr <- [C.exp| const char* { GetIO().IniFilename } |] + if cStr == nullPtr then return Nothing else Just <$> peekCString cStr + + setter = \case + Nothing -> + [C.block| void { GetIO().IniFilename = $(char* nullPtr); } |] + + Just str -> do + strPtr <- newCString str + [C.block| void { GetIO().IniFilename = $(char* strPtr); } |] + + -- | Create demo window. Demonstrate most ImGui features. Call this to learn -- about the library! Try to make it always available in your application! showDemoWindow :: MonadIO m => m ()