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

module GI.Gio.Objects.Emblem
    ( 

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


 -- * Methods
-- ** getIcon #method:getIcon#
    EmblemGetIconMethodInfo                 ,
    emblemGetIcon                           ,


-- ** getOrigin #method:getOrigin#
    EmblemGetOriginMethodInfo               ,
    emblemGetOrigin                         ,


-- ** new #method:new#
    emblemNew                               ,


-- ** newWithOrigin #method:newWithOrigin#
    emblemNewWithOrigin                     ,




 -- * Properties
-- ** icon #attr:icon#
    EmblemIconPropertyInfo                  ,
    constructEmblemIcon                     ,
    emblemIcon                              ,
    getEmblemIcon                           ,


-- ** origin #attr:origin#
    EmblemOriginPropertyInfo                ,
    constructEmblemOrigin                   ,
    emblemOrigin                            ,
    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.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

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
    

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

toEmblem :: IsEmblem o => o -> IO Emblem
toEmblem = unsafeCastTo Emblem

noEmblem :: Maybe Emblem
noEmblem = Nothing

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 "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 "replaceData" o = GObject.Object.ObjectReplaceDataMethodInfo
    ResolveEmblemMethod "replaceQdata" o = GObject.Object.ObjectReplaceQdataMethodInfo
    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
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif

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

getEmblemIcon :: (MonadIO m, IsEmblem o) => o -> m (Maybe GObject.Object.Object)
getEmblemIcon obj = liftIO $ getObjectPropertyObject obj "icon" GObject.Object.Object

constructEmblemIcon :: (IsEmblem o, GObject.Object.IsObject a) => a -> IO (GValueConstruct o)
constructEmblemIcon val = constructObjectPropertyObject "icon" (Just val)

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

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

getEmblemOrigin :: (MonadIO m, IsEmblem o) => o -> m Gio.Enums.EmblemOrigin
getEmblemOrigin obj = liftIO $ getObjectPropertyEnum obj "origin"

constructEmblemOrigin :: (IsEmblem o) => Gio.Enums.EmblemOrigin -> IO (GValueConstruct o)
constructEmblemOrigin val = constructObjectPropertyEnum "origin" val

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

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

emblemIcon :: AttrLabelProxy "icon"
emblemIcon = AttrLabelProxy

emblemOrigin :: AttrLabelProxy "origin"
emblemOrigin = AttrLabelProxy

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

-- 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'

-- 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'

-- 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'

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

-- 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'

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