@@ -570,21 +570,58 @@ arrowButton strId dir = liftIO do
570
570
withCString strId \ strIdPtr ->
571
571
Raw. arrowButton strIdPtr dir
572
572
573
-
574
573
-- | Wraps @ImGui::Checkbox()@.
575
574
checkbox :: (HasSetter ref Bool , HasGetter ref Bool , MonadIO m ) => String -> ref -> m Bool
576
- checkbox label ref = liftIO do
577
- currentValue <- get ref
578
- with (bool 0 1 currentValue) \ boolPtr -> do
579
- changed <- withCString label \ labelPtr ->
580
- Raw. checkbox labelPtr boolPtr
581
-
582
- when changed do
583
- newValue <- peek boolPtr
584
- ref $=! (newValue == 1 )
585
-
586
- return changed
575
+ checkbox label ref = stateful ref $ checkboxM label
587
576
577
+ -- | Wraps @ImGui::Checkbox()@.
578
+ checkboxM :: (MonadIO m ) => String -> Bool -> m (Maybe Bool )
579
+ checkboxM label currentValue =
580
+ changing
581
+ (bool 0 1 currentValue)
582
+ ( \ valuePtr ->
583
+ withCString label \ labelPtr ->
584
+ Raw. checkbox labelPtr valuePtr
585
+ )
586
+ (pure . (/=) 0 )
587
+
588
+ {-# INLINEABLE changing #-}
589
+ changing
590
+ :: (MonadIO m , Storable a1 )
591
+ => a1
592
+ -> (Ptr a1 -> IO Bool )
593
+ -> (a1 -> IO a2 )
594
+ -> m (Maybe a2 )
595
+ changing oldValue action extract = liftIO do
596
+ with oldValue \ valuePtr ->
597
+ action valuePtr >>=
598
+ peekChanged valuePtr extract
599
+
600
+ {-# INLINEABLE peekChanged #-}
601
+ peekChanged
602
+ :: (MonadIO m , Storable a1 )
603
+ => Ptr a1 -> (a1 -> m a2 ) -> Bool -> m (Maybe a2 )
604
+ peekChanged ptr action flag = do
605
+ if flag then
606
+ liftIO (peek ptr) >>=
607
+ fmap Just . action
608
+ else
609
+ pure Nothing
610
+
611
+ {-# INLINEABLE stateful #-}
612
+ stateful
613
+ :: (HasGetter t a , MonadIO m , HasSetter t a )
614
+ => t -> (a -> m (Maybe a )) -> m Bool
615
+ stateful ref action = get ref >>= action >>= maybeSet ref
616
+
617
+ {-# INLINEABLE maybeSet #-}
618
+ maybeSet :: (HasSetter t a , MonadIO f ) => t -> Maybe a -> f Bool
619
+ maybeSet ref = \ case
620
+ Nothing ->
621
+ pure False
622
+ Just val -> do
623
+ ref $=! val
624
+ pure True
588
625
589
626
progressBar :: MonadIO m => Float -> Maybe String -> m ()
590
627
progressBar progress overlay = liftIO do
0 commit comments