diff --git a/ChangeLog.md b/ChangeLog.md index 51bae5b..ef8ea00 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,9 @@ # Changelog for dear-imgui +## [1.2.1] + +- Added `DearImGui.Raw.IO` with attribute setters. + ## [1.2.0] - Fixed `nullPtr` in place of default arguments. diff --git a/dear-imgui.cabal b/dear-imgui.cabal index 680c7f3..59cf9dd 100644 --- a/dear-imgui.cabal +++ b/dear-imgui.cabal @@ -1,7 +1,7 @@ cabal-version: 3.0 name: dear-imgui -version: 1.2.0 +version: 1.2.1 author: Oliver Charles maintainer: ollie@ocharles.org.uk, aenor.realm@gmail.com license: BSD-3-Clause @@ -127,6 +127,7 @@ library DearImGui.Raw DearImGui.Raw.DrawList DearImGui.Raw.ListClipper + DearImGui.Raw.IO other-modules: DearImGui.Context DearImGui.Enums diff --git a/src/DearImGui/Raw/IO.hs b/src/DearImGui/Raw/IO.hs new file mode 100644 index 0000000..9252005 --- /dev/null +++ b/src/DearImGui/Raw/IO.hs @@ -0,0 +1,125 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE DuplicateRecordFields #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE ViewPatterns #-} + +{-| Main configuration and I/O between your application and ImGui + +-} + +module DearImGui.Raw.IO where + +-- TODO: add exports + +import Control.Monad.IO.Class + ( MonadIO, liftIO ) +import Foreign + ( Ptr ) +import Foreign.C + ( CFloat(..) + , CString + ) + +-- dear-imgui +import DearImGui.Context + ( imguiContext ) +-- import DearImGui.Enums +-- import DearImGui.Structs + +-- inline-c +import qualified Language.C.Inline as C + +-- inline-c-cpp +import qualified Language.C.Inline.Cpp as Cpp + +C.context (Cpp.cppCtx <> C.bsCtx <> imguiContext) +C.include "imgui.h" +Cpp.using "namespace ImGui" + +setIniFilename :: MonadIO m => CString -> m () +setIniFilename ptr = liftIO do + [C.block| + void { + GetIO().IniFilename = $(char * ptr); + } + |] + +setLogFilename :: MonadIO m => CString -> m () +setLogFilename ptr = liftIO do + [C.block| + void { + GetIO().LogFilename = $(char * ptr); + } + |] + +setMouseDoubleClickTime :: MonadIO m => CFloat -> m () +setMouseDoubleClickTime seconds = liftIO do + [C.block| + void { + GetIO().MouseDoubleClickTime = $(float seconds); + } + |] + +setMouseDoubleClickMaxDist :: MonadIO m => CFloat -> m () +setMouseDoubleClickMaxDist pixels = liftIO do + [C.block| + void { + GetIO().MouseDoubleClickMaxDist = $(float pixels); + } + |] + +setMouseDragThreshold :: MonadIO m => CFloat -> m () +setMouseDragThreshold pixels = liftIO do + [C.block| + void { + GetIO().MouseDragThreshold = $(float pixels); + } + |] + +setKeyRepeatDelay :: MonadIO m => CFloat -> m () +setKeyRepeatDelay seconds = liftIO do + [C.block| + void { + GetIO().KeyRepeatDelay = $(float seconds); + } + |] + +setKeyRepeatRate :: MonadIO m => CFloat -> m () +setKeyRepeatRate pixels = liftIO do + [C.block| + void { + GetIO().KeyRepeatRate = $(float pixels); + } + |] + +setUserData :: MonadIO m => Ptr () -> m () +setUserData ptr = liftIO do + [C.block| + void { + GetIO().UserData = $(void* ptr); + } + |] + +{- TODO: + +bool WantCaptureMouse; // Set when Dear ImGui will use mouse inputs, in this case do not dispatch them to your main game/application (either way, always pass on mouse inputs to imgui). (e.g. unclicked mouse is hovering over an imgui window, widget is active, mouse was clicked over an imgui window, etc.). +bool WantCaptureKeyboard; // Set when Dear ImGui will use keyboard inputs, in this case do not dispatch them to your main game/application (either way, always pass keyboard inputs to imgui). (e.g. InputText active, or an imgui window is focused and navigation is enabled, etc.). +bool WantTextInput; // Mobile/console: when set, you may display an on-screen keyboard. This is set by Dear ImGui when it wants textual keyboard input to happen (e.g. when a InputText widget is active). +bool WantSetMousePos; // MousePos has been altered, backend should reposition mouse on next frame. Rarely used! Set only when ImGuiConfigFlags_NavEnableSetMousePos flag is enabled. +bool WantSaveIniSettings; // When manual .ini load/save is active (io.IniFilename == NULL), this will be set to notify your application that you can call SaveIniSettingsToMemory() and save yourself. Important: clear io.WantSaveIniSettings yourself after saving! +bool NavActive; // Keyboard/Gamepad navigation is currently allowed (will handle ImGuiKey_NavXXX events) = a window is focused and it doesn't use the ImGuiWindowFlags_NoNavInputs flag. +bool NavVisible; // Keyboard/Gamepad navigation is visible and allowed (will handle ImGuiKey_NavXXX events). +float Framerate; // Rough estimate of application framerate, in frame per second. Solely for convenience. Rolling average estimation based on io.DeltaTime over 120 frames. +int MetricsRenderVertices; // Vertices output during last call to Render() +int MetricsRenderIndices; // Indices output during last call to Render() = number of triangles * 3 +int MetricsRenderWindows; // Number of visible windows +int MetricsActiveWindows; // Number of active windows +int MetricsActiveAllocations; // Number of active allocations, updated by MemAlloc/MemFree based on current context. May be off if you have multiple imgui contexts. +ImVec2 MouseDelta; +-}