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

The GActionMap interface is implemented by 'GI.Gio.Interfaces.ActionGroup.ActionGroup'
implementations that operate by containing a number of
named 'GI.Gio.Interfaces.Action.Action' instances, such as 'GI.Gio.Objects.SimpleActionGroup.SimpleActionGroup'.

One useful application of this interface is to map the
names of actions from various action groups to unique,
prefixed names (e.g. by prepending \"app.\" or \"win.\").
This is the motivation for the \'Map\' part of the interface
name.
-}

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

module GI.Gio.Interfaces.ActionMap
    (

-- * Exported types
    ActionMap(..)                           ,
    noActionMap                             ,
    IsActionMap                             ,
    toActionMap                             ,


 -- * Methods
-- ** addAction #method:addAction#

#if ENABLE_OVERLOADING
    ActionMapAddActionMethodInfo            ,
#endif
    actionMapAddAction                      ,


-- ** addActionEntries #method:addActionEntries#

#if ENABLE_OVERLOADING
    ActionMapAddActionEntriesMethodInfo     ,
#endif
    actionMapAddActionEntries               ,


-- ** lookupAction #method:lookupAction#

#if ENABLE_OVERLOADING
    ActionMapLookupActionMethodInfo         ,
#endif
    actionMapLookupAction                   ,


-- ** removeAction #method:removeAction#

#if ENABLE_OVERLOADING
    ActionMapRemoveActionMethodInfo         ,
#endif
    actionMapRemoveAction                   ,




    ) 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.Interfaces.Action as Gio.Action
