Changeset View
Changeset View
Standalone View
Standalone View
release/scripts/modules/bpy/utils/module_loader.py
- This file was added.
| import bpy | |||||
| import inspect | |||||
| import importlib | |||||
| from bpy import types as bpy_types | |||||
| REGISTERABLE_CLASSES = ( | |||||
| bpy_types.Menu, | |||||
| bpy_types.Operator, | |||||
| bpy_types.Header, | |||||
| bpy_types.Panel, | |||||
| bpy_types.PropertyGroup | |||||
| ) | |||||
| class ModuleLoader: | |||||
| def __init__(self, main_module): | |||||
| self.loaded_modules = [] | |||||
| self.main_module = main_module | |||||
| def import_modules(self, modules, package, reload = False): | |||||
| for module in modules: | |||||
| #print(("reloading " if reload else "loading ") + module) | |||||
| # import_module doesn't reload if already loaded, but we need a | |||||
| # reference to the module to reload. | |||||
| mod = importlib.import_module('.' + module, package) | |||||
| self.add_module(mod) | |||||
| if reload: | |||||
| importlib.reload(mod) | |||||
| def add_module(self, module): | |||||
| self.loaded_modules.append(module) | |||||
| def register_classes(self): | |||||
| for module in self._all_modules(): | |||||
| self._register_module_classes(module) | |||||
| def unregister_classes(self): | |||||
| for module in reversed(self._all_modules()): | |||||
| self._unregister_module_classes(module) | |||||
| def _all_modules(self): | |||||
| return [self.main_module] + self.loaded_modules | |||||
| def _registerable_module_classes(self, module): | |||||
| for name, obj in inspect.getmembers(module, inspect.isclass): | |||||
| for cls in REGISTERABLE_CLASSES: | |||||
| if issubclass(obj, cls) and obj != cls: | |||||
| #print(f"registerable class: {name}, class: {obj}") | |||||
| yield obj | |||||
| def _register_module_classes(self, module): | |||||
| #print(f"processing module {module}") | |||||
| for obj in self._registerable_module_classes(module): | |||||
| #print(f"registering {obj}") | |||||
| bpy.utils.register_class(obj) | |||||
| def _unregister_module_classes(self, module): | |||||
| for obj in reversed(list(self._registerable_module_classes(module))): | |||||
| #print(f"unregistering {obj}") | |||||
| bpy.utils.unregister_class(obj) | |||||