{- |
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 (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !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