{-# LANGUAGE TypeApplications #-}


-- | Copyright  : Will Thompson and Iñaki García Etxebarria
-- License    : LGPL-2.1
-- Maintainer : Iñaki García Etxebarria
-- 
-- An [class/@animationTarget@/] that calls a given callback during the
-- animation.

#if (MIN_VERSION_haskell_gi_overloading(1,0,0) && !defined(__HADDOCK_VERSION__))
#define ENABLE_OVERLOADING
#endif

module GI.Adw.Objects.CallbackAnimationTarget
    ( 

-- * Exported types
    CallbackAnimationTarget(..)             ,
    IsCallbackAnimationTarget               ,
    toCallbackAnimationTarget               ,


 -- * Methods
-- | 
-- 
--  === __Click to display all available methods, including inherited ones__
-- ==== Methods
-- [bindProperty]("GI.GObject.Objects.Object#g:method:bindProperty"), [bindPropertyFull]("GI.GObject.Objects.Object#g:method:bindPropertyFull"), [forceFloating]("GI.GObject.Objects.Object#g:method:forceFloating"), [freezeNotify]("GI.GObject.Objects.Object#g:method:freezeNotify"), [getv]("GI.GObject.Objects.Object#g:method:getv"), [isFloating]("GI.GObject.Objects.Object#g:method:isFloating"), [notify]("GI.GObject.Objects.Object#g:method:notify"), [notifyByPspec]("GI.GObject.Objects.Object#g:method:notifyByPspec"), [ref]("GI.GObject.Objects.Object#g:method:ref"), [refSink]("GI.GObject.Objects.Object#g:method:refSink"), [runDispose]("GI.GObject.Objects.Object#g:method:runDispose"), [stealData]("GI.GObject.Objects.Object#g:method:stealData"), [stealQdata]("GI.GObject.Objects.Object#g:method:stealQdata"), [thawNotify]("GI.GObject.Objects.Object#g:method:thawNotify"), [unref]("GI.GObject.Objects.Object#g:method:unref"), [watchClosure]("GI.GObject.Objects.Object#g:method:watchClosure").
-- 
-- ==== Getters
-- [getData]("GI.GObject.Objects.Object#g:method:getData"), [getProperty]("GI.GObject.Objects.Object#g:method:getProperty"), [getQdata]("GI.GObject.Objects.Object#g:method:getQdata").
-- 
-- ==== Setters
-- [setData]("GI.GObject.Objects.Object#g:method:setData"), [setDataFull]("GI.GObject.Objects.Object#g:method:setDataFull"), [setProperty]("GI.GObject.Objects.Object#g:method:setProperty").

#if defined(ENABLE_OVERLOADING)
    ResolveCallbackAnimationTargetMethod    ,
#endif

-- ** new #method:new#

    callbackAnimationTargetNew              ,




    ) 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.BasicTypes as B.Types
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GArray as B.GArray
import qualified Data.GI.Base.GClosure as B.GClosure
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GHashTable as B.GHT
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.GI.Base.Properties as B.Properties
import qualified Data.GI.Base.Signals as B.Signals
import qualified Control.Monad.IO.Class as MIO
import qualified Data.Coerce as Coerce
import qualified Data.Text as T
import qualified Data.Kind as DK
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP
import qualified GHC.OverloadedLabels as OL
import qualified GHC.Records as R

import qualified GI.Adw.Callbacks as Adw.Callbacks
import {-# SOURCE #-} qualified GI.Adw.Objects.AnimationTarget as Adw.AnimationTarget
import qualified GI.GLib.Callbacks as GLib.Callbacks
import qualified GI.GObject.Objects.Object as GObject.Object

-- | Memory-managed wrapper type.
newtype CallbackAnimationTarget = CallbackAnimationTarget (SP.ManagedPtr CallbackAnimationTarget)
    deriving (CallbackAnimationTarget -> CallbackAnimationTarget -> Bool
(CallbackAnimationTarget -> CallbackAnimationTarget -> Bool)
-> (CallbackAnimationTarget -> CallbackAnimationTarget -> Bool)
-> Eq CallbackAnimationTarget
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CallbackAnimationTarget -> CallbackAnimationTarget -> Bool
== :: CallbackAnimationTarget -> CallbackAnimationTarget -> Bool
$c/= :: CallbackAnimationTarget -> CallbackAnimationTarget -> Bool
/= :: CallbackAnimationTarget -> CallbackAnimationTarget -> Bool
Eq)

instance SP.ManagedPtrNewtype CallbackAnimationTarget where
    toManagedPtr :: CallbackAnimationTarget -> ManagedPtr CallbackAnimationTarget
toManagedPtr (CallbackAnimationTarget ManagedPtr CallbackAnimationTarget
p) = ManagedPtr CallbackAnimationTarget
p

foreign import ccall "adw_callback_animation_target_get_type"
    c_adw_callback_animation_target_get_type :: IO B.Types.GType

instance B.Types.TypedObject CallbackAnimationTarget where
    glibType :: IO GType
glibType = IO GType
c_adw_callback_animation_target_get_type

instance B.Types.GObject CallbackAnimationTarget

-- | Type class for types which can be safely cast to `CallbackAnimationTarget`, for instance with `toCallbackAnimationTarget`.
class (SP.GObject o, O.IsDescendantOf CallbackAnimationTarget o) => IsCallbackAnimationTarget o
instance (SP.GObject o, O.IsDescendantOf CallbackAnimationTarget o) => IsCallbackAnimationTarget o

instance O.HasParentTypes CallbackAnimationTarget
type instance O.ParentTypes CallbackAnimationTarget = '[Adw.AnimationTarget.AnimationTarget, GObject.Object.Object]

-- | Cast to `CallbackAnimationTarget`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
toCallbackAnimationTarget :: (MIO.MonadIO m, IsCallbackAnimationTarget o) => o -> m CallbackAnimationTarget
toCallbackAnimationTarget :: forall (m :: * -> *) o.
(MonadIO m, IsCallbackAnimationTarget o) =>
o -> m CallbackAnimationTarget
toCallbackAnimationTarget = IO CallbackAnimationTarget -> m CallbackAnimationTarget
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
MIO.liftIO (IO CallbackAnimationTarget -> m CallbackAnimationTarget)
-> (o -> IO CallbackAnimationTarget)
-> o
-> m CallbackAnimationTarget
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ManagedPtr CallbackAnimationTarget -> CallbackAnimationTarget)
-> o -> IO CallbackAnimationTarget
forall o o'.
(HasCallStack, ManagedPtrNewtype o, TypedObject o,
 ManagedPtrNewtype o', TypedObject o') =>
(ManagedPtr o' -> o') -> o -> IO o'
B.ManagedPtr.unsafeCastTo ManagedPtr CallbackAnimationTarget -> CallbackAnimationTarget
CallbackAnimationTarget

-- | Convert 'CallbackAnimationTarget' to and from 'Data.GI.Base.GValue.GValue'. See 'Data.GI.Base.GValue.toGValue' and 'Data.GI.Base.GValue.fromGValue'.
instance B.GValue.IsGValue (Maybe CallbackAnimationTarget) where
    gvalueGType_ :: IO GType
gvalueGType_ = IO GType
c_adw_callback_animation_target_get_type
    gvalueSet_ :: Ptr GValue -> Maybe CallbackAnimationTarget -> IO ()
gvalueSet_ Ptr GValue
gv Maybe CallbackAnimationTarget
P.Nothing = Ptr GValue -> Ptr CallbackAnimationTarget -> IO ()
forall a. GObject a => Ptr GValue -> Ptr a -> IO ()
B.GValue.set_object Ptr GValue
gv (Ptr CallbackAnimationTarget
forall a. Ptr a
FP.nullPtr :: FP.Ptr CallbackAnimationTarget)
    gvalueSet_ Ptr GValue
gv (P.Just CallbackAnimationTarget
obj) = CallbackAnimationTarget
-> (Ptr CallbackAnimationTarget -> IO ()) -> IO ()
forall a c.
(HasCallStack, ManagedPtrNewtype a) =>
a -> (Ptr a -> IO c) -> IO c
B.ManagedPtr.withManagedPtr CallbackAnimationTarget
obj (Ptr GValue -> Ptr CallbackAnimationTarget -> IO ()
forall a. GObject a => Ptr GValue -> Ptr a -> IO ()
B.GValue.set_object Ptr GValue
gv)
    gvalueGet_ :: Ptr GValue -> IO (Maybe CallbackAnimationTarget)
gvalueGet_ Ptr GValue
gv = do
        Ptr CallbackAnimationTarget
ptr <- Ptr GValue -> IO (Ptr CallbackAnimationTarget)
forall a. GObject a => Ptr GValue -> IO (Ptr a)
B.GValue.get_object Ptr GValue
gv :: IO (FP.Ptr CallbackAnimationTarget)
        if Ptr CallbackAnimationTarget
ptr Ptr CallbackAnimationTarget -> Ptr CallbackAnimationTarget -> Bool
forall a. Eq a => a -> a -> Bool
/= Ptr CallbackAnimationTarget
forall a. Ptr a
FP.nullPtr
        then CallbackAnimationTarget -> Maybe CallbackAnimationTarget
forall a. a -> Maybe a
P.Just (CallbackAnimationTarget -> Maybe CallbackAnimationTarget)
-> IO CallbackAnimationTarget -> IO (Maybe CallbackAnimationTarget)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ManagedPtr CallbackAnimationTarget -> CallbackAnimationTarget)
-> Ptr CallbackAnimationTarget -> IO CallbackAnimationTarget
forall a b.
(HasCallStack, GObject a, GObject b) =>
(ManagedPtr a -> a) -> Ptr b -> IO a
B.ManagedPtr.newObject ManagedPtr CallbackAnimationTarget -> CallbackAnimationTarget
CallbackAnimationTarget Ptr CallbackAnimationTarget
ptr
        else Maybe CallbackAnimationTarget -> IO (Maybe CallbackAnimationTarget)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe CallbackAnimationTarget
