mirror of
https://github.com/slint-ui/slint.git
synced 2025-09-30 13:51:13 +00:00
Python: Add support for a @slint.callback decorator to conveniently associated callbacks with python methods
cc #4134
This commit is contained in:
parent
e161535bab
commit
a93e2be393
4 changed files with 92 additions and 5 deletions
|
@ -81,6 +81,22 @@ def _build_class(compdef):
|
|||
|
||||
def cls_init(self, **kwargs):
|
||||
self.__instance__ = compdef.create()
|
||||
for name, value in self.__class__.__dict__.items():
|
||||
if hasattr(value, "slint.callback"):
|
||||
callback_info = getattr(value, "slint.callback")
|
||||
name = callback_info["name"]
|
||||
|
||||
def mk_callback(self, callback):
|
||||
def invoke(*args, **kwargs):
|
||||
return callback(self, *args, **kwargs)
|
||||
return invoke
|
||||
|
||||
if "global_name" in callback_info:
|
||||
self.__instance__.set_global_callback(
|
||||
callback_info["global_name"], name, mk_callback(self, value))
|
||||
else:
|
||||
self.__instance__.set_callback(
|
||||
name, mk_callback(self, value))
|
||||
|
||||
properties_and_callbacks = {
|
||||
"__init__": cls_init
|
||||
|
@ -196,6 +212,26 @@ class SlintModuleFinder:
|
|||
return None
|
||||
|
||||
|
||||
def _callback_decorator(callable, info):
|
||||
if "name" not in info:
|
||||
info["name"] = callable.__name__
|
||||
setattr(callable, "slint.callback", info)
|
||||
return callable
|
||||
|
||||
|
||||
def callback(global_name=None, name=None):
|
||||
if callable(global_name):
|
||||
callback = global_name
|
||||
return _callback_decorator(callback, {})
|
||||
else:
|
||||
info = {}
|
||||
if name:
|
||||
info["name"] = name
|
||||
if global_name:
|
||||
info["global_name"] = global_name
|
||||
return lambda callback: _callback_decorator(callback, info)
|
||||
|
||||
|
||||
sys.meta_path.append(SlintModuleFinder())
|
||||
|
||||
Image = native.PyImage
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue