2021-01-24 15:27:03 +00:00
|
|
|
{-# LANGUAGE BlockArguments #-}
|
|
|
|
{-# LANGUAGE LambdaCase #-}
|
|
|
|
{-# LANGUAGE NamedFieldPuns #-}
|
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
|
|
|
|
module Main (main) where
|
|
|
|
|
2021-02-06 13:26:28 +00:00
|
|
|
import Control.Monad
|
2021-01-24 15:56:14 +00:00
|
|
|
import Data.IORef
|
2021-01-24 15:27:03 +00:00
|
|
|
import DearImGui
|
2021-02-06 14:44:58 +00:00
|
|
|
import DearImGui.OpenGL3
|
2021-01-24 18:25:40 +00:00
|
|
|
import DearImGui.SDL
|
|
|
|
import DearImGui.SDL.OpenGL
|
2021-01-24 15:27:03 +00:00
|
|
|
import Control.Exception
|
|
|
|
import Graphics.GL
|
|
|
|
import SDL
|
|
|
|
|
|
|
|
main :: IO ()
|
|
|
|
main = do
|
|
|
|
initializeAll
|
|
|
|
|
|
|
|
bracket (createWindow "Hello, Dear ImGui!" defaultWindow { windowGraphicsContext = OpenGLContext defaultOpenGL }) destroyWindow \w ->
|
|
|
|
bracket (glCreateContext w) glDeleteContext \glContext ->
|
|
|
|
bracket createContext destroyContext \_imguiContext ->
|
|
|
|
bracket_ (sdl2InitForOpenGL w glContext) sdl2Shutdown $
|
2021-02-06 14:44:58 +00:00
|
|
|
bracket_ openGL3Init openGL3Shutdown do
|
2021-01-24 15:27:03 +00:00
|
|
|
checkVersion
|
|
|
|
styleColorsLight
|
|
|
|
|
2021-01-25 09:11:46 +00:00
|
|
|
checked <- newIORef False
|
|
|
|
color <- newIORef $ ImVec3 1 0 0
|
2021-01-28 23:02:04 +00:00
|
|
|
slider <- newIORef (0.42, 0, 0.314)
|
2021-01-28 23:38:59 +00:00
|
|
|
r <- newIORef 4
|
2021-02-05 23:46:48 +00:00
|
|
|
pos <- newIORef $ ImVec2 64 64
|
|
|
|
size' <- newIORef $ ImVec2 512 512
|
2021-02-05 21:20:32 +00:00
|
|
|
selected <- newIORef 4
|
2021-02-06 13:26:28 +00:00
|
|
|
tab1 <- newIORef True
|
|
|
|
tab2 <- newIORef True
|
|
|
|
loop w checked color slider r pos size' selected tab1 tab2
|
2021-01-24 15:27:03 +00:00
|
|
|
|
2021-01-28 23:38:59 +00:00
|
|
|
|
2021-08-30 17:08:23 +00:00
|
|
|
loop
|
|
|
|
:: Window
|
|
|
|
-> IORef Bool
|
|
|
|
-> IORef ImVec3
|
|
|
|
-> IORef (Float, Float, Float)
|
|
|
|
-> IORef Int
|
|
|
|
-> IORef ImVec2
|
2021-02-05 23:46:48 +00:00
|
|
|
-> IORef ImVec2
|
2021-08-30 17:08:23 +00:00
|
|
|
-> IORef Int
|
2021-02-06 13:26:28 +00:00
|
|
|
-> IORef Bool
|
|
|
|
-> IORef Bool
|
2021-02-05 21:20:32 +00:00
|
|
|
-> IO ()
|
2021-08-30 17:08:23 +00:00
|
|
|
loop window checked color slider r pos size' selected tab1Ref tab2Ref = do
|
|
|
|
shouldQuit <- checkEvents
|
2021-01-24 15:27:03 +00:00
|
|
|
|
2021-02-06 14:44:58 +00:00
|
|
|
openGL3NewFrame
|
2021-08-30 16:57:00 +00:00
|
|
|
sdl2NewFrame
|
2021-01-24 15:27:03 +00:00
|
|
|
newFrame
|
|
|
|
|
|
|
|
-- showDemoWindow
|
|
|
|
-- showMetricsWindow
|
|
|
|
-- showAboutWindow
|
|
|
|
-- showUserGuide
|
|
|
|
|
2021-02-05 23:46:48 +00:00
|
|
|
setNextWindowPos pos ImGuiCond_Once Nothing
|
|
|
|
setNextWindowSize size' ImGuiCond_Once
|
|
|
|
-- Works, but will make the window contents illegible without doing something more involved.
|
2021-08-30 17:08:23 +00:00
|
|
|
-- setNextWindowContentSize size'
|
2021-02-05 23:46:48 +00:00
|
|
|
-- setNextWindowSizeConstraints size' size'
|
|
|
|
setNextWindowCollapsed False ImGuiCond_Once
|
|
|
|
|
|
|
|
setNextWindowBgAlpha 0.42
|
|
|
|
|
2021-01-24 15:27:03 +00:00
|
|
|
begin "My Window"
|
2021-02-06 13:26:28 +00:00
|
|
|
|
2021-01-24 15:27:03 +00:00
|
|
|
text "Hello!"
|
|
|
|
|
2021-02-06 13:26:28 +00:00
|
|
|
beginTabBar "My tab bar" ImGuiTabBarFlags_Reorderable >>= whenTrue do
|
|
|
|
beginTabItem "Tab 1" tab1Ref ImGuiTabBarFlags_None >>= whenTrue do
|
|
|
|
text "Tab 1 is currently selected."
|
|
|
|
endTabItem
|
|
|
|
beginTabItem "Tab 2" tab2Ref ImGuiTabBarFlags_None >>= whenTrue do
|
|
|
|
text "Tab 2 is selected now."
|
|
|
|
endTabItem
|
|
|
|
reOpen <- tabItemButton "ReopenTabs" ImGuiTabItemFlags_Trailing
|
|
|
|
when reOpen do
|
|
|
|
writeIORef tab1Ref True
|
|
|
|
writeIORef tab2Ref True
|
|
|
|
endTabBar
|
|
|
|
|
2021-01-28 23:38:59 +00:00
|
|
|
listBox "Items" r [ "A", "B", "C" ]
|
|
|
|
|
2021-01-24 15:27:03 +00:00
|
|
|
button "Click me" >>= \case
|
2021-01-24 17:35:00 +00:00
|
|
|
True -> openPopup "Button Popup"
|
2021-01-24 15:27:03 +00:00
|
|
|
False -> return ()
|
|
|
|
|
2021-01-24 17:39:44 +00:00
|
|
|
isItemHovered >>= whenTrue do
|
|
|
|
beginTooltip
|
|
|
|
text "Tooltip?"
|
|
|
|
endTooltip
|
|
|
|
|
|
|
|
beginPopup "Button Popup" >>= whenTrue do
|
2021-01-24 17:35:00 +00:00
|
|
|
button "Close" >>= whenTrue closeCurrentPopup
|
|
|
|
endPopup
|
|
|
|
|
2021-01-24 16:58:52 +00:00
|
|
|
sameLine >> smallButton "Click me" >>= \case
|
2021-01-24 15:27:03 +00:00
|
|
|
True -> putStrLn "Oh hi Mark"
|
|
|
|
False -> return ()
|
|
|
|
|
2021-02-05 20:57:17 +00:00
|
|
|
sameLine >> arrowButton "Arrow" ImGuiDir_Up
|
2021-01-24 15:54:39 +00:00
|
|
|
|
2021-01-24 16:58:52 +00:00
|
|
|
sameLine >> checkbox "Check!" checked >>= \case
|
2021-01-24 15:56:14 +00:00
|
|
|
True -> readIORef checked >>= print
|
|
|
|
False -> return ()
|
|
|
|
|
2021-01-24 17:00:25 +00:00
|
|
|
separator
|
|
|
|
|
2021-01-28 23:10:58 +00:00
|
|
|
dragFloat3 "Slider" slider 0.1 0.0 1.0
|
2021-01-25 19:04:43 +00:00
|
|
|
|
2021-01-24 16:03:18 +00:00
|
|
|
progressBar 0.314 (Just "Pi")
|
|
|
|
|
2021-09-12 10:28:48 +00:00
|
|
|
beginChild "Child" (ImVec2 0 0) True ImGuiWindowFlags_None
|
2021-01-28 22:38:25 +00:00
|
|
|
|
2021-01-24 16:14:51 +00:00
|
|
|
beginCombo "Label" "Preview" >>= whenTrue do
|
|
|
|
selectable "Testing 1"
|
|
|
|
selectable "Testing 2"
|
|
|
|
endCombo
|
|
|
|
|
2021-02-05 21:20:32 +00:00
|
|
|
combo "Simple" selected [ "1", "2", "3" ]
|
|
|
|
|
2021-01-28 22:38:25 +00:00
|
|
|
endChild
|
|
|
|
|
2021-01-24 20:23:58 +00:00
|
|
|
plotHistogram "A histogram" [ 10, 10, 20, 30, 90 ]
|
|
|
|
|
2021-01-25 09:11:46 +00:00
|
|
|
colorPicker3 "Test" color
|
2021-01-24 20:46:01 +00:00
|
|
|
|
2021-01-28 23:28:45 +00:00
|
|
|
treeNode "Tree Node 1" >>= whenTrue do
|
|
|
|
treeNode "Tree Node 2" >>= whenTrue do
|
|
|
|
treePop
|
|
|
|
|
|
|
|
treeNode "Tree Node 3" >>= whenTrue do
|
|
|
|
treePop
|
|
|
|
|
|
|
|
treePop
|
|
|
|
|
2021-01-24 16:49:28 +00:00
|
|
|
beginMainMenuBar >>= whenTrue do
|
|
|
|
beginMenu "Hello" >>= whenTrue do
|
|
|
|
menuItem "Hello"
|
|
|
|
endMenu
|
|
|
|
|
|
|
|
beginMenu "World" >>= whenTrue do
|
|
|
|
menuItem "World"
|
|
|
|
endMenu
|
|
|
|
|
|
|
|
endMainMenuBar
|
|
|
|
|
2021-01-24 15:27:03 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
render
|
|
|
|
|
|
|
|
glClear GL_COLOR_BUFFER_BIT
|
2021-02-06 14:44:58 +00:00
|
|
|
openGL3RenderDrawData =<< getDrawData
|
2021-01-24 15:27:03 +00:00
|
|
|
|
2021-08-30 17:08:23 +00:00
|
|
|
glSwapWindow window
|
2021-01-24 15:27:03 +00:00
|
|
|
|
2021-08-30 17:08:23 +00:00
|
|
|
if shouldQuit
|
|
|
|
then return ()
|
|
|
|
else loop window checked color slider r pos size' selected tab1Ref tab2Ref
|
2021-01-24 16:49:38 +00:00
|
|
|
|
|
|
|
where
|
|
|
|
|
2021-08-30 17:08:23 +00:00
|
|
|
checkEvents = do
|
2021-01-24 16:49:38 +00:00
|
|
|
ev <- pollEventWithImGui
|
|
|
|
|
|
|
|
case ev of
|
|
|
|
Nothing -> return False
|
|
|
|
Just Event{ eventPayload } -> do
|
|
|
|
let isQuit = case eventPayload of
|
|
|
|
QuitEvent -> True
|
|
|
|
_ -> False
|
|
|
|
|
2021-08-30 17:08:23 +00:00
|
|
|
(isQuit ||) <$> checkEvents
|
2021-01-24 16:14:51 +00:00
|
|
|
|
|
|
|
|
|
|
|
whenTrue :: IO () -> Bool -> IO ()
|
|
|
|
whenTrue io True = io
|
2021-08-30 17:08:23 +00:00
|
|
|
whenTrue _io False = return ()
|