mirror of
				https://github.com/Drezil/dear-imgui.hs.git
				synced 2025-11-04 15:11:06 +01:00 
			
		
		
		
	
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							e5969f6b35
						
					
				
				
					commit
					bc590d97c5
				
			@@ -1,6 +1,7 @@
 | 
			
		||||
{-# language BlockArguments #-}
 | 
			
		||||
{-# language LambdaCase #-}
 | 
			
		||||
{-# language OverloadedStrings #-}
 | 
			
		||||
{-# language RecordWildCards #-}
 | 
			
		||||
 | 
			
		||||
module Main ( main ) where
 | 
			
		||||
 | 
			
		||||
@@ -8,6 +9,11 @@ import Control.Exception
 | 
			
		||||
import Control.Monad
 | 
			
		||||
import Control.Monad.IO.Class
 | 
			
		||||
import Control.Monad.Managed
 | 
			
		||||
import Data.Bits ((.|.))
 | 
			
		||||
import Data.IORef
 | 
			
		||||
import Data.List (sortBy)
 | 
			
		||||
import Data.Foldable (traverse_)
 | 
			
		||||
 | 
			
		||||
import DearImGui
 | 
			
		||||
import DearImGui.OpenGL2
 | 
			
		||||
import DearImGui.GLFW
 | 
			
		||||
@@ -40,14 +46,23 @@ main = do
 | 
			
		||||
        -- Initialize ImGui's OpenGL backend
 | 
			
		||||
        _ <- managed_ $ bracket_ openGL2Init openGL2Shutdown
 | 
			
		||||
 | 
			
		||||
        liftIO $ mainLoop win
 | 
			
		||||
        tableRef <- liftIO $ newIORef
 | 
			
		||||
          [ (1,  "foo")
 | 
			
		||||
          , (2,  "bar")
 | 
			
		||||
          , (3,  "baz")
 | 
			
		||||
          , (10, "spam")
 | 
			
		||||
          , (11, "spam")
 | 
			
		||||
          , (12, "spam")
 | 
			
		||||
          ]
 | 
			
		||||
 | 
			
		||||
        liftIO $ mainLoop win tableRef
 | 
			
		||||
      Nothing -> do
 | 
			
		||||
        error "GLFW createWindow failed"
 | 
			
		||||
 | 
			
		||||
  GLFW.terminate
 | 
			
		||||
 | 
			
		||||
mainLoop :: Window -> IO ()
 | 
			
		||||
mainLoop win = do
 | 
			
		||||
mainLoop :: Window -> IORef [(Integer, String)] -> IO ()
 | 
			
		||||
mainLoop win tableRef = do
 | 
			
		||||
  -- Process the event loop
 | 
			
		||||
  GLFW.pollEvents
 | 
			
		||||
  close <- GLFW.windowShouldClose win
 | 
			
		||||
@@ -73,8 +88,9 @@ mainLoop win = do
 | 
			
		||||
          when clicked $
 | 
			
		||||
            closeCurrentPopup
 | 
			
		||||
 | 
			
		||||
    -- Show the ImGui demo window
 | 
			
		||||
    showDemoWindow
 | 
			
		||||
      newLine
 | 
			
		||||
 | 
			
		||||
      mkTable tableRef
 | 
			
		||||
 | 
			
		||||
    -- Render
 | 
			
		||||
    glClear GL_COLOR_BUFFER_BIT
 | 
			
		||||
@@ -84,4 +100,41 @@ mainLoop win = do
 | 
			
		||||
 | 
			
		||||
    GLFW.swapBuffers win
 | 
			
		||||
 | 
			
		||||
    mainLoop win
 | 
			
		||||
    mainLoop win tableRef
 | 
			
		||||
 | 
			
		||||
mkTable :: IORef [(Integer, String)] -> IO ()
 | 
			
		||||
mkTable tableRef =
 | 
			
		||||
  withTableOpen sortable "MyTable" 3 $ do
 | 
			
		||||
    tableSetupColumn "Hello"
 | 
			
		||||
    tableSetupColumnWith defTableColumnOptions "World"
 | 
			
		||||
 | 
			
		||||
    withSortableTable \isDirty sortSpecs ->
 | 
			
		||||
      when (isDirty && not (null sortSpecs)) do
 | 
			
		||||
        -- XXX: do your sorting & cache it. Dont sort every frame.
 | 
			
		||||
        putStrLn "So dirty!"
 | 
			
		||||
        print sortSpecs
 | 
			
		||||
        modifyIORef' tableRef . sortBy $
 | 
			
		||||
          foldMap mkCompare sortSpecs
 | 
			
		||||
 | 
			
		||||
    tableHeadersRow
 | 
			
		||||
    readIORef tableRef >>=
 | 
			
		||||
      traverse_ \(ix, title) -> do
 | 
			
		||||
        tableNextRow
 | 
			
		||||
        tableNextColumn $ text (show ix)
 | 
			
		||||
        tableNextColumn $ text title
 | 
			
		||||
        tableNextColumn $ void (button "♥")
 | 
			
		||||
  where
 | 
			
		||||
    mkCompare TableSortingSpecs{..} a b =
 | 
			
		||||
      let
 | 
			
		||||
        dir = if tableSortingReverse then flip else id
 | 
			
		||||
      in
 | 
			
		||||
        case tableSortingColumn of
 | 
			
		||||
          0 -> dir compare (fst a) (fst b)
 | 
			
		||||
          1 -> dir compare (snd a) (snd b)
 | 
			
		||||
          _ -> EQ
 | 
			
		||||
 | 
			
		||||
    sortable = defTableOptions
 | 
			
		||||
      { tableFlags =
 | 
			
		||||
          ImGuiTableFlags_Sortable .|.
 | 
			
		||||
          ImGuiTableFlags_SortMulti
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user