forall a. Maybe a
P.Nothing
        
    

#if defined(ENABLE_OVERLOADING)
type family ResolveCallbackAnimationTargetMethod (t :: Symbol) (o :: DK.Type) :: DK.Type where
    ResolveCallbackAnimationTargetMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveCallbackAnimationTargetMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveCallbackAnimationTargetMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveCallbackAnimationTargetMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveCallbackAnimationTargetMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
    ResolveCallbackAnimationTargetMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveCallbackAnimationTargetMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveCallbackAnimationTargetMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveCallbackAnimationTargetMethod "ref" o = GObject.Object.ObjectRefMethodInfo
    ResolveCallbackAnimationTargetMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveCallbackAnimationTargetMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveCallbackAnimationTargetMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveCallbackAnimationTargetMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveCallbackAnimationTargetMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveCallbackAnimationTargetMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
    ResolveCallbackAnimationTargetMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveCallbackAnimationTargetMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveCallbackAnimationTargetMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveCallbackAnimationTargetMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveCallbackAnimationTargetMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveCallbackAnimationTargetMethod "setDataFull" o = GObject.Object.ObjectSetDataFullMethodInfo
    ResolveCallbackAnimationTargetMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveCallbackAnimationTargetMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveCallbackAnimationTargetMethod t CallbackAnimationTarget, O.OverloadedMethod info CallbackAnimationTarget p) => OL.IsLabel t (CallbackAnimationTarget -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod @info
#else
    fromLabel _ = O.overloadedMethod @info
#endif

#if MIN_VERSION_base(4,13,0)
instance (info ~ ResolveCallbackAnimationTargetMethod t CallbackAnimationTarget, O.OverloadedMethod info CallbackAnimationTarget p, R.HasField t CallbackAnimationTarget p) => R.HasField t CallbackAnimationTarget p where
    getField = O.overloadedMethod @info

#endif

instance (info ~ ResolveCallbackAnimationTargetMethod t CallbackAnimationTarget, O.OverloadedMethodInfo info CallbackAnimationTarget) => OL.IsLabel t (O.MethodProxy info CallbackAnimationTarget) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.MethodProxy
#else
    fromLabel _ = O.MethodProxy
#endif

#endif

#if defined(ENABLE_OVERLOADING)
instance O.HasAttributeList CallbackAnimationTarget
type instance O.AttributeList CallbackAnimationTarget = CallbackAnimationTargetAttributeList
type CallbackAnimationTargetAttributeList = ('[ ] :: [(Symbol, DK.Type)])
#endif

#if defined(ENABLE_OVERLOADING)
#endif

#if defined(ENABLE_OVERLOADING)
type instance O.SignalList CallbackAnimationTarget = CallbackAnimationTargetSignalList
type CallbackAnimationTargetSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, DK.Type)])

