-- NOTE: If this is file is edited, please also copy and paste it into -- README.md. {-# language OverloadedStrings #-} module Main ( main ) where import DearImGui import DearImGui.OpenGL3 import DearImGui.SDL import DearImGui.SDL.OpenGL import Graphics.GL import SDL import Control.Monad.Managed import Control.Monad.IO.Class () import Control.Monad (when, unless) import Control.Exception (bracket, bracket_) main :: IO () main = do -- Initialize SDL initializeAll runManaged $ do -- Create a window using SDL; as we're using OpenGL, we enable OpenGL too window <- do let title = "Hello, Dear ImGui!" let config = defaultWindow { windowGraphicsContext = OpenGLContext defaultOpenGL } managed $ bracket (createWindow title config) destroyWindow -- Create an OpenGL context glContext <- managed $ bracket (glCreateContext window) glDeleteContext -- Create an ImGui context _ <- managed $ bracket createContext destroyContext -- Initialize ImGui's SDL2 backend managed_ $ bracket_ (sdl2InitForOpenGL window glContext) sdl2Shutdown -- Initialize ImGui's OpenGL backend managed_ $ bracket_ openGL3Init openGL3Shutdown liftIO $ mainLoop window mainLoop :: Window -> IO () mainLoop window = unlessQuit $ do -- Tell ImGui we're starting a new frame openGL3NewFrame sdl2NewFrame newFrame -- Build the GUI withWindowOpen "Hello, ImGui!" $ do -- Add a text widget text "Hello, ImGui!" -- Add a button widget, and call 'putStrLn' when it's clicked button "Clickety Click" >>= \clicked -> when clicked $ putStrLn "Ow!" -- Show the ImGui demo window showDemoWindow -- Render glClear GL_COLOR_BUFFER_BIT render openGL3RenderDrawData =<< getDrawData glSwapWindow window mainLoop window where -- Process the event loop unlessQuit action = do shouldQuit <- gotQuitEvent unless shouldQuit action gotQuitEvent = do ev <- pollEventWithImGui case ev of Nothing -> return False Just event -> (isQuit event ||) <$> gotQuitEvent isQuit event = eventPayload event == QuitEvent