From 38fbf5c9295c9d1ad36375aed7eb9870d87fb172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B0=E4=B8=AD=E7=81=AB?= Date: Mon, 31 Aug 2020 21:53:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E6=96=B0=E7=9A=84=E8=AE=A8?= =?UTF-8?q?=E8=AE=BA=E7=BB=93=E6=9E=9C=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extensions/extensionlib/extension_lib.py | 10 +++++ .../extensions_manager/ExtensionLoader.py | 44 +++++++++++++------ .../extensions/extensions_manager/UIInster.py | 8 ++-- .../extensions_manager/readme.drawio | 1 + 4 files changed, 44 insertions(+), 19 deletions(-) create mode 100644 pyminer_new/extensions/extensionlib/extension_lib.py create mode 100644 pyminer_new/extensions/extensions_manager/readme.drawio diff --git a/pyminer_new/extensions/extensionlib/extension_lib.py b/pyminer_new/extensions/extensionlib/extension_lib.py new file mode 100644 index 00000000..3a7830ee --- /dev/null +++ b/pyminer_new/extensions/extensionlib/extension_lib.py @@ -0,0 +1,10 @@ +def wrapper(): + from pyminer_new.extensions.extensions_manager.manager import extensions_manager + class ExtensionLib: + def get_interface(self,name): + return extensions_manager.get_ext_by_name(name).public_interface + def insert_widget(self,widget,insert_mode,config=None): + extensions_manager.ui_inserters[insert_mode](widget,insert_mode,config) + return ExtensionLib + +extension_lib=wrapper()() \ No newline at end of file diff --git a/pyminer_new/extensions/extensions_manager/ExtensionLoader.py b/pyminer_new/extensions/extensions_manager/ExtensionLoader.py index 354b5ae0..9fea362e 100644 --- a/pyminer_new/extensions/extensions_manager/ExtensionLoader.py +++ b/pyminer_new/extensions/extensions_manager/ExtensionLoader.py @@ -5,6 +5,7 @@ import json from collections import namedtuple from pyminer_new.extensions.extensions_manager import log from pyminer_new.pmutil import get_root_dir +import copy # package.json大概结构 # { @@ -45,6 +46,8 @@ BASEDIR = get_root_dir() Info = namedtuple('Info', ['icon', 'name', 'display_name', 'version', 'description', 'path']) +class PublicInterface: + pass class ExtensionLoader: def load(self, file, ui_inserters): @@ -57,22 +60,27 @@ class ExtensionLoader: self.description = self.package['description'] self.icon = self.package['icon'] self.path = os.path.join(BASEDIR, 'extensions/packages/', self.name) # 扩展文件夹路径 - self.main = self.load_obj( + main_class = self.load_class( { 'file': 'main.py', 'class_name': 'Extension' }, 'class_name' ) - self.interface = self.load_obj(self.package['interface'], 'interface') - if getattr(self.interface, 'ui_inserters', None): - for key in self.interface.ui_inserters: - self.ui_inserters[f'extension_{self.name}_{key}'] = self.interface.ui_inserters[key] - self.main.interface = self.interface - self.main.widgets = [] + + self.interface = self.load_class(self.package['interface'], 'interface')() + self.public_interface=self.create_public_interface(self.interface) + + for key in getattr(self.interface, 'ui_inserters', []): + self.ui_inserters[f'extension_{self.name}_{key}'] = self.interface.ui_inserters[key] + + main_class.interface = self.interface + main_class.public_interface=self.interface + main_class.widgets = [] for widget in self.package['widgets']: - widget_obj = self.load_widget(widget) - self.main.widgets.append(widget_obj) + widget_class = self.load_widget(widget) + main_class.widgets.append(widget_class) + self.main=main_class() self.binding_info() return self.main except KeyError as e: @@ -108,7 +116,7 @@ class ExtensionLoader: del sys.path[i] return model - def load_obj(self, obj, class_name): + def load_class(self, obj, class_name): if not obj: return None if not (obj.get('file') and obj.get(class_name)): @@ -118,17 +126,25 @@ class ExtensionLoader: model = self.run_code(path) if model: if getattr(model, obj[class_name], None): - return getattr(model, obj[class_name], None)() + return getattr(model, obj[class_name], None) else: log.error(f"{obj['file']}文件中不存在{obj[class_name]}类") else: log.error(f"{obj['file']}文件不存在或有误") def load_widget(self, widget): - widget_obj = self.load_obj(widget, 'widget') + widget_class = self.load_class(widget, 'widget') try: - self.ui_inserters[widget['position']].insert(widget_obj, widget['config']) - return widget_obj + if widget.get('auto_insert',True): + self.ui_inserters[widget['position']].insert(widget_class(), widget['config']) + return widget_class except KeyError as e: log.error(f"插件{self.name}的widgets配置不正确!") log.error(f"位置:{widget}") + + def create_public_interface(self,interface): + public_interface=PublicInterface() + for i in dir(interface): + if not i.startswith('_'): + setattr(public_interface,i,getattr(interface,i)) + return public_interface diff --git a/pyminer_new/extensions/extensions_manager/UIInster.py b/pyminer_new/extensions/extensions_manager/UIInster.py index 6ca945fd..3bfab522 100644 --- a/pyminer_new/extensions/extensions_manager/UIInster.py +++ b/pyminer_new/extensions/extensions_manager/UIInster.py @@ -17,7 +17,7 @@ class BaseInserter: @classmethod def insert(cls, widget: 'QWidget', config=None): print("BaseInserter.insert({widget},{config})".format(widget=repr(widget), config=repr(config))) - # raise NotImplementedError + raise NotImplementedError class NewTab(BaseInserter): @@ -33,16 +33,14 @@ class NewToolBar(BaseInserter): def insert(cls, widget: 'QWidget', config=None): name = config['name'] text = config['text'] - print(name,text,widget) PluginInterface.add_tool_bar(name,widget,text) class NewSubWindow(BaseInserter): @classmethod - def insert(cls, widget: 'QWidget', config=None, side: str = 'left'): - print('config is', config) + def insert(cls, widget: 'QWidget', config=None): dock_name = config['name'] # 'plugin_widget %f'%time.time() text = config['text'] # 'this is a test name!' - print('widget is', widget) + side = config['side'] PluginInterface.add_docked_widget(dock_name=dock_name, widget=widget, text=text, side=side) diff --git a/pyminer_new/extensions/extensions_manager/readme.drawio b/pyminer_new/extensions/extensions_manager/readme.drawio new file mode 100644 index 00000000..080c8be1 --- /dev/null +++ b/pyminer_new/extensions/extensions_manager/readme.drawio @@ -0,0 +1 @@ +7VrZbuM2FP0aAu1Lod3ko+RlWiBFC+ShM08DxmJsdWTRkOnY7tf3kqJW0ktQO5lxCgQBeXkpkeeQd5ORP17tP5V0vfydpyxHnpPukT9Bnhf6GP5LwaESBIEWLMosrURuK3jM/mFa6GjpNkvZpqcoOM9Ftu4L57wo2Fz0ZLQs+a6v9szz/lvXdMEMweOc5qb0rywVy0qKvVEr/5Vli2X9Zjci1ciK1sp6J5slTfmuI/KnyB+XnIuqtdqPWS6xq3Gp5s2OjDYLK1khLpmg1/VC863em16XONSbXZR8u0Z+shEl/8bGPOelGvAJGY9n8ODkmRdiRldZLun8REu64kWq5R19xwlmBFaRmIvU635hpWB7G4X0qV5OixKcLsZXTJQH0NOz/PqIHGrodX/X8uRhLVt2OAocLaT6bCyaZ7fwQUMjaEfTO48mgFmkTOq7gMRumQn2uKZzObqDuwKypVjleviWkJMjkJvQvgl0vgndNEJ4hgg0ApQkKIkMMGHloo8YzbNFAe057JMBCIncXwY3N9YDqyxN5XQr9C05zneDfj3qDQ62ea4DCzfeFagJLNQQhEOEJ2g6QskExVNJFgG+RsfJ+gFPfj0a9bGPTOxdxwJ+dAXwQwv4gDCWIAP4MUYYGiFKYnlZ7gdz7zzk3o0gjwzIM2lMniVudwuwG1ocpc2iuMEVIB4ZEG8zZe+nKL5LEzJA2/cuRPsa5xmfcq2hNORxKBuEgDn5aZt9zYqN3Fi5+fmOGPD7DDT9DgO24Ca8AgG1r+4wkGdPBraQC6xlc37IMwC5PA/wU8XGw1MjoPNvC8XRH1sBT2FvwMSx2P0oE6PzlieyMIGvwYRroM5SSO10l5diyRe8oPm0lQ6iwlbngfO1xvdvJsRB56l0K3ifJrbPxGc9Xba/yPYvoe5N9p2hyaHuFLC1z/UDZKczS3bbaapXz3sDpjd8W85ZLzwRtFywWkvzJIE9eRxKllORvfRzahu7ampclvTQUVhz8MqbzpP/lIKOxR1eeGeQCZ/Rd4kzOFnVCtpz1mzlsqNnSQ6l9Y1lDCftsYOwqyQYkSqkS2RUVwXWiaNC7QTh4B7ToVfbEG+Y51uMyK3yIdcMEN/FqvwYFsINTBMR3MRCGFc6Gl5pTPqPqNakZw0OwCtv9+h/x3LzYzO69rG5+MaTd2W3YfRLZ8TO7juxdOubbJQDhmH5kZv82qBhFPTfE7qng4Yz+v89aLDV3oyyqA4jIETAshoHf3U2ZxzbD5NjXBAf3CzJsCXcGMUzVbMLFXvRZSXUsRQCsQlRtFdq5kQzaCSITOQRaAPLs8WVDxQ9RoNr61qKAbeKHj2zGGA6lyKN5WdKiX1ON5tsfiT0a9z0d+PDu/46utA5dFAPT5Rgbu1DKsdm+BDzQYMCRjT8/nUlZ2QUDaPw9LqG+v51nVFzz/oZLKSmOFJ2CoxRYHdPYKRIrCRgvIi0XNCVqSw0ApUAB+oLxtRWmcTSJsax8m7g5pLO9KNlTJvB1ToPnErHVz/kt6a2L+d6CI+1ply5+tISTxrlbnFUWWdQmCrL2ywSJoJddvV7cbNrtRLiqD2a62+wCpQHn7XIfGAz7ZPBRbN89HRH17HT0G1/dVFdjvanK/70Xw== \ No newline at end of file -- Gitee