module Graphics.UI.Qtah.Generator.Types (
QtExport (..),
qtExport,
qtExportToExports,
makeQtEnum,
makeQtEnum',
makeQtEnumAndFlags,
makeQtEnumAndFlags',
makeQtEnumAndFlagsWithOverrides,
ListenerInfo (ListenerInfo),
Signal, SignalGen, makeSignal, makeSignal', makeSignalPrivate,
makeQtClassAndSignals,
signalCName, signalHaskellName, signalClass, signalListenerClass, signalCallback,
) where
import Data.Maybe (mapMaybe)
import qualified Data.Set as S
import Foreign.Hoppy.Generator.Spec (
Callback,
Class,
ClassEntity (CEMethod),
CppEnum,
Scoped (Unscoped),
Export (Export),
Exportable,
ForeignLanguage (Haskell),
Function,
Identifier,
Include,
addReqIncludes,
callbackParams,
callbackReturn,
classAddEntities,
enumAddEntryNameOverrides,
enumSetHasBitOperations,
enumSetUnknownValueEntry,
enumSetValuePrefix,
identifierParts,
idPartBase,
makeAutoEnum,
mkMethod'_,
onParameterType,
stripToGc,
toExtName,
toExport,
)
import Graphics.UI.Qtah.Generator.Common (upperFirst)
import Graphics.UI.Qtah.Generator.Flags (Flags, makeFlags)
data QtExport =
QtExport Export
| QtExportFnRenamed Function String
| QtExportClassAndSignals Class [Signal]
| QtExportEvent Class
| QtExportSceneEvent Class
| QtExportSpecials
qtExport :: Exportable a => a -> QtExport
qtExport :: a -> QtExport
qtExport = Export -> QtExport
QtExport (Export -> QtExport) -> (a -> Export) -> a -> QtExport
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Export
forall a. Exportable a => a -> Export
toExport
qtExportToExports :: QtExport -> [Export]
qtExportToExports :: QtExport -> [Export]
qtExportToExports QtExport
qtExport = case QtExport
qtExport of
QtExport Export
export -> [Export
export]
QtExportFnRenamed Function
fn String
_ -> [Function -> Export
forall a. Exportable a => a -> Export
Export Function
fn]
QtExportClassAndSignals Class
cls [Signal]
_ -> [Class -> Export
forall a. Exportable a => a -> Export
Export Class
cls]
QtExportEvent Class
cls -> [Class -> Export
forall a. Exportable a => a -> Export
Export Class
cls]
QtExportSceneEvent Class
cls -> [Class -> Export
forall a. Exportable a => a -> Export
Export Class
cls]
QtExport
QtExportSpecials -> []
makeQtEnum :: Identifier -> [Include] -> [String] -> CppEnum
makeQtEnum :: Identifier -> [Include] -> [String] -> CppEnum
makeQtEnum Identifier
identifier [Include]
includes [String]
names =
Identifier -> Scoped -> [Include] -> [String] -> CppEnum
makeQtEnum' Identifier
identifier
Scoped
Unscoped
[Include]
includes
[String]
names
makeQtEnum' :: Identifier -> Scoped -> [Include] -> [String] -> CppEnum
makeQtEnum' :: Identifier -> Scoped -> [Include] -> [String] -> CppEnum
makeQtEnum' Identifier
identifier Scoped
scoped [Include]
includes [String]
names =
[Include] -> CppEnum -> CppEnum
forall a. HasReqs a => [Include] -> a -> a
addReqIncludes [Include]
includes (CppEnum -> CppEnum) -> CppEnum -> CppEnum
forall a b. (a -> b) -> a -> b
$
String -> CppEnum -> CppEnum
enumSetValuePrefix String
"" (CppEnum -> CppEnum) -> CppEnum -> CppEnum
forall a b. (a -> b) -> a -> b
$
String -> CppEnum -> CppEnum
forall a. IsEnumUnknownValueEntry a => a -> CppEnum -> CppEnum
enumSetUnknownValueEntry (String
"Unknown" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
niceName) (CppEnum -> CppEnum) -> CppEnum -> CppEnum
forall a b. (a -> b) -> a -> b
$
Bool -> CppEnum -> CppEnum
enumSetHasBitOperations Bool
False (CppEnum -> CppEnum) -> CppEnum -> CppEnum
forall a b. (a -> b) -> a -> b
$
CppEnum -> CppEnum
addEntryOverrides (CppEnum -> CppEnum) -> CppEnum -> CppEnum
forall a b. (a -> b) -> a -> b
$
Identifier -> Maybe ExtName -> Scoped -> [String] -> CppEnum
forall v.
IsAutoEnumValue v =>
Identifier -> Maybe ExtName -> Scoped -> [v] -> CppEnum
makeAutoEnum Identifier
identifier
(ExtName -> Maybe ExtName
forall a. a -> Maybe a
Just (ExtName -> Maybe ExtName) -> ExtName -> Maybe ExtName
forall a b. (a -> b) -> a -> b
$ HasCallStack => String -> ExtName
String -> ExtName
toExtName String
niceName)
Scoped
scoped
[String]
names
where niceName :: String
niceName = (IdPart -> String) -> [IdPart] -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap IdPart -> String
idPartBase ([IdPart] -> String) -> [IdPart] -> String
forall a b. (a -> b) -> a -> b
$ Identifier -> [IdPart]
identifierParts Identifier
identifier
addEntryOverrides :: CppEnum -> CppEnum
addEntryOverrides = ForeignLanguage -> [(String, String)] -> CppEnum -> CppEnum
forall v.
IsAutoEnumValue v =>
ForeignLanguage -> [(v, v)] -> CppEnum -> CppEnum
enumAddEntryNameOverrides ForeignLanguage
Haskell [(String, String)]
applicableOverrides
applicableOverrides :: [(String, String)]
applicableOverrides = ((String, String) -> Bool)
-> [(String, String)] -> [(String, String)]
forall a. (a -> Bool) -> [a] -> [a]
filter (\(String
from, String
_) -> String -> Set String -> Bool
forall a. Ord a => a -> Set a -> Bool
S.member String
from Set String
nameSet) [(String, String)]
enumNameOverrides
nameSet :: Set String
nameSet = [String] -> Set String
forall a. Ord a => [a] -> Set a
S.fromList [String]
names
makeQtEnumAndFlags :: Identifier -> String -> [Include] -> [String] -> (CppEnum, Flags)
makeQtEnumAndFlags :: Identifier -> String -> [Include] -> [String] -> (CppEnum, Flags)
makeQtEnumAndFlags Identifier
enumIdentifier String
flagsName [Include]
includes [String]
names =
let enum :: CppEnum
enum = Identifier -> [Include] -> [String] -> CppEnum
makeQtEnum Identifier
enumIdentifier [Include]
includes [String]
names
flags :: Flags
flags = CppEnum -> String -> Flags
makeFlags CppEnum
enum String
flagsName
in (CppEnum
enum, Flags
flags)
makeQtEnumAndFlags' :: Identifier -> String -> Scoped -> [Include] -> [String] -> (CppEnum, Flags)
makeQtEnumAndFlags' :: Identifier
-> String -> Scoped -> [Include] -> [String] -> (CppEnum, Flags)
makeQtEnumAndFlags' Identifier
enumIdentifier String
flagsName Scoped
scoped [Include]
includes [String]
names =
let enum :: CppEnum
enum = Identifier -> Scoped -> [Include] -> [String] -> CppEnum
makeQtEnum' Identifier
enumIdentifier Scoped
scoped [Include]
includes [String]
names
flags :: Flags
flags = CppEnum -> String -> Flags
makeFlags CppEnum
enum String
flagsName
in (CppEnum
enum, Flags
flags)
makeQtEnumAndFlagsWithOverrides ::
Identifier -> String -> [Include] -> [String] -> [(String, String)] -> (CppEnum, Flags)
makeQtEnumAndFlagsWithOverrides :: Identifier
-> String
-> [Include]
-> [String]
-> [(String, String)]
-> (CppEnum, Flags)
makeQtEnumAndFlagsWithOverrides Identifier
enumIdentifier String
flagsName [Include]
includes [String]
names [(String, String)]
nameOverrides =
let enum :: CppEnum
enum = ForeignLanguage -> [(String, String)] -> CppEnum -> CppEnum
forall v.
IsAutoEnumValue v =>
ForeignLanguage -> [(v, v)] -> CppEnum -> CppEnum
enumAddEntryNameOverrides ForeignLanguage
Haskell [(String, String)]
nameOverrides (CppEnum -> CppEnum) -> CppEnum -> CppEnum
forall a b. (a -> b) -> a -> b
$
Identifier -> [Include] -> [String] -> CppEnum
makeQtEnum Identifier
enumIdentifier [Include]
includes [String]
names
flags :: Flags
flags = CppEnum -> String -> Flags
makeFlags CppEnum
enum String
flagsName
in (CppEnum
enum, Flags
flags)
enumNameOverrides :: [(String, String)]
enumNameOverrides :: [(String, String)]
enumNameOverrides =
[ (String
"Type", String
"Typ")
]
data Signal = Signal
{ Signal -> Class
signalClass :: Class
, Signal -> String
signalCName :: String
, Signal -> String
signalHaskellName :: String
, Signal -> Class
signalListenerClass :: Class
, Signal -> Callback
signalCallback :: Callback
, Signal -> Bool
signalPrivate :: Bool
}
type SignalGen = Class -> Signal
data ListenerInfo = ListenerInfo Class Callback
makeSignal :: String
-> ListenerInfo
-> SignalGen
makeSignal :: String -> ListenerInfo -> SignalGen
makeSignal String
cName (ListenerInfo Class
listenerClass Callback
callback) Class
cls =
Class -> String -> String -> Class -> Callback -> Bool -> Signal
Signal Class
cls String
cName String
cName Class
listenerClass Callback
callback Bool
False
makeSignal' :: String
-> String
-> ListenerInfo
-> SignalGen
makeSignal' :: String -> String -> ListenerInfo -> SignalGen
makeSignal' String
cName String
hsName (ListenerInfo Class
listenerClass Callback
callback) Class
cls =
Class -> String -> String -> Class -> Callback -> Bool -> Signal
Signal Class
cls String
cName String
hsName Class
listenerClass Callback
callback Bool
False
makeSignalPrivate ::
String
-> ListenerInfo
-> SignalGen
makeSignalPrivate :: String -> ListenerInfo -> SignalGen
makeSignalPrivate String
cName (ListenerInfo Class
listenerClass Callback
callback) Class
cls =
Class -> String -> String -> Class -> Callback -> Bool -> Signal
Signal Class
cls String
cName String
cName Class
listenerClass Callback
callback Bool
True
makeQtClassAndSignals :: [SignalGen] -> Class -> (Class, [Signal])
makeQtClassAndSignals :: [SignalGen] -> Class -> (Class, [Signal])
makeQtClassAndSignals [SignalGen]
sigs Class
cls = (Class
cls', [Signal]
sigs')
where cls' :: Class
cls' = ([ClassEntity] -> Class -> Class)
-> Class -> [ClassEntity] -> Class
forall a b c. (a -> b -> c) -> b -> a -> c
flip [ClassEntity] -> Class -> Class
classAddEntities Class
cls ([ClassEntity] -> Class) -> [ClassEntity] -> Class
forall a b. (a -> b) -> a -> b
$ ((Signal -> Maybe ClassEntity) -> [Signal] -> [ClassEntity])
-> [Signal] -> (Signal -> Maybe ClassEntity) -> [ClassEntity]
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Signal -> Maybe ClassEntity) -> [Signal] -> [ClassEntity]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe [Signal]
sigs' ((Signal -> Maybe ClassEntity) -> [ClassEntity])
-> (Signal -> Maybe ClassEntity) -> [ClassEntity]
forall a b. (a -> b) -> a -> b
$ \Signal
sig ->
if Signal -> Bool
signalPrivate Signal
sig
then Maybe ClassEntity
forall a. Maybe a
Nothing
else ClassEntity -> Maybe ClassEntity
forall a. a -> Maybe a
Just (ClassEntity -> Maybe ClassEntity)
-> ClassEntity -> Maybe ClassEntity
forall a b. (a -> b) -> a -> b
$
let cName :: String
cName = Signal -> String
signalCName Signal
sig
hsName :: String
hsName = String
"emit" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
upperFirst (Signal -> String
signalHaskellName Signal
sig)
callback :: Callback
callback = Signal -> Callback
signalCallback Signal
sig
params :: [Parameter]
params = (Parameter -> Parameter) -> [Parameter] -> [Parameter]
forall a b. (a -> b) -> [a] -> [b]
map ((Type -> Type) -> Parameter -> Parameter
onParameterType Type -> Type
stripToGc) ([Parameter] -> [Parameter]) -> [Parameter] -> [Parameter]
forall a b. (a -> b) -> a -> b
$ Callback -> [Parameter]
callbackParams Callback
callback
retType :: Type
retType = Callback -> Type
callbackReturn Callback
callback
in Method -> ClassEntity
CEMethod (Method -> ClassEntity) -> Method -> ClassEntity
forall a b. (a -> b) -> a -> b
$ String -> String -> [Parameter] -> Type -> Method
forall name p.
(IsFnName String name, IsParameter p) =>
name -> String -> [p] -> Type -> Method
mkMethod'_ String
cName String
hsName [Parameter]
params Type
retType
sigs' :: [Signal]
sigs' = (SignalGen -> Signal) -> [SignalGen] -> [Signal]
forall a b. (a -> b) -> [a] -> [b]
map (SignalGen -> SignalGen
forall a b. (a -> b) -> a -> b
$ Class
cls') [SignalGen]
sigs