diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-02-11 02:48:22 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-02-11 02:48:22 +0300 |
commit | 4612034cf45f2534b01bb038f80b7795e8b8e20d (patch) | |
tree | ba47ff0cb8d4916faa8fb2ff06dbf08883fae9b3 /release/scripts/modules | |
parent | 46bb5643b7660033bc0d15c5fcc752324a1b519f (diff) |
patch [#25809] Auto-Registration as utility function.
This removes auto-registration, committed by Martin r30961.
Realize this is a contentious topic but Brecht and myself both would rather opt-in registration.
TODO:
- addons need updating.
- class list will be modified to use weakrefs (should have been done for existing system too).
- will move bpy.types.(un)register functions into bpy.utils.(un)register_class, currently including these functions in a type list is internally ugly, scripts which loop over types also need to check for these.
Diffstat (limited to 'release/scripts/modules')
-rw-r--r-- | release/scripts/modules/bpy/utils.py | 61 | ||||
-rw-r--r-- | release/scripts/modules/bpy_types.py | 74 |
2 files changed, 51 insertions, 84 deletions
diff --git a/release/scripts/modules/bpy/utils.py b/release/scripts/modules/bpy/utils.py index f83b5ab01e0..9d7b1fe3420 100644 --- a/release/scripts/modules/bpy/utils.py +++ b/release/scripts/modules/bpy/utils.py @@ -100,9 +100,6 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): import traceback import time - # must be set back to True on exits - _bpy_types._register_immediate = False - t_main = time.time() loaded_modules = set() @@ -112,7 +109,6 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): if reload_scripts: _bpy_types.TypeMap.clear() - _bpy_types.PropertiesMap.clear() # just unload, dont change user defaults, this means we can sync to reload. # note that they will only actually reload of the modification time changes. @@ -121,7 +117,6 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): addon_disable(module_name, default_set=False) def register_module_call(mod): - _bpy_types._register_module(mod.__name__) register = getattr(mod, "register", None) if register: try: @@ -132,7 +127,6 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): print("\nWarning! '%s' has no register function, this is now a requirement for registerable scripts." % mod.__file__) def unregister_module_call(mod): - _bpy_types._unregister_module(mod.__name__) unregister = getattr(mod, "unregister", None) if unregister: try: @@ -199,8 +193,6 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): for mod in modules_from_path(path, loaded_modules): test_register(mod) - _bpy_types._register_immediate = True - # deal with addons seperately addon_reset_all(reload_scripts) @@ -367,12 +359,9 @@ def addon_enable(module_name, default_set=True): import bpy_types as _bpy_types import imp - _bpy_types._register_immediate = False - def handle_error(): import traceback traceback.print_exc() - _bpy_types._register_immediate = True # reload if the mtime changes mod = sys.modules.get(module_name) @@ -402,19 +391,13 @@ def addon_enable(module_name, default_set=True): return None # 2) try register collected modules - try: - _bpy_types._register_module(module_name) - except: - handle_error() - del sys.modules[module_name] - return None + # removed, addons need to handle own registration now. # 3) try run the modules register function try: mod.register() except: handle_error() - _bpy_types._unregister_module(module_name) del sys.modules[module_name] return None @@ -426,8 +409,6 @@ def addon_enable(module_name, default_set=True): ext = _bpy.context.user_preferences.addons.new() ext.module = module_name - _bpy_types._register_immediate = True - mod.__addon_enabled__ = True if _bpy.app.debug: @@ -454,7 +435,6 @@ def addon_disable(module_name, default_set=True): mod.__addon_enabled__ = False try: - _bpy_types._unregister_module(module_name, free=False) # dont free because we may want to enable again. mod.unregister() except: traceback.print_exc() @@ -594,3 +574,42 @@ def user_resource(type, path="", create=False): target_path = "" return target_path + + +_register_types = _bpy.types.Panel, _bpy.types.Operator, _bpy.types.Menu, _bpy.types.Header, _bpy.types.RenderEngine + + +def register_module(module): + import traceback + total = 0 + register = _bpy.types.register + for cls, path, line in _bpy_types.TypeMap.get(module, ()): + if not "bl_rna" in cls.__dict__: + total += 1 + try: + register(cls) + except: + print("bpy.utils.register_module(): failed to registering class '%s.%s'" % (cls.__module__, cls.__name__)) + print("\t", path, "line", line) + traceback.print_exc() + + if total == 0: + raise Exception("register_module(%r): defines no classes" % module) + + +def unregister_module(module): + import traceback + unregister = _bpy.types.unregister + total = 0 + for cls, path, line in _bpy_types.TypeMap.get(module, ()): + if "bl_rna" in cls.__dict__: + total += 1 + try: + unregister(cls) + except: + print("bpy.utils.unregister_module(): failed to unregistering class '%s.%s'" % (cls.__module__, cls.__name__)) + print("\t", path, "line", line) + traceback.print_exc() + + if total == 0: + raise Exception("unregister_module(%r): defines no classes" % module) diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index 1cb30765bf0..43bd3f4ff26 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -550,85 +550,33 @@ class Text(bpy_types.ID): import bpy return tuple(obj for obj in bpy.data.objects if self in [cont.text for cont in obj.game.controllers if cont.type == 'PYTHON']) -import collections - +# values are module: [(cls, path, line), ...] TypeMap = {} -# Properties (IDPropertyGroup) are different from types because they need to be registered -# before adding sub properties to them, so they are registered on definition -# and unregistered on unload -PropertiesMap = {} - -# Using our own loading function we set this to false -# so when running a script directly in the text editor -# registers moduals instantly. -_register_immediate = True - - -def _unregister_module(module, free=True): - for t in TypeMap.get(module, ()): - try: - bpy_types.unregister(t) - except: - import traceback - print("bpy.utils._unregister_module(): Module '%s' failed to unregister class '%s.%s'" % (module, t.__module__, t.__name__)) - traceback.print_exc() - - if free == True and module in TypeMap: - del TypeMap[module] - - for t in PropertiesMap.get(module, ()): - try: - bpy_types.unregister(t) - except: - import traceback - print("bpy.utils._unload_module(): Module '%s' failed to unregister class '%s.%s'" % (module, t.__module__, t.__name__)) - traceback.print_exc() - - if free == True and module in PropertiesMap: - del PropertiesMap[module] - - -def _register_module(module): - for t in TypeMap.get(module, ()): - try: - bpy_types.register(t) - except: - import traceback - import sys - print("bpy.utils._register_module(): '%s' failed to register class '%s.%s'" % (sys.modules[module].__file__, t.__module__, t.__name__)) - traceback.print_exc() class RNAMeta(type): - @classmethod - def _register_immediate(cls): - return _register_immediate - def __new__(cls, name, bases, classdict, **args): + import traceback result = type.__new__(cls, name, bases, classdict) if bases and bases[0] != StructRNA: module = result.__module__ - ClassMap = TypeMap - - # Register right away if needed - if cls._register_immediate(): - bpy_types.register(result) - ClassMap = PropertiesMap - # first part of packages only if "." in module: module = module[:module.index(".")] - ClassMap.setdefault(module, []).append(result) + sf = traceback.extract_stack(limit=2)[0] + + TypeMap.setdefault(module, []).append((result, sf[0], sf[1])) return result -class RNAMetaRegister(RNAMeta, StructMetaIDProp): - @classmethod - def _register_immediate(cls): - return True +import collections + + +class RNAMetaIDProp(RNAMeta, StructMetaIDProp): + pass class OrderedMeta(RNAMeta): @@ -685,7 +633,7 @@ class Macro(StructRNA, metaclass=OrderedMeta): return ops.macro_define(self, opname) -class IDPropertyGroup(StructRNA, metaclass=RNAMetaRegister): +class IDPropertyGroup(StructRNA, metaclass=RNAMetaIDProp): __slots__ = () |