#endif

-- method CallbackAnimationTarget::new
-- method type : Constructor
-- Args: [ Arg
--           { argCName = "callback"
--           , argType =
--               TInterface
--                 Name { namespace = "Adw" , name = "AnimationTargetFunc" }
--           , direction = DirectionIn
--           , mayBeNull = False
--           , argDoc =
--               Documentation
--                 { rawDocText = Just "the callback to call"
--                 , sinceVersion = Nothing
--                 }
--           , argScope = ScopeTypeNotified
--           , argClosure = 1
--           , argDestroy = 2
--           , argCallerAllocates = False
--           , transfer = TransferNothing
--           }
--       , Arg
--           { argCName = "user_data"
--           , argType = TBasicType TPtr
--           , direction = DirectionIn
--           , mayBeNull = True
--           , argDoc =
--               Documentation
--                 { rawDocText = Just "the data to be passed to @callback"
--                 , sinceVersion = Nothing
--                 }
--           , argScope = ScopeTypeNotified
--           , argClosure = -1
--           , argDestroy = -1
--           , argCallerAllocates = False
--           , transfer = TransferNothing
--           }
--       , Arg
--           { argCName = "destroy"
--           , argType =
--               TInterface Name { namespace = "GLib" , name = "DestroyNotify" }
--           , direction = DirectionIn
--           , mayBeNull = False
--           , argDoc =
--               Documentation
--                 { rawDocText =
--                     Just
--                       "the function to be called when the\n  callback action is finalized"
--                 , sinceVersion = Nothing
--                 }
--           , argScope = ScopeTypeAsync
--           , argClosure = -1
--           , argDestroy = -1
--           , argCallerAllocates = False
--           , transfer = TransferNothing
--           }
--       ]
-- Lengths: []
-- returnType: Just
--               (TInterface
--                  Name { namespace = "Adw" , name = "CallbackAnimationTarget" })
-- throws : False
-- Skip return : False

