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

    Note: /@oldValue@/ field of 'GI.Atk.Structs.PropertyValues.PropertyValues' will not contain a
    valid value. This is a field defined with the purpose of contain
    the previous value of the property, but is not used anymore.
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Atk.Structs.PropertyValues
        (

    -- * Exported types
        PropertyValues(..)                      ,
        newZeroPropertyValues                   ,
        noPropertyValues                        ,

     -- * Properties
    -- ** newValue #attr:newValue#
    {- | The new value of the named property.
    -}
        getPropertyValuesNewValue               ,
    #if ENABLE_OVERLOADING
        propertyValues_newValue                 ,
    #endif

    -- ** oldValue #attr:oldValue#
    {- | NULL. This field is not used anymore.
    -}
        getPropertyValuesOldValue               ,
    #if ENABLE_OVERLOADING
        propertyValues_oldValue                 ,
    #endif

    -- ** propertyName #attr:propertyName#
    {- | The name of the ATK property which has changed.
    -}
        clearPropertyValuesPropertyName         ,
        getPropertyValuesPropertyName           ,
    #if ENABLE_OVERLOADING
        propertyValues_propertyName             ,
    #endif
        setPropertyValuesPropertyName           ,

        ) 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 PropertyValues = PropertyValues (ManagedPtr PropertyValues)
    instance WrappedPtr PropertyValues where
        wrappedPtrCalloc = callocBytes 56
        wrappedPtrCopy = \p -> withManagedPtr p (copyBytes 56 >=> wrapPtr PropertyValues)
        wrappedPtrFree = Just ptr_to_g_free

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

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

    -- | A convenience alias for `Nothing` :: `Maybe` `PropertyValues`.
    noPropertyValues :: Maybe PropertyValues
    noPropertyValues = Nothing

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

    @
    'Data.GI.Base.Attributes.get' propertyValues #propertyName
    @
    -}
    getPropertyValuesPropertyName :: MonadIO m => PropertyValues -> m (Maybe T.Text)
    getPropertyValuesPropertyName s = liftIO $ withManagedPtr s $ \ptr -> do
        val <- peek (ptr `plusPtr` 0) :: IO CString
        result <- SP.convertIfNonNull val $ \val' -> do
            val'' <- cstringToText val'
            return val''
        return result

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

    @
    'Data.GI.Base.Attributes.set' propertyValues [ #propertyName 'Data.GI.Base.Attributes.:=' value ]
    @
    -}
    setPropertyValuesPropertyName :: MonadIO m => PropertyValues -> CString -> m ()
    setPropertyValuesPropertyName s val = liftIO $ withManagedPtr s $ \ptr -> do
        poke (ptr `plusPtr` 0) (val :: CString)

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

    @
    'Data.GI.Base.Attributes.clear' #propertyName
    @
    -}
    clearPropertyValuesPropertyName :: MonadIO m => PropertyValues -> m ()
    clearPropertyValuesPropertyName s = liftIO $ withManagedPtr s $ \ptr -> do
        poke (ptr `plusPtr` 0) (FP.nullPtr :: CString)

    #if ENABLE_OVERLOADING
    data PropertyValuesPropertyNameFieldInfo
    instance AttrInfo PropertyValuesPropertyNameFieldInfo where
        type AttrAllowedOps PropertyValuesPropertyNameFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear]
        type AttrSetTypeConstraint PropertyValuesPropertyNameFieldInfo = (~) CString
        type AttrBaseTypeConstraint PropertyValuesPropertyNameFieldInfo = (~) PropertyValues
        type AttrGetType PropertyValuesPropertyNameFieldInfo = Maybe T.Text
        type AttrLabel PropertyValuesPropertyNameFieldInfo = "property_name"
        type AttrOrigin PropertyValuesPropertyNameFieldInfo = PropertyValues
        attrGet _ = getPropertyValuesPropertyName
        attrSet _ = setPropertyValuesPropertyName
        attrConstruct = undefined
        attrClear _ = clearPropertyValuesPropertyName

    propertyValues_propertyName :: AttrLabelProxy "propertyName"
    propertyValues_propertyName = AttrLabelProxy

    #endif

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

    @
    'Data.GI.Base.Attributes.get' propertyValues #oldValue
    @
    -}
    getPropertyValuesOldValue :: MonadIO m => PropertyValues -> m GValue
    getPropertyValuesOldValue s = liftIO $ withManagedPtr s $ \ptr -> do
        let val = ptr `plusPtr` 8 :: (Ptr GValue)
        val' <- (newBoxed GValue) val
        return val'

    #if ENABLE_OVERLOADING
    data PropertyValuesOldValueFieldInfo
    instance AttrInfo PropertyValuesOldValueFieldInfo where
        type AttrAllowedOps PropertyValuesOldValueFieldInfo = '[ 'AttrGet]
        type AttrSetTypeConstraint PropertyValuesOldValueFieldInfo = (~) (Ptr GValue)
        type AttrBaseTypeConstraint PropertyValuesOldValueFieldInfo = (~) PropertyValues
        type AttrGetType PropertyValuesOldValueFieldInfo = GValue
        type AttrLabel PropertyValuesOldValueFieldInfo = "old_value"
        type AttrOrigin PropertyValuesOldValueFieldInfo = PropertyValues
        attrGet _ = getPropertyValuesOldValue
        attrSet _ = undefined
        attrConstruct = undefined
        attrClear _ = undefined

    propertyValues_oldValue :: AttrLabelProxy "oldValue"
    propertyValues_oldValue = AttrLabelProxy

    #endif

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

    @
    'Data.GI.Base.Attributes.get' propertyValues #newValue
    @
    -}
    getPropertyValuesNewValue :: MonadIO m => PropertyValues -> m GValue
    getPropertyValuesNewValue s = liftIO $ withManagedPtr s $ \ptr -> do
        let val = ptr `plusPtr` 32 :: (Ptr GValue)
        val' <- (newBoxed GValue) val
        return val'

    #if ENABLE_OVERLOADING
    data PropertyValuesNewValueFieldInfo
    instance AttrInfo PropertyValuesNewValueFieldInfo where
        type AttrAllowedOps PropertyValuesNewValueFieldInfo = '[ 'AttrGet]
        type AttrSetTypeConstraint PropertyValuesNewValueFieldInfo = (~) (Ptr GValue)
        type AttrBaseTypeConstraint PropertyValuesNewValueFieldInfo = (~) PropertyValues
        type AttrGetType PropertyValuesNewValueFieldInfo = GValue
        type AttrLabel PropertyValuesNewValueFieldInfo = "new_value"
        type AttrOrigin PropertyValuesNewValueFieldInfo = PropertyValues
        attrGet _ = getPropertyValuesNewValue
        attrSet _ = undefined
        attrConstruct = undefined
        attrClear _ = undefined

    propertyValues_newValue :: AttrLabelProxy "newValue"
    propertyValues_newValue = AttrLabelProxy

    #endif

    #if ENABLE_OVERLOADING
    instance O.HasAttributeList PropertyValues
    type instance O.AttributeList PropertyValues = PropertyValuesAttributeList
    type PropertyValuesAttributeList = ('[ '("propertyName", PropertyValuesPropertyNameFieldInfo), '("oldValue", PropertyValuesOldValueFieldInfo), '("newValue", PropertyValuesNewValueFieldInfo)] :: [(Symbol, *)])
    #endif

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

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

    #if MIN_VERSION_base(4,9,0)
    instance (info ~ ResolvePropertyValuesMethod t PropertyValues, O.MethodInfo info PropertyValues p) => O.IsLabel t (PropertyValues -> 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