further plugin work, refactoring

This commit is contained in:
2022-02-01 01:43:09 -06:00
parent a863dbc586
commit 95c6f79627
5 changed files with 84 additions and 34 deletions

View File

@@ -13,13 +13,13 @@ class Builtins(IPCServerMixin):
"""Docstring for __builtins__ extender"""
def __init__(self):
# NOTE: The format used is list of [type, target, data] Where:
# NOTE: The format used is list of [type, target, (data,)] Where:
# type is useful context for control flow,
# target is the method to call,
# data is the method parameters to give
# Where data may be any kind of data
self._gui_events = []
self._fm_events = []
self._module_events = []
self.is_ipc_alive = False
self.ipc_authkey = b'solarfm-ipc'
self.ipc_address = '127.0.0.1'
@@ -33,9 +33,9 @@ class Builtins(IPCServerMixin):
return self._gui_events.pop(0)
return None
def _pop_fm_event(self):
if len(self._fm_events) > 0:
return self._fm_events.pop(0)
def _pop_module_event(self):
if len(self._module_events) > 0:
return self._module_events.pop(0)
return None
@@ -44,26 +44,26 @@ class Builtins(IPCServerMixin):
self._gui_events.append(event)
return None
raise Exception("Invald event format! Please do: [type, target, data]")
raise Exception("Invald event format! Please do: [type, target, (data,)]")
def push_fm_event(self, event):
def push_module_event(self, event):
if len(event) == 3:
self._fm_events.append(event)
self._module_events.append(event)
return None
raise Exception("Invald event format! Please do: [type, target, data]")
raise Exception("Invald event format! Please do: [type, target, (data,)]")
def read_gui_event(self):
return self._gui_events[0]
def read_fm_event(self):
return self._fm_events[0]
def read_module_event(self):
return self._module_events[0]
def consume_gui_event(self):
return self._pop_gui_event()
def consume_fm_event(self):
return self._pop_fm_event()
def consume_module_event(self):
return self._pop_module_event()

View File

@@ -57,11 +57,20 @@ class Controller(UIMixin, KeyboardSignalsMixin, IPCSignalsMixin, Controller_Data
if event:
try:
type, target, data = event
method = getattr(self.__class__, target)
GLib.idle_add(method, *(self, *data,))
if type:
method = getattr(self.__class__, "handle_gui_event_and_set_message")
GLib.idle_add(method, *(self, type, target, data))
else:
method = getattr(self.__class__, target)
GLib.idle_add(method, *(self, *data,))
except Exception as e:
print(repr(e))
def handle_gui_event_and_set_message(self, type, target, parameters):
method = getattr(self.__class__, f"{target}")
data = method(*(self, *parameters))
self.plugins.set_message_on_plugin(type, data)
def custom_except_hook(self, exctype, value, _traceback):
trace = ''.join(traceback.format_tb(_traceback))
data = f"Exectype: {exctype} <--> Value: {value}\n\n{trace}\n\n\n\n"

View File

@@ -10,6 +10,12 @@ from gi.repository import Gtk, Gio
# Application imports
class Plugin:
name = None
module = None
gtk_socket_id = None
gtk_socket = None
reference = None
class Plugins:
@@ -19,16 +25,9 @@ class Plugins:
self._plugin_list_widget = self._settings.get_builder().get_object("plugin_list")
self._plugin_list_socket = self._settings.get_builder().get_object("plugin_socket")
self._plugins_path = self._settings.get_plugins_path()
self._gtk_socket = Gtk.Socket().new()
self._plugins_dir_watcher = None
self._plugin_collection = []
self._plugin_list_socket.add(self._gtk_socket)
# NOTE: Must get ID after adding socket to window. Else issues....
self._gtk_socket_id = self._gtk_socket.get_id()
self._plugin_list_widget.show_all()
def launch_plugins(self):
self._set_plugins_watcher()
@@ -45,17 +44,36 @@ class Plugins:
Gio.FileMonitorEvent.MOVED_OUT]:
self.reload_plugins(file)
# @threaded
def load_plugins(self, file=None):
print(f"Loading plugins...")
for file in os.listdir(self._plugins_path):
path = join(self._plugins_path, file)
if isdir(path):
spec = importlib.util.spec_from_file_location(file, join(path, "__main__.py"))
module = importlib.util.module_from_spec(spec)
try:
path = join(self._plugins_path, file)
if isdir(path):
gtk_socket = Gtk.Socket().new()
self._plugin_list_socket.add(gtk_socket)
# NOTE: Must get ID after adding socket to window. Else issues....
gtk_socket_id = gtk_socket.get_id()
spec = importlib.util.spec_from_file_location(file, join(path, "__main__.py"))
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
ref = module.Main(gtk_socket_id, event_system)
plugin = Plugin()
plugin.name = ref.get_plugin_name()
plugin.module = path
plugin.gtk_socket_id = gtk_socket_id
plugin.gtk_socket = gtk_socket
plugin.reference = ref
self._plugin_collection.append(plugin)
gtk_socket.show_all()
except Exception as e:
print("Malformed plugin! Not loading!")
print(repr(e))
spec.loader.exec_module(module)
plugin = module.Main(self._gtk_socket_id, event_system)
self._plugin_collection.append([file, plugin])
def reload_plugins(self, file=None):
print(f"Reloading plugins...")
@@ -64,3 +82,10 @@ class Plugins:
# for dir in self._plugin_collection:
# if not os.path.isdir(os.path.join(self._plugins_path, dir)):
# to_unload.append(dir)
def set_message_on_plugin(self, type, data):
print("Trying to send message to plugin...")
for plugin in self._plugin_collection:
if type in plugin.name:
print('Found plugin; posting message...')
plugin.reference.set_message(data)

View File

@@ -32,7 +32,7 @@ class WindowController:
def fm_event_observer(self):
while True:
time.sleep(event_sleep_time)
event = event_system.consume_fm_event()
event = event_system.consume_module_event()
if event:
print(event)