@@ -570,21 +570,36 @@ arrowButton strId dir = liftIO do
570570 withCString strId \ strIdPtr ->
571571 Raw. arrowButton strIdPtr dir
572572
573-
574573-- | Wraps @ImGui::Checkbox()@.
575574checkbox :: (HasSetter ref Bool , HasGetter ref Bool , MonadIO m ) => String -> ref -> m Bool
576- checkbox label ref = liftIO do
577- currentValue <- get ref
575+ checkbox label ref = stateful ref $ checkboxM label
576+
577+ {-# INLINEABLE stateful #-}
578+ stateful
579+ :: (HasGetter t a , MonadIO m , HasSetter t a )
580+ => t -> (a -> m (Maybe a )) -> m Bool
581+ stateful ref action = get ref >>= action >>= maybeSet ref
582+
583+ {-# INLINEABLE maybeSet #-}
584+ maybeSet :: (HasSetter t a , MonadIO f ) => t -> Maybe a -> f Bool
585+ maybeSet ref = \ case
586+ Nothing ->
587+ pure False
588+ Just val -> do
589+ ref $=! val
590+ pure True
591+
592+ -- | Wraps @ImGui::Checkbox()@.
593+ checkboxM :: (MonadIO m ) => String -> Bool -> m (Maybe Bool )
594+ checkboxM label currentValue = liftIO do
578595 with (bool 0 1 currentValue) \ boolPtr -> do
579596 changed <- withCString label \ labelPtr ->
580597 Raw. checkbox labelPtr boolPtr
581598
582- when changed do
583- newValue <- peek boolPtr
584- ref $=! (newValue == 1 )
585-
586- return changed
587-
599+ if changed then
600+ (Just . (/=) 0 ) <$> peek boolPtr
601+ else
602+ pure Nothing
588603
589604progressBar :: MonadIO m => Float -> Maybe String -> m ()
590605progressBar progress overlay = liftIO do
0 commit comments