diff --git a/space_view3d_modifier_tools.py b/space_view3d_modifier_tools.py index 71a97a580da1dcaa409494a97ff0bd7654b694af..9076f1a8598f5a1cc729eb694c1e007cfa23e2c0 100644 --- a/space_view3d_modifier_tools.py +++ b/space_view3d_modifier_tools.py @@ -20,7 +20,7 @@ bl_info = { "name": "Modifier Tools", "author": "Meta Androcto, saidenka", - "version": (0, 2, 4), + "version": (0, 2, 5), "blender": (2, 77, 0), "location": "Properties > Modifiers", "description": "Modifiers Specials Show/Hide/Apply Selected", @@ -36,7 +36,7 @@ from bpy.types import Operator class ApplyAllModifiers(Operator): bl_idname = "object.apply_all_modifiers" - bl_label = "Apply All" + bl_label = "Apply All Modifiers" bl_description = ("Apply All modifiers of the selected object(s) \n" "Active object has to have modifiers for the option to show up") bl_options = {'REGISTER', 'UNDO'} @@ -94,7 +94,7 @@ class ApplyAllModifiers(Operator): class DeleteAllModifiers(Operator): bl_idname = "object.delete_all_modifiers" - bl_label = "Remove All" + bl_label = "Remove All Modifiers" bl_description = "Remove All modifiers of the selected object(s)" bl_options = {'REGISTER', 'UNDO'} @@ -127,8 +127,8 @@ class DeleteAllModifiers(Operator): class ToggleApplyModifiersView(Operator): bl_idname = "object.toggle_apply_modifiers_view" - bl_label = "Hide Viewport" - bl_description = "Shows/Hide modifiers of the active / selected object(s) in 3d View" + bl_label = "Toggle Visibility of Modifiers" + bl_description = "Shows/Hide modifiers of the active / selected object(s) in the 3D View" bl_options = {'REGISTER'} @classmethod @@ -139,31 +139,69 @@ class ToggleApplyModifiersView(Operator): is_apply = True message_a = "" - for mod in context.active_object.modifiers: - if mod.show_viewport: - is_apply = False - break + # avoid toggling not exposed modifiers (currently only Collision, see T53406) + skip_type = ["COLLISION"] # types of modifiers to skip + skipped = set() # collect names + count_modifiers = 0 # check for message_a (all skipped) + + # check if the active object has only one non exposed modifier as the logic will fail + if len(context.active_object.modifiers) == 1 and \ + context.active_object.modifiers[0].type in skip_type: + + for obj in context.selected_objects: + for mod in obj.modifiers: + if mod.type in skip_type: + skipped.add(mod.name) + continue + + if mod.show_viewport: + is_apply = False + break + else: + for mod in context.active_object.modifiers: + if mod.type in skip_type: + skipped.add(mod.name) + continue + + if mod.show_viewport: + is_apply = False + break + count_modifiers = len(context.active_object.modifiers) # active object - no selection for mod in context.active_object.modifiers: + if mod.type in skip_type: + count_modifiers -= 1 + skipped.add(mod.name) + continue + mod.show_viewport = is_apply for obj in context.selected_objects: + count_modifiers += len(obj.modifiers) + for mod in obj.modifiers: + if mod.type in skip_type: + skipped.add(mod.name) + count_modifiers -= 1 + continue + mod.show_viewport = is_apply - if is_apply: - message_a = "Displaying modifiers in the 3D View" - else: - message_a = "Hiding modifiers in the 3D View" + message_a = "{} modifiers in the 3D View".format("Displaying" if is_apply else "Hidding") + + if skipped: + message_a = "{}, {}".format(message_a, "skipping: " + ", ".join(skipped)) if \ + count_modifiers > 0 else "No change of Modifiers' Visibility, all skipped" self.report({"INFO"}, message_a) + return {'FINISHED'} class ToggleAllShowExpanded(Operator): bl_idname = "wm.toggle_all_show_expanded" - bl_label = "Expand/Collapse All" + bl_label = "Expand/Collapse All Modifiers" bl_description = "Expand/Collapse Modifier Stack" bl_options = {'REGISTER'}