UI: custom free function improvements
This changes `UI_but_func_tooltip_set` so that it allows passing a custom free function, which has two benefits: * The caller can pass `null` to indicate that the value should not be freed. * Arbitrary c++ data can be passed to the callback (before the struct had to be trivially destructible). I added `uiFreeArgFunc` and used it in other places where appropriate. Differential Revision: https://developer.blender.org/D11738
This commit is contained in:
parent
ca12d70af0
commit
17a67bf778
Notes:
blender-bot
2023-02-14 08:33:26 +01:00
Referenced by issue #89586, Memory spike after setting domain resolution Referenced by issue #89583, Particles do not react to collision objects anymore
|
@ -504,7 +504,6 @@ typedef void (*uiButSearchUpdateFn)(const struct bContext *C,
|
|||
const char *str,
|
||||
uiSearchItems *items,
|
||||
const bool is_first);
|
||||
typedef void (*uiButSearchArgFreeFn)(void *arg);
|
||||
typedef bool (*uiButSearchContextMenuFn)(struct bContext *C,
|
||||
void *arg,
|
||||
void *active,
|
||||
|
@ -533,6 +532,8 @@ typedef void (*uiMenuHandleFunc)(struct bContext *C, void *arg, int event);
|
|||
*/
|
||||
typedef bool (*uiMenuStepFunc)(struct bContext *C, int direction, void *arg1);
|
||||
|
||||
typedef void (*uiFreeArgFunc)(void *arg);
|
||||
|
||||
/* interface_query.c */
|
||||
bool UI_but_has_tooltip_label(const uiBut *but);
|
||||
bool UI_but_is_tool(const uiBut *but);
|
||||
|
@ -619,11 +620,11 @@ typedef void (*uiBlockCancelFunc)(struct bContext *C, void *arg1);
|
|||
void UI_popup_block_invoke(struct bContext *C,
|
||||
uiBlockCreateFunc func,
|
||||
void *arg,
|
||||
void (*arg_free)(void *arg));
|
||||
uiFreeArgFunc arg_free);
|
||||
void UI_popup_block_invoke_ex(struct bContext *C,
|
||||
uiBlockCreateFunc func,
|
||||
void *arg,
|
||||
void (*arg_free)(void *arg),
|
||||
uiFreeArgFunc arg_free,
|
||||
bool can_refresh);
|
||||
void UI_popup_block_ex(struct bContext *C,
|
||||
uiBlockCreateFunc func,
|
||||
|
@ -1599,7 +1600,7 @@ void UI_but_func_search_set(uiBut *but,
|
|||
uiButSearchUpdateFn search_update_fn,
|
||||
void *arg,
|
||||
const bool free_arg,
|
||||
uiButSearchArgFreeFn search_arg_free_fn,
|
||||
uiFreeArgFunc search_arg_free_fn,
|
||||
uiButHandleFunc search_exec_fn,
|
||||
void *active);
|
||||
void UI_but_func_search_set_context_menu(uiBut *but, uiButSearchContextMenuFn context_menu_fn);
|
||||
|
@ -1644,7 +1645,7 @@ void UI_but_func_drawextra_set(
|
|||
|
||||
void UI_but_func_menu_step_set(uiBut *but, uiMenuStepFunc func);
|
||||
|
||||
void UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *argN);
|
||||
void UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *arg, uiFreeArgFunc free_arg);
|
||||
void UI_but_tooltip_refresh(struct bContext *C, uiBut *but);
|
||||
void UI_but_tooltip_timer_remove(struct bContext *C, uiBut *but);
|
||||
|
||||
|
|
|
@ -811,7 +811,8 @@ static void ui_but_update_old_active_from_new(uiBut *oldbut, uiBut *but)
|
|||
|
||||
/* Move tooltip from new to old. */
|
||||
SWAP(uiButToolTipFunc, oldbut->tip_func, but->tip_func);
|
||||
SWAP(void *, oldbut->tip_argN, but->tip_argN);
|
||||
SWAP(void *, oldbut->tip_arg, but->tip_arg);
|
||||
SWAP(uiFreeArgFunc, oldbut->tip_arg_free, but->tip_arg_free);
|
||||
|
||||
oldbut->flag = (oldbut->flag & ~flag_copy) | (but->flag & flag_copy);
|
||||
oldbut->drawflag = (oldbut->drawflag & ~drawflag_copy) | (but->drawflag & drawflag_copy);
|
||||
|
@ -822,7 +823,7 @@ static void ui_but_update_old_active_from_new(uiBut *oldbut, uiBut *but)
|
|||
if (oldbut->type == UI_BTYPE_SEARCH_MENU) {
|
||||
uiButSearch *search_oldbut = (uiButSearch *)oldbut, *search_but = (uiButSearch *)but;
|
||||
|
||||
SWAP(uiButSearchArgFreeFn, search_oldbut->arg_free_fn, search_but->arg_free_fn);
|
||||
SWAP(uiFreeArgFunc, search_oldbut->arg_free_fn, search_but->arg_free_fn);
|
||||
SWAP(void *, search_oldbut->arg, search_but->arg);
|
||||
}
|
||||
|
||||
|
@ -3358,8 +3359,8 @@ static void ui_but_free(const bContext *C, uiBut *but)
|
|||
MEM_freeN(but->func_argN);
|
||||
}
|
||||
|
||||
if (but->tip_argN) {
|
||||
MEM_freeN(but->tip_argN);
|
||||
if (but->tip_arg_free) {
|
||||
but->tip_arg_free(but->tip_arg);
|
||||
}
|
||||
|
||||
if (but->hold_argN) {
|
||||
|
@ -6334,13 +6335,14 @@ void UI_but_func_menu_step_set(uiBut *but, uiMenuStepFunc func)
|
|||
but->menu_step_func = func;
|
||||
}
|
||||
|
||||
void UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *argN)
|
||||
void UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *arg, uiFreeArgFunc free_arg)
|
||||
{
|
||||
but->tip_func = func;
|
||||
if (but->tip_argN) {
|
||||
MEM_freeN(but->tip_argN);
|
||||
if (but->tip_arg_free) {
|
||||
but->tip_arg_free(but->tip_arg);
|
||||
}
|
||||
but->tip_argN = argN;
|
||||
but->tip_arg = arg;
|
||||
but->tip_arg_free = free_arg;
|
||||
}
|
||||
|
||||
void UI_but_func_pushed_state_set(uiBut *but, uiButPushedStateFunc func, const void *arg)
|
||||
|
@ -6630,7 +6632,7 @@ void UI_but_func_search_set(uiBut *but,
|
|||
uiButSearchUpdateFn search_update_fn,
|
||||
void *arg,
|
||||
const bool free_arg,
|
||||
uiButSearchArgFreeFn search_arg_free_fn,
|
||||
uiFreeArgFunc search_arg_free_fn,
|
||||
uiButHandleFunc search_exec_fn,
|
||||
void *active)
|
||||
{
|
||||
|
@ -6965,7 +6967,7 @@ void UI_but_string_info_get(bContext *C, uiBut *but, ...)
|
|||
}
|
||||
else if (type == BUT_GET_TIP) {
|
||||
if (but->tip_func) {
|
||||
tmp = but->tip_func(C, but->tip_argN, but->tip);
|
||||
tmp = but->tip_func(C, but->tip_arg, but->tip);
|
||||
}
|
||||
else if (but->tip && but->tip[0]) {
|
||||
tmp = BLI_strdup(but->tip);
|
||||
|
|
|
@ -469,7 +469,7 @@ typedef struct uiAfterFunc {
|
|||
PropertyRNA *rnaprop;
|
||||
|
||||
void *search_arg;
|
||||
uiButSearchArgFreeFn search_arg_free_fn;
|
||||
uiFreeArgFunc search_arg_free_fn;
|
||||
|
||||
bContextStore *context;
|
||||
|
||||
|
|
|
@ -221,7 +221,8 @@ struct uiBut {
|
|||
|
||||
const char *tip;
|
||||
uiButToolTipFunc tip_func;
|
||||
void *tip_argN;
|
||||
void *tip_arg;
|
||||
uiFreeArgFunc tip_arg_free;
|
||||
|
||||
/** info on why button is disabled, displayed in tooltip */
|
||||
const char *disabled_info;
|
||||
|
@ -316,7 +317,7 @@ typedef struct uiButSearch {
|
|||
void *item_active;
|
||||
|
||||
void *arg;
|
||||
uiButSearchArgFreeFn arg_free_fn;
|
||||
uiFreeArgFunc arg_free_fn;
|
||||
|
||||
uiButSearchContextMenuFn item_context_menu_fn;
|
||||
uiButSearchTooltipFn item_tooltip_fn;
|
||||
|
@ -704,7 +705,7 @@ struct uiPopupBlockCreate {
|
|||
uiBlockCreateFunc create_func;
|
||||
uiBlockHandleCreateFunc handle_create_func;
|
||||
void *arg;
|
||||
void (*arg_free)(void *arg);
|
||||
uiFreeArgFunc arg_free;
|
||||
|
||||
int event_xy[2];
|
||||
|
||||
|
@ -828,7 +829,7 @@ uiPopupBlockHandle *ui_popup_block_create(struct bContext *C,
|
|||
uiBlockCreateFunc create_func,
|
||||
uiBlockHandleCreateFunc handle_create_func,
|
||||
void *arg,
|
||||
void (*arg_free)(void *arg));
|
||||
uiFreeArgFunc arg_free);
|
||||
uiPopupBlockHandle *ui_popup_menu_create(struct bContext *C,
|
||||
struct ARegion *butregion,
|
||||
uiBut *but,
|
||||
|
|
|
@ -591,7 +591,7 @@ int UI_popup_menu_invoke(bContext *C, const char *idname, ReportList *reports)
|
|||
* \{ */
|
||||
|
||||
void UI_popup_block_invoke_ex(
|
||||
bContext *C, uiBlockCreateFunc func, void *arg, void (*arg_free)(void *arg), bool can_refresh)
|
||||
bContext *C, uiBlockCreateFunc func, void *arg, uiFreeArgFunc arg_free, bool can_refresh)
|
||||
{
|
||||
wmWindow *window = CTX_wm_window(C);
|
||||
uiPopupBlockHandle *handle;
|
||||
|
@ -608,10 +608,7 @@ void UI_popup_block_invoke_ex(
|
|||
WM_event_add_mousemove(window);
|
||||
}
|
||||
|
||||
void UI_popup_block_invoke(bContext *C,
|
||||
uiBlockCreateFunc func,
|
||||
void *arg,
|
||||
void (*arg_free)(void *arg))
|
||||
void UI_popup_block_invoke(bContext *C, uiBlockCreateFunc func, void *arg, uiFreeArgFunc arg_free)
|
||||
{
|
||||
UI_popup_block_invoke_ex(C, func, arg, arg_free, true);
|
||||
}
|
||||
|
|
|
@ -773,7 +773,7 @@ uiPopupBlockHandle *ui_popup_block_create(bContext *C,
|
|||
uiBlockCreateFunc create_func,
|
||||
uiBlockHandleCreateFunc handle_create_func,
|
||||
void *arg,
|
||||
void (*arg_free)(void *arg))
|
||||
uiFreeArgFunc arg_free)
|
||||
{
|
||||
wmWindow *window = CTX_wm_window(C);
|
||||
uiBut *activebut = UI_context_active_but_get(C);
|
||||
|
|
|
@ -6205,7 +6205,7 @@ void uiTemplateList(uiLayout *layout,
|
|||
0,
|
||||
TIP_("Double click to rename"));
|
||||
if ((dyntip_data = uilist_item_use_dynamic_tooltip(itemptr, item_dyntip_propname))) {
|
||||
UI_but_func_tooltip_set(but, uilist_item_tooltip_func, dyntip_data);
|
||||
UI_but_func_tooltip_set(but, uilist_item_tooltip_func, dyntip_data, MEM_freeN);
|
||||
}
|
||||
|
||||
sub = uiLayoutRow(overlap, false);
|
||||
|
@ -6762,7 +6762,7 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
|
|||
NULL);
|
||||
|
||||
but_progress->progress = progress;
|
||||
UI_but_func_tooltip_set(&but_progress->but, progress_tooltip_func, tip_arg);
|
||||
UI_but_func_tooltip_set(&but_progress->but, progress_tooltip_func, tip_arg, MEM_freeN);
|
||||
}
|
||||
|
||||
if (!wm->is_interface_locked) {
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "BLI_alloca.h"
|
||||
#include "BLI_blenlib.h"
|
||||
#include "BLI_fileops_types.h"
|
||||
|
@ -165,7 +167,7 @@ static void file_draw_icon(const SpaceFile *sfile,
|
|||
const float a2 = dimmed ? 0.3f : 0.0f;
|
||||
but = uiDefIconBut(
|
||||
block, UI_BTYPE_LABEL, 0, icon, x, y, width, height, NULL, 0.0f, 0.0f, a1, a2, NULL);
|
||||
UI_but_func_tooltip_set(but, file_draw_tooltip_func, BLI_strdup(path));
|
||||
UI_but_func_tooltip_set(but, file_draw_tooltip_func, BLI_strdup(path), MEM_freeN);
|
||||
|
||||
if (drag) {
|
||||
/* TODO duplicated from file_draw_preview(). */
|
||||
|
|
|
@ -1285,7 +1285,7 @@ static void node_add_error_message_button(
|
|||
0,
|
||||
0,
|
||||
nullptr);
|
||||
UI_but_func_tooltip_set(but, node_errors_tooltip_fn, storage_pointer_alloc);
|
||||
UI_but_func_tooltip_set(but, node_errors_tooltip_fn, storage_pointer_alloc, MEM_freeN);
|
||||
UI_block_emboss_set(node.block, UI_EMBOSS);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue