hsqml-0.2.0.0: src/Graphics/QML/Internal/Objects.hs
{-# LANGUAGE
ScopedTypeVariables,
TypeFamilies,
FlexibleContexts,
FlexibleInstances,
Rank2Types
#-}
module Graphics.QML.Internal.Objects where
import Graphics.QML.Internal.BindObj
import Graphics.QML.Internal.Marshal
import Data.Typeable
import Data.Bits
import Data.Char
data MemberKind
= MethodMember
| PropertyMember
| SignalMember
deriving (Bounded, Enum, Eq)
-- | Represents a named member of the QML class which wraps type @tt@.
data Member tt = Member {
memberKind :: MemberKind,
memberName :: String,
memberType :: TypeName,
memberParams :: [TypeName],
memberFun :: UniformFunc,
memberFunAux :: Maybe UniformFunc,
memberKey :: Maybe TypeRep
}
-- | Represents the API of the QML class which wraps the type @tt@.
newtype ClassDef tt = ClassDef {
classMembers :: [Member tt]
}
-- | The class 'Object' allows Haskell types to expose an object-oriented
-- interface to QML.
class (Typeable tt) => Object tt where
classDef :: ClassDef tt
type MObjToHsFunc t = HsQMLObjectHandle -> IO t
type MHsToObjFunc t = t -> IO HsQMLObjectHandle
-- | Type function yielding the object type specified by a given 'MarshalMode'.
type family ModeObj m
-- | Type function yielding the object type speficied by a given marshallable
-- type @tt@.
type ThisObj tt = ModeObj (MarshalMode tt)
-- | Class for 'MarshalMode's which support marshalling QML-to-Haskell
-- in contexts specific to objects.
class (MarshalBase m) => MarshalFromObj m where
mObjToHs_ :: forall t. Marshaller t m -> MObjToHsFunc t
mObjToHs ::
forall t. (Marshal t, MarshalFromObj (MarshalMode t)) => MObjToHsFunc t
mObjToHs = mObjToHs_ (marshaller :: Marshaller t (MarshalMode t))
-- | Class for 'MarshalMode's which support marshalling Haskell-to-QML
-- in contexts specific to objects.
class (MarshalBase m) => MarshalToObj m where
mHsToObj_ :: forall t. Marshaller t m -> MHsToObjFunc t
mHsToObj ::
forall t. (Marshal t, MarshalToObj (MarshalMode t)) => MHsToObjFunc t
mHsToObj = mHsToObj_ (marshaller :: Marshaller t (MarshalMode t))
-- | 'MarshalMode' for object types.
data ValObjBidi a
type instance ModeObj (ValObjBidi a) = a
data instance Marshaller t (ValObjBidi a) = MValObjBidi {
mValObjBidi_typeName :: !(MTypeNameFunc t),
mValObjBidi_valToHs :: !(MValToHsFunc t),
mValObjBidi_hsToVal :: !(MHsToValFunc t),
mValObjBidi_hsToAlloc :: !(MHsToAllocFunc t),
mValObjBidi_objToHs :: !(MObjToHsFunc t),
mValObjBidi_hsToObj :: !(MHsToObjFunc t)}
instance MarshalBase (ValObjBidi a) where
mTypeName_ = mValObjBidi_typeName
instance MarshalToHs (ValObjBidi a) where
mValToHs_ = mValObjBidi_valToHs
instance MarshalToValRaw (ValObjBidi a) where
mHsToVal_ = mValObjBidi_hsToVal
mHsToAlloc_ = mValObjBidi_hsToAlloc
instance MarshalToVal (ValObjBidi a) where
instance MarshalToObj (ValObjBidi a) where
mHsToObj_ = mValObjBidi_hsToObj
instance MarshalFromObj (ValObjBidi a) where
mObjToHs_ = mValObjBidi_objToHs
-- | 'MarshalMode' for object types, operating only in the QML-to-Haskell
-- direction.
data ValObjToOnly a
type instance ModeObj (ValObjToOnly a) = a
data instance Marshaller t (ValObjToOnly a) = MValObjToOnly {
mValObjToOnly_typeName :: !(MTypeNameFunc t),
mValObjToOnly_valToHs :: !(MValToHsFunc t),
mValObjToOnly_objToHs :: !(MObjToHsFunc t)}
instance MarshalBase (ValObjToOnly a) where
mTypeName_ = mValObjToOnly_typeName
instance MarshalToHs (ValObjToOnly a) where
mValToHs_ = mValObjToOnly_valToHs
instance MarshalFromObj (ValObjToOnly a) where
mObjToHs_ = mValObjToOnly_objToHs