[Bf-blender-cvs] [6609fa29968] temp-ui-button-type-refactor: Merge branch 'master' into temp-ui-cleanup
Julian Eisel
noreply at git.blender.org
Fri Jun 5 14:22:47 CEST 2020
Commit: 6609fa29968454c35efec909955d9296d1962cc7
Author: Julian Eisel
Date: Fri Jun 5 13:53:47 2020 +0200
Branches: temp-ui-button-type-refactor
https://developer.blender.org/rB6609fa29968454c35efec909955d9296d1962cc7
Merge branch 'master' into temp-ui-cleanup
===================================================================
===================================================================
diff --cc source/blender/editors/include/UI_interface.h
index 230a8a2fa3d,01bc59f71e7..303f14224a2
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@@ -504,15 -504,24 +506,24 @@@ typedef void (*uiButHandleRenameFunc)(s
typedef void (*uiButHandleNFunc)(struct bContext *C, void *argN, void *arg2);
typedef void (*uiButHandleHoldFunc)(struct bContext *C, struct ARegion *butregion, uiBut *but);
typedef int (*uiButCompleteFunc)(struct bContext *C, char *str, void *arg);
- typedef struct ARegion *(*uiButSearchCreateFunc)(struct bContext *C,
- struct ARegion *butregion,
- struct uiButSearch *search_but);
- typedef void (*uiButSearchFunc)(const struct bContext *C,
- void *arg,
- const char *str,
- uiSearchItems *items);
- typedef void (*uiButSearchArgFreeFunc)(void *arg);
+ /* Search types. */
+ typedef struct ARegion *(*uiButSearchCreateFn)(struct bContext *C,
+ struct ARegion *butregion,
- uiBut *but);
++ uiBut *search_but);
+ typedef void (*uiButSearchUpdateFn)(const struct bContext *C,
+ void *arg,
+ const char *str,
+ uiSearchItems *items);
+ typedef void (*uiButSearchArgFreeFn)(void *arg);
+ typedef bool (*uiButSearchContextMenuFn)(struct bContext *C,
+ void *arg,
+ void *active,
+ const struct wmEvent *event);
+ typedef struct ARegion *(*uiButSearchTooltipFn)(struct bContext *C,
+ struct ARegion *region,
+ void *arg,
+ void *active);
/* Must return allocated string. */
typedef char *(*uiButToolTipFunc)(struct bContext *C, void *argN, const char *tip);
diff --cc source/blender/editors/interface/interface.c
index 45e474238ca,04c259ab092..bba99b8dd1b
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@@ -807,14 -807,7 +807,10 @@@ static bool ui_but_update_from_old_bloc
SWAP(ListBase, but->extra_op_icons, oldbut->extra_op_icons);
- SWAP(struct uiButSearchData *, oldbut->search, but->search);
+ if (oldbut->type == UI_BTYPE_SEARCH_MENU) {
+ uiButSearch *search_oldbut = (uiButSearch *)oldbut, *search_but = (uiButSearch *)but;
-
- SWAP(uiButSearchArgFreeFunc,
- search_oldbut->item_collect_arg_free_func,
- search_but->item_collect_arg_free_func);
- SWAP(void *, search_oldbut->item_collect_arg, search_but->item_collect_arg);
++ SWAP(struct uiButSearchData *, search_oldbut->search, search_but->search);
+ }
/* copy hardmin for list rows to prevent 'sticking' highlight to mouse position
* when scrolling without moving mouse (see [#28432]) */
@@@ -3216,27 -3206,6 +3212,32 @@@ static void ui_set_but_soft_range(uiBu
/* ******************* Free ********************/
+/**
+ * Free data specific to a certain button type.
+ * For now just do in a switch-case, we could instead have a callback stored in #uiBut and set that
+ * in #ui_but_alloc_info().
+ */
+static void ui_but_free_type_specific(uiBut *but)
+{
+ switch (but->type) {
+ case UI_BTYPE_SEARCH_MENU: {
+ uiButSearch *search_but = (uiButSearch *)but;
- if (search_but->item_collect_arg_free_func) {
- search_but->item_collect_arg_free_func(search_but->item_collect_arg);
- search_but->item_collect_arg = NULL;
++
++ if (search_but->search != NULL) {
++ if (search_but->search->arg_free_fn) {
++ search_but->search->arg_free_fn(but->search->arg);
++ search_but->search->arg = NULL;
++ }
++ MEM_freeN(search_but->search);
+ }
++
+ break;
+ }
+ default:
+ break;
+ }
+}
+
/* can be called with C==NULL */
static void ui_but_free(const bContext *C, uiBut *but)
{
@@@ -6460,46 -6351,53 +6461,57 @@@ uiBut *uiDefSearchBut(uiBlock *block
}
/**
- * \param search_func, bfunc: both get it as \a arg.
- * \param arg: user value,
- * \param active: when set, button opens with this item visible and selected.
- * \param separator_string: when not NULL, this string is used as a separator,
- * showing the icon and highlighted text after the last instance of this string.
+ * \note The item-pointer (referred to below) is a per search item user pointer
+ * passed to #UI_search_item_add (stored in #uiSearchItems.pointers).
+ *
+ * \param search_create_fn: Function to create the menu.
+ * \param search_update_fn: Function to refresh search content after the search text has changed.
+ * \param arg: user value.
+ * \param search_arg_free_fn: When non-null, use this function to free \a arg.
+ * \param search_exec_fn: Function that executes the action, gets \a arg as the first argument.
+ * The second argument as the active item-pointer
+ * \param active: When non-null, this item-pointer item will be visible and selected,
+ * otherwise the first item will be selected.
*/
void UI_but_func_search_set(uiBut *but,
- uiButSearchCreateFunc popup_create_func,
- uiButSearchFunc search_func,
+ uiButSearchCreateFn search_create_fn,
+ uiButSearchUpdateFn search_update_fn,
void *arg,
- uiButSearchArgFreeFunc search_arg_free_func,
- uiButHandleFunc bfunc,
- const char *search_sep_string,
+ uiButSearchArgFreeFn search_arg_free_fn,
+ uiButHandleFunc search_exec_fn,
void *active)
{
+ uiButSearch *but_search = (uiButSearch *)but;
+
+ BLI_assert(but->type == UI_BTYPE_SEARCH_MENU);
+
/* needed since callers don't have access to internal functions
* (as an alternative we could expose it) */
- if (popup_create_func == NULL) {
- popup_create_func = ui_searchbox_create_generic;
+ if (search_create_fn == NULL) {
+ search_create_fn = ui_searchbox_create_generic;
}
- if (but_search->item_collect_arg_free_func != NULL) {
- but_search->item_collect_arg_free_func(but_search->item_collect_arg);
- but_search->item_collect_arg = NULL;
- struct uiButSearchData *search = but->search;
++ struct uiButSearchData *search = but_search->search;
+ if (search != NULL) {
+ if (search->arg_free_fn != NULL) {
- search->arg_free_fn(but->search->arg);
++ search->arg_free_fn(but_search->search->arg);
+ search->arg = NULL;
+ }
+ }
+ else {
- search = MEM_callocN(sizeof(*but->search), __func__);
- but->search = search;
++ search = MEM_callocN(sizeof(*but_search->search), __func__);
++ but_search->search = search;
}
- but_search->popup_create_func = popup_create_func;
- but_search->item_collect_func = search_func;
+ search->create_fn = search_create_fn;
+ search->update_fn = search_update_fn;
- but_search->item_collect_arg = arg;
- but_search->item_collect_arg_free_func = search_arg_free_func;
- but_search->item_sep_string = search_sep_string;
+ search->arg = arg;
+ search->arg_free_fn = search_arg_free_fn;
- if (bfunc) {
+ if (search_exec_fn) {
#ifdef DEBUG
- if (but->func) {
+ if (but_search->but.func) {
/* watch this, can be cause of much confusion, see: T47691 */
printf("%s: warning, overwriting button callback with search function callback!\n",
__func__);
diff --cc source/blender/editors/interface/interface_context_menu.c
index 29a131cca73,cc370113422..00c5c5ea3ef
--- a/source/blender/editors/interface/interface_context_menu.c
+++ b/source/blender/editors/interface/interface_context_menu.c
@@@ -962,7 -962,7 +962,7 @@@ bool ui_popup_context_menu_for_button(b
const PropertyType prop_type = RNA_property_type(but->rnaprop);
if (((prop_type == PROP_POINTER) ||
(prop_type == PROP_STRING && but->type == UI_BTYPE_SEARCH_MENU &&
- ((uiButSearch *)but)->item_collect_func == ui_rna_collection_search_cb)) &&
- but->search->update_fn == ui_rna_collection_search_update_fn)) &&
++ ((uiButSearch *)but)->search->update_fn == ui_rna_collection_search_update_fn)) &&
ui_jump_to_target_button_poll(C)) {
uiItemO(layout,
CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Jump to Target"),
diff --cc source/blender/editors/interface/interface_handlers.c
index 7a9aff80ed7,eb99d044e17..0c70360655a
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@@ -753,12 -756,11 +756,12 @@@ static void ui_apply_but_func(bContext
after->rnapoin = but->rnapoin;
after->rnaprop = but->rnaprop;
- if (but->search != NULL) {
- after->search_arg_free_fn = but->search->arg_free_fn;
- after->search_arg = but->search->arg;
- but->search->arg_free_fn = NULL;
- but->search->arg = NULL;
+ if (but->type == UI_BTYPE_SEARCH_MENU) {
+ uiButSearch *search_but = (uiButSearch *)but;
- after->search_arg_free_func = search_but->item_collect_arg_free_func;
- after->search_arg = search_but->item_collect_arg;
- search_but->item_collect_arg_free_func = NULL;
- search_but->item_collect_arg = NULL;
++ after->search_arg_free_fn = search_but->search->arg_free_fn;
++ after->search_arg = search_but->search->arg;
++ search_but->search->arg_free_fn = NULL;
++ search_but->search->arg = NULL;
}
if (but->context) {
@@@ -3318,11 -3311,13 +3313,15 @@@ static void ui_textedit_begin(b
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list