diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-10-30 02:46:29 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-10-30 02:53:47 +0300 |
commit | 4205cd269dfdace8ab2d3e1cc8363be19979ce53 (patch) | |
tree | 1b793341d5d84fe0ce492ed6055ecc391a1bceea | |
parent | e3817e5ec179f24b18d58ac60fe0b0969887544e (diff) |
UI: add uiItemMenuFN which frees it's argument
-rw-r--r-- | source/blender/editors/include/UI_interface.h | 1 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_layout.c | 19 |
2 files changed, 18 insertions, 2 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 0db6e2c122c..48c917040f7 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -1076,6 +1076,7 @@ void uiItemV(uiLayout *layout, const char *name, int icon, int argval); /* value void uiItemS(uiLayout *layout); /* separator */ void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg); +void uiItemMenuFN(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *argN); void uiItemMenuEnumO_ptr(uiLayout *layout, struct bContext *C, struct wmOperatorType *ot, const char *propname, const char *name, int icon); void uiItemMenuEnumO(uiLayout *layout, struct bContext *C, const char *opname, const char *propname, const char *name, int icon); void uiItemMenuEnumR_prop(uiLayout *layout, struct PointerRNA *ptr, PropertyRNA *prop, const char *name, int icon); diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 6550115e50b..4c252ae55bb 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1941,8 +1941,11 @@ static uiBut *ui_item_menu( else but = uiDefMenuBut(block, func, arg, name, 0, 0, w, h, tip); - if (argN) { /* ugly .. */ - but->poin = (char *)but; + if (argN) { + /* ugly .. */ + if (arg != argN) { + but->poin = (char *)but; + } but->func_argN = argN; } @@ -2078,6 +2081,18 @@ void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc ui_item_menu(layout, name, icon, func, arg, NULL, "", false); } +/** + * Version of #uiItemMenuF that free's `argN`. + */ +void uiItemMenuFN(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *argN) +{ + if (!func) + return; + + /* Second 'argN' only ensures it gets freed. */ + ui_item_menu(layout, name, icon, func, argN, argN, "", false); +} + typedef struct MenuItemLevel { int opcontext; /* don't use pointers to the strings because python can dynamically |