diff options
author | Ray Molenkamp <github@lazydodo.com> | 2022-10-11 23:30:30 +0300 |
---|---|---|
committer | Ray Molenkamp <github@lazydodo.com> | 2022-10-11 23:30:30 +0300 |
commit | 824e18adb1bb558e727d3b5308a0730c3285742b (patch) | |
tree | edfe595625fd23e4082b6abf4eb4bdf64e25b200 /release | |
parent | e4919873bce5839d2e73cba2ba13a56a3d261af2 (diff) | |
parent | 7636fc06ea30616014e93686b5c4f35696e9b799 (diff) |
Merge remote-tracking branch 'origin/master' into tmp-vfx-platform-2023
Diffstat (limited to 'release')
21 files changed, 128 insertions, 26 deletions
diff --git a/release/datafiles/blender_icons.svg b/release/datafiles/blender_icons.svg index 41707261ac6..9dc7b184b12 100644 --- a/release/datafiles/blender_icons.svg +++ b/release/datafiles/blender_icons.svg @@ -18997,6 +18997,36 @@ id="path4817-4" inkscape:connector-curvature="0" /> </g> + <g + id="g24638"> + <path + style="color:#000000;fill:none;stroke-linecap:round;-inkscape-stroke:none;opacity:1;stroke:#ffffff;stroke-opacity:1;stroke-linejoin:round" + d="m 374.12695,305.31445 c -1.10721,0 -1.93616,0.24199 -2.97851,0.63086 -1.04236,0.38888 -2.18224,0.95849 -3.30078,1.77735 -2.2371,1.63771 -4.46485,4.54533 -4.46485,8.40625 a 3.0581999,3.0581999 0 0 0 3.0586,3.05859 3.0581999,3.0581999 0 0 0 3.05859,-3.05859 c 0,-1.63187 0.77567,-2.603 1.96094,-3.47071 0.59263,-0.43385 1.26841,-0.77311 1.82422,-0.98047 0.5558,-0.20735 1.10962,-0.24804 0.84179,-0.24804 a 3.0581999,3.0581999 0 0 0 3.05664,-3.0586 3.0581999,3.0581999 0 0 0 -3.05664,-3.05664 z" + id="path6454-6" /> + <path + style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;enable-background:new" + d="m 366.4419,316.12916 c 0,-5.49278 6.00534,-7.75723 7.68412,-7.75723" + id="path15424" + sodipodi:nodetypes="cc" /> + </g> + <g + id="g24643"> + <path + style="opacity:0.5;fill:#ffffff;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1" + d="m 343.45275,317.52104 4.51631,-3.99333" + id="path4694" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1" + d="m 342.44508,318.83525 c 14.125,0.14581 -0.42233,-12.9179 13.5429,-12.85486" + id="path6454" + sodipodi:nodetypes="cc" /> + <path + style="opacity:0.5;fill:#ffffff;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1" + d="m 350.84964,311.18794 4.21454,-3.72502" + id="path19640" + sodipodi:nodetypes="cc" /> + </g> </g> <g inkscape:groupmode="layer" diff --git a/release/datafiles/blender_icons16/icon16_mod_envelope.dat b/release/datafiles/blender_icons16/icon16_mod_envelope.dat Binary files differnew file mode 100644 index 00000000000..7a4a1c2e569 --- /dev/null +++ b/release/datafiles/blender_icons16/icon16_mod_envelope.dat diff --git a/release/datafiles/blender_icons16/icon16_mod_outline.dat b/release/datafiles/blender_icons16/icon16_mod_outline.dat Binary files differnew file mode 100644 index 00000000000..fa15aabec55 --- /dev/null +++ b/release/datafiles/blender_icons16/icon16_mod_outline.dat diff --git a/release/datafiles/blender_icons32/icon32_mod_envelope.dat b/release/datafiles/blender_icons32/icon32_mod_envelope.dat Binary files differnew file mode 100644 index 00000000000..b0799fc33f2 --- /dev/null +++ b/release/datafiles/blender_icons32/icon32_mod_envelope.dat diff --git a/release/datafiles/blender_icons32/icon32_mod_outline.dat b/release/datafiles/blender_icons32/icon32_mod_outline.dat Binary files differnew file mode 100644 index 00000000000..19d31834fcb --- /dev/null +++ b/release/datafiles/blender_icons32/icon32_mod_outline.dat diff --git a/release/scripts/addons b/release/scripts/addons -Subproject 726d08c9036b939f46b59bceb72a61e3102600c +Subproject eb09be71a96c4fe910fdc43373be5ec08b419d2 diff --git a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py index 21ca38bff20..18a41d86322 100644 --- a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py +++ b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py @@ -978,17 +978,30 @@ def dump_messages(do_messages, do_checks, settings): # Get strings from addons' bl_info. import addon_utils for module in addon_utils.modules(): - if module.bl_info['support'] != 'OFFICIAL': + # Only process official add-ons, i.e. those marked as 'OFFICIAL' and + # existing in the system add-ons directory (not user-installed ones). + if (module.bl_info['support'] != 'OFFICIAL' + or not bpy.path.is_subdir(module.__file__, bpy.utils.system_resource('SCRIPTS'))): continue dump_addon_bl_info(msgs, reports, module, settings) # Get strings from addons' categories. + system_categories = set() + for module in addon_utils.modules(): + if bpy.path.is_subdir(module.__file__, bpy.utils.system_resource('SCRIPTS')): + system_categories.add(module.bl_info['category']) for uid, label, tip in bpy.types.WindowManager.addon_filter.keywords['items']( bpy.context.window_manager, bpy.context, ): - process_msg(msgs, settings.DEFAULT_CONTEXT, label, "Add-ons' categories", reports, None, settings) - if tip: + if label in system_categories: + # Only process add-on if it a system one (i.e shipped with Blender). Also, + # we do want to translate official categories, even if they have no official add-ons, + # hence the different test than below. + process_msg(msgs, settings.DEFAULT_CONTEXT, label, "Add-ons' categories", reports, None, settings) + elif tip: + # Only special categories get a tip (All and User). + process_msg(msgs, settings.DEFAULT_CONTEXT, label, "Add-ons' categories", reports, None, settings) process_msg(msgs, settings.DEFAULT_CONTEXT, tip, "Add-ons' categories", reports, None, settings) # Get strings specific to translations' menu. diff --git a/release/scripts/modules/bl_i18n_utils/settings.py b/release/scripts/modules/bl_i18n_utils/settings.py index a8a3ed9f4b7..d8f8d58f609 100644 --- a/release/scripts/modules/bl_i18n_utils/settings.py +++ b/release/scripts/modules/bl_i18n_utils/settings.py @@ -260,9 +260,9 @@ PYGETTEXT_KEYWORDS = (() + # NOTE: regex is a bit more complex than it would need too. Since the actual # identifier (`B_UNIT_DEF_`) is at the end, if it's simpler/too general it # becomes extremely slow to process some (unrelated) source files. - ((r"\{(?:(?:\s*\"[^\"',]+\"\s*,)|(?:\s*NULL\s*,)){4}\s*" + + ((r"\{(?:(?:\s*\"[^\",]+\"\s*,)|(?:\s*\"\\\"\",)|(?:\s*NULL\s*,)){4}\s*" + _msg_re + r"\s*,(?:(?:\s*\"[^\"',]+\"\s*,)|(?:\s*NULL\s*,))(?:[^,]+,){2}" - + "\s*B_UNIT_DEF_[_A-Z]+\s*\}"),) + + + "(?:\|?\s*B_UNIT_DEF_[_A-Z]+\s*)+\}"),) + tuple((r"{}\(\s*" + _msg_re + r"\s*,\s*(?:" + r"\s*,\s*)?(?:".join(_ctxt_re_gen(i) for i in range(PYGETTEXT_MAX_MULTI_CTXT)) + r")?\s*\)").format(it) @@ -367,9 +367,9 @@ WARN_MSGID_NOT_CAPITALIZED_ALLOWED = { "all and invert unselected", "and AMD driver version 22.10 or newer", "and AMD Radeon Pro 21.Q4 driver or newer", - "and Linux driver version xx.xx.23570 or newer", + "and Linux driver version xx.xx.23904 or newer", "and NVIDIA driver version 470 or newer", - "and Windows driver version 101.3268 or newer", + "and Windows driver version 101.3430 or newer", "available with", "brown fox", "can't save image while rendering", diff --git a/release/scripts/modules/bl_i18n_utils/utils_spell_check.py b/release/scripts/modules/bl_i18n_utils/utils_spell_check.py index a93f1323562..7fe4d0da0a4 100644 --- a/release/scripts/modules/bl_i18n_utils/utils_spell_check.py +++ b/release/scripts/modules/bl_i18n_utils/utils_spell_check.py @@ -389,6 +389,8 @@ class SpellChecker: "albedo", "anamorphic", "anisotropic", "anisotropy", + "arcminute", "arcminutes", + "arcsecond", "arcseconds", "bimanual", # OpenXR? "bitangent", "boid", "boids", @@ -449,7 +451,7 @@ class SpellChecker: "superellipse", "thumbstick", "tooltip", "tooltips", - "trackpad", + "touchpad", "trackpad", "tuple", "unicode", "viewport", "viewports", @@ -650,6 +652,7 @@ class SpellChecker: "mikktspace", "minkowski", "minnaert", + "mises", # von Mises-Fisher "moskowitz", # Pierson-Moskowitz "musgrave", "nayar", @@ -665,6 +668,7 @@ class SpellChecker: "runge", "sobol", "verlet", + "von", # von Mises-Fisher "wilkie", "worley", @@ -724,6 +728,7 @@ class SpellChecker: "lmb", "mmb", "rmb", "lscm", "kb", + "mis", "mocap", "msgid", "msgids", "mux", @@ -751,6 +756,7 @@ class SpellChecker: "uuid", "vbo", "vbos", "vfx", + "vmm", "vr", "wxyz", "xr", diff --git a/release/scripts/modules/bpy_extras/object_utils.py b/release/scripts/modules/bpy_extras/object_utils.py index ab678ba27c8..5275a83e062 100644 --- a/release/scripts/modules/bpy_extras/object_utils.py +++ b/release/scripts/modules/bpy_extras/object_utils.py @@ -142,8 +142,17 @@ def object_data_add(context, obdata, operator=None, name=None): bpy.ops.object.mode_set(mode='EDIT') else: layer.objects.active = obj_new - if obdata and context.preferences.edit.use_enter_edit_mode: - bpy.ops.object.mode_set(mode='EDIT') + if context.preferences.edit.use_enter_edit_mode: + if obdata and obdata.library is None: + obtype = obj_new.type + mode = None + if obtype in {'ARMATURE', 'CURVE', 'CURVES', 'FONT', 'LATTICE', 'MESH', 'META', 'SURFACE'}: + mode = 'EDIT' + elif obtype == 'GPENCIL': + mode = 'EDIT_GPENCIL' + + if mode is not None: + bpy.ops.object.mode_set(mode=mode) return obj_new diff --git a/release/scripts/modules/sys_info.py b/release/scripts/modules/sys_info.py index 026c39908c0..7f6d0b1e9bf 100644 --- a/release/scripts/modules/sys_info.py +++ b/release/scripts/modules/sys_info.py @@ -53,6 +53,13 @@ def write_sysinfo(filepath): output.write("build linkflags: %s\n" % prepr(bpy.app.build_linkflags)) output.write("build system: %s\n" % prepr(bpy.app.build_system)) + # Windowing Environment (include when dynamically selectable). + from _bpy import _ghost_backend + ghost_backend = _ghost_backend() + if ghost_backend not in {'NONE', 'DEFAULT'}: + output.write("windowing environment: %s\n" % prepr(ghost_backend)) + del _ghost_backend, ghost_backend + # Python info. output.write(title("Python")) output.write("version: %s\n" % (sys.version.replace("\n", " "))) diff --git a/release/scripts/startup/bl_operators/assets.py b/release/scripts/startup/bl_operators/assets.py index 088f4189ca5..d8182e25641 100644 --- a/release/scripts/startup/bl_operators/assets.py +++ b/release/scripts/startup/bl_operators/assets.py @@ -4,6 +4,9 @@ from __future__ import annotations import bpy from bpy.types import Operator +from bpy.app.translations import pgettext_data as data_ + + from bpy_extras.asset_utils import ( SpaceAssetInfo, ) @@ -33,7 +36,7 @@ class ASSET_OT_tag_add(AssetBrowserMetadataOperator, Operator): def execute(self, context): active_asset = SpaceAssetInfo.get_active_asset(context) - active_asset.tags.new("Tag") + active_asset.tags.new(data_("Tag")) return {'FINISHED'} diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index 9d04cfd5bc8..3b81f75b08a 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -3158,6 +3158,15 @@ class WM_MT_splash_about(Menu): bpy.app.build_commit_time.decode('utf-8', 'replace')), translate=False) col.label(text=iface_("Hash: %s") % bpy.app.build_hash.decode('ascii'), translate=False) col.label(text=iface_("Branch: %s") % bpy.app.build_branch.decode('utf-8', 'replace'), translate=False) + + # This isn't useful information on MS-Windows or Apple systems as dynamically switching + # between windowing systems is only supported between X11/WAYLAND. + from _bpy import _ghost_backend + ghost_backend = _ghost_backend() + if ghost_backend not in {'NONE', 'DEFAULT'}: + col.label(text=iface_("Windowing Environment: %s") % _ghost_backend(), translate=False) + del _ghost_backend, ghost_backend + col.separator(factor=2.0) col.label(text="Blender is free software") col.label(text="Licensed under the GNU General Public License") diff --git a/release/scripts/startup/bl_ui/node_add_menu_geometry.py b/release/scripts/startup/bl_ui/node_add_menu_geometry.py index c31a0e18756..e1b57ec4f43 100644 --- a/release/scripts/startup/bl_ui/node_add_menu_geometry.py +++ b/release/scripts/startup/bl_ui/node_add_menu_geometry.py @@ -208,6 +208,7 @@ class NODE_MT_geometry_node_GEO_MESH(Menu): layout.separator() node_add_menu.add_node_type(layout, "GeometryNodeInputMeshEdgeAngle") node_add_menu.add_node_type(layout, "GeometryNodeInputMeshEdgeNeighbors") + node_add_menu.add_node_type(layout, "GeometryNodeInputMeshEdgeVertices") node_add_menu.add_node_type(layout, "GeometryNodeInputMeshFaceArea") node_add_menu.add_node_type(layout, "GeometryNodeInputMeshFaceNeighbors") node_add_menu.add_node_type(layout, "GeometryNodeMeshFaceSetBoundaries") @@ -233,6 +234,7 @@ class NODE_MT_category_PRIMITIVES_MESH(Menu): node_add_menu.add_node_type(layout, "GeometryNodeMeshIcoSphere") node_add_menu.add_node_type(layout, "GeometryNodeMeshCircle") node_add_menu.add_node_type(layout, "GeometryNodeMeshLine") + node_add_menu.add_node_type(layout, "GeometryNodeMeshUVSphere") class NODE_MT_geometry_node_mesh_topology(Menu): @@ -243,7 +245,6 @@ class NODE_MT_geometry_node_mesh_topology(Menu): layout = self.layout node_add_menu.add_node_type(layout, "GeometryNodeCornersOfFace"), node_add_menu.add_node_type(layout, "GeometryNodeCornersOfVertex"), - node_add_menu.add_node_type(layout, "GeometryNodeInputMeshEdgeVertices") node_add_menu.add_node_type(layout, "GeometryNodeEdgesOfCorner"), node_add_menu.add_node_type(layout, "GeometryNodeEdgesOfVertex"), node_add_menu.add_node_type(layout, "GeometryNodeFaceOfCorner"), diff --git a/release/scripts/startup/bl_ui/properties_output.py b/release/scripts/startup/bl_ui/properties_output.py index bc7e8bb4347..ca0e698500e 100644 --- a/release/scripts/startup/bl_ui/properties_output.py +++ b/release/scripts/startup/bl_ui/properties_output.py @@ -3,7 +3,10 @@ import bpy from bpy.types import Menu, Panel, UIList from bl_ui.utils import PresetPanel -from bpy.app.translations import pgettext_tip as tip_ +from bpy.app.translations import ( + contexts as i18n_contexts, + pgettext_tip as tip_, +) class RENDER_PT_format_presets(PresetPanel, Panel): diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py index 080c8ca5726..8567ddb9372 100644 --- a/release/scripts/startup/bl_ui/properties_particle.py +++ b/release/scripts/startup/bl_ui/properties_particle.py @@ -239,6 +239,7 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel, Panel): class PARTICLE_PT_emission(ParticleButtonsPanel, Panel): bl_label = "Emission" + bl_translation_context = i18n_contexts.id_particlesettings COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_EEVEE_NEXT', 'BLENDER_WORKBENCH'} @classmethod @@ -1679,7 +1680,7 @@ class PARTICLE_PT_children_roughness(ParticleButtonsPanel, Panel): if part.use_roughness_curve: sub = col.column() sub.template_curve_mapping(part, "roughness_curve") - sub.prop(part, "roughness_1", text=iface_("Roughness", i18n_contexts.id_particlesettings)) + sub.prop(part, "roughness_1", text="Roughness", text_ctxt=i18n_contexts.id_particlesettings) sub.prop(part, "roughness_1_size", text="Size") else: sub = col.column(align=True) diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py index c337e8018e6..54b3a20f966 100644 --- a/release/scripts/startup/bl_ui/space_clip.py +++ b/release/scripts/startup/bl_ui/space_clip.py @@ -2,7 +2,10 @@ import bpy from bpy.types import Panel, Header, Menu, UIList -from bpy.app.translations import pgettext_iface as iface_ +from bpy.app.translations import ( + pgettext_iface as iface_, + contexts as i18n_contexts, +) from bl_ui.utils import PresetPanel from bl_ui.properties_grease_pencil_common import ( AnnotationDrawingToolsPanel, @@ -1751,6 +1754,7 @@ class CLIP_MT_marker_pie(Menu): class CLIP_MT_tracking_pie(Menu): # Tracking Operators bl_label = "Tracking" + bl_translation_context = i18n_contexts.id_movieclip @classmethod def poll(cls, context): diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index a99df1164a0..e703cf7f9c6 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -683,7 +683,7 @@ class SEQUENCER_MT_add(Menu): elif bpy_data_movieclips_len > 0: layout.operator_menu_enum("sequencer.movieclip_strip_add", "clip", text="Clip", icon='TRACKER') else: - layout.menu("SEQUENCER_MT_add_empty", text="Clip", icon='TRACKER') + layout.menu("SEQUENCER_MT_add_empty", text="Clip", text_ctxt=i18n_contexts.id_movieclip, icon='TRACKER') del bpy_data_movieclips_len bpy_data_masks_len = len(bpy.data.masks) diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py index da089ea23b0..3320e1e24a7 100644 --- a/release/scripts/startup/bl_ui/space_topbar.py +++ b/release/scripts/startup/bl_ui/space_topbar.py @@ -2,7 +2,10 @@ import bpy from bpy.types import Header, Menu, Panel -from bpy.app.translations import pgettext_iface as iface_ +from bpy.app.translations import ( + pgettext_iface as iface_, + contexts as i18n_contexts, +) class TOPBAR_HT_upper_bar(Header): @@ -269,7 +272,7 @@ class TOPBAR_MT_file(Menu): layout = self.layout layout.operator_context = 'INVOKE_AREA' - layout.menu("TOPBAR_MT_file_new", text="New", icon='FILE_NEW') + layout.menu("TOPBAR_MT_file_new", text="New", text_ctxt=i18n_contexts.id_windowmanager, icon='FILE_NEW') layout.operator("wm.open_mainfile", text="Open...", icon='FILE_FOLDER') layout.menu("TOPBAR_MT_file_open_recent") layout.operator("wm.revert_mainfile") @@ -408,9 +411,16 @@ class TOPBAR_MT_file_defaults(Menu): app_template, has_ext=False)) layout.operator("wm.save_homefile") - props = layout.operator("wm.read_factory_settings") if app_template: + display_name = bpy.path.display_name(iface_(app_template)) + props = layout.operator("wm.read_factory_settings", text="Load Factory Blender Settings") + props.app_template = app_template + props = layout.operator("wm.read_factory_settings", text="Load Factory %s Settings" % display_name) props.app_template = app_template + props.use_factory_startup_app_template_only = True + del display_name + else: + layout.operator("wm.read_factory_settings") # Include technical operators here which would otherwise have no way for users to access. @@ -724,7 +734,7 @@ class TOPBAR_MT_file_context_menu(Menu): layout = self.layout layout.operator_context = 'INVOKE_AREA' - layout.menu("TOPBAR_MT_file_new", text="New", icon='FILE_NEW') + layout.menu("TOPBAR_MT_file_new", text="New", text_ctxt=i18n_contexts.id_windowmanager, icon='FILE_NEW') layout.operator("wm.open_mainfile", text="Open...", icon='FILE_FOLDER') layout.separator() diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 441babefd60..a9736feb057 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -109,7 +109,16 @@ class USERPREF_MT_save_load(Menu): sub_revert.operator("wm.read_userpref", text="Revert to Saved Preferences") layout.operator_context = 'INVOKE_AREA' - layout.operator("wm.read_factory_userpref", text="Load Factory Preferences") + + app_template = prefs.app_template + if app_template: + display_name = bpy.path.display_name(iface_(app_template)) + layout.operator("wm.read_factory_userpref", text="Load Factory Blender Preferences") + props = layout.operator("wm.read_factory_userpref", text="Load Factory %s Preferences" % display_name) + props.use_factory_startup_app_template_only = True + del display_name + else: + layout.operator("wm.read_factory_userpref", text="Load Factory Preferences") class USERPREF_PT_save_preferences(Panel): diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index ada2993a16f..e8c0d4586bd 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -3356,8 +3356,7 @@ class VIEW3D_MT_face_sets(Menu): op = layout.operator("sculpt.face_set_change_visibility", text='Invert Visible Face Sets') op.mode = 'INVERT' - op = layout.operator("sculpt.face_set_change_visibility", text='Show All Face Sets') - op.mode = 'SHOW_ALL' + op = layout.operator("sculpt.reveal_all", text='Show All Face Sets') layout.separator() @@ -5518,9 +5517,7 @@ class VIEW3D_MT_sculpt_face_sets_edit_pie(Menu): op = pie.operator("sculpt.face_set_change_visibility", text='Invert Visible') op.mode = 'INVERT' - op = pie.operator("sculpt.face_set_change_visibility", text='Show All') - op.mode = 'SHOW_ALL' - + op = pie.operator("sculpt.reveal_all", text='Show All') class VIEW3D_MT_wpaint_vgroup_lock_pie(Menu): bl_label = "Vertex Group Locks" |