{- |
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.
-}

module GI.Gdk.Structs.TimeCoord
    ( 

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


 -- * Properties
-- ** time #attr:time#
    getTimeCoordTime                        ,
    setTimeCoordTime                        ,
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    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.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


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


noTimeCoord :: Maybe TimeCoord
noTimeCoord = Nothing

getTimeCoordTime :: MonadIO m => TimeCoord -> m Word32
getTimeCoordTime s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 0) :: IO Word32
    return val

setTimeCoordTime :: MonadIO m => TimeCoord -> Word32 -> m ()
setTimeCoordTime s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 0) (val :: Word32)

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
instance O.HasAttributeList TimeCoord
type instance O.AttributeList TimeCoord = TimeCoordAttributeList
type TimeCoordAttributeList = ('[ '("time", TimeCoordTimeFieldInfo)] :: [(Symbol, *)])
#endif

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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