gegl-0.0.0.1: src/GEGL/Reparent.hs
-- | Sometimes it is useful to be able to move nodes between graphs or even
-- handle orphaned nodes that are not part of a graph.
module GEGL.Reparent
( gegl_node_add_child
, gegl_node_remove_child
, gegl_node_get_parent
)
where
import qualified GEGL.FFI.Reparent as FFI
import qualified GEGL.FFI.Node as FFI
import System.Glib.GObject (objectUnref)
import Foreign.Ptr (nullPtr)
import Foreign.ForeignPtr (newForeignPtr, withForeignPtr)
-- | Make the Graph node take reference on the child node.
gegl_node_add_child
:: FFI.GeglNode -- ^ Graph node
-> FFI.GeglNode -- ^ Child node
-> IO FFI.GeglNode -- ^ The child
gegl_node_add_child (FFI.GeglNode fgraph) (FFI.GeglNode fchild) =
FFI.GeglNode <$> (newForeignPtr objectUnref =<<
withForeignPtr fgraph (\graph ->
withForeignPtr fchild (\child ->
FFI.c_gegl_node_add_child graph child)))
-- | Removes a child form a 'FFI.GeglNode'.
gegl_node_remove_child
:: FFI.GeglNode -- ^ Graph node
-> FFI.GeglNode -- ^ Child node
-> IO FFI.GeglNode -- ^ The child
gegl_node_remove_child (FFI.GeglNode fgraph) (FFI.GeglNode fchild) =
FFI.GeglNode <$> (newForeignPtr objectUnref =<<
withForeignPtr fgraph (\graph ->
withForeignPtr fchild (\child ->
FFI.c_gegl_node_remove_child graph child)))
-- | Gets parent of specified node. Returns 'Nothing' if node has no parent.
gegl_node_get_parent
:: FFI.GeglNode -- ^ A node
-> IO (Maybe FFI.GeglNode) -- The parent node (if any)
gegl_node_get_parent (FFI.GeglNode fnode) = do
ptr <- withForeignPtr fnode (\node -> FFI.c_gegl_node_get_parent node)
if ptr == nullPtr
then return Nothing
else Just <$> FFI.GeglNode <$> newForeignPtr objectUnref ptr