diff options
author | Luca Rood <dev@lucarood.com> | 2022-08-18 15:42:48 +0300 |
---|---|---|
committer | Luca Rood <dev@lucarood.com> | 2022-08-18 15:46:30 +0300 |
commit | 8a799b00f8fa28433ba44cfec09757f77a46ae0d (patch) | |
tree | 84bb804b342fb6c4344d0f2729322eafc7c5752c /doc/python_api | |
parent | c3757504233ab7b1dca7102bb9239423d6419efc (diff) |
Fix T100423: Addon's custom context menu entries get overridden by other addons
This introduces a new `UI_MT_button_context_menu` class which is
registered at startup. Addons can append/prepend draw functions to this
class, in order to add their custom context menu entries.
The new class replaces the old `WM_MT_button_context` class, thus
requiring a small change in addons using this feature. This is done
because addons were previously required to register the class
themselves, which caused addons to override each other's context menu
entries.
Now the class registration is handled by Blender, and addons need only
append their draw functions. The new class name ensures that addons
using the old method don't override menu entries made using the new
class.
Menu entries added with the legacy `WM_MT_button_context` class are
still drawn for backwards compatibility, but this class must not be used
going forward, as any addon using it still runs the risk of having its
menu entries overridden, and support for the legacy class is subject to
removal in a future version.
Reviewed By: campbellbarton
Maniphest Tasks: T100423
Differential Revision: https://developer.blender.org/D15702
Diffstat (limited to 'doc/python_api')
-rw-r--r-- | doc/python_api/examples/bpy.types.Menu.4.py | 31 |
1 files changed, 7 insertions, 24 deletions
diff --git a/doc/python_api/examples/bpy.types.Menu.4.py b/doc/python_api/examples/bpy.types.Menu.4.py index 869def8bfe0..4d1ae2d4a19 100644 --- a/doc/python_api/examples/bpy.types.Menu.4.py +++ b/doc/python_api/examples/bpy.types.Menu.4.py @@ -3,8 +3,8 @@ Extending the Button Context Menu +++++++++++++++++++++++++++++++++ This example enables you to insert your own menu entry into the common -right click menu that you get while hovering over a value field, -color, string, etc. +right click menu that you get while hovering over a UI button (e.g. operator, +value field, color, string, etc.) To make the example work, you have to first select an object then right click on an user interface element (maybe a color in the @@ -14,7 +14,6 @@ Executing the operator will then print all values. """ import bpy -from bpy.types import Menu def dump(obj, text): @@ -47,36 +46,20 @@ class WM_OT_button_context_test(bpy.types.Operator): return {'FINISHED'} -# This class has to be exactly named like that to insert an entry in the right click menu -class WM_MT_button_context(Menu): - bl_label = "Unused" - - def draw(self, context): - pass - - -def menu_func(self, context): +def draw_menu(self, context): layout = self.layout layout.separator() layout.operator(WM_OT_button_context_test.bl_idname) -classes = ( - WM_OT_button_context_test, - WM_MT_button_context, -) - - def register(): - for cls in classes: - bpy.utils.register_class(cls) - bpy.types.WM_MT_button_context.append(menu_func) + bpy.utils.register_class(WM_OT_button_context_test) + bpy.types.UI_MT_button_context_menu.append(draw_menu) def unregister(): - for cls in classes: - bpy.utils.unregister_class(cls) - bpy.types.WM_MT_button_context.remove(menu_func) + bpy.types.UI_MT_button_context_menu.remove(draw_menu) + bpy.utils.unregister_class(WM_OT_button_context_test) if __name__ == "__main__": |