packages feed

systranything-0.1.3.0: lib/Model/Checkbox.hs

{-# LANGUAGE TemplateHaskell #-}

module Model.Checkbox (Checkbox (..), newItem) where

import Control.Monad (void)
import Data.Aeson.TH (deriveJSON)
import Data.Text (Text)
import Data.Text qualified as T
import Foreign.C (CULong)
import GHC.Generics (Generic)
import GI.GObject qualified as GObject
import GI.Gtk qualified as Gtk
import Model.Common (runCommand)
import Model.Internal (options)

data Checkbox = MkCheckbox
  { chLabel :: Text,
    chOnClick :: Text,
    chOnGetStatus :: Text
  }
  deriving stock (Eq, Generic, Show)

$(deriveJSON options ''Checkbox)

newItem :: Bool -> Checkbox -> IO (Gtk.CheckMenuItem, IO ())
newItem verbose MkCheckbox {..} = do
  item <- Gtk.checkMenuItemNewWithLabel chLabel

  signalId <- runCommandOnToggle verbose chOnClick item

  pure (item, updateAction item signalId)
  where
    updateAction item signalId = do
      mbOutput <- runCommand verbose chOnGetStatus
      let active = maybe False (not . T.null) mbOutput
      GObject.signalHandlerBlock item signalId
      Gtk.checkMenuItemSetActive item active
      GObject.signalHandlerUnblock item signalId

runCommandOnToggle :: Bool -> Text -> Gtk.CheckMenuItem -> IO CULong
runCommandOnToggle verbose command item =
  Gtk.on item #toggled $ void $ runCommand verbose command