aboutsummaryrefslogtreecommitdiffstats
path: root/qface/helper/qtcpp.py
blob: 5b1c379f62ae7d0b229489c9b99518934c002225 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
"""
Provides helper functionality specificially for Qt C++/QML code generators
"""


def upper_first(s):
    s = str(s)
    return s[0].upper() + s[1:]


class Filters(object):
    """provides a set of filters to be used with the template engine"""
    classPrefix = 'Qml'

    @staticmethod
    def className(symbol):
        classPrefix = Filters.classPrefix
        return '{0}{1}'.format(classPrefix, symbol.name)

    @staticmethod
    def defaultValue(symbol):
        prefix = Filters.classPrefix
        t = symbol.type  # type: qface.domain.TypeSymbol
        if t.is_primitive:
            if t.is_int:
                return '0'
            if t.is_bool:
                return 'false'
            if t.is_string:
                return 'QString()'
            if t.is_real:
                return '0.0'
            if t.is_variant:
                return 'QVariant()'
        elif t.is_void:
            return ''
        elif t.is_enum:
            module_name = t.reference.module.module_name
            value = next(iter(t.reference.members))
            return '{0}{1}Module::{2}'.format(prefix, module_name, value)
        elif symbol.type.is_list:
            nested = Filters.returnType(symbol.type.nested)
            return 'QVariantList()'.format(nested)
        elif symbol.type.is_struct:
            return '{0}{1}()'.format(prefix, symbol.type)
        elif symbol.type.is_model:
            nested = symbol.type.nested
            if nested.is_primitive:
                return 'new {0}VariantModel(this)'.format(prefix)
            elif nested.is_complex:
                return 'new {0}{1}Model(this)'.format(prefix, nested)
        return 'XXX'

    @staticmethod
    def parameterType(symbol):
        prefix = Filters.classPrefix
        module_name = symbol.module.module_name
        if symbol.type.is_enum:
            return '{0}{1}Module::{2} {3}'.format(prefix, module_name, symbol.type, symbol)
        if symbol.type.is_void or symbol.type.is_primitive:
            if symbol.type.name == 'string':
                return 'const QString &{0}'.format(symbol)
            if symbol.type.name == 'var':
                return 'const QVariant &{0}'.format(symbol)
            if symbol.type.name == 'real':
                return 'qreal {0}'.format(symbol)
            return '{0} {1}'.format(symbol.type, symbol)
        elif symbol.type.is_list:
            nested = Filters.returnType(symbol.type.nested)
            return 'const QVariantList &{1}'.format(nested, symbol)
        elif symbol.type.is_model:
            nested = symbol.type.nested
            if nested.is_primitive:
                return '{0}VariantModel *{1}'.format(prefix, symbol)
            elif nested.is_complex:
                return '{0}{1}Model *{2}'.format(prefix, nested, symbol)
        else:
            return 'const {0}{1} &{2}'.format(prefix, symbol.type, symbol)
        return 'XXX'

    @staticmethod
    def returnType(symbol):
        prefix = Filters.classPrefix
        module_name = symbol.module.module_name
        if symbol.type.is_enum:
            return '{0}{1}Module::{2}'.format(prefix, module_name, symbol.type)
        if symbol.type.is_void or symbol.type.is_primitive:
            if symbol.type.name == 'string':
                return 'QString'
            if symbol.type.name == 'var':
                return 'QVariant'
            if symbol.type.name == 'real':
                return 'qreal'
            return symbol.type.name
        elif symbol.type.is_list:
            nested = Filters.returnType(symbol.type.nested)
            return 'QVariantList'.format(nested)
        elif symbol.type.is_model:
            nested = symbol.type.nested
            if nested.is_primitive:
                return '{0}VariantModel *'.format(prefix)
            elif nested.is_complex:
                return '{0}{1}Model *'.format(prefix, nested)
        else:
            return '{0}{1}'.format(prefix, symbol.type)
        return 'XXX'