-- | -- Maintainer: Henning Guenther -- -- A module containing a widget to create new channels. module Barracuda.GUI.ChannelCreator (ChannelCreator() ,channelCreatorNew ,channelCreatorGetWidget ,channelCreatorOnEnter ) where import Data.IORef import Graphics.UI.Gtk -- | A widget to create new channels. data ChannelCreator = ChanCreator Table (IORef (String -> String -> Bool -> IO ())) -- | Initiates a new 'ChannelCreator'. channelCreatorNew :: IO ChannelCreator channelCreatorNew = do cb <- newIORef (\_ _ _ -> return ()) tab <- tableNew 5 2 False lblName <- labelNew (Just "Channelname:") lblName `set` [miscXalign:=0,labelUseMarkup:=True] entrName <- entryNew lblDescr <- labelNew (Just "Description:") lblDescr `set` [miscXalign:=0,labelUseMarkup:=True] entrDescr <- entryNew lblType <- labelNew (Just "Channeltype:") lblType `set` [miscXalign:=0,labelUseMarkup:=True] optPub <- radioButtonNewWithLabel "public" optPriv <- radioButtonNewWithLabelFromWidget optPub "private" butOk <- buttonNewFromStock stockAdd let rcb = do f <- readIORef cb name <- entrName `get` entryText descr <- entrDescr `get` entryText priv <- optPriv `get` toggleButtonActive f name descr priv butOk `onClicked` rcb tab `onKeyPress` (\ev -> case eventKeyName ev of "Return" -> rcb >> return True _ -> return False) entrName `onKeyPress` (\ev -> case eventKeyName ev of "Return" -> rcb >> return True _ -> return False) entrDescr `onKeyPress` (\ev -> case eventKeyName ev of "Return" -> rcb >> return True _ -> return False) butBox <- hButtonBoxNew butBox `set` [buttonBoxLayoutStyle:=ButtonboxEnd] boxPackStart butBox butOk PackNatural 0 tableAttach tab lblName 0 1 0 1 [Fill] [Fill] 5 0 tableAttach tab lblDescr 0 1 1 2 [Fill] [Fill] 5 0 tableAttach tab lblType 0 1 2 4 [Fill] [Fill] 5 0 tableAttach tab entrName 1 2 0 1 [Expand,Fill] [Fill] 0 0 tableAttach tab entrDescr 1 2 1 2 [Expand,Fill] [Fill] 0 0 tableAttach tab optPub 1 2 2 3 [Fill] [Fill] 0 0 tableAttach tab optPriv 1 2 3 4 [Fill] [Fill] 0 0 tableAttach tab butBox 0 2 4 5 [Fill] [Fill] 0 0 return (ChanCreator tab cb) -- | Sets the callback for a 'ChannelCreator'. It is called with channel name, -- channel description and private flag, when the user confirms the data. channelCreatorOnEnter :: ChannelCreator -> (String -> String -> Bool -> IO ()) -> IO () channelCreatorOnEnter (ChanCreator _ cb) f = writeIORef cb f -- | Returns the 'Widget' associated with a 'ChannelCreator'. channelCreatorGetWidget :: ChannelCreator -> Widget channelCreatorGetWidget (ChanCreator tab _) = toWidget tab