diff --git a/render_copy_settings/__init__.py b/render_copy_settings/__init__.py index ecc3603ddef3580376208bbc8c9303c0990dec4b..ee445e71a98a0af4b51cd0bb13a83f4a1d7eaf0f 100644 --- a/render_copy_settings/__init__.py +++ b/render_copy_settings/__init__.py @@ -21,8 +21,8 @@ bl_info = { "name": "Copy Render Settings", "author": "Bastien Montagne", - "version": (1, 0, 0), - "blender": (2, 80, 0), + "version": (1, 1, 0), + "blender": (3, 0, 0), "location": "Render buttons (Properties window)", "description": "Allows to copy a selection of render settings " "from current scene to others.", @@ -56,6 +56,11 @@ from bpy.props import ( classes = data.classes + operator.classes + panel.classes +def scene_render_copy_settings_timer(): + operator.scene_render_copy_settings_update() + return 1.0 # Run every second. + + def register(): for cls in classes: bpy.utils.register_class(cls) @@ -63,8 +68,12 @@ def register(): bpy.app.translations.register(__name__, translations.translations_dict) + bpy.app.timers.register(scene_render_copy_settings_timer, persistent=True) + def unregister(): + bpy.app.timers.unregister(scene_render_copy_settings_timer) + bpy.app.translations.unregister(__name__) del bpy.types.Scene.render_copy_settings diff --git a/render_copy_settings/operator.py b/render_copy_settings/operator.py index 5c633f1f5f59ab646b8009c18fed8e58f461fd59..5de9bc3d7ec8563157e6be10e537e5e70d6f48b8 100644 --- a/render_copy_settings/operator.py +++ b/render_copy_settings/operator.py @@ -21,9 +21,6 @@ import bpy from . import presets -# These operators are only defined because it seems impossible to directly edit properties from UI code… - - # A sorting func for collections (working in-place). # XXX Not optimized at all… # XXX If some items in the collection do not have the sortkey property, they are just ignored… @@ -46,74 +43,66 @@ def collection_property_sort(collection, sortkey, start_idx=0): return collection -class RenderCopySettingsOPPrepare(bpy.types.Operator): - """Prepare internal data for render_copy_settings (gathering all existing render settings, and scenes)""" - bl_idname = "scene.render_copy_settings_prepare" - bl_label = "Render: Copy Settings Prepare" - bl_option = {'REGISTER'} - - @classmethod - def poll(cls, context): - return context.scene is not None - - def execute(self, context): - cp_sett = context.scene.render_copy_settings +def scene_render_copy_settings_update(): + """Prepare internal data for render_copy_settings (gathering all existing render settings, and scenes).""" + current_scene = getattr(bpy.context, "scene", None) + if current_scene is None: + return + cp_sett = current_scene.render_copy_settings - # Get all available render settings, and update accordingly affected_settings… - props = {} - for prop in context.scene.render.bl_rna.properties: - if prop.identifier in {'rna_type'}: - continue - if prop.is_readonly: - continue - props[prop.identifier] = prop.name - corr = 0 - for i, sett in enumerate(cp_sett.affected_settings): - if sett.strid not in props: - cp_sett.affected_settings.remove(i - corr) - corr += 1 - else: - del props[sett.strid] - for strid, name in props.items(): - sett = cp_sett.affected_settings.add() - sett.name = "{} [{}]".format(name, strid) - sett.strid = strid - collection_property_sort(cp_sett.affected_settings, "name") - - # Get all available scenes, and update accordingly allowed_scenes… - regex = None - if cp_sett.filter_scene: + # Get all available render settings, and update accordingly affected_settings… + props = {} + for prop in current_scene.render.bl_rna.properties: + if prop.identifier in {'rna_type'}: + continue + if prop.is_readonly: + continue + props[prop.identifier] = prop.name + corr = 0 + for i, sett in enumerate(cp_sett.affected_settings): + if sett.strid not in props: + cp_sett.affected_settings.remove(i - corr) + corr += 1 + else: + del props[sett.strid] + for strid, name in props.items(): + sett = cp_sett.affected_settings.add() + sett.name = "{} [{}]".format(name, strid) + sett.strid = strid + collection_property_sort(cp_sett.affected_settings, "name") + + # Get all available scenes, and update accordingly allowed_scenes… + regex = None + if cp_sett.filter_scene: + try: + import re try: - import re - try: - regex = re.compile(cp_sett.filter_scene) - except Exception as e: - self.report({'ERROR_INVALID_INPUT'}, "The filter-scene regex did not compile:\n (%s)." % str(e)) - return {'CANCELLED'} - except: - regex = None - self.report({'WARNING'}, "Unable to import the re module, regex scene filtering will be disabled!") - scenes = set() - for scene in bpy.data.scenes: - if scene == bpy.context.scene: # Exclude current scene! - continue - # If a valid filtering regex, only keep scenes matching it. - if regex: - if regex.match(scene.name): - scenes.add(scene.name) - else: + regex = re.compile(cp_sett.filter_scene) + except Exception as e: + print("The filter-scene regex did not compile:\n (%s)." % str(e)) + return + except: + regex = None + print("Unable to import the re module, regex scene filtering will be disabled!") + scenes = set() + for scene in bpy.data.scenes: + if scene == current_scene: # Exclude current scene! + continue + # If a valid filtering regex, only keep scenes matching it. + if regex: + if regex.match(scene.name): scenes.add(scene.name) - for i, scene in enumerate(cp_sett.allowed_scenes): - if scene.name not in scenes: - cp_sett.allowed_scenes.remove(i) - else: - scenes.remove(scene.name) - for scene in scenes: - sett = cp_sett.allowed_scenes.add() - sett.name = scene - collection_property_sort(cp_sett.allowed_scenes, "name") - - return {'FINISHED'} + else: + scenes.add(scene.name) + for i, scene in enumerate(cp_sett.allowed_scenes): + if scene.name not in scenes: + cp_sett.allowed_scenes.remove(i) + else: + scenes.remove(scene.name) + for scene in scenes: + sett = cp_sett.allowed_scenes.add() + sett.name = scene + collection_property_sort(cp_sett.allowed_scenes, "name") from bpy.props import EnumProperty @@ -191,7 +180,6 @@ class RenderCopySettingsOPCopy(bpy.types.Operator): classes = ( - RenderCopySettingsOPPrepare, RenderCopySettingsOPPreset, RenderCopySettingsOPCopy, ) diff --git a/render_copy_settings/panel.py b/render_copy_settings/panel.py index 88f4e9405a02faac78da98fc1c06ad943f6098ec..1e79bef7f162e85f6e4d350328e8f0d85b3ec711 100644 --- a/render_copy_settings/panel.py +++ b/render_copy_settings/panel.py @@ -55,11 +55,6 @@ class RENDER_PT_copy_settings(bpy.types.Panel): layout.operator("scene.render_copy_settings", text="Copy Render Settings") - # This will update affected_settings/allowed_scenes (as this seems - # to be impossible to do it from here…). - if bpy.ops.scene.render_copy_settings_prepare.poll(): - bpy.ops.scene.render_copy_settings_prepare() - split = layout.split(factor=0.75) split.template_list("RENDER_UL_copy_settings", "settings", cp_sett, "affected_settings", cp_sett, "affected_settings_idx", rows=5)