mirror of
https://github.com/Relintai/gdnative_python.git
synced 2024-11-14 10:27:22 +01:00
121 lines
4.0 KiB
Cython
121 lines
4.0 KiB
Cython
{#- `render_target` must be defined by calling context -#}
|
|
{% set get_target_method_spec = get_target_method_spec_factory(render_target) %}
|
|
|
|
{#- Define rendering macros -#}
|
|
|
|
{% macro render_method(method_name, py_name=None, default_args={}) %}
|
|
{% set spec = get_target_method_spec(method_name) %}
|
|
{% set args_without_self = spec.args[1:] %}
|
|
def {{ py_name or spec.py_name }}({{ spec.klass.cy_type }} self{%- if args_without_self -%},{%- endif -%}
|
|
{%- for arg in args_without_self %}
|
|
{{ arg.cy_type }} {{ arg.name }}
|
|
{%- if not arg.is_base_type and not arg.is_variant %}
|
|
not None
|
|
{%- endif -%}
|
|
,
|
|
{%- endfor -%}
|
|
) -> {{ spec.return_type.py_type }}:
|
|
{% for arg in args_without_self %}
|
|
{% if arg.is_variant %}
|
|
cdef pandemonium_variant __var_{{ arg.name }}
|
|
if not pyobj_to_pandemonium_variant({{ arg.name }}, &__var_{{ arg.name }}):
|
|
{% for initialized_arg in args_without_self %}
|
|
{% if initialized_arg.name == arg.name %}
|
|
{% break %}
|
|
{% endif %}
|
|
{% if initialized_arg.is_variant %}
|
|
gdapi10.pandemonium_variant_destroy(&__var_{{ initialized_arg.name }})
|
|
{% endif %}
|
|
{% endfor %}
|
|
raise TypeError(f"Cannot convert `{ {{ arg.name}} !r}` to Pandemonium Variant")
|
|
{% endif %}
|
|
{% endfor %}
|
|
{% if spec.return_type.is_variant %}
|
|
cdef pandemonium_variant __var_ret = (
|
|
{%- elif spec.return_type.is_builtin %}
|
|
cdef {{ spec.return_type.cy_type }} __ret = {{ spec.return_type.cy_type }}.__new__({{ spec.return_type.cy_type }})
|
|
__ret._gd_data = (
|
|
{%- elif spec.return_type.is_object %}
|
|
cdef {{ spec.return_type.cy_type }} __ret = {{ spec.return_type.cy_type }}.__new__({{ spec.return_type.cy_type }})
|
|
__ret._gd_ptr = (
|
|
{%- elif not spec.return_type.is_void %}
|
|
cdef {{ spec.return_type.cy_type }} __ret = (
|
|
{%- else %}
|
|
(
|
|
{%- endif %}
|
|
{{ spec.gdapi }}.{{ spec.c_name }}(&self._gd_data,
|
|
{%- for arg in args_without_self %}
|
|
{%- if arg.is_variant %}
|
|
&__var_{{ arg.name }},
|
|
{%- elif arg.is_builtin %}
|
|
{%- if arg.is_ptr %}
|
|
&{{ arg.name }}._gd_data,
|
|
{%- else %}
|
|
{{ arg.name }}._gd_data,
|
|
{%- endif %}
|
|
{%- elif arg.is_object %}
|
|
{{ arg.name }}._gd_ptr,
|
|
{%- else %}
|
|
{{ arg.name }},
|
|
{%- endif %}
|
|
{% endfor %}
|
|
))
|
|
{% for arg in args_without_self %}
|
|
{% if arg.is_variant %}
|
|
gdapi10.pandemonium_variant_destroy(&__var_{{ arg.name }})
|
|
{% endif %}
|
|
{% endfor %}
|
|
{% if spec.return_type.is_variant %}
|
|
cdef object __ret = pandemonium_variant_to_pyobj(&__var_ret)
|
|
gdapi10.pandemonium_variant_destroy(&__var_ret)
|
|
return __ret
|
|
{% elif not spec.return_type.is_void %}
|
|
return __ret
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
{% macro render_operator_eq() %}
|
|
{% set spec = get_target_method_spec("operator_equal") %}
|
|
def __eq__({{ spec.klass.cy_type }} self, other):
|
|
try:
|
|
return {{ spec.gdapi }}.{{ spec.c_name }}(&self._gd_data, &(<{{ spec.klass.cy_type }}?>other)._gd_data)
|
|
except TypeError:
|
|
return False
|
|
{% endmacro %}
|
|
|
|
{% macro render_operator_ne() %}
|
|
{% set spec = get_target_method_spec("operator_equal") %}
|
|
def __ne__({{ spec.klass.cy_type }} self, other):
|
|
try:
|
|
return not {{ spec.gdapi }}.{{ spec.c_name }}(&self._gd_data, &(<{{ spec.klass.cy_type }}?>other)._gd_data)
|
|
except TypeError:
|
|
return True
|
|
{% endmacro %}
|
|
|
|
{% macro render_operator_lt() %}
|
|
{% set spec = get_target_method_spec("operator_less") %}
|
|
def __lt__({{ spec.klass.cy_type }} self, other):
|
|
try:
|
|
return {{ spec.gdapi }}.{{ spec.c_name }}(&self._gd_data, &(<{{ spec.klass.cy_type }}?>other)._gd_data)
|
|
except TypeError:
|
|
return False
|
|
{% endmacro %}
|
|
|
|
{% macro render_property(py_name, getter, setter=None) %}
|
|
@property
|
|
{{ render_method(getter, py_name=py_name) }}
|
|
{% if setter %}
|
|
@{{ py_name }}.setter
|
|
{{ render_method(setter, py_name=py_name) }}
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
{#- Overwrite blocks to be ignored -#}
|
|
|
|
{% block pxd_header %}{% endblock %}
|
|
{% block cdef_attributes %}{% endblock %}
|
|
|
|
{#- Now the template will be generated with the context -#}
|
|
|
|
{% extends render_target_to_template(render_target) %}
|