gdnative_python/pythonscript/_godot_editor.pxi

257 lines
6.8 KiB
Cython

# cython: c_string_type=unicode, c_string_encoding=utf8
from libc.stddef cimport wchar_t
from godot._hazmat.gdnative_api_struct cimport (
godot_pluginscript_language_data,
godot_string,
godot_bool,
godot_array,
godot_pool_string_array,
godot_object,
godot_variant,
godot_error,
godot_dictionary
)
from godot._hazmat.gdapi cimport pythonscript_gdapi10 as gdapi10
from godot._hazmat.conversion cimport (
godot_string_to_pyobj,
pyobj_to_godot_string,
godot_variant_to_pyobj,
)
cdef api godot_string pythonscript_get_template_source_code(
godot_pluginscript_language_data *p_data,
const godot_string *p_class_name,
const godot_string *p_base_class_name
) with gil:
cdef str class_name
if p_class_name == NULL:
class_name = "MyExportedCls"
else:
class_name = godot_string_to_pyobj(p_class_name)
cdef str base_class_name = godot_string_to_pyobj(p_base_class_name)
cdef str src = f"""from godot import exposed, export
from godot import *
@exposed
class {class_name}({base_class_name}):
# member variables here, example:
a = export(int)
b = export(str, default='foo')
def _ready(self):
\"\"\"
Called every time the node is added to the scene.
Initialization here.
\"\"\"
pass
"""
cdef godot_string ret
pyobj_to_godot_string(src, &ret)
return ret
cdef api godot_bool pythonscript_validate(
godot_pluginscript_language_data *p_data,
const godot_string *p_script,
int *r_line_error,
int *r_col_error,
godot_string *r_test_error,
const godot_string *p_path,
godot_pool_string_array *r_functions
) with gil:
return True
cdef api int pythonscript_find_function(
godot_pluginscript_language_data *p_data,
const godot_string *p_function,
const godot_string *p_code
) with gil:
return 0
cdef api godot_string pythonscript_make_function(
godot_pluginscript_language_data *p_data,
const godot_string *p_class,
const godot_string *p_name,
const godot_pool_string_array *p_args
) with gil:
cdef str name = godot_string_to_pyobj(p_name)
# TODO: replace this with PoolStringArray binding once implemented
cdef int i
cdef godot_string gdarg
cdef list args_names = []
for i in range(gdapi10.godot_pool_string_array_size(p_args)):
gdarg = gdapi10.godot_pool_string_array_get(p_args, i)
arg = godot_string_to_pyobj(&gdarg)
gdapi10.godot_string_destroy(&gdarg)
args_names.append(arg.split(":", 1)[0])
cdef str src = """\
def {name}(self, { ','.join(args_names) }):
pass
"""
cdef godot_string ret
pyobj_to_godot_string(src, &ret)
return ret
cdef api godot_error pythonscript_complete_code(
godot_pluginscript_language_data *p_data,
const godot_string *p_code,
const godot_string *p_base_path,
godot_object *p_owner,
godot_array *r_options,
godot_bool *r_force,
godot_string *r_call_hint
) with gil:
return godot_error.GODOT_OK
cdef api void pythonscript_auto_indent_code(
godot_pluginscript_language_data *p_data,
godot_string *p_code,
int p_from_line,
int p_to_line
) with gil:
# TODO: use black for this job
# try:
# import autopep8
# except ImportError:
# print(
# "[Pythonscript] Auto indent requires module `autopep8`, "
# "install it with `pip install autopep8`"
# )
# pycode = godot_string_to_pyobj(code).splitlines()
# before = "\n".join(pycode[:from_line])
# to_fix = "\n".join(pycode[from_line:to_line])
# after = "\n".join(pycode[to_line:])
# fixed = autopep8.fix_code(to_fix)
# final_code = "\n".join((before, fixed, after))
# # TODO: modify code instead of replace it when binding on godot_string
# # operation is available
# lib.godot_string_destroy(code)
# lib.godot_string_new_unicode_data(code, final_code, len(final_code))
pass
__global_constants = {}
cdef api void pythonscript_add_global_constant(
godot_pluginscript_language_data *p_data,
const godot_string *p_variable,
const godot_variant *p_value
) with gil:
# However, Godot add global constants very early (first as an empty variant
# placeholder before any script is loaded, then as a proper loaded script).
# So it's possible this function get called before `pythonscript_script_init`
# (which is supposed to do the lazy `_initialize_bindings`).
_initialize_bindings()
name = godot_string_to_pyobj(p_variable)
value = godot_variant_to_pyobj(p_value)
__global_constants[name] = value
cdef api godot_string pythonscript_debug_get_error(
godot_pluginscript_language_data *p_data
) with gil:
cdef godot_string ret
pyobj_to_godot_string("Nothing", &ret)
return ret
cdef api int pythonscript_debug_get_stack_level_count(
godot_pluginscript_language_data *p_data
) with gil:
return 1
cdef api int pythonscript_debug_get_stack_level_line(
godot_pluginscript_language_data *p_data,
int p_level
) with gil:
return 1
cdef api godot_string pythonscript_debug_get_stack_level_function(
godot_pluginscript_language_data *p_data,
int p_level
) with gil:
cdef godot_string ret
pyobj_to_godot_string("Nothing", &ret)
return ret
cdef api godot_string pythonscript_debug_get_stack_level_source(
godot_pluginscript_language_data *p_data,
int p_level
) with gil:
cdef godot_string ret
pyobj_to_godot_string("Nothing", &ret)
return ret
cdef api void pythonscript_debug_get_stack_level_locals(
godot_pluginscript_language_data *p_data,
int p_level,
godot_pool_string_array *p_locals,
godot_array *p_values,
int p_max_subitems,
int p_max_depth
) with gil:
pass
cdef api void pythonscript_debug_get_stack_level_members(
godot_pluginscript_language_data *p_data,
int p_level,
godot_pool_string_array *p_members,
godot_array *p_values,
int p_max_subitems,
int p_max_depth
) with gil:
pass
cdef api void pythonscript_debug_get_globals(
godot_pluginscript_language_data *p_data,
godot_pool_string_array *p_locals,
godot_array *p_values,
int p_max_subitems,
int p_max_depth
) with gil:
pass
cdef api godot_string pythonscript_debug_parse_stack_level_expression(
godot_pluginscript_language_data *p_data,
int p_level,
const godot_string *p_expression,
int p_max_subitems,
int p_max_depth
) with gil:
cdef godot_string ret
pyobj_to_godot_string("Nothing", &ret)
return ret
cdef api void pythonscript_get_public_functions(
godot_pluginscript_language_data *p_data,
godot_array *r_functions
) with gil:
pass
cdef api void pythonscript_get_public_constants(
godot_pluginscript_language_data *p_data,
godot_dictionary *r_constants
) with gil:
pass