gtk2hs-rpn-0.0.2: src/Graphics/UI/Gtk/Layout/Rpn.hs
module Graphics.UI.Gtk.Layout.Rpn where { import Graphics.UI.Gtk hiding
( get ) ; import qualified Data.Word ; import Data.Monoid ; import
Control.Monad.State ;
import Graphics.UI.Gtk.Types ;
import Graphics.Rendering.Cairo ;
import Graphics.UI.Gtk.Gdk.EventM ;
import Data.IORef ;
import Data.Maybe ;
import Data.List ;
import Graphics.UI.Gtk.Layout.Rpn.CanBeCasted ;
doNothing :: (Monad m) => m () ;
doNothing = return () ;
maybeDoNothing :: (Monad m) => Maybe a -> ( a -> m b ) -> m () ;
maybeDoNothing a f = maybe doNothing f' a
where { f' a = f a >> doNothing } ;
type ActionType a = StateT [ Widget ] IO a ;
pushWidget :: ( WidgetClass w ) => w -> ActionType () ;
pushWidget w = modify ( toWidget w : ) ;
touchWidget :: ( CanBeCasted a ) => ( a -> IO b ) -> ActionType () ;
touchWidget f = do {
w <- ( liftM $ take 1 ) get ;
case mapMaybe glibCast w of {
[ w' ] -> liftIO $ f w' >> doNothing ;
_ -> doNothing
}
} ;
reachWidget :: ( CanBeCasted a ) => Int -> ActionType ( Maybe a ) ;
reachWidget n = do {
s <- get ;
return $ if length s > n
then glibCast ( s !! n )
else Nothing
} ;
pullWidget :: ( CanBeCasted a , CanBeCasted b ) =>
( a -> b -> IO c ) -> ActionType () ;
pullWidget f = do {
w0 <- reachWidget 0 ;
w1 <- reachWidget 1 ;
case ( w0 , w1 ) of {
( Just w0' , Just w1' ) -> do {
liftIO $ f w0' w1' ;
( s : ss ) <- get ;
put $ s : drop 1 ss
} ;
_ -> doNothing
}
} ;
pullWidget3 :: ( CanBeCasted a , CanBeCasted b , CanBeCasted c ,
CanBeCasted d ) => ( a -> b -> c -> d -> IO e ) -> ActionType () ;
pullWidget3 f = do {
w0 <- reachWidget 0 ;
w1 <- reachWidget 1 ;
w2 <- reachWidget 2 ;
w3 <- reachWidget 3 ;
case ( w0 , w1 , w2 , w3 ) of {
( Just w0 , Just w1 , Just w2 , Just w3 ) -> do {
liftIO $ f w0 w1 w2 w3 ;
( s : ss ) <- get ;
put $ s : drop 3 ss
} ;
_ -> doNothing
}
} ;
newtype RPN = RPN ( ActionType () ) ;
instance Monoid RPN where { mempty = RPN doNothing ; mappend ( RPN
rpn1 ) ( RPN rpn2 ) = RPN $ rpn1 >> rpn2 } ;
widgetsFromRpn :: RPN -> IO [ Widget ] ;
widgetsFromRpn ( RPN rpn ) = ( liftM $ reverse ) ( execStateT rpn [] ) ;
io2rpn :: ( WidgetClass w ) => IO w -> RPN ;
io2rpn = RPN . ( >>= pushWidget ) . liftIO ;
cWID = RPN . pushWidget ;
cACL = io2rpn . accelLabelNew ;
cALN = ((( io2rpn .).).). alignmentNew ;
cARW = ( io2rpn .). arrowNew ;
cAFR = (( io2rpn .).). aspectFrameNew ;
cBTN = io2rpn buttonNew ;
cBTNSTK = io2rpn . buttonNewFromStock ;
cBTNL = io2rpn . buttonNewWithLabel ;
cBTNMNM = io2rpn . buttonNewWithMnemonic ;
cCLD = io2rpn calendarNew ;
cCVW = io2rpn cellViewNew ;
cCVWPIX = io2rpn . cellViewNewWithPixbuf ;
cCVWMRK = io2rpn . cellViewNewWithMarkup ;
cCVWTXT = io2rpn . cellViewNewWithText ;
cBTNCHK = io2rpn checkButtonNew ;
cBTNCHKL = io2rpn . checkButtonNewWithLabel ;
cBTNCHKMNM = io2rpn . checkButtonNewWithMnemonic ;
cMENCHKIT = io2rpn checkMenuItemNew ;
cMENCHKITL = io2rpn . checkMenuItemNewWithLabel ;
cMENCHKITMNM = io2rpn . checkMenuItemNewWithMnemonic ;
cBTNCLR = io2rpn colorButtonNew ;
cBTNCLRCL = io2rpn . colorButtonNewWithColor ;
cCLRSEL = io2rpn colorSelectionNew ;
cCMBENY = io2rpn comboBoxEntryNew ;
cCMBENYTXT = io2rpn comboBoxEntryNewText ;
cCMBENYMDL = io2rpn . comboBoxEntryNewWithModel ;
cCMB = io2rpn comboBoxNew ;
cCMBTXT = io2rpn comboBoxNewText ;
cCMBMDL = io2rpn . comboBoxNewWithModel ;
cDRW = io2rpn drawingAreaNew ;
cENY = io2rpn entryNew ;
cEVN = io2rpn eventBoxNew ;
cEXN = io2rpn . expanderNew ;
cEXNMNM = io2rpn . expanderNewWithMnemonic ;
cBTNFLE = ( io2rpn .). fileChooserButtonNew ;
cFLESEL = io2rpn . fileChooserWidgetNew ;
cFXD = io2rpn fixedNew ;
cBTNFON = io2rpn fontButtonNew ;
cBTNFONFN = io2rpn . fontButtonNewWithFont ;
cFONSEL = io2rpn fontSelectionNew ;
cFRM = io2rpn frameNew ;
cHBX = ( io2rpn .). hBoxNew ;
cHBXBTN = io2rpn hButtonBoxNew ;
cHPD = io2rpn hPanedNew ;
cHSC = io2rpn . hScaleNew ;
cHSCRNG = (( io2rpn .).). hScaleNewWithRange ;
cHSB = io2rpn . hScrollbarNew ;
cHSBDF = io2rpn hScrollbarNewDefaults ;
cHSP = io2rpn hSeparatorNew ;
cHNB = io2rpn handleBoxNew ;
cIVW = io2rpn iconViewNew ;
cIVWMDL = io2rpn . iconViewNewWithModel ;
cMENIMGIT = io2rpn imageMenuItemNew ;
cMENIMGITSTK = io2rpn . imageMenuItemNewFromStock ;
cMENIMGITL = io2rpn . imageMenuItemNewWithLabel ;
cMENIMGITMNM = io2rpn . imageMenuItemNewWithMnemonic ;
cIMG = io2rpn imageNew ;
cIMGFLE = io2rpn . imageNewFromFile ;
cIMGICN = ( io2rpn .). imageNewFromIconName ;
cIMGPIX = io2rpn . imageNewFromPixbuf ;
cIMGSTK = ( io2rpn .). imageNewFromStock ;
cLBL = io2rpn . labelNew ;
cLBLMNM = io2rpn . labelNewWithMnemonic ;
cLAY = ( io2rpn .). layoutNew ;
cMENBAR = io2rpn menuBarNew ;
cMENIT = io2rpn menuItemNew ;
cMENITL = io2rpn . menuItemNewWithLabel ;
cMENITMNM = io2rpn . menuItemNewWithMnemonic ;
cMEN = io2rpn menuNew ;
cMENTBN = ( io2rpn .). menuToolButtonNew ;
cMENTBNSTK = io2rpn . menuToolButtonNewFromStock ;
cNBK = io2rpn notebookNew ;
cPRB = io2rpn progressBarNew ;
cBTNRDI = io2rpn radioButtonNew ;
cBTNRDIWID = io2rpn . radioButtonNewFromWidget ;
cBTNRDIL = io2rpn . radioButtonNewWithLabel ;
cBTNRDILWID = ( io2rpn .). radioButtonNewWithLabelFromWidget ;
cBTNRDIMNM = io2rpn . radioButtonNewWithMnemonic ;
cBTNRDIMNMWID = ( io2rpn .). radioButtonNewWithMnemonicFromWidget ;
cMENRDIIT = io2rpn radioMenuItemNew ;
cMENRDIITWID = io2rpn . radioMenuItemNewFromWidget ;
cMENRDIITL = io2rpn . radioMenuItemNewWithLabel ;
cMENRDIITLWID = ( io2rpn .). radioMenuItemNewWithLabelFromWidget ;
cMENRDIMNM = io2rpn . radioMenuItemNewWithMnemonic ;
cMENRDIMNMWID = ( io2rpn .). radioMenuItemNewWithMnemonicFromWidget ;
cTBNRDI = io2rpn radioToolButtonNew ;
cTBNRDISTK = io2rpn . radioToolButtonNewFromStock ;
cTBNRDIWID = io2rpn . radioToolButtonNewFromWidget ;
cTBNRDISTKWID = ( io2rpn .). radioToolButtonNewWithStockFromWidget ;
cSRL = ( io2rpn .). scrolledWindowNew ;
cMENITSP = io2rpn separatorMenuItemNew ;
cTLBITSP = io2rpn separatorToolItemNew ;
cSKT = io2rpn socketNew ;
cBTNSPI = (( io2rpn .).). spinButtonNew ;
cBTNSPIRNG = (( io2rpn .).). spinButtonNewWithRange ;
cSTU = io2rpn statusbarNew ;
cTBL = (( io2rpn .).). tableNew ;
cMENITTF = io2rpn tearoffMenuItemNew ;
cXVW = io2rpn textViewNew ;
cTVWBF = io2rpn . textViewNewWithBuffer ;
cBTNTGL = io2rpn toggleButtonNew ;
cBTNTGLL = io2rpn . toggleButtonNewWithLabel ;
cBTNTGLMNM = io2rpn . toggleButtonNewWithMnemonic ;
cTLBITTLG = io2rpn toggleToolButtonNew ;
cTLBITTLGSTK = io2rpn . toggleToolButtonNewFromStock ;
cTLBITBTN = ( io2rpn .). toolButtonNew ;
cTLBITBTNSTK = io2rpn . toolButtonNewFromStock ;
cTLBIT = io2rpn toolItemNew ;
cTLB = io2rpn toolbarNew ;
cRVW = io2rpn treeViewNew ;
cRVWMDL = io2rpn . treeViewNewWithModel ;
cVBX = ( io2rpn .). vBoxNew ;
cVBXBTN = io2rpn vButtonBoxNew ;
cVPD = io2rpn vPanedNew ;
cVSC = io2rpn . vScaleNew ;
cVSCRNG = (( io2rpn .).). vScaleNewWithRange ;
cVSB = io2rpn . vScrollbarNew ;
cVSBDF = io2rpn vScrollbarNewDefaults ;
cVSP = io2rpn vSeparatorNew ;
cVWP = ( io2rpn .). viewportNew ;
cWND = io2rpn windowNew ;
cWNDPU = io2rpn windowNewPopup ;
tSET :: ( CanBeCasted w ) => [ AttrOp w ] -> RPN ;
tSET a = RPN $ touchWidget $ ( $ a ) . set ;
tON :: ( CanBeCasted w ) => Signal w c -> c -> RPN ;
tON s c = RPN $ touchWidget $ ($ c) . ($ s) . on ;
tAF :: ( CanBeCasted w ) => Signal w c -> c -> RPN ;
tAF s c = RPN $ touchWidget $ ($ c) . ($ s) . after ;
tSKT :: NativeWindowId -> RPN ;
tSKT n = RPN $ touchWidget $ ($ n) . sai
where { sai :: Socket -> NativeWindowId -> IO () ;
sai = socketAddId } ;
pCA = RPN $
let { ca :: Container -> Widget -> IO () ; ca = containerAdd }
in pullWidget ca ;
pBSI = RPN $
let { bsi :: Button -> Widget -> IO () ; bsi = buttonSetImage }
in pullWidget bsi ;
pBPS p i = RPN $
let { bps :: Box -> Widget -> IO () ; bps b w = boxPackStart b w p i }
in pullWidget bps ;
pBPE p i = RPN $
let { bpe :: Box -> Widget -> IO () ; bpe b w = boxPackEnd b w p i }
in pullWidget bpe ;
pBPSD = RPN $
let { bpsd :: Box -> Widget -> IO () ; bpsd = boxPackStartDefaults }
in pullWidget bpsd ;
pBPED = RPN $
let { bped :: Box -> Widget -> IO () ; bped = boxPackEndDefaults }
in pullWidget bped ;
pFP p = RPN $
let { fp :: Fixed -> Widget -> IO () ; fp f w = fixedPut f w p }
in pullWidget fp ;
pPA1 = RPN $
let { pa1 :: Paned -> Widget -> IO () ; pa1 = panedAdd1 }
in pullWidget pa1 ;
pPA2 = RPN $
let { pa2 :: Paned -> Widget -> IO () ; pa2 = panedAdd2 }
in pullWidget pa2 ;
pPP1 r s = RPN $
let { pp1 :: Paned -> Widget -> IO () ; pp1 p w = panedPack1 p w r s }
in pullWidget pp1 ;
pPP2 r s = RPN $
let { pp2 :: Paned -> Widget -> IO () ; pp2 p w = panedPack2 p w r s }
in pullWidget pp2 ;
pLP x y = RPN $
let { lp :: Layout -> Widget -> IO () ; lp l w = layoutPut l w x y }
in pullWidget lp ;
pNAP s = RPN $
let { nap :: Notebook -> Widget -> IO Int ;
nap l w = notebookAppendPage l w s }
in pullWidget nap ;
pNAPM = RPN $
let { napm :: Notebook -> Widget -> Widget -> Widget -> IO Int ;
napm = notebookAppendPageMenu }
in pullWidget3 napm ;
pNPP s = RPN $
let { npp :: Notebook -> Widget -> IO Int ;
npp l w = notebookPrependPage l w s }
in pullWidget npp ;
pNPPM = RPN $
let { nppm :: Notebook -> Widget -> Widget -> Widget -> IO Int ;
nppm = notebookPrependPageMenu }
in pullWidget3 nppm ;
pTA l r t b xo yo xp yp = RPN $
let { ta :: Table -> Widget -> IO () ; ta tab wid =
tableAttach tab wid l r t b xo yo xp yp }
in pullWidget ta ;
pTAD l r t b = RPN $
let { tad :: Table -> Widget -> IO () ;
tad ta wi = tableAttachDefaults ta wi l r t b }
in pullWidget tad ;
pTVACAA a = RPN $
let { tvacaa :: TextView -> Widget -> IO () ; tvacaa t w =
textViewAddChildAtAnchor t w a }
in pullWidget tvacaa ;
pTVACIW t x y = RPN $
let { tvaciw :: TextView -> Widget -> IO () ; tvaciw te wi =
textViewAddChildInWindow te wi t x y }
in pullWidget tvaciw ;
pTI i = RPN $
let { ti :: Toolbar -> ToolItem -> IO () ; ti tc tic =
toolbarInsert tc tic i }
in pullWidget ti ;
rCBK :: ( Widget -> IO () ) -> RPN ;
rCBK f = RPN $ touchWidget cb
where {
cb w = after w realize $ f w
} ;
rTME :: ( Widget -> IO () ) -> Int -> RPN ;
rTME f dt = rCBK i
where {
i w = do {
id <- timeoutAdd ( f w >> return True ) dt ;
on w unrealize $ timeoutRemove id
} >> return ()
} ;
rSHPE :: ( ( Double , Double ) -> Render () ) -> RPN ;
rSHPE c = mconcat [ cDRW , tON e s ]
where {
e :: Signal Widget ( EventM EExpose Bool ) ;
e = exposeEvent ;
s = do {
w <- eventWindow ;
liftIO $ do {
( ww , wh ) <- liftIO $ drawableGetSize w ;
let { ch = c ( fromIntegral ww , fromIntegral wh ) } ;
liftIO $ renderWithDrawable w ch ;
} ;
return True
}
} ;
rANIM :: Int -> IO a -> ( a -> ( Double , Double ) -> Render () ) -> RPN ;
rANIM dt readData toRender = mconcat [ cDRW , tON e ef , tON m mf ]
where {
e :: Signal Widget ( EventM EExpose Bool ) ;
e = exposeEvent ;
ef = do {
dw <- eventWindow ;
liftIO $ do {
(sx,sy) <- drawableGetSize dw ;
let { (sx',sy') = (fromIntegral sx , fromIntegral sy) } ;
d <- readData ;
let { render = toRender d (sx',sy') } ;
renderWithDrawable dw render ;
} ;
return True
} ;
m :: Signal Widget ( EventM EAny Bool ) ;
m = mapEvent ;
mf = do {
dw <- eventWindow ;
liftIO $ do {
(sx,sy) <- drawableGetSize dw ;
let { area = Rectangle 0 0 sx sy } ;
let { f = drawWindowInvalidateRect dw area False } ;
timeoutAdd ( f >> return True ) dt
} ;
return True
}
} ;
}