@@ -183,6 +183,37 @@ module DearImGui
183
183
, colorPicker3
184
184
, colorButton
185
185
186
+ -- ** Tables
187
+ , beginTable
188
+ , Raw. endTable
189
+ , withTable
190
+ , TableOptions (.. )
191
+ , defTableOptions
192
+ , tableNextRow
193
+ , tableNextRowWith
194
+ , TableRowOptions (.. )
195
+ , defTableRowOptions
196
+ , Raw. tableNextColumn
197
+ , tableSetColumnIndex
198
+
199
+ , tableSetupColumn
200
+ , TableColumnOptions (.. )
201
+ , defTableColumnOptions
202
+ , tableSetupScrollFreeze
203
+ , Raw. tableHeadersRow
204
+ , Raw. tableHeader
205
+
206
+ , withSortableTable
207
+ , TableSortingSpecs (.. )
208
+
209
+ , tableGetColumnCount
210
+ , tableGetColumnIndex
211
+ , tableGetRowIndex
212
+ , tableGetColumnName
213
+ , tableGetColumnFlags
214
+ , tableSetColumnEnabled
215
+ , tableSetBgColor
216
+
186
217
-- ** Trees
187
218
, treeNode
188
219
, treePush
@@ -1274,6 +1305,203 @@ colorButton desc ref = liftIO do
1274
1305
1275
1306
return changed
1276
1307
1308
+ data TableOptions = TableOptions
1309
+ { tableFlags :: ImGuiTableFlags
1310
+ , outerSize :: ImVec2
1311
+ , innerWidth :: Float
1312
+ } deriving Show
1313
+
1314
+ defTableOptions :: TableOptions
1315
+ defTableOptions = TableOptions (ImGuiTableFlags 0 ) (ImVec2 0 0 ) 0
1316
+
1317
+ -- | Wraps @ImGui::BeginTable()@.
1318
+ beginTable :: MonadIO m => TableOptions -> String -> Int -> m Bool
1319
+ beginTable (TableOptions flags outer inner) label columns = liftIO do
1320
+ withCString label $ \ l ->
1321
+ with outer $ \ o ->
1322
+ Raw. beginTable l (fromIntegral columns) flags o (CFloat inner)
1323
+
1324
+ -- | Create a table.
1325
+ --
1326
+ -- The action will get 'False' if the entry is not visible.
1327
+ --
1328
+ -- ==== __Example usage:__
1329
+ --
1330
+ -- > withTable defTableOptions "MyTable" 2 $ \case
1331
+ -- > False -> return ()
1332
+ -- > True -> do
1333
+ -- > tableSetupColumn "Hello"
1334
+ -- > tableSetupColumn "World"
1335
+ -- > tableHeadersRow
1336
+ -- > forM_ [("a","1"),("b","2")] $\(a,b)
1337
+ -- > tableNextRow
1338
+ -- > whenM tableNextColumn (text a)
1339
+ -- > whenM tableNextColumn (text b)
1340
+ --
1341
+ -- Displays:
1342
+ --
1343
+ -- @
1344
+ -- | Hello | World |
1345
+ -- +-------+-------+
1346
+ -- | a | 1 |
1347
+ -- | b | 2 |
1348
+ -- @
1349
+ --
1350
+ withTable :: MonadUnliftIO m => TableOptions -> String -> Int -> (Bool -> m a ) -> m a
1351
+ withTable options label columns =
1352
+ bracket (beginTable options label columns) (`when` Raw. endTable)
1353
+
1354
+ -- | Wraps @ImGui::TableNextRow()@ with 'defTableRowOptions'.
1355
+ -- append into the first cell of a new row.
1356
+ tableNextRow :: MonadIO m => m ()
1357
+ tableNextRow = tableNextRowWith defTableRowOptions
1358
+
1359
+ data TableRowOptions = TableRowOptions
1360
+ { tableRowFlags :: ImGuiTableRowFlags
1361
+ , minRowHeight :: Float
1362
+ } deriving Show
1363
+
1364
+ defTableRowOptions :: TableRowOptions
1365
+ defTableRowOptions = TableRowOptions (ImGuiTableRowFlags 0 ) 0
1366
+
1367
+ -- | Wraps @ImGui::TableNextRow()@ with explicit options.
1368
+ tableNextRowWith :: MonadIO m => TableRowOptions -> m ()
1369
+ tableNextRowWith (TableRowOptions flags minHeight) = liftIO do
1370
+ Raw. tableNextRow flags (CFloat minHeight)
1371
+
1372
+ -- | Wraps @ImGui::TableSetColumnIndex()@.
1373
+ -- append into the specified column. Return true when column is visible.
1374
+ tableSetColumnIndex :: MonadIO m => Int -> m Bool
1375
+ tableSetColumnIndex column = liftIO do
1376
+ Raw. tableSetColumnIndex (fromIntegral column)
1377
+
1378
+
1379
+ data TableColumnOptions = TableColumnOptions
1380
+ { tableColumnFlags :: ImGuiTableColumnFlags
1381
+ , initWidthOrWeight :: Float
1382
+ , userId :: ImGuiID
1383
+ } deriving Show
1384
+
1385
+ defTableColumnOptions :: TableColumnOptions
1386
+ defTableColumnOptions = TableColumnOptions (ImGuiTableColumnFlags 0 ) 0 0
1387
+
1388
+ -- | Wraps @ImGui::TableSetupColumn()@ using 'defTableColumnOptions'.
1389
+ tableSetupColumn :: MonadIO m => String -> m ()
1390
+ tableSetupColumn = tableSetupColumnWith defTableColumnOptions
1391
+
1392
+ -- | Wraps @ImGui::TableSetupColumn() with explicit options@.
1393
+ tableSetupColumnWith :: MonadIO m => TableColumnOptions -> String -> m ()
1394
+ tableSetupColumnWith (TableColumnOptions flags weight userId) label = liftIO do
1395
+ withCString label $ \ l ->
1396
+ Raw. tableSetupColumn l flags (CFloat weight) userId
1397
+
1398
+ -- | Wraps @ImGui::TableSetupScrollFreeze()@.
1399
+ -- lock columns/rows so they stay visible when scrolled.
1400
+ tableSetupScrollFreeze :: MonadIO m => Int -> Int -> m ()
1401
+ tableSetupScrollFreeze cols rows = liftIO do
1402
+ Raw. tableSetupScrollFreeze (fromIntegral cols) (fromIntegral rows)
1403
+
1404
+ data TableSortingSpecs = TableSortingSpecs
1405
+ { tableSortingId :: ImGuiID -- ^ User id of the column (if specified by a TableSetupColumn() call)
1406
+ , tableSortingColumn :: Int -- ^ Index of the column, starting at 0
1407
+ , dableSortingOrder :: Int -- ^ Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here).
1408
+ -- On 'ImGuiTableFlags_SortMulti' this is the order in which should be sorted.
1409
+ , tableSortingDirection :: ImGuiSortDirection -- ^ 'ImGuiSortDirection_Ascending' or 'ImGuiSortDirection_Descending'. Should not be 'ImGuiSortDirection_None'
1410
+ } deriving (Show , Eq )
1411
+
1412
+ -- | High-Level sorting. Returns of the underlying data should be sorted
1413
+ -- and to what specification. Number of Specifications is mostly 0 or 1, but
1414
+ -- can be more if 'ImGuiTableFlags_SortMulti' is enabled on the table.
1415
+ --
1416
+ -- The Bool only fires true for one frame on each sorting event and resets
1417
+ -- automatically.
1418
+ --
1419
+ -- Must be called AFTER all columns are set up with 'tableSetupColumn'
1420
+ --
1421
+ -- Hint: Don't forget to set 'ImGuiTableFlags_Sortable' to enable sorting
1422
+ -- on tables.
1423
+ --
1424
+ -- ==== __Example usage:__
1425
+ --
1426
+ -- > withTable defTableOptions "MyTable" 2 $ \case
1427
+ -- > False -> return ()
1428
+ -- > True -> do
1429
+ -- > tableSetupColumn "Hello"
1430
+ -- > tableSetupColumn "World"
1431
+ -- > withSortableTable $ \(mustSort, sortSpecs) do
1432
+ -- > when mustSort $
1433
+ -- > -- ... do your sorting here & cache it. Dont sort every frame.
1434
+ -- > tableHeadersRow
1435
+ -- > forM_ [("a","1"),("b","2")] $\(a,b) -- use sorted data here.
1436
+ -- > tableNextRow
1437
+ -- > whenM tableNextColumn (text a)
1438
+ -- > whenM tableNextColumn (text b)
1439
+ withSortableTable :: MonadIO m => ((Bool ,[TableSortingSpecs ]) -> m a ) -> m a
1440
+ withSortableTable action = do
1441
+ specsPtr <- liftIO $ Raw. tableGetSortSpecs
1442
+ case specsPtr of
1443
+ Nothing -> action (False , [] )
1444
+ Just ptr -> do
1445
+ specs <- liftIO $ peek ptr
1446
+ cSpecs <- liftIO $ peekArray (fromIntegral $ imGuiTableSortSpecsCount specs) (imGuiTableColumnSortSpecs specs)
1447
+
1448
+ -- just map singed 16-bit-int to something nice for the end-user
1449
+ let cSpecs' = (\ (ImGuiTableColumnSortSpecs a b c d) -> TableSortingSpecs a (fromIntegral b) (fromIntegral c) d) <$> cSpecs
1450
+
1451
+ result <- action (imGuiTableSortSpecsDirty specs /= 0 , cSpecs')
1452
+ -- set dirty to 0 after everything is done.
1453
+ liftIO $ poke (ptr `plusPtr` (sizeOf (imGuiTableColumnSortSpecs specs)) `plusPtr` (sizeOf (imGuiTableSortSpecsCount specs))) (0 :: CInt )
1454
+ return result
1455
+
1456
+ -- | Wraps @ImGui::TableGetColumnCount()@.
1457
+ -- return number of columns (value passed to BeginTable)
1458
+ tableGetColumnCount :: MonadIO m => m Int
1459
+ tableGetColumnCount =
1460
+ fromIntegral <$> Raw. tableGetColumnCount
1461
+
1462
+ -- | Wraps @ImGui::TableGetColumnIndex()@.
1463
+ -- return current column index.
1464
+ tableGetColumnIndex :: MonadIO m => m Int
1465
+ tableGetColumnIndex =
1466
+ fromIntegral <$> Raw. tableGetColumnIndex
1467
+
1468
+ -- | Wraps @ImGui::TableGetRowIndex()@.
1469
+ -- return current row index
1470
+ tableGetRowIndex :: MonadIO m => m Int
1471
+ tableGetRowIndex =
1472
+ fromIntegral <$> Raw. tableGetRowIndex
1473
+
1474
+ -- | Wraps @ImGui::TableGetColumnName
1475
+ -- returns "" if column didn't have a name declared by TableSetupColumn
1476
+ -- 'Nothing' returns the current column name
1477
+ tableGetColumnName :: MonadIO m => Maybe Int -> m String
1478
+ tableGetColumnName c = liftIO do
1479
+ Raw. tableGetColumnName (fromIntegral <$> c) >>= peekCString
1480
+
1481
+ -- | Wraps @ImGui::TableGetRowIndex()@.
1482
+ -- return column flags so you can query their Enabled/Visible/Sorted/Hovered
1483
+ -- status flags.
1484
+ -- 'Nothing' returns the current column flags
1485
+ tableGetColumnFlags :: MonadIO m => Maybe Int -> m ImGuiTableColumnFlags
1486
+ tableGetColumnFlags =
1487
+ Raw. tableGetColumnFlags . fmap fromIntegral
1488
+
1489
+ -- | Wraps @ImGui::TableSetColumnEnabled()@.
1490
+ -- change user accessible enabled/disabled state of a column. Set to false to
1491
+ -- hide the column. User can use the context menu to change this themselves
1492
+ -- (right-click in headers, or right-click in columns body with
1493
+ -- 'ImGuiTableFlags_ContextMenuInBody')
1494
+ tableSetColumnEnabled :: MonadIO m => Int -> Bool -> m ()
1495
+ tableSetColumnEnabled column_n v =
1496
+ Raw. tableSetColumnEnabled (fromIntegral column_n) (bool 0 1 v)
1497
+
1498
+ -- | Wraps @ImGui::TableSetBgColor()@.
1499
+ -- change the color of a cell, row, or column.
1500
+ -- See 'ImGuiTableBgTarget' flags for details.
1501
+ -- 'Nothing' sets the current row/column color
1502
+ tableSetBgColor :: MonadIO m => ImGuiTableBgTarget -> ImU32 -> Maybe Int -> m ()
1503
+ tableSetBgColor target color column_n =
1504
+ Raw. tableSetBgColor target color (fromIntegral <$> column_n)
1277
1505
1278
1506
-- | Wraps @ImGui::TreeNode()@.
1279
1507
treeNode :: MonadIO m => String -> m Bool
0 commit comments