diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-03-25 10:55:38 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-03-25 11:05:13 +0300 |
commit | e5836423127e4c10c2f01657ee0976d49582fd33 (patch) | |
tree | a078ccebdb444a3d00d0554535c205bdf4116ca0 /source/blender/editors/interface/interface_layout.c | |
parent | ca0cc0518f23ad0fa8c0a3c3614d6a469f4af20e (diff) |
UI: add UILayout.prop_popover_enum function
Support for RNA enum buttons that activate popovers when clicked.
This means we get useful tooltips, shortcuts and Ctrl-Wheel cycling
over enum items.
It also avoids inconvenient & slow access of enum values currently done
via RNA type lookups on the type to get the name & icon to use for a
regular popover button.
Resolves T57738
Diffstat (limited to 'source/blender/editors/interface/interface_layout.c')
-rw-r--r-- | source/blender/editors/interface/interface_layout.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 160b12526b8..14ce7edf7a8 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1990,6 +1990,33 @@ void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, int flag, uiItemFullR(layout, ptr, prop, RNA_NO_INDEX, 0, flag, name, icon); } +/** + * Use a wrapper function since re-implementing all the logic in this function would be messy. + */ +void uiItemFullR_with_popover( + uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int flag, const char *name, int icon, + const char *panel_type) +{ + uiBlock *block = layout->root->block; + uiBut *but = block->buttons.last; + uiItemFullR(layout, ptr, prop, index, value, flag, name, icon); + but = but->next; + while (but) { + if (but->rnaprop == prop && but->type == UI_BTYPE_MENU) { + ui_but_rna_menu_convert_to_popover(but, panel_type); + break; + } + but = but->next; + } + if (but) { + const char *propname = RNA_property_identifier(prop); + ui_item_disabled(layout, panel_type); + RNA_warning( + "property could not use a popover: %s.%s (%s)", + RNA_struct_identifier(ptr->type), propname, panel_type); + } +} + void uiItemEnumR_prop(uiLayout *layout, const char *name, int icon, struct PointerRNA *ptr, PropertyRNA *prop, int value) { if (RNA_property_type(prop) != PROP_ENUM) { |