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

    'GI.Gio.Objects.Emblem.Emblem' is an implementation of 'GI.Gio.Interfaces.Icon.Icon' that supports
    having an emblem, which is an icon with additional properties.
    It can than be added to a 'GI.Gio.Objects.EmblemedIcon.EmblemedIcon'.

    Currently, only metainformation about the emblem\'s origin is
    supported. More may be added in the future.
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Gio.Objects.Emblem
        (

    -- * Exported types
        Emblem(..)                              ,
        IsEmblem                                ,
        toEmblem                                ,
        noEmblem                                ,

     -- * Methods
    -- ** getIcon #method:getIcon#

    #if ENABLE_OVERLOADING
        EmblemGetIconMethodInfo                 ,
    #endif
        emblemGetIcon                           ,

    -- ** getOrigin #method:getOrigin#

    #if ENABLE_OVERLOADING
        EmblemGetOriginMethodInfo               ,
    #endif
        emblemGetOrigin                         ,

    -- ** new #method:new#

        emblemNew                               ,

    -- ** newWithOrigin #method:newWithOrigin#

        emblemNewWithOrigin                     ,

     -- * Properties
    -- ** icon #attr:icon#
    {- | /No description available in the introspection data./
    -}
    #if ENABLE_OVERLOADING
        EmblemIconPropertyInfo                  ,
    #endif
        constructEmblemIcon                     ,
    #if ENABLE_OVERLOADING
        emblemIcon                              ,
    #endif
        getEmblemIcon                           ,

    -- ** origin #attr:origin#
    {- | /No description available in the introspection data./
    -}
    #if ENABLE_OVERLOADING
        EmblemOriginPropertyInfo                ,
    #endif
        constructEmblemOrigin                   ,
    #if ENABLE_OVERLOADING
        emblemOrigin                            ,
    #endif
        getEmblemOrigin                         ,

        ) 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

    import qualified GI.GObject.Objects.Object as GObject.Object
    import {-# SOURCE #-} qualified GI.Gio.Enums as Gio.Enums
    import {-# SOURCE #-} qualified GI.Gio.Interfaces.Icon as Gio.Icon

    -- | Memory-managed wrapper type.
    newtype Emblem = Emblem (ManagedPtr Emblem)
    foreign import ccall "g_emblem_get_type"
        c_g_emblem_get_type :: IO GType

    instance GObject Emblem where
        gobjectType _ = c_g_emblem_get_type

    -- | Type class for types which can be safely cast to `Emblem`, for instance with `toEmblem`.
    class GObject o => IsEmblem o
    #if MIN_VERSION_base(4,9,0)
    instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError Emblem a) =>
        IsEmblem a
    #endif
    instance IsEmblem Emblem
    instance GObject.Object.IsObject Emblem
    instance Gio.Icon.IsIcon Emblem

    -- | Cast to `Emblem`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
    toEmblem :: (MonadIO m, IsEmblem o) => o -> m Emblem
    toEmblem = liftIO . unsafeCastTo Emblem

    -- | A convenience alias for `Nothing` :: `Maybe` `Emblem`.
    noEmblem :: Maybe Emblem
    noEmblem = Nothing

    #if ENABLE_OVERLOADING
    type family ResolveEmblemMethod (t :: Symbol) (o :: *) :: * where
        ResolveEmblemMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
        ResolveEmblemMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
        ResolveEmblemMethod "equal" o = Gio.Icon.IconEqualMethodInfo
        ResolveEmblemMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
        ResolveEmblemMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
        ResolveEmblemMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
        ResolveEmblemMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
        ResolveEmblemMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
        ResolveEmblemMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
        ResolveEmblemMethod "ref" o = GObject.Object.ObjectRefMethodInfo
        ResolveEmblemMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
        ResolveEmblemMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
        ResolveEmblemMethod "serialize" o = Gio.Icon.IconSerializeMethodInfo
        ResolveEmblemMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
        ResolveEmblemMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
        ResolveEmblemMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
        ResolveEmblemMethod "toString" o = Gio.Icon.IconToStringMethodInfo
        ResolveEmblemMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
        ResolveEmblemMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
        ResolveEmblemMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
        ResolveEmblemMethod "getIcon" o = EmblemGetIconMethodInfo
        ResolveEmblemMethod "getOrigin" o = EmblemGetOriginMethodInfo
        ResolveEmblemMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
        ResolveEmblemMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
        ResolveEmblemMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
        ResolveEmblemMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
        ResolveEmblemMethod l o = O.MethodResolutionFailed l o

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

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

    -- VVV Prop "icon"
       -- Type: TInterface (Name {namespace = "GObject", name = "Object"})
       -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]
       -- Nullable: (Nothing,Nothing)

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

    @
    'Data.GI.Base.Attributes.get' emblem #icon
    @
    -}
    getEmblemIcon :: (MonadIO m, IsEmblem o) => o -> m (Maybe GObject.Object.Object)
    getEmblemIcon obj = liftIO $ getObjectPropertyObject obj "icon" GObject.Object.Object

    {- |
    Construct a `GValueConstruct` with valid value for the “@icon@” property. This is rarely needed directly, but it is used by `Data.GI.Base.Constructible.new`.
    -}
    constructEmblemIcon :: (IsEmblem o, GObject.Object.IsObject a) => a -> IO (GValueConstruct o)
    constructEmblemIcon val = constructObjectPropertyObject "icon" (Just val)

    #if ENABLE_OVERLOADING
    data EmblemIconPropertyInfo
    instance AttrInfo EmblemIconPropertyInfo where
        type AttrAllowedOps EmblemIconPropertyInfo = '[ 'AttrConstruct, 'AttrGet, 'AttrClear]
        type AttrSetTypeConstraint EmblemIconPropertyInfo = GObject.Object.IsObject
        type AttrBaseTypeConstraint EmblemIconPropertyInfo = IsEmblem
        type AttrGetType EmblemIconPropertyInfo = (Maybe GObject.Object.Object)
        type AttrLabel EmblemIconPropertyInfo = "icon"
        type AttrOrigin EmblemIconPropertyInfo = Emblem
        attrGet _ = getEmblemIcon
        attrSet _ = undefined
        attrConstruct _ = constructEmblemIcon
        attrClear _ = undefined
    #endif

    -- VVV Prop "origin"
       -- Type: TInterface (Name {namespace = "Gio", name = "EmblemOrigin"})
       -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]
       -- Nullable: (Just False,Nothing)

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

    @
    'Data.GI.Base.Attributes.get' emblem #origin
    @
    -}
    getEmblemOrigin :: (MonadIO m, IsEmblem o) => o -> m Gio.Enums.EmblemOrigin
    getEmblemOrigin obj = liftIO $ getObjectPropertyEnum obj "origin"

    {- |
    Construct a `GValueConstruct` with valid value for the “@origin@” property. This is rarely needed directly, but it is used by `Data.GI.Base.Constructible.new`.
    -}
    constructEmblemOrigin :: (IsEmblem o) => Gio.Enums.EmblemOrigin -> IO (GValueConstruct o)
    constructEmblemOrigin val = constructObjectPropertyEnum "origin" val

    #if ENABLE_OVERLOADING
    data EmblemOriginPropertyInfo
    instance AttrInfo EmblemOriginPropertyInfo where
        type AttrAllowedOps EmblemOriginPropertyInfo = '[ 'AttrConstruct, 'AttrGet]
        type AttrSetTypeConstraint EmblemOriginPropertyInfo = (~) Gio.Enums.EmblemOrigin
        type AttrBaseTypeConstraint EmblemOriginPropertyInfo = IsEmblem
        type AttrGetType EmblemOriginPropertyInfo = Gio.Enums.EmblemOrigin
        type AttrLabel EmblemOriginPropertyInfo = "origin"
        type AttrOrigin EmblemOriginPropertyInfo = Emblem
        attrGet _ = getEmblemOrigin
        attrSet _ = undefined
        attrConstruct _ = constructEmblemOrigin
        attrClear _ = undefined
    #endif

    #if ENABLE_OVERLOADING
    instance O.HasAttributeList Emblem
    type instance O.AttributeList Emblem = EmblemAttributeList
    type EmblemAttributeList = ('[ '("icon", EmblemIconPropertyInfo), '("origin", EmblemOriginPropertyInfo)] :: [(Symbol, *)])
    #endif

    #if ENABLE_OVERLOADING
    emblemIcon :: AttrLabelProxy "icon"
    emblemIcon = AttrLabelProxy

    emblemOrigin :: AttrLabelProxy "origin"
    emblemOrigin = AttrLabelProxy

    #endif

    #if ENABLE_OVERLOADING
    type instance O.SignalList Emblem = EmblemSignalList
    type EmblemSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

    #endif

    -- method Emblem::new
    -- method type : Constructor
    -- Args : [Arg {argCName = "icon", argType = TInterface (Name {namespace = "Gio", name = "Icon"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a GIcon containing the icon.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "Emblem"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_emblem_new" g_emblem_new ::
        Ptr Gio.Icon.Icon ->                    -- icon : TInterface (Name {namespace = "Gio", name = "Icon"})
        IO (Ptr Emblem)

    {- |
    Creates a new emblem for /@icon@/.

    /Since: 2.18/
    -}
    emblemNew ::
        (B.CallStack.HasCallStack, MonadIO m, Gio.Icon.IsIcon a) =>
        a
        {- ^ /@icon@/: a GIcon containing the icon. -}
        -> m Emblem
        {- ^ __Returns:__ a new 'GI.Gio.Objects.Emblem.Emblem'. -}
    emblemNew icon = liftIO $ do
        icon' <- unsafeManagedPtrCastPtr icon
        result <- g_emblem_new icon'
        checkUnexpectedReturnNULL "emblemNew" result
        result' <- (wrapObject Emblem) result
        touchManagedPtr icon
        return result'

    #if ENABLE_OVERLOADING
    #endif

    -- method Emblem::new_with_origin
    -- method type : Constructor
    -- Args : [Arg {argCName = "icon", argType = TInterface (Name {namespace = "Gio", name = "Icon"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a GIcon containing the icon.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "origin", argType = TInterface (Name {namespace = "Gio", name = "EmblemOrigin"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a GEmblemOrigin enum defining the emblem's origin", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "Emblem"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_emblem_new_with_origin" g_emblem_new_with_origin ::
        Ptr Gio.Icon.Icon ->                    -- icon : TInterface (Name {namespace = "Gio", name = "Icon"})
        CUInt ->                                -- origin : TInterface (Name {namespace = "Gio", name = "EmblemOrigin"})
        IO (Ptr Emblem)

    {- |
    Creates a new emblem for /@icon@/.

    /Since: 2.18/
    -}
    emblemNewWithOrigin ::
        (B.CallStack.HasCallStack, MonadIO m, Gio.Icon.IsIcon a) =>
        a
        {- ^ /@icon@/: a GIcon containing the icon. -}
        -> Gio.Enums.EmblemOrigin
        {- ^ /@origin@/: a GEmblemOrigin enum defining the emblem\'s origin -}
        -> m Emblem
        {- ^ __Returns:__ a new 'GI.Gio.Objects.Emblem.Emblem'. -}
    emblemNewWithOrigin icon origin = liftIO $ do
        icon' <- unsafeManagedPtrCastPtr icon
        let origin' = (fromIntegral . fromEnum) origin
        result <- g_emblem_new_with_origin icon' origin'
        checkUnexpectedReturnNULL "emblemNewWithOrigin" result
        result' <- (wrapObject Emblem) result
        touchManagedPtr icon
        return result'

    #if ENABLE_OVERLOADING
    #endif

    -- method Emblem::get_icon
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "emblem", argType = TInterface (Name {namespace = "Gio", name = "Emblem"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GEmblem from which the icon should be extracted.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "Icon"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_emblem_get_icon" g_emblem_get_icon ::
        Ptr Emblem ->                           -- emblem : TInterface (Name {namespace = "Gio", name = "Emblem"})
        IO (Ptr Gio.Icon.Icon)

    {- |
    Gives back the icon from /@emblem@/.

    /Since: 2.18/
    -}
    emblemGetIcon ::
        (B.CallStack.HasCallStack, MonadIO m, IsEmblem a) =>
        a
        {- ^ /@emblem@/: a 'GI.Gio.Objects.Emblem.Emblem' from which the icon should be extracted. -}
        -> m Gio.Icon.Icon
        {- ^ __Returns:__ a 'GI.Gio.Interfaces.Icon.Icon'. The returned object belongs to
             the emblem and should not be modified or freed. -}
    emblemGetIcon emblem = liftIO $ do
        emblem' <- unsafeManagedPtrCastPtr emblem
        result <- g_emblem_get_icon emblem'
        checkUnexpectedReturnNULL "emblemGetIcon" result
        result' <- (newObject Gio.Icon.Icon) result
        touchManagedPtr emblem
        return result'

    #if ENABLE_OVERLOADING
    data EmblemGetIconMethodInfo
    instance (signature ~ (m Gio.Icon.Icon), MonadIO m, IsEmblem a) => O.MethodInfo EmblemGetIconMethodInfo a signature where
        overloadedMethod _ = emblemGetIcon

    #endif

    -- method Emblem::get_origin
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "emblem", argType = TInterface (Name {namespace = "Gio", name = "Emblem"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GEmblem", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "EmblemOrigin"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_emblem_get_origin" g_emblem_get_origin ::
        Ptr Emblem ->                           -- emblem : TInterface (Name {namespace = "Gio", name = "Emblem"})
        IO CUInt

    {- |
    Gets the origin of the emblem.

    /Since: 2.18/
    -}
    emblemGetOrigin ::
        (B.CallStack.HasCallStack, MonadIO m, IsEmblem a) =>
        a
        {- ^ /@emblem@/: a 'GI.Gio.Objects.Emblem.Emblem' -}
        -> m Gio.Enums.EmblemOrigin
        {- ^ __Returns:__ the origin of the emblem -}
    emblemGetOrigin emblem = liftIO $ do
        emblem' <- unsafeManagedPtrCastPtr emblem
        result <- g_emblem_get_origin emblem'
        let result' = (toEnum . fromIntegral) result
        touchManagedPtr emblem
        return result'

    #if ENABLE_OVERLOADING
    data EmblemGetOriginMethodInfo
    instance (signature ~ (m Gio.Enums.EmblemOrigin), MonadIO m, IsEmblem a) => O.MethodInfo EmblemGetOriginMethodInfo a signature where
        overloadedMethod _ = emblemGetOrigin

    #endif