clutterhs-0.1: Graphics/UI/Clutter/Alpha.chs
-- -*-haskell-*-
-- Clutter Alpha
--
-- Author : Matthew Arsenault
--
-- Created: 22 Sep 2009
--
-- Copyright (C) 2009 Matthew Arsenault
--
-- This library is free software; you can redistribute it and/or
-- modify it under the terms of the GNU Lesser General Public
-- License as published by the Free Software Foundation; either
-- version 3 of the License, or (at your option) any later version.
--
-- This library is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- Lesser General Public License for more details.
--
{-# LANGUAGE ForeignFunctionInterface, TypeSynonymInstances #-}
#include <clutter/clutter.h>
{# context lib="clutter" prefix="clutter" #}
-- | A class for calculating an alpha value as a function of time.
module Graphics.UI.Clutter.Alpha (
-- * Detail
-- | 'Alpha' is a class for calculating an floating point value
-- dependent only on the position of a 'Timeline'.
--
-- A 'Alpha' binds a 'Timeline' to a progress function which
-- translates the time T into an adimensional factor alpha. The factor
-- can then be used to drive a 'Behaviour', which will translate the
-- alpha value into something meaningful for a 'Actor'.
--
-- You should provide a 'Timeline' and bind it to the 'Alpha' instance
-- using 'alphaSetTimeline'. You should also set an \"animation
-- mode\", either by using the ClutterAnimationMode values that
-- Clutter itself provides or by registering custom functions using
-- 'alphaRegisterFunc'.
--
-- Instead of a 'AnimationMode' you may provide a function returning
-- the alpha value depending on the progress of the timeline, using
-- 'alphaSetFunc'. The alpha function will be executed each time a new
-- frame in the 'Timeline' is reached.
--
-- Since the alpha function is controlled by the timeline instance,
-- you can pause, stop or resume the 'Alpha' from calling the alpha
-- function by using the appropriate functions of the 'Timeline'
-- object.
--
-- 'Alpha' is used to \"drive\" a Behaviour instance, and it is
-- internally used by the Animation API.
--
-- * Figure 3. Easing modes provided by Clutter
-- <<file:///home/matt/src/clutterhs/doc/easing-modes.png>>
--
-- * Class Hierarchy
-- |
-- @
-- | 'GObject'
-- | +----'Alpha'
-- @
-- * Types
Alpha,
AlphaClass,
AlphaFunc,
-- * Constructors
alphaNew,
alphaNewFull,
alphaNewWithFunc,
-- * Methods
alphaSetTimeline,
alphaGetTimeline,
alphaSetMode,
alphaGetMode,
alphaGetAlpha,
alphaSetFunc,
--alphaSetClosure,
--alphaRegisterClosure,
alphaRegisterFunc,
-- * Attributes
alphaTimeline,
alphaMode,
alphaAlpha
) where
{# import Graphics.UI.Clutter.Types #}
import C2HS
import System.Glib.GObject
import System.Glib.Attributes
-- | Creates a new ClutterAlpha instance. You must set a function to
-- compute the alpha value using 'alphaSetFunc' and bind a
-- 'Timeline' object to the 'Alpha' instance using
-- 'alphaSetTimeline'.
--
-- You should use the newly created 'Alpha' instance inside a 'Behaviour' object.
--
-- [@Returns@] the newly created empty 'Alpha' instance.
--
-- * Since 0.2
--
{# fun unsafe alpha_new as ^ { } -> `Alpha' newAlpha* #}
-- | Creates a new 'Alpha' instance and sets the timeline and animation mode.
--
-- See also 'alphaSetTimeline' and 'alphaSetMode'.
--
-- [@timeline@] 'Timeline' timeline
--
-- [@mode@] animation mode
--
-- [@Returns@] the newly created 'Αlpha'
--
-- * Since 1.0
--
{# fun unsafe alpha_new_full as ^
{ withTimeline* `Timeline', cFromEnum `AnimationMode' } -> `Alpha' newAlpha* #}
-- | Creates a new ClutterAlpha instances and sets the timeline and the alpha function.
--
-- This function will not register func as a global alpha function.
--
-- See also alphaSetTimeline and 'alphaSetFunc'.
--
-- * Since 1.0
--
alphaNewWithFunc :: Timeline -- ^ a 'Timeline'
-> AlphaFunc -- ^ an 'AlphaFunc'
-> IO Alpha -- ^ The newly created 'Alpha'
alphaNewWithFunc tl af = withTimeline tl $ \tlptr -> do
afptr <- newAlphaFunc af
a <- {# call unsafe alpha_new_with_func #} tlptr afptr (castFunPtrToPtr afptr) destroyFunPtr
newAlpha a
-- | Binds alpha to timeline.
--
-- [@alpha@] An 'Alpha'
--
-- [@timeline@] A 'Timeline'
--
-- * Since 0.2
--
{# fun unsafe alpha_set_timeline as ^
{ withAlpha* `Alpha', withTimeline* `Timeline' } -> `()' #}
-- | Gets the 'Timeline' bound to alpha.
--
-- [@alpha@] an 'Alpha'
--
-- [@timeline@] a 'Timeline'
--
-- * Since 0.2
--
{# fun unsafe alpha_get_timeline as ^
{ withAlpha* `Alpha' } -> `Timeline' newTimeline* #}
--CHECKME/FIXME: AlphaMode can be something returned from register_func?
--how does enum stuff handle this?
-- | Sets the progress function of alpha using the symbolic value of
-- mode, as taken by the 'AnimationMode' enumeration or using
-- the value returned by 'alphaRegisterFunc'.
--
-- [@alpha@] an 'Alpha'
--
-- [@mode@] an 'AnimationMode'
--
-- * Since 1.0
--
{# fun unsafe alpha_set_mode as ^
{ withAlpha* `Alpha', cFromEnum `AnimationMode' } -> `()' #}
-- | Retrieves the 'AnimationMode' used by an 'Αlpha'.
--
-- * Since 0.2
--
{# fun unsafe alpha_get_mode as ^
{ withAlpha* `Alpha' } -> `AnimationMode' cToEnum #}
-- | Query the current alpha value
--
-- * Since 0.2
--
{# fun unsafe alpha_get_alpha as ^ { withAlpha* `Alpha' } -> `Double' #}
-- | Sets the 'AlphaFunc' function used to compute the alpha value at
-- each frame of the 'Timeline' bound to alpha.
-- This function will not register func as a global alpha function.
--
-- * Since 1.0
--
alphaSetFunc :: Alpha -> AlphaFunc -> IO ()
alphaSetFunc alp af = withAlpha alp $ \alpPtr -> do
afptr <- newAlphaFunc af
{# call unsafe alpha_set_func #} alpPtr afptr (castFunPtrToPtr afptr) destroyFunPtr
--TODO: some kind of ID Type for this.
--TODO: What is CLUTTER_ANIMATION_LAST here? some kind of macro
-- | Registers a global alpha function and returns its logical id to
-- be used by 'alphaSetMode' or by 'Animation'.
--
-- The logical id is always greater than CLUTTER_ANIMATION_LAST.
--
-- * Since 1.0
--
alphaRegisterFunc :: AlphaFunc -> IO Word64
alphaRegisterFunc af = do
afptr <- newAlphaFunc af
ret <- {# call unsafe alpha_register_func #} afptr nullPtr
return (cIntConv ret)
--pretty sure don't care about gclosure
--{# fun unsafe alpha_set_closure as ^ { withAlpha* `Alpha', `GClosure' } -> `()' #}
--{# fun unsafe alpha_register_closure as ^ { `GClosure' } -> `GULong' #}
-- | The alpha value as computed by the alpha function. The linear
-- interval is 0.0 to 1.0, but the Alpha allows overshooting by one
-- unit in each direction, so the valid interval is -1.0 to 2.0.
-- Allowed values: [-1,2]
--
-- Default value: 0
--
-- * Since 0.2
--
alphaAlpha :: ReadAttr Alpha Double
alphaAlpha = readNamedAttr "alpha" alphaGetAlpha
--CHECKME: The custom mode return
-- | The progress function logical id - either a value from the
-- 'AnimationMode' enumeration or a value returned by
-- 'alphaRegisterFunc'.
--
-- If CLUTTER_CUSTOM_MODE is used then the function set using
-- 'alphaSetFunc' will be
-- used.
--
-- * Since 1.0
--
alphaMode :: Attr Alpha AnimationMode
alphaMode = newNamedAttr "mode" alphaGetMode alphaSetMode
-- | A 'Timeline' instance used to drive the alpha function
--
-- * Since 0.2
--
alphaTimeline :: Attr Alpha Timeline
alphaTimeline = newNamedAttr "timeline" alphaGetTimeline alphaSetTimeline