Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Eisel <julian@blender.org>2021-01-13 17:08:09 +0300
committerJulian Eisel <julian@blender.org>2021-01-13 17:31:02 +0300
commit2771dfd5632ad6d982ee4bf3e87decdb197ebed7 (patch)
tree515ef4f88aaf9ad2a3873ba9dec5133317703d18 /source/blender/editors/interface
parentad4202a14fbce95b7c40df0e815c1ac261515b05 (diff)
UI: Revert design changes to data-block selector for the 2.92 release
Partially reverts 2250b5cefee7. Removing the user count and fake user count icons was controversial (which was expected) and there are a few further changes needed, that won't make it in time for the release, see D9946. While there is a design to bring back the user count and fake user indicators, a new design idea was proposed that the UI team wants to follow. This came too late for the 2.92 release, the new design is targeted at the 2.93 release now. Meanwhile, UI team decision was to simply revert the design changes. The new design is being worked on in https://developer.blender.org/T84669. Note that this commit does not revert some internal changes done in 2250b5cefee7. Namely the introduction of `ed_util_ops.c` and data-block operators in there. These will still be needed in the new design.
Diffstat (limited to 'source/blender/editors/interface')
-rw-r--r--source/blender/editors/interface/interface.c143
-rw-r--r--source/blender/editors/interface/interface_context_menu.c2
-rw-r--r--source/blender/editors/interface/interface_handlers.c51
-rw-r--r--source/blender/editors/interface/interface_ops.c1
-rw-r--r--source/blender/editors/interface/interface_region_tooltip.c68
-rw-r--r--source/blender/editors/interface/interface_templates.c1092
6 files changed, 500 insertions, 857 deletions
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 9644e6e0238..e53dfa83867 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -1168,21 +1168,16 @@ void ui_but_add_shortcut(uiBut *but, const char *shortcut_str, const bool do_str
* \{ */
static bool ui_but_event_operator_string_from_operator(const bContext *C,
- wmOperatorCallParams *op_call_params,
+ uiBut *but,
char *buf,
const size_t buf_len)
{
- BLI_assert(op_call_params->optype != NULL);
+ BLI_assert(but->optype != NULL);
bool found = false;
- IDProperty *prop = (op_call_params->opptr) ? op_call_params->opptr->data : NULL;
-
- if (WM_key_event_operator_string(C,
- op_call_params->optype->idname,
- op_call_params->opcontext,
- prop,
- true,
- buf,
- buf_len)) {
+ IDProperty *prop = (but->opptr) ? but->opptr->data : NULL;
+
+ if (WM_key_event_operator_string(
+ C, but->optype->idname, but->opcontext, prop, true, buf, buf_len)) {
found = true;
}
return found;
@@ -1259,22 +1254,15 @@ static bool ui_but_event_operator_string_from_panel(const bContext *C,
return found;
}
-static bool ui_but_event_operator_string(
- const bContext *C, uiBut *but, uiButExtraOpIcon *extra_icon, char *buf, const size_t buf_len)
+static bool ui_but_event_operator_string(const bContext *C,
+ uiBut *but,
+ char *buf,
+ const size_t buf_len)
{
bool found = false;
- wmOperatorType *extra_icon_optype = UI_but_extra_operator_icon_optype_get(extra_icon);
- if (extra_icon_optype) {
- found = ui_but_event_operator_string_from_operator(C, extra_icon->optype_params, buf, buf_len);
- }
- else if (but->optype != NULL) {
- found = ui_but_event_operator_string_from_operator(
- C,
- &(wmOperatorCallParams){
- .optype = but->optype, .opptr = but->opptr, .opcontext = but->opcontext},
- buf,
- buf_len);
+ if (but->optype != NULL) {
+ found = ui_but_event_operator_string_from_operator(C, but, buf, buf_len);
}
else if (UI_but_menutype_get(but) != NULL) {
found = ui_but_event_operator_string_from_menu(C, but, buf, buf_len);
@@ -1577,7 +1565,7 @@ static void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block)
continue;
}
- if (ui_but_event_operator_string(C, but, NULL, buf, sizeof(buf))) {
+ if (ui_but_event_operator_string(C, but, buf, sizeof(buf))) {
ui_but_add_shortcut(but, buf, false);
}
else if (ui_but_event_property_operator_string(C, but, buf, sizeof(buf))) {
@@ -1618,12 +1606,12 @@ typedef enum PredefinedExtraOpIconType {
PREDEFINED_EXTRA_OP_ICON_EYEDROPPER,
} PredefinedExtraOpIconType;
-static uiButExtraOpIcon *ui_but_extra_operator_icon_add_ptr(uiBut *but,
- wmOperatorType *optype,
- short opcontext,
- int icon)
+static PointerRNA *ui_but_extra_operator_icon_add_ptr(uiBut *but,
+ wmOperatorType *optype,
+ short opcontext,
+ int icon)
{
- uiButExtraOpIcon *extra_op_icon = MEM_callocN(sizeof(*extra_op_icon), __func__);
+ uiButExtraOpIcon *extra_op_icon = MEM_mallocN(sizeof(*extra_op_icon), __func__);
extra_op_icon->icon = (BIFIconID)icon;
extra_op_icon->optype_params = MEM_callocN(sizeof(*extra_op_icon->optype_params),
@@ -1638,15 +1626,13 @@ static uiButExtraOpIcon *ui_but_extra_operator_icon_add_ptr(uiBut *but,
BLI_addtail(&but->extra_op_icons, extra_op_icon);
- return extra_op_icon;
+ return extra_op_icon->optype_params->opptr;
}
static void ui_but_extra_operator_icon_free(uiButExtraOpIcon *extra_icon)
{
- if (extra_icon->optype_params->opptr) {
- WM_operator_properties_free(extra_icon->optype_params->opptr);
- MEM_freeN(extra_icon->optype_params->opptr);
- }
+ WM_operator_properties_free(extra_icon->optype_params->opptr);
+ MEM_freeN(extra_icon->optype_params->opptr);
MEM_freeN(extra_icon->optype_params);
MEM_freeN(extra_icon);
}
@@ -1659,25 +1645,18 @@ void ui_but_extra_operator_icons_free(uiBut *but)
BLI_listbase_clear(&but->extra_op_icons);
}
-uiButExtraOpIcon *UI_but_extra_operator_icon_add(uiBut *but,
- const char *opname,
- short opcontext,
- int icon)
+PointerRNA *UI_but_extra_operator_icon_add(uiBut *but,
+ const char *opname,
+ short opcontext,
+ int icon)
{
wmOperatorType *optype = WM_operatortype_find(opname, false);
- BLI_assert(optype);
- return ui_but_extra_operator_icon_add_ptr(but, optype, opcontext, icon);
-}
-
-PointerRNA *UI_but_extra_operator_icon_opptr_get(uiButExtraOpIcon *extra_icon)
-{
- return extra_icon->optype_params->opptr;
-}
+ if (optype) {
+ return ui_but_extra_operator_icon_add_ptr(but, optype, opcontext, icon);
+ }
-wmOperatorType *UI_but_extra_operator_icon_optype_get(uiButExtraOpIcon *extra_icon)
-{
- return extra_icon ? extra_icon->optype_params->optype : NULL;
+ return NULL;
}
static bool ui_but_icon_extra_is_visible_text_clear(const uiBut *but)
@@ -6840,7 +6819,7 @@ void UI_but_func_hold_set(uiBut *but, uiButHandleHoldFunc func, void *argN)
but->hold_argN = argN;
}
-void UI_but_string_info_get(bContext *C, uiBut *but, uiButExtraOpIcon *extra_icon, ...)
+void UI_but_string_info_get(bContext *C, uiBut *but, ...)
{
va_list args;
uiStringInfo *si;
@@ -6849,19 +6828,13 @@ void UI_but_string_info_get(bContext *C, uiBut *but, uiButExtraOpIcon *extra_ico
int totitems;
bool free_items = false;
- wmOperatorType *extra_icon_optype = UI_but_extra_operator_icon_optype_get(extra_icon);
- wmOperatorType *optype = extra_icon ? extra_icon_optype : but->optype;
-
- /* Don't query RNA data when the extra-icon overrides the button. */
- PropertyRNA *rnaprop = extra_icon ? NULL : but->rnaprop;
-
- va_start(args, extra_icon);
+ va_start(args, but);
while ((si = (uiStringInfo *)va_arg(args, void *))) {
uiStringInfoType type = si->type;
char *tmp = NULL;
if (type == BUT_GET_LABEL) {
- if (but->str && but->str[0] && !extra_icon) {
+ if (but->str && but->str[0]) {
const char *str_sep;
size_t str_len;
@@ -6891,16 +6864,16 @@ void UI_but_string_info_get(bContext *C, uiBut *but, uiButExtraOpIcon *extra_ico
}
if (type == BUT_GET_RNAPROP_IDENTIFIER) {
- if (rnaprop) {
- tmp = BLI_strdup(RNA_property_identifier(rnaprop));
+ if (but->rnaprop) {
+ tmp = BLI_strdup(RNA_property_identifier(but->rnaprop));
}
}
else if (type == BUT_GET_RNASTRUCT_IDENTIFIER) {
- if (rnaprop && but->rnapoin.data) {
+ if (but->rnaprop && but->rnapoin.data) {
tmp = BLI_strdup(RNA_struct_identifier(but->rnapoin.type));
}
- else if (optype) {
- tmp = BLI_strdup(optype->idname);
+ else if (but->optype) {
+ tmp = BLI_strdup(but->optype->idname);
}
else if (ELEM(but->type, UI_BTYPE_MENU, UI_BTYPE_PULLDOWN)) {
MenuType *mt = UI_but_menutype_get(but);
@@ -6916,25 +6889,23 @@ void UI_but_string_info_get(bContext *C, uiBut *but, uiButExtraOpIcon *extra_ico
}
}
else if (ELEM(type, BUT_GET_RNA_LABEL, BUT_GET_RNA_TIP)) {
- if (rnaprop) {
+ if (but->rnaprop) {
if (type == BUT_GET_RNA_LABEL) {
- tmp = BLI_strdup(RNA_property_ui_name(rnaprop));
+ tmp = BLI_strdup(RNA_property_ui_name(but->rnaprop));
}
else {
- const char *t = RNA_property_ui_description(rnaprop);
+ const char *t = RNA_property_ui_description(but->rnaprop);
if (t && t[0]) {
tmp = BLI_strdup(t);
}
}
}
- else if (optype) {
- PointerRNA *opptr = extra_icon_optype ? UI_but_extra_operator_icon_opptr_get(extra_icon) :
- but->opptr;
+ else if (but->optype) {
if (type == BUT_GET_RNA_LABEL) {
- tmp = BLI_strdup(WM_operatortype_name(optype, opptr));
+ tmp = BLI_strdup(WM_operatortype_name(but->optype, but->opptr));
}
else {
- tmp = WM_operatortype_description(C, optype, opptr);
+ tmp = WM_operatortype_description(C, but->optype, but->opptr);
}
}
else if (ELEM(but->type, UI_BTYPE_MENU, UI_BTYPE_PULLDOWN, UI_BTYPE_POPOVER)) {
@@ -6986,11 +6957,11 @@ void UI_but_string_info_get(bContext *C, uiBut *but, uiButExtraOpIcon *extra_ico
}
else if (type == BUT_GET_RNA_LABEL_CONTEXT) {
const char *_tmp = BLT_I18NCONTEXT_DEFAULT;
- if (rnaprop) {
- _tmp = RNA_property_translation_context(rnaprop);
+ if (but->rnaprop) {
+ _tmp = RNA_property_translation_context(but->rnaprop);
}
- else if (optype) {
- _tmp = RNA_struct_translation_context(optype->srna);
+ else if (but->optype) {
+ _tmp = RNA_struct_translation_context(but->optype->srna);
}
else if (ELEM(but->type, UI_BTYPE_MENU, UI_BTYPE_PULLDOWN)) {
MenuType *mt = UI_but_menutype_get(but);
@@ -7009,16 +6980,16 @@ void UI_but_string_info_get(bContext *C, uiBut *but, uiButExtraOpIcon *extra_ico
int value = 0;
/* get the enum property... */
- if (rnaprop && RNA_property_type(rnaprop) == PROP_ENUM) {
+ if (but->rnaprop && RNA_property_type(but->rnaprop) == PROP_ENUM) {
/* enum property */
ptr = &but->rnapoin;
- prop = rnaprop;
+ prop = but->rnaprop;
value = (ELEM(but->type, UI_BTYPE_ROW, UI_BTYPE_TAB)) ? (int)but->hardmax :
(int)ui_but_value_get(but);
}
- else if (optype) {
- PointerRNA *opptr = extra_icon_optype ? UI_but_extra_operator_icon_opptr_get(extra_icon) :
- UI_but_operator_ptr_get(but);
+ else if (but->optype) {
+ PointerRNA *opptr = UI_but_operator_ptr_get(but);
+ wmOperatorType *ot = but->optype;
/* so the context is passed to itemf functions */
WM_operator_properties_sanitize(opptr, false);
@@ -7028,11 +6999,11 @@ void UI_but_string_info_get(bContext *C, uiBut *but, uiButExtraOpIcon *extra_ico
* operator menus in the Anim Editors will show tooltips for the different
* operations instead of the meaningless generic operator tooltip
*/
- if (optype->prop && RNA_property_type(optype->prop) == PROP_ENUM) {
- if (RNA_struct_contains_property(opptr, optype->prop)) {
+ if (ot->prop && RNA_property_type(ot->prop) == PROP_ENUM) {
+ if (RNA_struct_contains_property(opptr, ot->prop)) {
ptr = opptr;
- prop = optype->prop;
- value = RNA_property_enum_get(opptr, optype->prop);
+ prop = ot->prop;
+ value = RNA_property_enum_get(opptr, ot->prop);
}
}
}
@@ -7065,7 +7036,7 @@ void UI_but_string_info_get(bContext *C, uiBut *but, uiButExtraOpIcon *extra_ico
else if (type == BUT_GET_OP_KEYMAP) {
if (!ui_block_is_menu(but->block)) {
char buf[128];
- if (ui_but_event_operator_string(C, but, extra_icon, buf, sizeof(buf))) {
+ if (ui_but_event_operator_string(C, but, buf, sizeof(buf))) {
tmp = BLI_strdup(buf);
}
}
diff --git a/source/blender/editors/interface/interface_context_menu.c b/source/blender/editors/interface/interface_context_menu.c
index 24a9558d095..85730d138ac 100644
--- a/source/blender/editors/interface/interface_context_menu.c
+++ b/source/blender/editors/interface/interface_context_menu.c
@@ -509,7 +509,7 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but)
uiStringInfo label = {BUT_GET_LABEL, NULL};
/* highly unlikely getting the label ever fails */
- UI_but_string_info_get(C, but, NULL, &label, NULL);
+ UI_but_string_info_get(C, but, &label, NULL);
pup = UI_popup_menu_begin(C, label.strinfo ? label.strinfo : "", ICON_NONE);
layout = UI_popup_menu_layout(pup);
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index c098b5c79a1..377e55e7299 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -334,7 +334,6 @@ typedef struct uiHandleButtonData {
int retval;
/* booleans (could be made into flags) */
bool cancel, escapecancel;
- bool skip_undo_push;
bool applied, applied_interactive;
bool changed_cursor;
wmTimer *flashtimer;
@@ -821,9 +820,7 @@ static void ui_apply_but_func(bContext *C, uiBut *but)
/* typically call ui_apply_but_undo(), ui_apply_but_autokey() */
static void ui_apply_but_undo(uiBut *but)
{
- const bool force_skip_undo = (but->active && but->active->skip_undo_push);
-
- if (but->flag & UI_BUT_UNDO && !force_skip_undo) {
+ if (but->flag & UI_BUT_UNDO) {
const char *str = NULL;
size_t str_len_clip = SIZE_MAX - 1;
bool skip_undo = false;
@@ -2874,8 +2871,7 @@ void ui_but_active_string_clear_and_exit(bContext *C, uiBut *but)
but->active->str[0] = 0;
ui_apply_but_TEX(C, but, but->active);
- /* use onfree event so undo is handled by caller and apply is already done above */
- button_activate_exit((bContext *)C, but, but->active, false, true);
+ button_activate_state(C, but, BUTTON_STATE_EXIT);
}
static void ui_textedit_string_ensure_max_length(uiBut *but, uiHandleButtonData *data, int maxlen)
@@ -4020,38 +4016,16 @@ static void ui_numedit_apply(bContext *C, uiBlock *block, uiBut *but, uiHandleBu
ED_region_tag_redraw(data->region);
}
-static void ui_but_extra_operator_icon_apply_func(uiBut *but, uiButExtraOpIcon *op_icon)
+static void ui_but_extra_operator_icon_apply(bContext *C, uiBut *but, uiButExtraOpIcon *op_icon)
{
- if (ui_afterfunc_check(but->block, but)) {
- uiAfterFunc *after = ui_afterfunc_new();
-
- after->optype = op_icon->optype_params->optype;
- after->opcontext = op_icon->optype_params->opcontext;
- after->opptr = op_icon->optype_params->opptr;
-
- if (but->context) {
- after->context = CTX_store_copy(but->context);
- }
-
- /* Ownership moved, don't let the UI code free it. */
- op_icon->optype_params->opptr = NULL;
+ if (but->active->interactive) {
+ ui_apply_but(C, but->block, but, but->active, true);
}
-}
-
-static void ui_but_extra_operator_icon_apply(bContext *C,
- uiBut *but,
- uiHandleButtonData *data,
- uiButExtraOpIcon *op_icon)
-{
button_activate_state(C, but, BUTTON_STATE_EXIT);
- ui_apply_but(C, but->block, but, data, true);
-
- data->postbut = but;
- data->posttype = BUTTON_ACTIVATE_OVER;
- /* Leave undo up to the operator. */
- data->skip_undo_push = true;
-
- ui_but_extra_operator_icon_apply_func(but, op_icon);
+ WM_operator_name_call_ptr(C,
+ op_icon->optype_params->optype,
+ op_icon->optype_params->opcontext,
+ op_icon->optype_params->opptr);
/* Force recreation of extra operator icons (pseudo update). */
ui_but_extra_operator_icons_free(but);
@@ -4250,7 +4224,7 @@ static bool ui_do_but_extra_operator_icon(bContext *C,
ED_region_tag_redraw(data->region);
button_tooltip_timer_reset(C, but);
- ui_but_extra_operator_icon_apply(C, but, data, op_icon);
+ ui_but_extra_operator_icon_apply(C, but, op_icon);
/* Note: 'but', 'data' may now be freed, don't access. */
return true;
@@ -7885,10 +7859,7 @@ static ARegion *ui_but_tooltip_init(
uiBut *but = UI_region_active_but_get(region);
*r_exit_on_event = false;
if (but) {
- uiButExtraOpIcon *extra_icon = ui_but_extra_operator_icon_mouse_over_get(
- but, but->active, CTX_wm_window(C)->eventstate);
-
- return UI_tooltip_create_from_button_or_extra_icon(C, region, but, extra_icon, is_label);
+ return UI_tooltip_create_from_button(C, region, but, is_label);
}
return NULL;
}
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index 2995cff8ed5..e5aa0665a16 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -1521,7 +1521,6 @@ static int edittranslation_exec(bContext *C, wmOperator *op)
UI_but_string_info_get(C,
but,
- NULL,
&but_label,
&rna_label,
&enum_label,
diff --git a/source/blender/editors/interface/interface_region_tooltip.c b/source/blender/editors/interface/interface_region_tooltip.c
index d88e4283553..2bf63955855 100644
--- a/source/blender/editors/interface/interface_region_tooltip.c
+++ b/source/blender/editors/interface/interface_region_tooltip.c
@@ -531,7 +531,7 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
{
uiStringInfo op_keymap = {BUT_GET_OP_KEYMAP, NULL};
- UI_but_string_info_get(C, but, NULL, &op_keymap, NULL);
+ UI_but_string_info_get(C, but, &op_keymap, NULL);
shortcut = op_keymap.strinfo;
}
@@ -761,9 +761,7 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
return data;
}
-static uiTooltipData *ui_tooltip_data_from_button(bContext *C,
- uiBut *but,
- uiButExtraOpIcon *extra_icon)
+static uiTooltipData *ui_tooltip_data_from_button(bContext *C, uiBut *but)
{
uiStringInfo but_label = {BUT_GET_LABEL, NULL};
uiStringInfo but_tip = {BUT_GET_TIP, NULL};
@@ -776,29 +774,20 @@ static uiTooltipData *ui_tooltip_data_from_button(bContext *C,
char buf[512];
- wmOperatorType *extra_icon_optype = UI_but_extra_operator_icon_optype_get(extra_icon);
- wmOperatorType *optype = extra_icon ? extra_icon_optype : but->optype;
-
/* create tooltip data */
uiTooltipData *data = MEM_callocN(sizeof(uiTooltipData), "uiTooltipData");
- if (extra_icon) {
- UI_but_string_info_get(C, but, extra_icon, &but_label, &but_tip, &op_keymap, NULL);
- }
- else {
- UI_but_string_info_get(C,
- but,
- NULL,
- &but_label,
- &but_tip,
- &enum_label,
- &enum_tip,
- &op_keymap,
- &prop_keymap,
- &rna_struct,
- &rna_prop,
- NULL);
- }
+ UI_but_string_info_get(C,
+ but,
+ &but_label,
+ &but_tip,
+ &enum_label,
+ &enum_tip,
+ &op_keymap,
+ &prop_keymap,
+ &rna_struct,
+ &rna_prop,
+ NULL);
/* Tip Label (only for buttons not already showing the label).
* Check prefix instead of comparing because the button may include the shortcut. */
@@ -931,16 +920,15 @@ static uiTooltipData *ui_tooltip_data_from_button(bContext *C,
}
}
}
- else if (optype) {
- PointerRNA *opptr = extra_icon_optype ?
- UI_but_extra_operator_icon_opptr_get(extra_icon) :
- UI_but_operator_ptr_get(
- but); /* allocated when needed, the button owns it */
+ else if (but->optype) {
+ PointerRNA *opptr;
+ char *str;
+ opptr = UI_but_operator_ptr_get(but); /* allocated when needed, the button owns it */
/* so the context is passed to fieldf functions (some py fieldf functions use it) */
WM_operator_properties_sanitize(opptr, false);
- char *str = ui_tooltip_text_python_from_op(C, optype, opptr);
+ str = ui_tooltip_text_python_from_op(C, but->optype, opptr);
/* operator info */
if (U.flag & USER_TOOLTIPS_PYTHON) {
@@ -967,7 +955,7 @@ static uiTooltipData *ui_tooltip_data_from_button(bContext *C,
disabled_msg = CTX_wm_operator_poll_msg_get(C);
}
/* alternatively, buttons can store some reasoning too */
- if (!disabled_msg && but->disabled_info) {
+ else if (but->disabled_info) {
disabled_msg = TIP_(but->disabled_info);
}
@@ -1405,8 +1393,11 @@ static ARegion *ui_tooltip_create_with_data(bContext *C,
/** \name ToolTip Public API
* \{ */
-ARegion *UI_tooltip_create_from_button_or_extra_icon(
- bContext *C, ARegion *butregion, uiBut *but, uiButExtraOpIcon *extra_icon, bool is_label)
+/**
+ * \param is_label: When true, show a small tip that only shows the name,
+ * otherwise show the full tooltip.
+ */
+ARegion *UI_tooltip_create_from_button(bContext *C, ARegion *butregion, uiBut *but, bool is_label)
{
wmWindow *win = CTX_wm_window(C);
/* aspect values that shrink text are likely unreadable */
@@ -1423,7 +1414,7 @@ ARegion *UI_tooltip_create_from_button_or_extra_icon(
}
if (data == NULL) {
- data = ui_tooltip_data_from_button(C, but, extra_icon);
+ data = ui_tooltip_data_from_button(C, but);
}
if (data == NULL) {
@@ -1461,15 +1452,6 @@ ARegion *UI_tooltip_create_from_button_or_extra_icon(
return region;
}
-/**
- * \param is_label: When true, show a small tip that only shows the name,
- * otherwise show the full tooltip.
- */
-ARegion *UI_tooltip_create_from_button(bContext *C, ARegion *butregion, uiBut *but, bool is_label)
-{
- return UI_tooltip_create_from_button_or_extra_icon(C, butregion, but, NULL, is_label);
-}
-
ARegion *UI_tooltip_create_from_gizmo(bContext *C, wmGizmo *gz)
{
wmWindow *win = CTX_wm_window(C);
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index e9a6809f170..003bb110baf 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -102,16 +102,9 @@
// #define USE_OP_RESET_BUT
/* defines for templateID/TemplateSearch */
-#define TEMPLATE_SEARCH_TEXTBUT_WIDTH (UI_UNIT_X * 8)
+#define TEMPLATE_SEARCH_TEXTBUT_WIDTH (UI_UNIT_X * 6)
#define TEMPLATE_SEARCH_TEXTBUT_HEIGHT UI_UNIT_Y
-/* Add "Make Single User" button to templateID. Users can just manually duplicate an ID, it's
- * unclear what the use-case of this specific button is. So for now disabling it, we can bring it
- * back or remove it later.
- * - Julian
- */
-//#define USE_TEMPLATE_ID_MAKE_SINGLE_USER
-
void UI_template_fix_linking(void)
{
}
@@ -315,12 +308,6 @@ typedef struct TemplateID {
ListBase *idlb;
short idcode;
-
- const char *new_op;
- const char *duplicate_op;
- const char *unlink_op;
- const char *open_op;
-
short filter;
int prv_rows, prv_cols;
bool preview;
@@ -577,64 +564,80 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
memset(&idptr, 0, sizeof(idptr));
RNA_property_pointer_set(&template_ui->ptr, template_ui->prop, idptr, NULL);
RNA_property_update(C, &template_ui->ptr, template_ui->prop);
+
+ if (id && CTX_wm_window(C)->eventstate->shift) {
+ /* only way to force-remove data (on save) */
+ id_us_clear_real(id);
+ id_fake_user_clear(id);
+ id->us = 0;
+ undo_push_label = "Delete Data-Block";
+ }
+
break;
- case UI_ID_MAKE_LOCAL:
+ case UI_ID_FAKE_USER:
if (id) {
- Main *bmain = CTX_data_main(C);
- if (BKE_lib_id_make_local(bmain, id, false, 0)) {
- BKE_main_id_clear_newpoins(bmain);
-
- /* reassign to get get proper updates/notifiers */
- idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop);
- RNA_property_pointer_set(&template_ui->ptr, template_ui->prop, idptr, NULL);
- RNA_property_update(C, &template_ui->ptr, template_ui->prop);
- undo_push_label = "Make Local";
+ if (id->flag & LIB_FAKEUSER) {
+ id_us_plus(id);
+ }
+ else {
+ id_us_min(id);
}
+ undo_push_label = "Fake User";
+ }
+ else {
+ return;
}
break;
- case UI_ID_LIB_OVERRIDE_ADD:
- if (id && ID_IS_OVERRIDABLE_LIBRARY(id)) {
+ case UI_ID_LOCAL:
+ if (id) {
Main *bmain = CTX_data_main(C);
- /* Only remap that specific ID usage to overriding local data-block. */
- ID *override_id = BKE_lib_override_library_create_from_id(bmain, id, false);
- if (override_id != NULL) {
- BKE_main_id_clear_newpoins(bmain);
-
- if (GS(override_id->name) == ID_OB) {
- Scene *scene = CTX_data_scene(C);
- if (!BKE_collection_has_object_recursive(scene->master_collection,
- (Object *)override_id)) {
- BKE_collection_object_add_from(bmain, scene, (Object *)id, (Object *)override_id);
+ if (CTX_wm_window(C)->eventstate->shift) {
+ if (ID_IS_OVERRIDABLE_LIBRARY(id)) {
+ /* Only remap that specific ID usage to overriding local data-block. */
+ ID *override_id = BKE_lib_override_library_create_from_id(bmain, id, false);
+ if (override_id != NULL) {
+ BKE_main_id_clear_newpoins(bmain);
+
+ if (GS(override_id->name) == ID_OB) {
+ Scene *scene = CTX_data_scene(C);
+ if (!BKE_collection_has_object_recursive(scene->master_collection,
+ (Object *)override_id)) {
+ BKE_collection_object_add_from(
+ bmain, scene, (Object *)id, (Object *)override_id);
+ }
+ }
+
+ /* Assign new pointer, takes care of updates/notifiers */
+ RNA_id_pointer_create(override_id, &idptr);
}
+ undo_push_label = "Make Library Override";
}
+ }
+ else {
+ if (BKE_lib_id_make_local(bmain, id, false, 0)) {
+ BKE_main_id_clear_newpoins(bmain);
- /* Assign new pointer, takes care of updates/notifiers */
- RNA_id_pointer_create(override_id, &idptr);
+ /* reassign to get get proper updates/notifiers */
+ idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop);
+ undo_push_label = "Make Local";
+ }
+ }
+ if (undo_push_label != NULL) {
+ RNA_property_pointer_set(&template_ui->ptr, template_ui->prop, idptr, NULL);
+ RNA_property_update(C, &template_ui->ptr, template_ui->prop);
}
- /* reassign to get get proper updates/notifiers */
- RNA_property_pointer_set(&template_ui->ptr, template_ui->prop, idptr, NULL);
- RNA_property_update(C, &template_ui->ptr, template_ui->prop);
- undo_push_label = "Make Library Override";
- }
- break;
- case UI_ID_LIB_OVERRIDE_RESET:
- if (id && ID_IS_OVERRIDE_LIBRARY_REAL(id)) {
- Main *bmain = CTX_data_main(C);
- BKE_lib_override_library_id_reset(bmain, id);
- undo_push_label = "Reset Library Override";
}
break;
- case UI_ID_LIB_OVERRIDE_REMOVE:
+ case UI_ID_OVERRIDE:
if (id && ID_IS_OVERRIDE_LIBRARY(id)) {
BKE_lib_override_library_free(&id->override_library, true);
/* reassign to get get proper updates/notifiers */
idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop);
RNA_property_pointer_set(&template_ui->ptr, template_ui->prop, idptr, NULL);
RNA_property_update(C, &template_ui->ptr, template_ui->prop);
- undo_push_label = "Remove Library Override";
+ undo_push_label = "Override Data-Block";
}
break;
-#ifdef USE_TEMPLATE_ID_MAKE_SINGLE_USER
case UI_ID_ALONE:
if (id) {
const bool do_scene_obj = ((GS(id->name) == ID_OB) &&
@@ -656,7 +659,6 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
undo_push_label = "Make Single User";
}
break;
-#endif
#if 0
case UI_ID_AUTO_NAME:
break;
@@ -770,222 +772,17 @@ static const char *template_id_context(StructRNA *type)
# define template_id_context(type) 0
#endif
-static void template_id_linked_operation_button(
- uiBlock *block, Main *bmain, ID *id, TemplateID *template_ui, int operation)
-{
- BLI_assert(ELEM(operation, UI_ID_MAKE_LOCAL, UI_ID_LIB_OVERRIDE_ADD));
-
- const char *label = (operation == UI_ID_MAKE_LOCAL) ?
- CTX_N_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Make Local") :
- CTX_N_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Add Library Override");
- const char *tip = (operation == UI_ID_MAKE_LOCAL) ?
- N_("Make library linked data-block local to this file") :
- N_("Create a local override of this library linked data-block");
- const BIFIconID icon = (operation == UI_ID_MAKE_LOCAL) ? ICON_BLANK1 :
- ICON_LIBRARY_DATA_OVERRIDE;
-
- uiBut *but = uiDefIconTextBut(block,
- UI_BTYPE_BUT,
- 0,
- icon,
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, label),
- 0,
- 0,
- UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0,
- 0,
- 0,
- 0,
- TIP_(tip));
-
- bool disabled = false;
-
- if (!ID_IS_LINKED(id)) {
- disabled = true;
- but->disabled_info = TIP_("Data-block is not linked");
- }
- else if (id->tag & LIB_TAG_INDIRECT) {
- disabled = true;
- but->disabled_info = TIP_("Indirect library data-block, cannot change");
- }
- else if (!BKE_lib_id_make_local(bmain, id, true /* test */, 0)) {
- disabled = true;
- but->disabled_info = TIP_("Data-blocks of this type cannot be made local");
- }
- else if (!RNA_property_editable_info(
- &template_ui->ptr, template_ui->prop, &but->disabled_info)) {
- disabled = true;
- }
-
- if (disabled) {
- UI_but_flag_enable(but, UI_BUT_DISABLED);
- }
- else {
- UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(operation));
- }
-}
-
-static void template_id_library_overridden_button(uiBlock *block,
- ID *id,
- TemplateID *template_ui,
- int operation)
-{
- BLI_assert(ELEM(operation, UI_ID_LIB_OVERRIDE_RESET, UI_ID_LIB_OVERRIDE_REMOVE) &&
- ID_IS_OVERRIDE_LIBRARY(id));
-
- if (operation == UI_ID_LIB_OVERRIDE_RESET && ID_IS_OVERRIDE_LIBRARY_REAL(id)) {
- uiBut *but = uiDefIconTextBut(
- block,
- UI_BTYPE_BUT,
- 0,
- ICON_BLANK1,
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Reset Library Override"),
- 0,
- 0,
- UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0,
- 0,
- 0,
- 0,
- TIP_("Reset the local override to the state of "
- "the overridden data-block"));
- if (!ID_IS_OVERRIDE_LIBRARY_REAL(id)) {
- but->disabled_info = TIP_("Data-block is a virtual, not a real override");
- UI_but_flag_enable(but, UI_BUT_DISABLED);
- }
- else {
- UI_but_funcN_set(but,
- template_id_cb,
- MEM_dupallocN(template_ui),
- POINTER_FROM_INT(UI_ID_LIB_OVERRIDE_RESET));
- }
- }
- else if (operation == UI_ID_LIB_OVERRIDE_REMOVE) {
- uiBut *but = uiDefIconTextBut(
- block,
- UI_BTYPE_BUT,
- 0,
- ICON_BLANK1,
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Make Local"),
- 0,
- 0,
- UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0,
- 0,
- 0,
- 0,
- TIP_("Remove library override and make the library linked data-block "
- "fully local to this file"));
- UI_but_funcN_set(but,
- template_id_cb,
- MEM_dupallocN(template_ui),
- POINTER_FROM_INT(UI_ID_LIB_OVERRIDE_REMOVE));
- }
-}
-
-#ifdef USE_TEMPLATE_ID_MAKE_SINGLE_USER
-static uiBut *template_id_make_single_user_button(uiBlock *block, ID *id, TemplateID *template_ui)
-{
- uiBut *but = uiDefIconTextBut(
- block,
- UI_BTYPE_BUT,
- 0,
- ICON_BLANK1,
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Make Single-User Copy"),
- 0,
- 0,
- UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0,
- 0,
- 0,
- 0,
- TIP_("Duplicate the data-block and assign the newly created copy"));
-
- if (ID_REAL_USERS(id) <= 1) {
- UI_but_flag_enable(but, UI_BUT_DISABLED);
- but->disabled_info = TIP_("Data-block already is a single-user");
- /* No need for further setup. */
- return but;
- }
-
- UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ALONE));
-
- ID *idfrom = template_ui->ptr.owner_id;
- bool disabled = false;
-
- if (!RNA_property_editable_info(&template_ui->ptr, template_ui->prop, &but->disabled_info)) {
- disabled = true;
- }
- if (!BKE_id_copy_is_allowed(id)) {
- but->disabled_info = TIP_("Data-blocks of this type cannot be copied");
- disabled = true;
- }
- /* object in editmode - don't change data */
- if (idfrom && GS(idfrom->name) == ID_OB && (((Object *)idfrom)->mode & OB_MODE_EDIT)) {
- but->disabled_info = TIP_("Cannot change object data in Edit Mode");
- disabled = true;
- }
-
- if (disabled) {
- UI_but_flag_enable(but, UI_BUT_DISABLED);
- }
-
- return but;
-}
-#endif
-
-static void template_id_use_fake_user_button(uiBlock *block, PointerRNA *idptr)
-{
- const bool use_fake_user = ID_FAKE_USERS(idptr->data) > 0;
- uiBut *but = uiDefIconTextButR(
- block,
- UI_BTYPE_ICON_TOGGLE,
- 0,
- ICON_FAKE_USER_OFF,
- use_fake_user ? CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Remove Fake User") :
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Add Fake User"),
- 0,
- 0,
- UI_UNIT_X,
- UI_UNIT_Y,
- idptr,
- "use_fake_user",
- -1,
- 0,
- 0,
- -1,
- -1,
- TIP_("When set, ensures the data-block is kept when reloading the file, even if not used at "
- "all"));
-
- if ((ELEM(GS(((ID *)idptr->data)->name), ID_GR, ID_SCE, ID_SCR, ID_TXT, ID_OB, ID_WS))) {
- but->disabled_info = TIP_("Data-block type does not support fake user");
- UI_but_flag_enable(but, UI_BUT_DISABLED);
- }
-}
-
-enum TemplateIDCreateType {
- TEMPLATE_ID_CREATE_NEW,
- TEMPLATE_ID_CREATE_DUPLICATE,
-};
-
-static uiBut *template_id_new_button(uiBlock *block,
- const ID *id,
- TemplateID *template_ui,
- enum TemplateIDCreateType create_type,
- StructRNA *type,
- const bool id_open,
- const bool use_tab_but,
- int but_height)
+static uiBut *template_id_def_new_but(uiBlock *block,
+ const ID *id,
+ const TemplateID *template_ui,
+ StructRNA *type,
+ const char *const newop,
+ const bool editable,
+ const bool id_open,
+ const bool use_tab_but,
+ int but_height)
{
+ ID *idfrom = template_ui->ptr.owner_id;
uiBut *but;
const int w = id ? UI_UNIT_X : id_open ? UI_UNIT_X * 3 : UI_UNIT_X * 6;
const int but_type = use_tab_but ? UI_BTYPE_TAB : UI_BTYPE_BUT;
@@ -1023,389 +820,54 @@ static uiBut *template_id_new_button(uiBlock *block,
BLT_I18NCONTEXT_ID_POINTCLOUD,
BLT_I18NCONTEXT_ID_VOLUME,
BLT_I18NCONTEXT_ID_SIMULATION, );
- BLT_I18N_MSGID_MULTI_CTXT("Duplicate",
- BLT_I18NCONTEXT_DEFAULT,
- BLT_I18NCONTEXT_ID_SCENE,
- BLT_I18NCONTEXT_ID_OBJECT,
- BLT_I18NCONTEXT_ID_MESH,
- BLT_I18NCONTEXT_ID_CURVE,
- BLT_I18NCONTEXT_ID_METABALL,
- BLT_I18NCONTEXT_ID_MATERIAL,
- BLT_I18NCONTEXT_ID_TEXTURE,
- BLT_I18NCONTEXT_ID_IMAGE,
- BLT_I18NCONTEXT_ID_LATTICE,
- BLT_I18NCONTEXT_ID_LIGHT,
- BLT_I18NCONTEXT_ID_CAMERA,
- BLT_I18NCONTEXT_ID_WORLD,
- BLT_I18NCONTEXT_ID_SCREEN,
- BLT_I18NCONTEXT_ID_TEXT, );
- BLT_I18N_MSGID_MULTI_CTXT("Duplicate",
- BLT_I18NCONTEXT_ID_SPEAKER,
- BLT_I18NCONTEXT_ID_SOUND,
- BLT_I18NCONTEXT_ID_ARMATURE,
- BLT_I18NCONTEXT_ID_ACTION,
- BLT_I18NCONTEXT_ID_NODETREE,
- BLT_I18NCONTEXT_ID_BRUSH,
- BLT_I18NCONTEXT_ID_PARTICLESETTINGS,
- BLT_I18NCONTEXT_ID_GPENCIL,
- BLT_I18NCONTEXT_ID_FREESTYLELINESTYLE,
- BLT_I18NCONTEXT_ID_WORKSPACE,
- BLT_I18NCONTEXT_ID_LIGHTPROBE,
- BLT_I18NCONTEXT_ID_HAIR,
- BLT_I18NCONTEXT_ID_POINTCLOUD,
- BLT_I18NCONTEXT_ID_VOLUME,
- BLT_I18NCONTEXT_ID_SIMULATION, );
/* Note: BLT_I18N_MSGID_MULTI_CTXT takes a maximum number of parameters,
* check the definition to see if a new call must be added when the limit
* is exceeded. */
- const char *text;
- const char *op;
- BIFIconID icon;
-
- switch (create_type) {
- case TEMPLATE_ID_CREATE_NEW:
- icon = ICON_ADD;
- text = CTX_IFACE_(template_id_context(type), "New");
- op = template_ui->new_op;
- break;
- case TEMPLATE_ID_CREATE_DUPLICATE:
- icon = ICON_DUPLICATE;
- text = CTX_IFACE_(template_id_context(type), "Duplicate");
- op = template_ui->duplicate_op;
- break;
- }
-
- const bool icon_only = use_tab_but;
- if (icon_only) {
- text = "";
- }
-
- if (op) {
- but = uiDefIconTextButO(
- block, but_type, op, WM_OP_INVOKE_DEFAULT, icon, text, 0, 0, w, but_height, NULL);
- UI_but_funcN_set(
- but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ADD_NEW));
-
- if (!RNA_property_editable_info(&template_ui->ptr, template_ui->prop, &but->disabled_info)) {
- UI_but_flag_enable(but, UI_BUT_DISABLED);
- }
- }
- else {
- but = uiDefIconTextBut(block,
- but_type,
- 0,
- icon,
- text,
- 0,
- 0,
- w,
- but_height,
- NULL,
- 0,
- 0,
- 0,
- 0,
- TIP_("Create a new data-block"));
- but->disabled_info = TIP_("Creating a new data-block is not supported here");
- UI_but_flag_enable(but, UI_BUT_DISABLED);
- }
- if (icon_only) {
- UI_but_drawflag_disable(but, UI_BUT_ICON_LEFT);
- }
-
-#ifndef WITH_INTERNATIONAL
- UNUSED_VARS(type);
-#endif
-
- return but;
-}
-
-static void template_id_unlink_button(uiBlock *block,
- TemplateID *template_ui,
- bool hide_if_disabled)
-{
- const char *disable_info;
- const bool is_menu = ui_block_is_menu(block);
- const bool editable = RNA_property_editable_info(
- &template_ui->ptr, template_ui->prop, &disable_info);
- /* allow unlink if 'unlinkop' is passed, even when 'PROP_NEVER_UNLINK' is set */
- uiBut *but = NULL;
-
- if (hide_if_disabled && !editable) {
- /* Add no button. */
- }
- else if (template_ui->unlink_op) {
- but = uiDefIconTextButO(block,
- UI_BTYPE_BUT,
- template_ui->unlink_op,
- WM_OP_INVOKE_DEFAULT,
- ICON_X,
- is_menu ? NULL : "",
- 0,
- 0,
- UI_UNIT_X,
- UI_UNIT_Y,
- NULL);
- /* so we can access the template from operators, font unlinking needs this */
- UI_but_funcN_set(but, NULL, MEM_dupallocN(template_ui), NULL);
- }
- else {
- const bool never_unlink = RNA_property_flag(template_ui->prop) &
- (PROP_NEVER_UNLINK | PROP_NEVER_NULL);
-
- if (!never_unlink || !hide_if_disabled) {
- but = uiDefIconTextBut(block,
- UI_BTYPE_BUT,
- 0,
- ICON_X,
- is_menu ? CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Unlink") : "",
- 0,
- 0,
- UI_UNIT_X,
- UI_UNIT_Y,
- NULL,
- 0,
- 0,
- 0,
- 0,
- TIP_("Remove this usage of the data-block"));
- if (!never_unlink) {
- UI_but_funcN_set(
- but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_DELETE));
- }
- if (!is_menu) {
- UI_but_drawflag_disable(but, UI_BUT_ICON_LEFT);
- }
- }
-
- if (but && never_unlink) {
- but->disabled_info = TIP_("Property must never be in an unlinked state");
- UI_but_flag_enable(but, UI_BUT_DISABLED);
- }
- }
-
- if (but) {
- if (!editable) {
- but->disabled_info = disable_info;
- UI_but_flag_enable(but, UI_BUT_DISABLED);
- }
- }
-}
-
-static void template_id_open_button(uiBlock *block,
- ID *id,
- TemplateID *template_ui,
- const bool compact)
-{
- const bool is_menu = ui_block_is_menu(block);
- const int w = compact ? UI_UNIT_X * 3 : UI_UNIT_X * 6;
- char text[UI_MAX_NAME_STR] = "";
- const bool icon_only = !is_menu && id;
- uiBut *but;
-
- if (!icon_only) {
- BLI_snprintf(text,
- sizeof(text),
- "%s%s",
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Open"),
- is_menu ? "..." : "");
- }
-
- if (template_ui->open_op) {
+ if (newop) {
but = uiDefIconTextButO(block,
- UI_BTYPE_BUT,
- template_ui->open_op,
+ but_type,
+ newop,
WM_OP_INVOKE_DEFAULT,
- ICON_FILEBROWSER,
- text,
+ (id && !use_tab_but) ? ICON_DUPLICATE : ICON_ADD,
+ (id) ? "" : CTX_IFACE_(template_id_context(type), "New"),
0,
0,
w,
- UI_UNIT_Y,
+ but_height,
NULL);
UI_but_funcN_set(
- but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_OPEN));
+ but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ADD_NEW));
}
else {
but = uiDefIconTextBut(block,
- UI_BTYPE_BUT,
+ but_type,
0,
- ICON_FILEBROWSER,
- text,
+ (id && !use_tab_but) ? ICON_DUPLICATE : ICON_ADD,
+ (id) ? "" : CTX_IFACE_(template_id_context(type), "New"),
0,
0,
w,
- UI_UNIT_Y,
+ but_height,
NULL,
0,
0,
0,
0,
NULL);
- but->disabled_info = TIP_("Browsing for a new data-block is not supported here");
- UI_but_flag_enable(but, UI_BUT_DISABLED);
+ UI_but_funcN_set(
+ but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ADD_NEW));
}
- if (!RNA_property_editable_info(&template_ui->ptr, template_ui->prop, &but->disabled_info)) {
+ if ((idfrom && idfrom->lib) || !editable) {
UI_but_flag_enable(but, UI_BUT_DISABLED);
}
-}
-
-static void template_id_unpack_button(uiBlock *block, ID *id)
-{
- wmOperatorType *optype = WM_operatortype_find("FILE_OT_unpack_item", false);
- uiBut *but;
-
- but = uiDefIconTextButO_ptr(block,
- UI_BTYPE_BUT,
- optype,
- WM_OP_INVOKE_REGION_WIN,
- ICON_PACKAGE,
- NULL,
- 0,
- 0,
- UI_UNIT_X,
- UI_UNIT_Y,
- NULL);
-
- if (!BKE_packedfile_id_check(id)) {
- but->disabled_info = TIP_("File is not packed");
- UI_but_flag_enable(but, UI_BUT_DISABLED);
- }
- UI_but_operator_ptr_get(but);
-
- RNA_string_set(but->opptr, "id_name", id->name + 2);
- RNA_int_set(but->opptr, "id_type", GS(id->name));
-}
-
-static void template_id_user_count_label(uiLayout *layout, const ID *id)
-{
- char numstr[UI_MAX_NAME_STR];
- BLI_snprintf(numstr,
- sizeof(numstr),
- "%d %s",
- ID_REAL_USERS(id),
- ID_REAL_USERS(id) > 1 ? IFACE_("Users") : IFACE_("User"));
- uiItemL(layout, numstr, ICON_NONE);
-}
-static void template_id_menu(bContext *C, uiLayout *layout, void *arg)
-{
- /* Button that spawned the menu. */
- const uiBut *menu_parent_but = arg;
- TemplateID *template_ui = menu_parent_but->func_argN;
- PointerRNA idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop);
- ID *id = idptr.data;
- uiBlock *block = uiLayoutGetBlock(layout);
-
- BLI_assert(id);
-
- template_id_new_button(
- block, id, template_ui, TEMPLATE_ID_CREATE_NEW, idptr.type, false, false, UI_UNIT_X);
- template_id_new_button(
- block, id, template_ui, TEMPLATE_ID_CREATE_DUPLICATE, idptr.type, false, false, UI_UNIT_X);
- template_id_unlink_button(block, template_ui, false);
-
-#ifdef USE_TEMPLATE_ID_MAKE_SINGLE_USER
- template_id_make_single_user_button(block, id, template_ui);
+#ifndef WITH_INTERNATIONAL
+ UNUSED_VARS(type);
#endif
- template_id_use_fake_user_button(block, &idptr);
-
- if (template_ui->open_op || BKE_packedfile_id_check(id)) {
- uiItemS(layout);
-
- template_id_open_button(block, id, template_ui, false);
- template_id_unpack_button(block, id);
- }
- /* Library operators. */
- if (ID_IS_OVERRIDE_LIBRARY(id)) {
- uiItemS(layout);
-
- template_id_library_overridden_button(block, id, template_ui, UI_ID_LIB_OVERRIDE_RESET);
- template_id_library_overridden_button(block, id, template_ui, UI_ID_LIB_OVERRIDE_REMOVE);
- }
- else if (ID_IS_LINKED(id)) {
- uiItemS(layout);
-
- Main *bmain = CTX_data_main(C);
- template_id_linked_operation_button(block, bmain, id, template_ui, UI_ID_MAKE_LOCAL);
- template_id_linked_operation_button(block, bmain, id, template_ui, UI_ID_LIB_OVERRIDE_ADD);
- }
-
- uiItemS(layout);
- template_id_user_count_label(layout, id);
-}
-
-static void template_id_name_button(
- uiBlock *block, StructRNA *type, TemplateID *template_ui, int flag, const bool hide_extras)
-{
- PointerRNA idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop);
- ID *id = idptr.data;
- const BIFIconID lib_icon = UI_icon_from_library(id);
-
- char name[UI_MAX_NAME_STR] = "";
- uiBut *but = uiDefIconTextButR(block,
- UI_BTYPE_TEXT,
- 0,
- lib_icon,
- name,
- 0,
- 0,
- TEMPLATE_SEARCH_TEXTBUT_WIDTH,
- TEMPLATE_SEARCH_TEXTBUT_HEIGHT,
- &idptr,
- "name",
- -1,
- 0,
- 0,
- 0,
- 0,
- RNA_struct_ui_description(type));
- /* Note: Also needed for the extra icons below (their operators access the TemplateID). */
- UI_but_funcN_set(
- but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_RENAME));
-
- const bool user_alert = (id->us <= 0);
- if (user_alert) {
- UI_but_flag_enable(but, UI_BUT_REDALERT);
- }
-
- if (hide_extras) {
- return;
- }
-
- if (template_ui->duplicate_op && (flag & UI_ID_ADD_NEW)) {
- UI_but_extra_operator_icon_add(
- but, template_ui->duplicate_op, WM_OP_INVOKE_DEFAULT, ICON_DUPLICATE);
- }
-
- if (template_ui->open_op && (flag & UI_ID_OPEN)) {
- UI_but_extra_operator_icon_add(
- but, template_ui->open_op, WM_OP_INVOKE_DEFAULT, ICON_FILEBROWSER);
- }
-
- if (id && (flag & UI_ID_DELETE)) {
- const bool never_unlink = RNA_property_flag(template_ui->prop) &
- (PROP_NEVER_UNLINK | PROP_NEVER_NULL);
- if (template_ui->unlink_op) {
- UI_but_extra_operator_icon_add(but, template_ui->unlink_op, WM_OP_INVOKE_DEFAULT, ICON_X);
- }
- else if (!never_unlink) {
- UI_but_extra_operator_icon_add(but, "ED_OT_lib_id_unlink", WM_OP_INVOKE_DEFAULT, ICON_X);
- }
- }
-
- /* Disable fake user icon for now, only have it in the menu. */
- const bool add_extra_fake_user_icon = false;
- if (add_extra_fake_user_icon && id->lib == NULL &&
- !(ELEM(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_TXT, ID_OB, ID_WS))) {
- UI_but_extra_operator_icon_add(but,
- "ED_OT_lib_id_fake_user_toggle",
- WM_OP_INVOKE_DEFAULT,
- ID_FAKE_USERS(id) ? ICON_FAKE_USER_ON : ICON_FAKE_USER_OFF);
- }
+ return but;
}
static void template_ID(const bContext *C,
@@ -1413,6 +875,9 @@ static void template_ID(const bContext *C,
TemplateID *template_ui,
StructRNA *type,
int flag,
+ const char *newop,
+ const char *openop,
+ const char *unlinkop,
const char *text,
const bool live_icon,
const bool hide_buttons)
@@ -1420,12 +885,15 @@ static void template_ID(const bContext *C,
uiBut *but;
uiBlock *block;
PointerRNA idptr;
- ID *id;
+ // ListBase *lb; // UNUSED
+ ID *id, *idfrom;
const bool editable = RNA_property_editable(&template_ui->ptr, template_ui->prop);
const bool use_previews = template_ui->preview = (flag & UI_ID_PREVIEWS) != 0;
idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop);
id = idptr.data;
+ idfrom = template_ui->ptr.owner_id;
+ // lb = template_ui->idlb;
/* Allow opertators to take the ID from context. */
uiLayoutSetContextPointer(layout, "id", &idptr);
@@ -1458,39 +926,277 @@ static void template_ID(const bContext *C,
/* text button with name */
if (id) {
- template_id_name_button(block, type, template_ui, flag, hide_buttons);
- }
- /* If no ID is set, show a "new" button instead of a text button. */
- else if ((flag & UI_ID_ADD_NEW) && (hide_buttons == false)) {
- template_id_new_button(
- block, id, template_ui, TEMPLATE_ID_CREATE_NEW, type, flag & UI_ID_OPEN, false, UI_UNIT_X);
- }
+ char name[UI_MAX_NAME_STR];
+ const bool user_alert = (id->us <= 0);
- if ((flag & UI_ID_OPEN) && !id) {
- template_id_open_button(block, id, template_ui, flag & UI_ID_ADD_NEW);
- }
-
- if (template_ui->idcode == ID_TE) {
- uiTemplateTextureShow(layout, C, &template_ui->ptr, template_ui->prop);
- }
+ // text_idbutton(id, name);
+ name[0] = '\0';
+ but = uiDefButR(block,
+ UI_BTYPE_TEXT,
+ 0,
+ name,
+ 0,
+ 0,
+ TEMPLATE_SEARCH_TEXTBUT_WIDTH,
+ TEMPLATE_SEARCH_TEXTBUT_HEIGHT,
+ &idptr,
+ "name",
+ -1,
+ 0,
+ 0,
+ -1,
+ -1,
+ RNA_struct_ui_description(type));
+ UI_but_funcN_set(
+ but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_RENAME));
+ if (user_alert) {
+ UI_but_flag_enable(but, UI_BUT_REDALERT);
+ }
- if (id && !hide_buttons) {
- /* Additional operations menu ("Make Local", overrides, etc). */
- but = uiDefIconMenuBut(block,
- template_id_menu,
+ if (id->lib) {
+ if (id->tag & LIB_TAG_INDIRECT) {
+ but = uiDefIconBut(block,
+ UI_BTYPE_BUT,
+ 0,
+ ICON_LIBRARY_DATA_INDIRECT,
+ 0,
+ 0,
+ UI_UNIT_X,
+ UI_UNIT_Y,
NULL,
- ICON_DOWNARROW_HLT,
+ 0,
+ 0,
+ 0,
+ 0,
+ TIP_("Indirect library data-block, cannot change"));
+ UI_but_flag_enable(but, UI_BUT_DISABLED);
+ }
+ else {
+ const bool disabled = (!BKE_lib_id_make_local(CTX_data_main(C), id, true /* test */, 0) ||
+ (idfrom && idfrom->lib));
+ but = uiDefIconBut(block,
+ UI_BTYPE_BUT,
+ 0,
+ ICON_LIBRARY_DATA_DIRECT,
0,
0,
UI_UNIT_X,
UI_UNIT_Y,
- TIP_("Show more operations for the selected data-block"));
- UI_but_type_set_menu_from_pulldown(but);
- /* Same hack as ui_item_menu() to allow allocated arg. */
- but->poin = (char *)but;
- but->func_argN = MEM_dupallocN(template_ui);
+ NULL,
+ 0,
+ 0,
+ 0,
+ 0,
+ TIP_("Direct linked library data-block, click to make local, "
+ "Shift + Click to create a library override"));
+ if (disabled) {
+ UI_but_flag_enable(but, UI_BUT_DISABLED);
+ }
+ else {
+ UI_but_funcN_set(
+ but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_LOCAL));
+ }
+ }
+ }
+ else if (ID_IS_OVERRIDE_LIBRARY(id)) {
+ but = uiDefIconBut(block,
+ UI_BTYPE_BUT,
+ 0,
+ ICON_LIBRARY_DATA_OVERRIDE,
+ 0,
+ 0,
+ UI_UNIT_X,
+ UI_UNIT_Y,
+ NULL,
+ 0,
+ 0,
+ 0,
+ 0,
+ TIP_("Library override of linked data-block, click to make fully local"));
+ UI_but_funcN_set(
+ but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_OVERRIDE));
+ }
+
+ if ((ID_REAL_USERS(id) > 1) && (hide_buttons == false)) {
+ char numstr[32];
+ short numstr_len;
+
+ numstr_len = BLI_snprintf(numstr, sizeof(numstr), "%d", ID_REAL_USERS(id));
+
+ but = uiDefBut(
+ block,
+ UI_BTYPE_BUT,
+ 0,
+ numstr,
+ 0,
+ 0,
+ numstr_len * 0.2f * UI_UNIT_X + UI_UNIT_X,
+ UI_UNIT_Y,
+ NULL,
+ 0,
+ 0,
+ 0,
+ 0,
+ TIP_("Display number of users of this data (click to make a single-user copy)"));
+ but->flag |= UI_BUT_UNDO;
+
+ UI_but_funcN_set(
+ but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ALONE));
+ if ((!BKE_id_copy_is_allowed(id)) || (idfrom && idfrom->lib) || (!editable) ||
+ /* object in editmode - don't change data */
+ (idfrom && GS(idfrom->name) == ID_OB && (((Object *)idfrom)->mode & OB_MODE_EDIT))) {
+ UI_but_flag_enable(but, UI_BUT_DISABLED);
+ }
+ }
+
+ if (user_alert) {
+ UI_but_flag_enable(but, UI_BUT_REDALERT);
+ }
+
+ if (id->lib == NULL && !(ELEM(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_TXT, ID_OB, ID_WS)) &&
+ (hide_buttons == false)) {
+ uiDefIconButR(block,
+ UI_BTYPE_ICON_TOGGLE,
+ 0,
+ ICON_FAKE_USER_OFF,
+ 0,
+ 0,
+ UI_UNIT_X,
+ UI_UNIT_Y,
+ &idptr,
+ "use_fake_user",
+ -1,
+ 0,
+ 0,
+ -1,
+ -1,
+ NULL);
+ }
+ }
+
+ if ((flag & UI_ID_ADD_NEW) && (hide_buttons == false)) {
+ template_id_def_new_but(
+ block, id, template_ui, type, newop, editable, flag & UI_ID_OPEN, false, UI_UNIT_X);
+ }
+
+ /* Due to space limit in UI - skip the "open" icon for packed data, and allow to unpack.
+ * Only for images, sound and fonts */
+ if (id && BKE_packedfile_id_check(id)) {
+ but = uiDefIconButO(block,
+ UI_BTYPE_BUT,
+ "FILE_OT_unpack_item",
+ WM_OP_INVOKE_REGION_WIN,
+ ICON_PACKAGE,
+ 0,
+ 0,
+ UI_UNIT_X,
+ UI_UNIT_Y,
+ TIP_("Packed File, click to unpack"));
+ UI_but_operator_ptr_get(but);
+
+ RNA_string_set(but->opptr, "id_name", id->name + 2);
+ RNA_int_set(but->opptr, "id_type", GS(id->name));
+ }
+ else if (flag & UI_ID_OPEN) {
+ const int w = id ? UI_UNIT_X : (flag & UI_ID_ADD_NEW) ? UI_UNIT_X * 3 : UI_UNIT_X * 6;
+
+ if (openop) {
+ but = uiDefIconTextButO(block,
+ UI_BTYPE_BUT,
+ openop,
+ WM_OP_INVOKE_DEFAULT,
+ ICON_FILEBROWSER,
+ (id) ? "" : IFACE_("Open"),
+ 0,
+ 0,
+ w,
+ UI_UNIT_Y,
+ NULL);
+ UI_but_funcN_set(
+ but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_OPEN));
+ }
+ else {
+ but = uiDefIconTextBut(block,
+ UI_BTYPE_BUT,
+ 0,
+ ICON_FILEBROWSER,
+ (id) ? "" : IFACE_("Open"),
+ 0,
+ 0,
+ w,
+ UI_UNIT_Y,
+ NULL,
+ 0,
+ 0,
+ 0,
+ 0,
+ NULL);
+ UI_but_funcN_set(
+ but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_OPEN));
+ }
+
+ if ((idfrom && idfrom->lib) || !editable) {
+ UI_but_flag_enable(but, UI_BUT_DISABLED);
+ }
+ }
+
+ /* delete button */
+ /* don't use RNA_property_is_unlink here */
+ if (id && (flag & UI_ID_DELETE) && (hide_buttons == false)) {
+ /* allow unlink if 'unlinkop' is passed, even when 'PROP_NEVER_UNLINK' is set */
+ but = NULL;
+
+ if (unlinkop) {
+ but = uiDefIconButO(block,
+ UI_BTYPE_BUT,
+ unlinkop,
+ WM_OP_INVOKE_DEFAULT,
+ ICON_X,
+ 0,
+ 0,
+ UI_UNIT_X,
+ UI_UNIT_Y,
+ NULL);
+ /* so we can access the template from operators, font unlinking needs this */
+ UI_but_funcN_set(but, NULL, MEM_dupallocN(template_ui), NULL);
+ }
+ else {
+ if ((RNA_property_flag(template_ui->prop) & PROP_NEVER_UNLINK) == 0) {
+ but = uiDefIconBut(
+ block,
+ UI_BTYPE_BUT,
+ 0,
+ ICON_X,
+ 0,
+ 0,
+ UI_UNIT_X,
+ UI_UNIT_Y,
+ NULL,
+ 0,
+ 0,
+ 0,
+ 0,
+ TIP_("Unlink data-block "
+ "(Shift + Click to set users to zero, data will then not be saved)"));
+ UI_but_funcN_set(
+ but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_DELETE));
+
+ if (RNA_property_flag(template_ui->prop) & PROP_NEVER_NULL) {
+ UI_but_flag_enable(but, UI_BUT_DISABLED);
+ }
+ }
+ }
+
+ if (but) {
+ if ((idfrom && idfrom->lib) || !editable) {
+ UI_but_flag_enable(but, UI_BUT_DISABLED);
+ }
+ }
}
+ if (template_ui->idcode == ID_TE) {
+ uiTemplateTextureShow(layout, C, &template_ui->ptr, template_ui->prop);
+ }
UI_block_align_end(block);
}
@@ -1509,6 +1215,7 @@ static void template_ID_tabs(const bContext *C,
TemplateID *template,
StructRNA *type,
int flag,
+ const char *newop,
const char *menu)
{
const ARegion *region = CTX_wm_region(C);
@@ -1556,20 +1263,22 @@ static void template_ID_tabs(const bContext *C,
BLI_freelistN(&ordered);
if (flag & UI_ID_ADD_NEW) {
+ const bool editable = RNA_property_editable(&template->ptr, template->prop);
uiBut *but;
if (active_ptr.type) {
type = active_ptr.type;
}
- but = template_id_new_button(block,
- active_ptr.data,
- template,
- TEMPLATE_ID_CREATE_NEW,
- type,
- flag & UI_ID_OPEN,
- true,
- but_height);
+ but = template_id_def_new_but(block,
+ active_ptr.data,
+ template,
+ type,
+ newop,
+ editable,
+ flag & UI_ID_OPEN,
+ true,
+ but_height);
UI_but_drawflag_enable(but, but_align);
}
}
@@ -1579,7 +1288,6 @@ static void ui_template_id(uiLayout *layout,
PointerRNA *ptr,
const char *propname,
const char *newop,
- const char *duplicateop,
const char *openop,
const char *unlinkop,
/* Only respected by tabs (use_tabs). */
@@ -1609,10 +1317,6 @@ static void ui_template_id(uiLayout *layout,
template_ui = MEM_callocN(sizeof(TemplateID), "TemplateID");
template_ui->ptr = *ptr;
template_ui->prop = prop;
- template_ui->new_op = newop;
- template_ui->duplicate_op = duplicateop;
- template_ui->unlink_op = unlinkop;
- template_ui->open_op = openop;
template_ui->prv_rows = prv_rows;
template_ui->prv_cols = prv_cols;
template_ui->scale = scale;
@@ -1624,7 +1328,7 @@ static void ui_template_id(uiLayout *layout,
template_ui->filter = 0;
}
- if (newop || duplicateop) {
+ if (newop) {
flag |= UI_ID_ADD_NEW;
}
if (openop) {
@@ -1642,11 +1346,21 @@ static void ui_template_id(uiLayout *layout,
if (template_ui->idlb) {
if (use_tabs) {
layout = uiLayoutRow(layout, true);
- template_ID_tabs(C, layout, template_ui, type, flag, menu);
+ template_ID_tabs(C, layout, template_ui, type, flag, newop, menu);
}
else {
layout = uiLayoutRow(layout, true);
- template_ID(C, layout, template_ui, type, flag, text, live_icon, hide_buttons);
+ template_ID(C,
+ layout,
+ template_ui,
+ type,
+ flag,
+ newop,
+ openop,
+ unlinkop,
+ text,
+ live_icon,
+ hide_buttons);
}
}
@@ -1658,7 +1372,6 @@ void uiTemplateID(uiLayout *layout,
PointerRNA *ptr,
const char *propname,
const char *newop,
- const char *duplicateop,
const char *openop,
const char *unlinkop,
int filter,
@@ -1670,7 +1383,6 @@ void uiTemplateID(uiLayout *layout,
ptr,
propname,
newop,
- duplicateop,
openop,
unlinkop,
NULL,
@@ -1700,7 +1412,6 @@ void uiTemplateIDBrowse(uiLayout *layout,
ptr,
propname,
newop,
- NULL,
openop,
unlinkop,
NULL,
@@ -1732,7 +1443,6 @@ void uiTemplateIDPreview(uiLayout *layout,
ptr,
propname,
newop,
- NULL,
openop,
unlinkop,
NULL,
@@ -1765,7 +1475,6 @@ void uiTemplateGpencilColorPreview(uiLayout *layout,
NULL,
NULL,
NULL,
- NULL,
UI_ID_BROWSE | UI_ID_PREVIEWS | UI_ID_DELETE,
rows,
cols,
@@ -1794,7 +1503,6 @@ void uiTemplateIDTabs(uiLayout *layout,
newop,
NULL,
NULL,
- NULL,
menu,
NULL,
UI_ID_BROWSE | UI_ID_RENAME,
@@ -1954,25 +1662,35 @@ static void template_search_add_button_searchmenu(const bContext *C,
static void template_search_add_button_name(uiBlock *block,
PointerRNA *active_ptr,
- const StructRNA *type,
- const char *newop,
- const char *unlinkop)
+ const StructRNA *type)
{
- uiBut *but = uiDefAutoButR(block,
- active_ptr,
- RNA_struct_name_property(type),
- 0,
- "",
- ICON_NONE,
- 0,
- 0,
- TEMPLATE_SEARCH_TEXTBUT_WIDTH,
- TEMPLATE_SEARCH_TEXTBUT_HEIGHT);
- if (newop) {
- UI_but_extra_operator_icon_add(but, newop, WM_OP_INVOKE_DEFAULT, ICON_DUPLICATE);
+ uiDefAutoButR(block,
+ active_ptr,
+ RNA_struct_name_property(type),
+ 0,
+ "",
+ ICON_NONE,
+ 0,
+ 0,
+ TEMPLATE_SEARCH_TEXTBUT_WIDTH,
+ TEMPLATE_SEARCH_TEXTBUT_HEIGHT);
+}
+
+static void template_search_add_button_operator(uiBlock *block,
+ const char *const operator_name,
+ const int opcontext,
+ const int icon,
+ const bool editable)
+{
+ if (!operator_name) {
+ return;
}
- if (unlinkop) {
- UI_but_extra_operator_icon_add(but, unlinkop, WM_OP_INVOKE_REGION_WIN, ICON_X);
+
+ uiBut *but = uiDefIconButO(
+ block, UI_BTYPE_BUT, operator_name, opcontext, icon, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
+
+ if (!editable) {
+ UI_but_drawflag_enable(but, UI_BUT_DISABLED);
}
}
@@ -1998,7 +1716,10 @@ static void template_search_buttons(const bContext *C,
UI_block_align_begin(block);
template_search_add_button_searchmenu(C, layout, block, template_search, editable, false);
- template_search_add_button_name(block, &active_ptr, type, newop, unlinkop);
+ template_search_add_button_name(block, &active_ptr, type);
+ template_search_add_button_operator(
+ block, newop, WM_OP_INVOKE_DEFAULT, ICON_DUPLICATE, editable);
+ template_search_add_button_operator(block, unlinkop, WM_OP_INVOKE_REGION_WIN, ICON_X, editable);
UI_block_align_end(block);
}
@@ -7488,7 +7209,6 @@ void uiTemplateCacheFile(uiLayout *layout,
ptr,
propname,
NULL,
- NULL,
"CACHEFILE_OT_open",
NULL,
UI_TEMPLATE_ID_FILTER_ALL,