import {-# SOURCE #-} qualified GI.Gio.Structs.ActionEntry as Gio.ActionEntry

-- interface ActionMap 
-- | Memory-managed wrapper type.
newtype ActionMap = ActionMap (ManagedPtr ActionMap)
-- | A convenience alias for `Nothing` :: `Maybe` `ActionMap`.
noActionMap :: Maybe ActionMap
noActionMap = Nothing

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

#endif

foreign import ccall "g_action_map_get_type"
    c_g_action_map_get_type :: IO GType

instance GObject ActionMap where
    gobjectType _ = c_g_action_map_get_type


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

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

#if ENABLE_OVERLOADING
instance O.HasAttributeList ActionMap
type instance O.AttributeList ActionMap = ActionMapAttributeList
type ActionMapAttributeList = ('[ ] :: [(Symbol, *)])
#endif

#if ENABLE_OVERLOADING
#endif

#if ENABLE_OVERLOADING
type family ResolveActionMapMethod (t :: Symbol) (o :: *) :: * where
    ResolveActionMapMethod "addAction" o = ActionMapAddActionMethodInfo
    ResolveActionMapMethod "addActionEntries" o = ActionMapAddActionEntriesMethodInfo
    ResolveActionMapMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveActionMapMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveActionMapMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveActionMapMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveActionMapMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
    ResolveActionMapMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveActionMapMethod "lookupAction" o = ActionMapLookupActionMethodInfo
    ResolveActionMapMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveActionMapMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveActionMapMethod "ref" o = GObject.Object.ObjectRefMethodInfo
    ResolveActionMapMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveActionMapMethod "removeAction" o = ActionMapRemoveActionMethodInfo
    ResolveActionMapMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveActionMapMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveActionMapMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveActionMapMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveActionMapMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
    ResolveActionMapMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveActionMapMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveActionMapMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveActionMapMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveActionMapMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveActionMapMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveActionMapMethod l o = O.MethodResolutionFailed l o

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

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

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

foreign import ccall "g_action_map_add_action" g_action_map_add_action ::
    Ptr ActionMap ->                        -- action_map : TInterface (Name {namespace = "Gio", name = "ActionMap"})
    Ptr Gio.Action.Action ->                -- action : TInterface (Name {namespace = "Gio", name = "Action"})
    IO ()

{- |
Adds an action to the /@actionMap@/.

If the action map already contains an action with the same name
as /@action@/ then the old action is dropped from the action map.

The action map takes its own reference on /@action@/.

/Since: 2.32/
-}
actionMapAddAction ::
    (B.CallStack.HasCallStack, MonadIO m, IsActionMap a, Gio.Action.IsAction b) =>
    a
    {- ^ /@actionMap@/: a 'GI.Gio.Interfaces.ActionMap.ActionMap' -}
    -> b
    {- ^ /@action@/: a 'GI.Gio.Interfaces.Action.Action' -}
    -> m ()
actionMapAddAction actionMap action = liftIO $ do
    actionMap' <- unsafeManagedPtrCastPtr actionMap
    action' <- unsafeManagedPtrCastPtr action
    g_action_map_add_action actionMap' action'
    touchManagedPtr actionMap
    touchManagedPtr action
    return ()

#if ENABLE_OVERLOADING
data ActionMapAddActionMethodInfo
instance (signature ~ (b -> m ()), MonadIO m, IsActionMap a, Gio.Action.IsAction b) => O.MethodInfo ActionMapAddActionMethodInfo a signature where
    overloadedMethod _ = actionMapAddAction

#endif

-- method ActionMap::add_action_entries
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "action_map", argType = TInterface (Name {namespace = "Gio", name = "ActionMap"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GActionMap", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "entries", argType = TCArray False (-1) 2 (TInterface (Name {namespace = "Gio", name = "ActionEntry"})), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a pointer to\n          the first item in an array of #GActionEntry structs", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "n_entries", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the length of @entries, or -1 if @entries is %NULL-terminated", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "user_data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the user data for signal connections", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : [Arg {argCName = "n_entries", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the length of @entries, or -1 if @entries is %NULL-terminated", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_action_map_add_action_entries" g_action_map_add_action_entries ::
    Ptr ActionMap ->                        -- action_map : TInterface (Name {namespace = "Gio", name = "ActionMap"})
    Ptr Gio.ActionEntry.ActionEntry ->      -- entries : TCArray False (-1) 2 (TInterface (Name {namespace = "Gio", name = "ActionEntry"}))
    Int32 ->                                -- n_entries : TBasicType TInt
    Ptr () ->                               -- user_data : TBasicType TPtr
    IO ()

{- |
A convenience function for creating multiple 'GI.Gio.Objects.SimpleAction.SimpleAction' instances
and adding them to a 'GI.Gio.Interfaces.ActionMap.ActionMap'.

Each action is constructed as per one 'GI.Gio.Structs.ActionEntry.ActionEntry'.


=== /C code/
>
>static void
>activate_quit (GSimpleAction *simple,
>               GVariant      *parameter,
>               gpointer       user_data)
>{
>  exit (0);
>}
>
>static void
>activate_print_string (GSimpleAction *simple,
>                       GVariant      *parameter,
>                       gpointer       user_data)
>{
>  g_print ("%s\n", g_variant_get_string (parameter, NULL));
>}
>
>static GActionGroup *
>create_action_group (void)
>{
>  const GActionEntry entries[] = {
>    { "quit",         activate_quit              },
>    { "print-string", activate_print_string, "s" }
>  };
>  GSimpleActionGroup *group;
>
>  group = g_simple_action_group_new ();
>  g_action_map_add_action_entries (G_ACTION_MAP (group), entries, G_N_ELEMENTS (entries), NULL);
>
>  return G_ACTION_GROUP (group);
>}


/Since: 2.32/
-}
actionMapAddActionEntries ::
    (B.CallStack.HasCallStack, MonadIO m, IsActionMap a) =>
    a
    {- ^ /@actionMap@/: a 'GI.Gio.Interfaces.ActionMap.ActionMap' -}
    -> [Gio.ActionEntry.ActionEntry]
    {- ^ /@entries@/: a pointer to
          the first item in an array of 'GI.Gio.Structs.ActionEntry.ActionEntry' structs -}
    -> Ptr ()
    {- ^ /@userData@/: the user data for signal connections -}
    -> m ()
actionMapAddActionEntries actionMap entries userData = liftIO $ do
    let nEntries = fromIntegral $ length entries
    actionMap' <- unsafeManagedPtrCastPtr actionMap
    entries' <- mapM unsafeManagedPtrGetPtr entries
    entries'' <- packBlockArray 64 entries'
    g_action_map_add_action_entries actionMap' entries'' nEntries userData
    touchManagedPtr actionMap
    mapM_ touchManagedPtr entries
    freeMem entries''
    return ()

#if ENABLE_OVERLOADING
data ActionMapAddActionEntriesMethodInfo
instance (signature ~ ([Gio.ActionEntry.ActionEntry] -> Ptr () -> m ()), MonadIO m, IsActionMap a) => O.MethodInfo ActionMapAddActionEntriesMethodInfo a signature where
    overloadedMethod _ = actionMapAddActionEntries

#endif

-- method ActionMap::lookup_action
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "action_map", argType = TInterface (Name {namespace = "Gio", name = "ActionMap"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GActionMap", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "action_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the name of an action", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gio", name = "Action"}))
-- throws : False
-- Skip return : False

foreign import ccall "g_action_map_lookup_action" g_action_map_lookup_action ::
    Ptr ActionMap ->                        -- action_map : TInterface (Name {namespace = "Gio", name = "ActionMap"})
    CString ->                              -- action_name : TBasicType TUTF8
    IO (Ptr Gio.Action.Action)

{- |
Looks up the action with the name /@actionName@/ in /@actionMap@/.

If no such action exists, returns 'Nothing'.

/Since: 2.32/
-}
actionMapLookupAction ::
    (B.CallStack.HasCallStack, MonadIO m, IsActionMap a) =>
    a
    {- ^ /@actionMap@/: a 'GI.Gio.Interfaces.ActionMap.ActionMap' -}
    -> T.Text
    {- ^ /@actionName@/: the name of an action -}
    -> m Gio.Action.Action
    {- ^ __Returns:__ a 'GI.Gio.Interfaces.Action.Action', or 'Nothing' -}
actionMapLookupAction actionMap actionName = liftIO $ do
    actionMap' <- unsafeManagedPtrCastPtr actionMap
    actionName' <- textToCString actionName
    result <- g_action_map_lookup_action actionMap' actionName'
    checkUnexpectedReturnNULL "actionMapLookupAction" result
    result' <- (newObject Gio.Action.Action) result
    touchManagedPtr actionMap
    freeMem actionName'
    return result'

#if ENABLE_OVERLOADING
data ActionMapLookupActionMethodInfo
instance (signature ~ (T.Text -> m Gio.Action.Action), MonadIO m, IsActionMap a) => O.MethodInfo ActionMapLookupActionMethodInfo a signature where
    overloadedMethod _ = actionMapLookupAction

#endif

-- method ActionMap::remove_action
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "action_map", argType = TInterface (Name {namespace = "Gio", name = "ActionMap"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GActionMap", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "action_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the name of the action", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_action_map_remove_action" g_action_map_remove_action ::
    Ptr ActionMap ->                        -- action_map : TInterface (Name {namespace = "Gio", name = "ActionMap"})
    CString ->                              -- action_name : TBasicType TUTF8
    IO ()

{- |
Removes the named action from the action map.

If no action of this name is in the map then nothing happens.

/Since: 2.32/
-}
actionMapRemoveAction ::
    (B.CallStack.HasCallStack, MonadIO m, IsActionMap a) =>
    a
    {- ^ /@actionMap@/: a 'GI.Gio.Interfaces.ActionMap.ActionMap' -}
    -> T.Text
    {- ^ /@actionName@/: the name of the action -}
    -> m ()
actionMapRemoveAction actionMap actionName = liftIO $ do
    actionMap' <- unsafeManagedPtrCastPtr actionMap
    actionName' <- textToCString actionName
    g_action_map_remove_action actionMap' actionName'
    touchManagedPtr actionMap
    freeMem actionName'
    return ()

#if ENABLE_OVERLOADING
data ActionMapRemoveActionMethodInfo
instance (signature ~ (T.Text -> m ()), MonadIO m, IsActionMap a) => O.MethodInfo ActionMapRemoveActionMethodInfo a signature where
    overloadedMethod _ = actionMapRemoveAction

#endif