module LGtk
(
Category (..)
, Tensor (..)
, liftM
, liftM2
, liftM3
, when
, Lens (Lens)
, lens
, iso
, runLens
, getL
, setL
, modL
, fstLens
, sndLens
, listLens
, maybeLens
, showLens
, Morph
, HasReadPart (..)
, Reference
, RefMonad
, ReadRefMonad
, readRef
, writeRef
, lensMap
, joinRef
, unitRef
, ExtRef
, Ref
, extRef
, newRef
, ReadRef
, WriteRef
, liftReadRef
, modRef
, readRef'
, memoRead
, undoTr
, EqReference (..)
, EqRef
, eqRef
, newEqRef
, toRef
, EffRef
, onChange
, SafeIO
, getArgs
, getProgName
, lookupEnv
, EffIORef
, asyncWrite
, putStr_
, getLine_
, fileRef
, putStrLn_
, Widget
, runWidget
, label
, checkbox
, combobox
, entry
, vcat
, hcat
, button_
, Color (..)
, notebook
, cell_
, action
, empty
, entryShow
, button
, smartButton
, cell
, cellNoMemo
, button__
) where
import Data.Maybe
import Control.Category
import Control.Category.Product
import Control.Concurrent
import Control.Monad
import Control.Monad.State
import Control.Monad.Trans.Identity
import Prelude hiding ((.), id)
import Data.Lens.Common
import Control.Monad.ExtRef
import Control.Monad.Register
import Control.Monad.Register.Basic
import Control.Monad.EffRef
import GUI.Gtk.Structures hiding (Send, Receive, SendReceive, Widget)
import qualified GUI.Gtk.Structures as Gtk
import qualified GUI.Gtk.Structures.IO as Gtk
import Control.Monad.ExtRef.Pure
import Control.Monad.Restricted
type Widget m = Gtk.Widget (EffectM m) m
runWidget :: (forall m . EffIORef m => Widget m) -> IO ()
runWidget desc = do
postActionsRef <- newRef' $ return ()
let addPostAction = runMorphD postActionsRef . modify . flip (>>)
runPostActions = join $ runMorphD postActionsRef $ state $ \m -> (m, return ())
actionChannel <- newChan
_ <- forkIO $ forever $ do
join $ readChan actionChannel
runPostActions
Gtk.gtkContext $ \postGUISync -> do
widget <- runExtRef_ $ unliftIO $ \unlift ->
evalRegister
(runIdentityT $ Gtk.runWidget unlift addPostAction postGUISync desc)
(liftIO . writeChan actionChannel . unlift)
runPostActions
return widget
vcat :: [Widget m] -> Widget m
vcat = List Vertical
hcat :: [Widget m] -> Widget m
hcat = List Horizontal
empty :: Widget m
empty = hcat []
label :: EffRef m => ReadRef m String -> Widget m
label = Label . rEffect True
button__
:: EffRef m
=> ReadRef m String
-> ReadRef m Bool
-> ReadRef m Color
-> WriteRef m ()
-> Widget m
button__ r x c y = Button (rEffect True r) (rEffect True x) (rEffect True c) (toReceive $ \() -> y)
button_
:: EffRef m
=> ReadRef m String
-> ReadRef m Bool
-> WriteRef m ()
-> Widget m
button_ r x y = Button (rEffect True r) (rEffect True x) (const $ return ()) (toReceive $ \() -> y)
button
:: EffRef m
=> ReadRef m String
-> ReadRef m (Maybe (WriteRef m ()))
-> Widget m
button r fm = button_ r (liftM isJust fm) (liftReadPart fm >>= maybe (return ()) id)
smartButton
:: (EffRef m, EqReference r, RefMonad r ~ RefMonad (Ref m))
=> ReadRef m String
-> r a
-> (a -> a)
-> Widget m
smartButton s r f
= button_ s (hasEffect r f) (modRef r f)
checkbox :: EffRef m => Ref m Bool -> Widget m
checkbox r = Checkbox (rEffect True (readRef r), toReceive $ writeRef r)
combobox :: EffRef m => [String] -> Ref m Int -> Widget m
combobox ss r = Combobox ss (rEffect True (readRef r), toReceive $ writeRef r)
entry :: (EffRef m, Reference r, RefMonad r ~ RefMonad (Ref m)) => r String -> Widget m
entry r = Entry (rEffect True (readRef r), toReceive $ writeRef r)
entryShow :: (EffRef m, Show a, Read a, Reference r, RefMonad r ~ RefMonad (Ref m)) => r a -> Widget m
entryShow r = entry $ showLens `lensMap` r
notebook :: EffRef m => [(String, Widget m)] -> Widget m
notebook xs = Action $ do
currentPage <- newRef 0
let f index (title, w) = (,) title $ cell (liftM (== index) $ readRef currentPage) $ \b -> case b of
False -> hcat []
True -> w
return $ Notebook' (toReceive $ writeRef currentPage) $ zipWith f [0..] xs
cell_ :: (EffRef m, Eq a) => ReadRef m a -> (forall x . (Widget m -> m x) -> a -> m (m x)) -> Widget m
cell_ = Cell . onChange True
cell :: (EffRef m, Eq a) => ReadRef m a -> (a -> Widget m) -> Widget m
cell r m = cell_ r $ \mk -> liftM return . mk . m
cellNoMemo :: (EffRef m, Eq a) => ReadRef m a -> (a -> Widget m) -> Widget m
cellNoMemo r m = cell_ r $ \mk -> return . mk . m
action :: EffRef m => m (Widget m) -> Widget m
action = Action