    {- |
    Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
    License    : LGPL-2.1
    Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)

    A 'GI.Gdk.Structs.TimeCoord.TimeCoord' stores a single event in a motion history.
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Gdk.Structs.TimeCoord
        (

    -- * Exported types
        TimeCoord(..)                           ,
        newZeroTimeCoord                        ,
        noTimeCoord                             ,

     -- * Properties
    -- ** time #attr:time#
    {- | The timestamp for this event.
    -}
        getTimeCoordTime                        ,
        setTimeCoordTime                        ,
    #if ENABLE_OVERLOADING
        timeCoord_time                          ,
    #endif

        ) where

    import Data.GI.Base.ShortPrelude
    import qualified Data.GI.Base.ShortPrelude as SP
    import qualified Data.GI.Base.Overloading as O
    import qualified Prelude as P

    import qualified Data.GI.Base.Attributes as GI.Attributes
    import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
    import qualified Data.GI.Base.GError as B.GError
    import qualified Data.GI.Base.GVariant as B.GVariant
    import qualified Data.GI.Base.GValue as B.GValue
    import qualified Data.GI.Base.GParamSpec as B.GParamSpec
    import qualified Data.GI.Base.CallStack as B.CallStack
    import qualified Data.Text as T
    import qualified Data.ByteString.Char8 as B
    import qualified Data.Map as Map
    import qualified Foreign.Ptr as FP

    -- | Memory-managed wrapper type.
    newtype TimeCoord = TimeCoord (ManagedPtr TimeCoord)
    instance WrappedPtr TimeCoord where
        wrappedPtrCalloc = callocBytes 1032
        wrappedPtrCopy = \p -> withManagedPtr p (copyBytes 1032 >=> wrapPtr TimeCoord)
        wrappedPtrFree = Just ptr_to_g_free

    -- | Construct a `TimeCoord` struct initialized to zero.
    newZeroTimeCoord :: MonadIO m => m TimeCoord
    newZeroTimeCoord = liftIO $ wrappedPtrCalloc >>= wrapPtr TimeCoord

    instance tag ~ 'AttrSet => Constructible TimeCoord tag where
        new _ attrs = do
            o <- newZeroTimeCoord
            GI.Attributes.set o attrs
            return o

    -- | A convenience alias for `Nothing` :: `Maybe` `TimeCoord`.
    noTimeCoord :: Maybe TimeCoord
    noTimeCoord = Nothing

    {- |
    Get the value of the “@time@” field.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.get' timeCoord #time
    @
    -}
    getTimeCoordTime :: MonadIO m => TimeCoord -> m Word32
    getTimeCoordTime s = liftIO $ withManagedPtr s $ \ptr -> do
        val <- peek (ptr `plusPtr` 0) :: IO Word32
        return val

    {- |
    Set the value of the “@time@” field.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.set' timeCoord [ #time 'Data.GI.Base.Attributes.:=' value ]
    @
    -}
    setTimeCoordTime :: MonadIO m => TimeCoord -> Word32 -> m ()
    setTimeCoordTime s val = liftIO $ withManagedPtr s $ \ptr -> do
        poke (ptr `plusPtr` 0) (val :: Word32)

    #if ENABLE_OVERLOADING
    data TimeCoordTimeFieldInfo
    instance AttrInfo TimeCoordTimeFieldInfo where
        type AttrAllowedOps TimeCoordTimeFieldInfo = '[ 'AttrSet, 'AttrGet]
        type AttrSetTypeConstraint TimeCoordTimeFieldInfo = (~) Word32
        type AttrBaseTypeConstraint TimeCoordTimeFieldInfo = (~) TimeCoord
        type AttrGetType TimeCoordTimeFieldInfo = Word32
        type AttrLabel TimeCoordTimeFieldInfo = "time"
        type AttrOrigin TimeCoordTimeFieldInfo = TimeCoord
        attrGet _ = getTimeCoordTime
        attrSet _ = setTimeCoordTime
        attrConstruct = undefined
        attrClear _ = undefined

    timeCoord_time :: AttrLabelProxy "time"
    timeCoord_time = AttrLabelProxy

    #endif

    -- XXX Skipped attribute for "TimeCoord:axes" :: Not implemented: "Don't know how to unpack C array of type TCArray False 128 (-1) (TBasicType TDouble)"

    #if ENABLE_OVERLOADING
    instance O.HasAttributeList TimeCoord
    type instance O.AttributeList TimeCoord = TimeCoordAttributeList
    type TimeCoordAttributeList = ('[ '("time", TimeCoordTimeFieldInfo)] :: [(Symbol, *)])
    #endif

    #if ENABLE_OVERLOADING
    type family ResolveTimeCoordMethod (t :: Symbol) (o :: *) :: * where
        ResolveTimeCoordMethod l o = O.MethodResolutionFailed l o

    instance (info ~ ResolveTimeCoordMethod t TimeCoord, O.MethodInfo info TimeCoord p) => O.IsLabelProxy t (TimeCoord -> p) where
        fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

    #if MIN_VERSION_base(4,9,0)
    instance (info ~ ResolveTimeCoordMethod t TimeCoord, O.MethodInfo info TimeCoord p) => O.IsLabel t (TimeCoord -> p) where
    #if MIN_VERSION_base(4,10,0)
        fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
    #else
        fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
    #endif
    #endif

    #endif