Plugin inferastructure work/fixes
This commit is contained in:
parent
7c46e5eb4b
commit
43d0881a36
|
@ -6,7 +6,7 @@
|
||||||
"support": "",
|
"support": "",
|
||||||
"requests": {
|
"requests": {
|
||||||
"ui_target": "plugin_control_list",
|
"ui_target": "plugin_control_list",
|
||||||
"pass_fm_events": "true",
|
"pass_events": "true",
|
||||||
"bind_keys": ["Example Plugin||send_message:<Control>f"]
|
"bind_keys": ["Example Plugin||send_message:<Control>f"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,4 +61,8 @@ class ManifestProcessor:
|
||||||
if isinstance(requests["bind_keys"], list):
|
if isinstance(requests["bind_keys"], list):
|
||||||
loading_data["bind_keys"] = requests["bind_keys"]
|
loading_data["bind_keys"] = requests["bind_keys"]
|
||||||
|
|
||||||
|
if "pass_ui_objects" in keys:
|
||||||
|
if isinstance(requests["pass_ui_objects"], list):
|
||||||
|
loading_data["pass_ui_objects"] = [ self._builder.get_object(obj) for obj in requests["pass_ui_objects"] ]
|
||||||
|
|
||||||
return self._plugin, loading_data
|
return self._plugin, loading_data
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# Python imports
|
# Python imports
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
|
import inspect
|
||||||
|
|
||||||
# Lib imports
|
# Lib imports
|
||||||
|
|
||||||
|
@ -12,7 +13,8 @@ class PluginBaseException(Exception):
|
||||||
|
|
||||||
|
|
||||||
class PluginBase:
|
class PluginBase:
|
||||||
def __init__(self):
|
def __init__(self, **kwargs):
|
||||||
|
super().__init__(**kwargs)
|
||||||
self.name = "Example Plugin" # NOTE: Need to remove after establishing private bidirectional 1-1 message bus
|
self.name = "Example Plugin" # NOTE: Need to remove after establishing private bidirectional 1-1 message bus
|
||||||
# where self.name should not be needed for message comms
|
# where self.name should not be needed for message comms
|
||||||
|
|
||||||
|
@ -36,13 +38,6 @@ class PluginBase:
|
||||||
"""
|
"""
|
||||||
raise PluginBaseException("Method hasn't been overriden...")
|
raise PluginBaseException("Method hasn't been overriden...")
|
||||||
|
|
||||||
def set_event_system(self, event_system):
|
|
||||||
"""
|
|
||||||
Requests Key: 'pass_events': "true"
|
|
||||||
Must define in plugin if "pass_events" is set to "true" string.
|
|
||||||
"""
|
|
||||||
self._event_system = event_system
|
|
||||||
|
|
||||||
def set_ui_object_collection(self, ui_objects):
|
def set_ui_object_collection(self, ui_objects):
|
||||||
"""
|
"""
|
||||||
Requests Key: "pass_ui_objects": [""]
|
Requests Key: "pass_ui_objects": [""]
|
||||||
|
@ -51,9 +46,45 @@ class PluginBase:
|
||||||
"""
|
"""
|
||||||
self._ui_objects = ui_objects
|
self._ui_objects = ui_objects
|
||||||
|
|
||||||
|
def set_event_system(self, event_system):
|
||||||
|
"""
|
||||||
|
Requests Key: 'pass_events': "true"
|
||||||
|
Must define in plugin if "pass_events" is set to "true" string.
|
||||||
|
"""
|
||||||
|
self._event_system = event_system
|
||||||
|
|
||||||
def subscribe_to_events(self):
|
def subscribe_to_events(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
|
def _connect_builder_signals(self, caller_class, builder):
|
||||||
|
classes = [caller_class]
|
||||||
|
handlers = {}
|
||||||
|
for c in classes:
|
||||||
|
methods = None
|
||||||
|
try:
|
||||||
|
methods = inspect.getmembers(c, predicate=inspect.ismethod)
|
||||||
|
handlers.update(methods)
|
||||||
|
except Exception as e:
|
||||||
|
logger.debug(repr(e))
|
||||||
|
|
||||||
|
builder.connect_signals(handlers)
|
||||||
|
|
||||||
|
def reload_package(self, plugin_path, module_dict_main=locals()):
|
||||||
|
import importlib
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
def reload_package_recursive(current_dir, module_dict):
|
||||||
|
for path in current_dir.iterdir():
|
||||||
|
if "__init__" in str(path) or path.stem not in module_dict:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if path.is_file() and path.suffix == ".py":
|
||||||
|
importlib.reload(module_dict[path.stem])
|
||||||
|
elif path.is_dir():
|
||||||
|
reload_package_recursive(path, module_dict[path.stem].__dict__)
|
||||||
|
|
||||||
|
reload_package_recursive(Path(plugin_path).parent, module_dict_main["module_dict_main"])
|
||||||
|
|
||||||
|
|
||||||
def clear_children(self, widget: type) -> None:
|
def clear_children(self, widget: type) -> None:
|
||||||
""" Clear children of a gtk widget. """
|
""" Clear children of a gtk widget. """
|
||||||
|
|
|
@ -53,7 +53,7 @@ class PluginsController:
|
||||||
self.reload_plugins(file)
|
self.reload_plugins(file)
|
||||||
|
|
||||||
def load_plugins(self, file: str = None) -> None:
|
def load_plugins(self, file: str = None) -> None:
|
||||||
logger.debug(f"Loading plugins...")
|
logger.info(f"Loading plugins...")
|
||||||
parent_path = os.getcwd()
|
parent_path = os.getcwd()
|
||||||
|
|
||||||
for path, folder in [[join(self._plugins_path, item), item] if os.path.isdir(join(self._plugins_path, item)) else None for item in os.listdir(self._plugins_path)]:
|
for path, folder in [[join(self._plugins_path, item), item] if os.path.isdir(join(self._plugins_path, item)) else None for item in os.listdir(self._plugins_path)]:
|
||||||
|
@ -68,7 +68,8 @@ class PluginsController:
|
||||||
module = self.load_plugin_module(path, folder, target)
|
module = self.load_plugin_module(path, folder, target)
|
||||||
self.execute_plugin(module, plugin, loading_data)
|
self.execute_plugin(module, plugin, loading_data)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.debug(f"Malformed Plugin: Not loading -->: '{folder}' !\n{traceback.print_exc()}")
|
logger.info(f"Malformed Plugin: Not loading -->: '{folder}' !")
|
||||||
|
logger.debug("Trace: ", traceback.print_exc())
|
||||||
|
|
||||||
os.chdir(parent_path)
|
os.chdir(parent_path)
|
||||||
|
|
||||||
|
@ -99,13 +100,13 @@ class PluginsController:
|
||||||
|
|
||||||
if "ui_target" in keys:
|
if "ui_target" in keys:
|
||||||
loading_data["ui_target"].add( plugin.reference.generate_reference_ui_element() )
|
loading_data["ui_target"].add( plugin.reference.generate_reference_ui_element() )
|
||||||
loading_data["ui_target"].show_all()
|
loading_data["ui_target"].show()
|
||||||
|
|
||||||
if "pass_ui_objects" in keys:
|
if "pass_ui_objects" in keys:
|
||||||
plugin.reference.set_ui_object_collection( loading_data["pass_ui_objects"] )
|
plugin.reference.set_ui_object_collection( loading_data["pass_ui_objects"] )
|
||||||
|
|
||||||
if "pass_events" in keys:
|
if "pass_events" in keys:
|
||||||
plugin.reference.set_fm_event_system(event_system)
|
plugin.reference.set_event_system(event_system)
|
||||||
plugin.reference.subscribe_to_events()
|
plugin.reference.subscribe_to_events()
|
||||||
|
|
||||||
if "bind_keys" in keys:
|
if "bind_keys" in keys:
|
||||||
|
@ -115,4 +116,4 @@ class PluginsController:
|
||||||
self._plugin_collection.append(plugin)
|
self._plugin_collection.append(plugin)
|
||||||
|
|
||||||
def reload_plugins(self, file: str = None) -> None:
|
def reload_plugins(self, file: str = None) -> None:
|
||||||
logger.debug(f"Reloading plugins... stub.")
|
logger.info(f"Reloading plugins... stub.")
|
||||||
|
|
|
@ -42,6 +42,17 @@ class Keybindings(Singleton):
|
||||||
self.keymap = Gdk.Keymap.get_default()
|
self.keymap = Gdk.Keymap.get_default()
|
||||||
self.configure({})
|
self.configure({})
|
||||||
|
|
||||||
|
def print_keys(self):
|
||||||
|
print(self.keys)
|
||||||
|
|
||||||
|
def append_bindings(self, combos):
|
||||||
|
""" Accept new binding(s) and reload """
|
||||||
|
for item in combos:
|
||||||
|
method, keys = item.split(":")
|
||||||
|
self.keys[method] = keys
|
||||||
|
|
||||||
|
self.reload()
|
||||||
|
|
||||||
def configure(self, bindings):
|
def configure(self, bindings):
|
||||||
""" Accept new bindings and reconfigure with them """
|
""" Accept new bindings and reconfigure with them """
|
||||||
self.keys = bindings
|
self.keys = bindings
|
||||||
|
|
Loading…
Reference in New Issue