{- |
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 'GI.Pango.Objects.FontFamily.FontFamily' structure is used to represent a family of related
font faces. The faces in a family share a common design, but differ in
slant, weight, width and other aspects.
-}

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

module GI.Pango.Objects.FontFamily
    (

-- * Exported types
    FontFamily(..)                          ,
    IsFontFamily                            ,
    toFontFamily                            ,
    noFontFamily                            ,


 -- * Methods
-- ** getName #method:getName#

#if ENABLE_OVERLOADING
    FontFamilyGetNameMethodInfo             ,
#endif
    fontFamilyGetName                       ,


-- ** isMonospace #method:isMonospace#

#if ENABLE_OVERLOADING
    FontFamilyIsMonospaceMethodInfo         ,
#endif
    fontFamilyIsMonospace                   ,


-- ** listFaces #method:listFaces#

#if ENABLE_OVERLOADING
    FontFamilyListFacesMethodInfo           ,
#endif
    fontFamilyListFaces                     ,




    ) 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.Pango.Objects.FontFace as Pango.FontFace

-- | Memory-managed wrapper type.
newtype FontFamily = FontFamily (ManagedPtr FontFamily)
foreign import ccall "pango_font_family_get_type"
    c_pango_font_family_get_type :: IO GType

instance GObject FontFamily where
    gobjectType _ = c_pango_font_family_get_type


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

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

-- | A convenience alias for `Nothing` :: `Maybe` `FontFamily`.
noFontFamily :: Maybe FontFamily
noFontFamily = Nothing

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

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

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

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

#if ENABLE_OVERLOADING
#endif

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

#endif

-- method FontFamily::get_name
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "family", argType = TInterface (Name {namespace = "Pango", name = "FontFamily"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoFontFamily", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "pango_font_family_get_name" pango_font_family_get_name ::
    Ptr FontFamily ->                       -- family : TInterface (Name {namespace = "Pango", name = "FontFamily"})
    IO CString

{- |
Gets the name of the family. The name is unique among all
fonts for the font backend and can be used in a 'GI.Pango.Structs.FontDescription.FontDescription'
to specify that a face from this family is desired.
-}
fontFamilyGetName ::
    (B.CallStack.HasCallStack, MonadIO m, IsFontFamily a) =>
    a
    {- ^ /@family@/: a 'GI.Pango.Objects.FontFamily.FontFamily' -}
    -> m T.Text
    {- ^ __Returns:__ the name of the family. This string is owned
  by the family object and must not be modified or freed. -}
fontFamilyGetName family = liftIO $ do
    family' <- unsafeManagedPtrCastPtr family
    result <- pango_font_family_get_name family'
    checkUnexpectedReturnNULL "fontFamilyGetName" result
    result' <- cstringToText result
    touchManagedPtr family
    return result'

#if ENABLE_OVERLOADING
data FontFamilyGetNameMethodInfo
instance (signature ~ (m T.Text), MonadIO m, IsFontFamily a) => O.MethodInfo FontFamilyGetNameMethodInfo a signature where
    overloadedMethod _ = fontFamilyGetName

#endif

-- method FontFamily::is_monospace
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "family", argType = TInterface (Name {namespace = "Pango", name = "FontFamily"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoFontFamily", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "pango_font_family_is_monospace" pango_font_family_is_monospace ::
    Ptr FontFamily ->                       -- family : TInterface (Name {namespace = "Pango", name = "FontFamily"})
    IO CInt

{- |
A monospace font is a font designed for text display where the the
characters form a regular grid. For Western languages this would
mean that the advance width of all characters are the same, but
this categorization also includes Asian fonts which include
double-width characters: characters that occupy two grid cells.
'GI.GLib.Functions.unicharIswide' returns a result that indicates whether a
character is typically double-width in a monospace font.

The best way to find out the grid-cell size is to call
'GI.Pango.Structs.FontMetrics.fontMetricsGetApproximateDigitWidth', since the results
of 'GI.Pango.Structs.FontMetrics.fontMetricsGetApproximateCharWidth' may be affected
by double-width characters.

/Since: 1.4/
-}
fontFamilyIsMonospace ::
    (B.CallStack.HasCallStack, MonadIO m, IsFontFamily a) =>
    a
    {- ^ /@family@/: a 'GI.Pango.Objects.FontFamily.FontFamily' -}
    -> m Bool
    {- ^ __Returns:__ 'True' if the family is monospace. -}
fontFamilyIsMonospace family = liftIO $ do
    family' <- unsafeManagedPtrCastPtr family
    result <- pango_font_family_is_monospace family'
    let result' = (/= 0) result
    touchManagedPtr family
    return result'

#if ENABLE_OVERLOADING
data FontFamilyIsMonospaceMethodInfo
instance (signature ~ (m Bool), MonadIO m, IsFontFamily a) => O.MethodInfo FontFamilyIsMonospaceMethodInfo a signature where
    overloadedMethod _ = fontFamilyIsMonospace

#endif

-- method FontFamily::list_faces
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "family", argType = TInterface (Name {namespace = "Pango", name = "FontFamily"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoFontFamily", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "faces", argType = TCArray False (-1) 2 (TInterface (Name {namespace = "Pango", name = "FontFace"})), direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "\n  location to store an array of pointers to #PangoFontFace objects,\n  or %NULL. This array should be freed with g_free() when it is no\n  longer needed.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferContainer},Arg {argCName = "n_faces", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "location to store number of elements in @faces.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : [Arg {argCName = "n_faces", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "location to store number of elements in @faces.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "pango_font_family_list_faces" pango_font_family_list_faces ::
    Ptr FontFamily ->                       -- family : TInterface (Name {namespace = "Pango", name = "FontFamily"})
    Ptr (Ptr (Ptr Pango.FontFace.FontFace)) -> -- faces : TCArray False (-1) 2 (TInterface (Name {namespace = "Pango", name = "FontFace"}))
    Ptr Int32 ->                            -- n_faces : TBasicType TInt
    IO ()

{- |
Lists the different font faces that make up /@family@/. The faces
in a family share a common design, but differ in slant, weight,
width and other aspects.
-}
fontFamilyListFaces ::
    (B.CallStack.HasCallStack, MonadIO m, IsFontFamily a) =>
    a
    {- ^ /@family@/: a 'GI.Pango.Objects.FontFamily.FontFamily' -}
    -> m ([Pango.FontFace.FontFace])
fontFamilyListFaces family = liftIO $ do
    family' <- unsafeManagedPtrCastPtr family
    faces <- allocMem :: IO (Ptr (Ptr (Ptr Pango.FontFace.FontFace)))
    nFaces <- allocMem :: IO (Ptr Int32)
    pango_font_family_list_faces family' faces nFaces
    nFaces' <- peek nFaces
    faces' <- peek faces
    faces'' <- (unpackPtrArrayWithLength nFaces') faces'
    faces''' <- mapM (newObject Pango.FontFace.FontFace) faces''
    freeMem faces'
    touchManagedPtr family
    freeMem faces
    freeMem nFaces
    return faces'''

#if ENABLE_OVERLOADING
data FontFamilyListFacesMethodInfo
instance (signature ~ (m ([Pango.FontFace.FontFace])), MonadIO m, IsFontFamily a) => O.MethodInfo FontFamilyListFacesMethodInfo a signature where
    overloadedMethod _ = fontFamilyListFaces

#endif