foreign import ccall "adw_callback_animation_target_new" adw_callback_animation_target_new :: 
    FunPtr Adw.Callbacks.C_AnimationTargetFunc -> -- callback : TInterface (Name {namespace = "Adw", name = "AnimationTargetFunc"})
    Ptr () ->                               -- user_data : TBasicType TPtr
    FunPtr GLib.Callbacks.C_DestroyNotify -> -- destroy : TInterface (Name {namespace = "GLib", name = "DestroyNotify"})
    IO (Ptr CallbackAnimationTarget)

-- | Creates a new @AdwAnimationTarget@ that calls the given /@callback@/ during
-- the animation.
callbackAnimationTargetNew ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Adw.Callbacks.AnimationTargetFunc
    -- ^ /@callback@/: the callback to call
    -> m CallbackAnimationTarget
    -- ^ __Returns:__ the newly created callback target
callbackAnimationTargetNew :: forall (m :: * -> *).
(HasCallStack, MonadIO m) =>
AnimationTargetFunc -> m CallbackAnimationTarget
callbackAnimationTargetNew AnimationTargetFunc
callback = IO CallbackAnimationTarget -> m CallbackAnimationTarget
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO CallbackAnimationTarget -> m CallbackAnimationTarget)
-> IO CallbackAnimationTarget -> m CallbackAnimationTarget
forall a b. (a -> b) -> a -> b
$ do
    FunPtr C_AnimationTargetFunc
callback' <- C_AnimationTargetFunc -> IO (FunPtr C_AnimationTargetFunc)
Adw.Callbacks.mk_AnimationTargetFunc (Maybe (Ptr (FunPtr C_AnimationTargetFunc))
-> AnimationTargetFunc_WithClosures -> C_AnimationTargetFunc
Adw.Callbacks.wrap_AnimationTargetFunc Maybe (Ptr (FunPtr C_AnimationTargetFunc))
forall a. Maybe a
Nothing (AnimationTargetFunc -> AnimationTargetFunc_WithClosures
Adw.Callbacks.drop_closures_AnimationTargetFunc AnimationTargetFunc
callback))
    let userData :: Ptr ()
userData = FunPtr C_AnimationTargetFunc -> Ptr ()
forall a b. FunPtr a -> Ptr b
castFunPtrToPtr FunPtr C_AnimationTargetFunc
callback'
    let destroy :: FunPtr (Ptr a -> IO ())
destroy = FunPtr (Ptr a -> IO ())
forall a. FunPtr (Ptr a -> IO ())
SP.safeFreeFunPtrPtr
    Ptr CallbackAnimationTarget
result <- FunPtr C_AnimationTargetFunc
-> Ptr ()
-> FunPtr C_DestroyNotify
-> IO (Ptr CallbackAnimationTarget)
adw_callback_animation_target_new FunPtr C_AnimationTargetFunc
callback' Ptr ()
userData FunPtr C_DestroyNotify
forall a. FunPtr (Ptr a -> IO ())
destroy
    Text -> Ptr CallbackAnimationTarget -> IO ()
forall a. HasCallStack => Text -> Ptr a -> IO ()
checkUnexpectedReturnNULL Text
"callbackAnimationTargetNew" Ptr CallbackAnimationTarget
result
    CallbackAnimationTarget
result' <- ((ManagedPtr CallbackAnimationTarget -> CallbackAnimationTarget)
-> Ptr CallbackAnimationTarget -> IO CallbackAnimationTarget
forall a b.
(HasCallStack, GObject a, GObject b) =>
(ManagedPtr a -> a) -> Ptr b -> IO a
wrapObject ManagedPtr CallbackAnimationTarget -> CallbackAnimationTarget
CallbackAnimationTarget) Ptr CallbackAnimationTarget
result
    CallbackAnimationTarget -> IO CallbackAnimationTarget
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return CallbackAnimationTarget
result'

#if defined(ENABLE_OVERLOADING)
#endif