diff options
Diffstat (limited to 'source/blender')
27 files changed, 657 insertions, 1311 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 9ea6099ff11..7bbb7225f14 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -76,7 +76,6 @@ struct wmWindow; typedef struct uiBlock uiBlock; typedef struct uiBut uiBut; -typedef struct uiButExtraOpIcon uiButExtraOpIcon; typedef struct uiLayout uiLayout; typedef struct uiPopupBlockHandle uiPopupBlockHandle; @@ -1387,16 +1386,13 @@ typedef struct uiStringInfo { /* Note: Expects pointers to uiStringInfo structs as parameters. * Will fill them with translated strings, when possible. * Strings in uiStringInfo must be MEM_freeN'ed by caller. */ -void UI_but_string_info_get(struct bContext *C, uiBut *but, uiButExtraOpIcon *extra_icon, ...) - ATTR_SENTINEL(0); +void UI_but_string_info_get(struct bContext *C, uiBut *but, ...) ATTR_SENTINEL(0); /* Edit i18n stuff. */ /* Name of the main py op from i18n addon. */ #define EDTSRC_I18N_OP_NAME "UI_OT_edittranslation" /** - * TODO This is old stuff, only used by templateID. Should be cleaned up. - * * Special Buttons * * Buttons with a more specific purpose: @@ -1414,16 +1410,14 @@ enum { UI_ID_ALONE = 1 << 4, UI_ID_OPEN = 1 << 3, UI_ID_DELETE = 1 << 5, - UI_ID_MAKE_LOCAL = 1 << 6, - UI_ID_LIB_OVERRIDE_ADD = 1 << 7, - UI_ID_AUTO_NAME = 1 << 8, + UI_ID_LOCAL = 1 << 6, + UI_ID_AUTO_NAME = 1 << 7, + UI_ID_FAKE_USER = 1 << 8, UI_ID_PIN = 1 << 9, UI_ID_PREVIEWS = 1 << 10, - UI_ID_LIB_OVERRIDE_REMOVE = 1 << 11, - UI_ID_LIB_OVERRIDE_RESET = 1 << 12, + UI_ID_OVERRIDE = 1 << 11, UI_ID_FULL = UI_ID_RENAME | UI_ID_BROWSE | UI_ID_ADD_NEW | UI_ID_OPEN | UI_ID_ALONE | - UI_ID_DELETE | UI_ID_MAKE_LOCAL | UI_ID_LIB_OVERRIDE_ADD | - UI_ID_LIB_OVERRIDE_REMOVE | UI_ID_LIB_OVERRIDE_RESET, + UI_ID_DELETE | UI_ID_LOCAL, }; /** @@ -1669,12 +1663,10 @@ void UI_but_func_hold_set(uiBut *but, uiButHandleHoldFunc func, void *argN); void UI_but_func_pushed_state_set(uiBut *but, uiButPushedStateFunc func, void *arg); -struct uiButExtraOpIcon *UI_but_extra_operator_icon_add(uiBut *but, - const char *opname, - short opcontext, - int icon); -struct wmOperatorType *UI_but_extra_operator_icon_optype_get(struct uiButExtraOpIcon *extra_icon); -struct PointerRNA *UI_but_extra_operator_icon_opptr_get(struct uiButExtraOpIcon *extra_icon); +struct PointerRNA *UI_but_extra_operator_icon_add(uiBut *but, + const char *opname, + short opcontext, + int icon); /* Autocomplete * @@ -1976,7 +1968,6 @@ void uiTemplateID(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *newop, - const char *duplicateop, const char *openop, const char *unlinkop, int filter, @@ -2589,11 +2580,6 @@ struct ARegion *UI_tooltip_create_from_button(struct bContext *C, struct ARegion *butregion, uiBut *but, bool is_label); -struct ARegion *UI_tooltip_create_from_button_or_extra_icon(struct bContext *C, - struct ARegion *butregion, - uiBut *but, - uiButExtraOpIcon *extra_icon, - bool is_label); struct ARegion *UI_tooltip_create_from_gizmo(struct bContext *C, struct wmGizmo *gz); void UI_tooltip_free(struct bContext *C, struct bScreen *screen, struct ARegion *region); 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, diff --git a/source/blender/editors/render/render_intern.h b/source/blender/editors/render/render_intern.h index e60455667e9..e1d03e6f3be 100644 --- a/source/blender/editors/render/render_intern.h +++ b/source/blender/editors/render/render_intern.h @@ -38,11 +38,8 @@ void OBJECT_OT_material_slot_move(struct wmOperatorType *ot); void OBJECT_OT_material_slot_remove_unused(struct wmOperatorType *ot); void MATERIAL_OT_new(struct wmOperatorType *ot); -void MATERIAL_OT_duplicate(struct wmOperatorType *ot); void TEXTURE_OT_new(struct wmOperatorType *ot); -void TEXTURE_OT_duplicate(struct wmOperatorType *ot); void WORLD_OT_new(struct wmOperatorType *ot); -void WORLD_OT_duplicate(struct wmOperatorType *ot); void MATERIAL_OT_copy(struct wmOperatorType *ot); void MATERIAL_OT_paste(struct wmOperatorType *ot); diff --git a/source/blender/editors/render/render_ops.c b/source/blender/editors/render/render_ops.c index 48e894036d9..e0aa02b354d 100644 --- a/source/blender/editors/render/render_ops.c +++ b/source/blender/editors/render/render_ops.c @@ -45,11 +45,8 @@ void ED_operatortypes_render(void) WM_operatortype_append(OBJECT_OT_material_slot_remove_unused); WM_operatortype_append(MATERIAL_OT_new); - WM_operatortype_append(MATERIAL_OT_duplicate); WM_operatortype_append(TEXTURE_OT_new); - WM_operatortype_append(TEXTURE_OT_duplicate); WM_operatortype_append(WORLD_OT_new); - WM_operatortype_append(WORLD_OT_duplicate); WM_operatortype_append(MATERIAL_OT_copy); WM_operatortype_append(MATERIAL_OT_paste); diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c index 10cd1df6d96..32d4abcabd4 100644 --- a/source/blender/editors/render/render_shading.c +++ b/source/blender/editors/render/render_shading.c @@ -743,40 +743,45 @@ void OBJECT_OT_material_slot_remove_unused(wmOperatorType *ot) /** \} */ /* -------------------------------------------------------------------- */ -/** \name Create Material Operators +/** \name New Material Operator * \{ */ -struct MaterialCreationData { - Object *ob; - PropertyPointerRNA pprop; -}; - -static void material_creation_data_init_from_UI_context(bContext *C, - struct MaterialCreationData *r_create_data) +static int new_material_exec(bContext *C, wmOperator *UNUSED(op)) { - PointerRNA ptr; + Material *ma = CTX_data_pointer_get_type(C, "material", &RNA_Material).data; + Main *bmain = CTX_data_main(C); + PointerRNA ptr, idptr; PropertyRNA *prop; /* hook into UI */ UI_context_active_but_prop_get_templateID(C, &ptr, &prop); - r_create_data->ob = (prop && RNA_struct_is_a(ptr.type, &RNA_Object)) ? ptr.data : NULL; - r_create_data->pprop.ptr = ptr; - r_create_data->pprop.prop = prop; -} + Object *ob = (prop && RNA_struct_is_a(ptr.type, &RNA_Object)) ? ptr.data : NULL; -static void material_creation_assign(bContext *C, - Material *ma, - struct MaterialCreationData *create_data) -{ - Main *bmain = CTX_data_main(C); + /* add or copy material */ + if (ma) { + Material *new_ma = (Material *)BKE_id_copy_ex( + bmain, &ma->id, NULL, LIB_ID_COPY_DEFAULT | LIB_ID_COPY_ACTIONS); + ma = new_ma; + } + else { + const char *name = DATA_("Material"); + if (!(ob != NULL && ob->type == OB_GPENCIL)) { + ma = BKE_material_add(bmain, name); + } + else { + ma = BKE_gpencil_material_add(bmain, name); + } + ED_node_shader_default(C, &ma->id); + ma->use_nodes = true; + } - if (create_data->pprop.prop) { - if (create_data->ob != NULL) { + if (prop) { + if (ob != NULL) { /* Add slot follows user-preferences for creating new slots, * RNA pointer assignment doesn't, see: T60014. */ - if (BKE_object_material_get_p(create_data->ob, create_data->ob->actcol) == NULL) { - BKE_object_material_slot_add(bmain, create_data->ob); + if (BKE_object_material_get_p(ob, ob->actcol) == NULL) { + BKE_object_material_slot_add(bmain, ob); } } @@ -784,32 +789,10 @@ static void material_creation_assign(bContext *C, * pointer use also increases user, so this compensates it */ id_us_min(&ma->id); - PointerRNA idptr; RNA_id_pointer_create(&ma->id, &idptr); - RNA_property_pointer_set(&create_data->pprop.ptr, create_data->pprop.prop, idptr, NULL); - RNA_property_update(C, &create_data->pprop.ptr, create_data->pprop.prop); - } -} - -static int new_material_exec(bContext *C, wmOperator *UNUSED(op)) -{ - Main *bmain = CTX_data_main(C); - struct MaterialCreationData create_data; - - material_creation_data_init_from_UI_context(C, &create_data); - - const char *name = DATA_("Material"); - Material *ma; - if ((create_data.ob == NULL) || (create_data.ob->type != OB_GPENCIL)) { - ma = BKE_material_add(bmain, name); - } - else { - ma = BKE_gpencil_material_add(bmain, name); + RNA_property_pointer_set(&ptr, prop, idptr, NULL); + RNA_property_update(C, &ptr, prop); } - ED_node_shader_default(C, &ma->id); - ma->use_nodes = true; - - material_creation_assign(C, ma, &create_data); WM_event_add_notifier(C, NC_MATERIAL | NA_ADDED, ma); @@ -831,57 +814,27 @@ void MATERIAL_OT_new(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; } -static int duplicate_material_exec(bContext *C, wmOperator *op) -{ - Material *old_ma = CTX_data_pointer_get_type(C, "material", &RNA_Material).data; - - if (!old_ma) { - BKE_report( - op->reports, - RPT_ERROR, - "Incorrect context for duplicating a material (did not find material to duplicate)"); - return OPERATOR_CANCELLED; - } - - Main *bmain = CTX_data_main(C); - struct MaterialCreationData create_data; - - material_creation_data_init_from_UI_context(C, &create_data); - - Material *new_ma = (Material *)BKE_id_copy_ex( - bmain, &old_ma->id, NULL, LIB_ID_COPY_DEFAULT | LIB_ID_COPY_ACTIONS); - - material_creation_assign(C, new_ma, &create_data); - - WM_event_add_notifier(C, NC_MATERIAL | NA_ADDED, new_ma); - - return OPERATOR_FINISHED; -} - -void MATERIAL_OT_duplicate(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Duplicate Material"; - ot->idname = "MATERIAL_OT_duplicate"; - ot->description = "Duplicate an existing material"; - - /* api callbacks */ - ot->exec = duplicate_material_exec; - ot->poll = object_materials_supported_poll; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; -} +/** \} */ /* -------------------------------------------------------------------- */ -/** \name Create Texture Operators +/** \name New Texture Operator * \{ */ -static void texture_creation_assign(bContext *C, Tex *tex) +static int new_texture_exec(bContext *C, wmOperator *UNUSED(op)) { + Tex *tex = CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data; + Main *bmain = CTX_data_main(C); PointerRNA ptr, idptr; PropertyRNA *prop; + /* add or copy texture */ + if (tex) { + tex = (Tex *)BKE_id_copy(bmain, &tex->id); + } + else { + tex = BKE_texture_add(bmain, DATA_("Texture")); + } + /* hook into UI */ UI_context_active_but_prop_get_templateID(C, &ptr, &prop); @@ -894,14 +847,6 @@ static void texture_creation_assign(bContext *C, Tex *tex) RNA_property_pointer_set(&ptr, prop, idptr, NULL); RNA_property_update(C, &ptr, prop); } -} - -static int new_texture_exec(bContext *C, wmOperator *UNUSED(op)) -{ - Main *bmain = CTX_data_main(C); - Tex *tex = BKE_texture_add(bmain, DATA_("Texture")); - - texture_creation_assign(C, tex); WM_event_add_notifier(C, NC_TEXTURE | NA_ADDED, tex); @@ -922,53 +867,31 @@ void TEXTURE_OT_new(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; } -static int duplicate_texture_exec(bContext *C, wmOperator *op) -{ - Tex *tex = CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data; - - if (!tex) { - BKE_report(op->reports, - RPT_ERROR, - "Incorrect context for duplicating a texture (did not find texture to duplicate)"); - return OPERATOR_CANCELLED; - } - - /* add or copy texture */ - Main *bmain = CTX_data_main(C); - tex = (Tex *)BKE_id_copy(bmain, &tex->id); - - texture_creation_assign(C, tex); - - WM_event_add_notifier(C, NC_TEXTURE | NA_ADDED, tex); - - return OPERATOR_FINISHED; -} - -void TEXTURE_OT_duplicate(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Duplicate Texture"; - ot->idname = "TEXTURE_OT_duplicate"; - ot->description = "Duplicate an existing texture"; - - /* api callbacks */ - ot->exec = duplicate_texture_exec; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; -} - /** \} */ /* -------------------------------------------------------------------- */ -/** \name Create world operators +/** \name new world operator * \{ */ -static void world_creation_assign(bContext *C, World *wo) +static int new_world_exec(bContext *C, wmOperator *UNUSED(op)) { + World *wo = CTX_data_pointer_get_type(C, "world", &RNA_World).data; + Main *bmain = CTX_data_main(C); PointerRNA ptr, idptr; PropertyRNA *prop; + /* add or copy world */ + if (wo) { + World *new_wo = (World *)BKE_id_copy_ex( + bmain, &wo->id, NULL, LIB_ID_COPY_DEFAULT | LIB_ID_COPY_ACTIONS); + wo = new_wo; + } + else { + wo = BKE_world_add(bmain, DATA_("World")); + ED_node_shader_default(C, &wo->id); + wo->use_nodes = true; + } + /* hook into UI */ UI_context_active_but_prop_get_templateID(C, &ptr, &prop); @@ -981,17 +904,6 @@ static void world_creation_assign(bContext *C, World *wo) RNA_property_pointer_set(&ptr, prop, idptr, NULL); RNA_property_update(C, &ptr, prop); } -} - -static int new_world_exec(bContext *C, wmOperator *UNUSED(op)) -{ - Main *bmain = CTX_data_main(C); - - World *wo = BKE_world_add(bmain, DATA_("World")); - ED_node_shader_default(C, &wo->id); - wo->use_nodes = true; - - world_creation_assign(C, wo); WM_event_add_notifier(C, NC_WORLD | NA_ADDED, wo); @@ -1003,7 +915,7 @@ void WORLD_OT_new(wmOperatorType *ot) /* identifiers */ ot->name = "New World"; ot->idname = "WORLD_OT_new"; - ot->description = "Create a new world data-block"; + ot->description = "Create a new world Data-Block"; /* api callbacks */ ot->exec = new_world_exec; @@ -1012,36 +924,6 @@ void WORLD_OT_new(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; } -static int duplicate_world_exec(bContext *C, wmOperator *UNUSED(op)) -{ - World *wo = CTX_data_pointer_get_type(C, "world", &RNA_World).data; - - if (wo) { - Main *bmain = CTX_data_main(C); - wo = (World *)BKE_id_copy(bmain, &wo->id); - } - - world_creation_assign(C, wo); - - WM_event_add_notifier(C, NC_WORLD | NA_ADDED, wo); - - return OPERATOR_FINISHED; -} - -void WORLD_OT_duplicate(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Duplicate World"; - ot->idname = "WORLD_OT_duplicate"; - ot->description = "Duplicate an existing world data-block"; - - /* api callbacks */ - ot->exec = duplicate_world_exec; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; -} - /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/space_action/action_data.c b/source/blender/editors/space_action/action_data.c index 4d5a93f75e0..3a584a7f0cb 100644 --- a/source/blender/editors/space_action/action_data.c +++ b/source/blender/editors/space_action/action_data.c @@ -158,78 +158,7 @@ static void actedit_change_action(bContext *C, bAction *act) RNA_property_update(C, &ptr, prop); } -/* ******************** New Action Operators *********************** */ - -static void action_creation_assign(bContext *C, - bAction *action, - PointerRNA *ptr, - PropertyRNA *prop) -{ - PointerRNA idptr; - /* Set the new action. - * NOTE: we can't use actedit_change_action, as this function is also called from the NLA. */ - RNA_id_pointer_create(&action->id, &idptr); - RNA_property_pointer_set(ptr, prop, idptr, NULL); - RNA_property_update(C, ptr, prop); -} - -/** - * Stash the previously active action to prevent it from being lost. - * \return The old action if any. - */ -static bAction *action_creation_stash_old(bContext *C, PointerRNA *ptr, PropertyRNA *prop) -{ - bAction *oldact = NULL; - AnimData *adt = NULL; - - if (prop) { - /* The operator was called from a button. */ - PointerRNA oldptr; - - oldptr = RNA_property_pointer_get(ptr, prop); - oldact = (bAction *)oldptr.owner_id; - - /* stash the old action to prevent it from being lost */ - if (ptr->type == &RNA_AnimData) { - adt = ptr->data; - } - else if (ptr->type == &RNA_SpaceDopeSheetEditor) { - adt = ED_actedit_animdata_from_context(C); - } - } - else { - adt = ED_actedit_animdata_from_context(C); - oldact = adt->action; - } - - if (!adt || !oldact) { - /* Found nothing to stash in current context. */ - return NULL; - } - - /* Perform stashing operation. */ - if (BKE_nla_action_stash(adt, ID_IS_OVERRIDE_LIBRARY(ptr->owner_id))) { - /* The stash operation will remove the user already - * (and unlink the action from the AnimData action slot). - * Hence, we must unset the ref to the action in the - * action editor too (if this is where we're being called from) - * first before setting the new action once it is created, - * or else the user gets decremented twice! - */ - if (ptr->type == &RNA_SpaceDopeSheetEditor) { - SpaceAction *saction = ptr->data; - saction->action = NULL; - } - } - else { -#if 0 - printf("WARNING: Failed to stash %s. It may already exist in the NLA stack though\n", - oldact->id.name); -#endif - } - - return oldact; -} +/* ******************** New Action Operator *********************** */ /* Criteria: * 1) There must be an dopesheet/action editor, and it must be in a mode which uses actions... @@ -278,17 +207,71 @@ static bool action_new_poll(bContext *C) static int action_new_exec(bContext *C, wmOperator *UNUSED(op)) { - PointerRNA ptr; + PointerRNA ptr, idptr; PropertyRNA *prop; + bAction *oldact = NULL; + AnimData *adt = NULL; /* hook into UI */ UI_context_active_but_prop_get_templateID(C, &ptr, &prop); - action_creation_stash_old(C, &ptr, prop); - - bAction *action = action_create_new(C, NULL); if (prop) { - action_creation_assign(C, action, &ptr, prop); + /* The operator was called from a button. */ + PointerRNA oldptr; + + oldptr = RNA_property_pointer_get(&ptr, prop); + oldact = (bAction *)oldptr.owner_id; + + /* stash the old action to prevent it from being lost */ + if (ptr.type == &RNA_AnimData) { + adt = ptr.data; + } + else if (ptr.type == &RNA_SpaceDopeSheetEditor) { + adt = ED_actedit_animdata_from_context(C); + } + } + else { + adt = ED_actedit_animdata_from_context(C); + oldact = adt->action; + } + { + bAction *action = NULL; + + /* Perform stashing operation - But only if there is an action */ + if (adt && oldact) { + /* stash the action */ + if (BKE_nla_action_stash(adt, ID_IS_OVERRIDE_LIBRARY(ptr.owner_id))) { + /* The stash operation will remove the user already + * (and unlink the action from the AnimData action slot). + * Hence, we must unset the ref to the action in the + * action editor too (if this is where we're being called from) + * first before setting the new action once it is created, + * or else the user gets decremented twice! + */ + if (ptr.type == &RNA_SpaceDopeSheetEditor) { + SpaceAction *saction = ptr.data; + saction->action = NULL; + } + } + else { +#if 0 + printf("WARNING: Failed to stash %s. It may already exist in the NLA stack though\n", + oldact->id.name); +#endif + } + } + + /* create action */ + action = action_create_new(C, oldact); + + if (prop) { + /* set this new action + * NOTE: we can't use actedit_change_action, as this function is also called from the NLA + */ + RNA_id_pointer_create(&action->id, &idptr); + RNA_property_pointer_set(&ptr, prop, idptr, NULL); + RNA_property_update(C, &ptr, prop); + } } /* set notifier that keyframes have changed */ @@ -302,7 +285,7 @@ void ACTION_OT_new(wmOperatorType *ot) /* identifiers */ ot->name = "New Action"; ot->idname = "ACTION_OT_new"; - ot->description = "Create a new action"; + ot->description = "Create new action"; /* api callbacks */ ot->exec = action_new_exec; @@ -312,45 +295,6 @@ void ACTION_OT_new(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -static int action_duplicate_assign_exec(bContext *C, wmOperator *UNUSED(op)) -{ - PointerRNA ptr; - PropertyRNA *prop; - - /* hook into UI */ - UI_context_active_but_prop_get_templateID(C, &ptr, &prop); - - bAction *old_action = action_creation_stash_old(C, &ptr, prop); - - bAction *new_action = action_create_new(C, old_action); - if (prop) { - action_creation_assign(C, new_action, &ptr, prop); - } - - /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_ADDED, NULL); - - return OPERATOR_FINISHED; -} - -/** - * Duplicate an action assigned to a templateID and update it's assignment - based on UI context. - */ -void ACTION_OT_duplicate_assign(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Duplicate & Assign Action"; - ot->idname = "ACTION_OT_duplicate_assign"; - ot->description = "Create a copy of an existing action and assign it"; - - /* api callbacks */ - ot->exec = action_duplicate_assign_exec; - ot->poll = action_new_poll; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; -} - /* ******************* Action Push-Down Operator ******************** */ /* Criteria: diff --git a/source/blender/editors/space_action/action_intern.h b/source/blender/editors/space_action/action_intern.h index 4bce6c62a1a..ffe0606c98f 100644 --- a/source/blender/editors/space_action/action_intern.h +++ b/source/blender/editors/space_action/action_intern.h @@ -106,7 +106,6 @@ void ACTION_OT_snap(struct wmOperatorType *ot); void ACTION_OT_mirror(struct wmOperatorType *ot); void ACTION_OT_new(struct wmOperatorType *ot); -void ACTION_OT_duplicate_assign(struct wmOperatorType *ot); void ACTION_OT_unlink(struct wmOperatorType *ot); void ACTION_OT_push_down(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_action/action_ops.c b/source/blender/editors/space_action/action_ops.c index 329c3a9f6f6..7422c05511c 100644 --- a/source/blender/editors/space_action/action_ops.c +++ b/source/blender/editors/space_action/action_ops.c @@ -73,9 +73,7 @@ void action_operatortypes(void) WM_operatortype_append(ACTION_OT_copy); WM_operatortype_append(ACTION_OT_paste); - /* UI-context based operators. */ WM_operatortype_append(ACTION_OT_new); - WM_operatortype_append(ACTION_OT_duplicate_assign); WM_operatortype_append(ACTION_OT_unlink); WM_operatortype_append(ACTION_OT_push_down); diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c index 10fa2c19919..0fe94ec382c 100644 --- a/source/blender/editors/space_api/spacetypes.c +++ b/source/blender/editors/space_api/spacetypes.c @@ -65,7 +65,6 @@ #include "ED_space_api.h" #include "ED_transform.h" #include "ED_userpref.h" -#include "ED_util.h" #include "ED_uvedit.h" #include "io_ops.h" @@ -125,7 +124,6 @@ void ED_spacetypes_init(void) ED_operatortypes_render(); ED_operatortypes_mask(); ED_operatortypes_io(); - ED_operatortypes_edutils(); ED_operatortypes_view2d(); ED_operatortypes_ui(); diff --git a/source/blender/editors/space_clip/clip_buttons.c b/source/blender/editors/space_clip/clip_buttons.c index 78dc6eabbd2..81bae26efeb 100644 --- a/source/blender/editors/space_clip/clip_buttons.c +++ b/source/blender/editors/space_clip/clip_buttons.c @@ -134,7 +134,6 @@ void uiTemplateMovieClip( ptr, propname, NULL, - NULL, "CLIP_OT_open", NULL, UI_TEMPLATE_ID_FILTER_ALL, diff --git a/source/blender/editors/space_file/file_panels.c b/source/blender/editors/space_file/file_panels.c index 411f99cc3b4..afa85d183d8 100644 --- a/source/blender/editors/space_file/file_panels.c +++ b/source/blender/editors/space_file/file_panels.c @@ -180,16 +180,11 @@ static void file_panel_execution_buttons_draw(const bContext *C, Panel *panel) UI_but_funcN_set(but, file_filename_enter_handle, NULL, but); if (params->flag & FILE_CHECK_EXISTING) { - uiButExtraOpIcon *extra_icon; - - extra_icon = UI_but_extra_operator_icon_add( + but_extra_rna_ptr = UI_but_extra_operator_icon_add( but, "FILE_OT_filenum", WM_OP_EXEC_REGION_WIN, ICON_REMOVE); - but_extra_rna_ptr = UI_but_extra_operator_icon_opptr_get(extra_icon); RNA_int_set(but_extra_rna_ptr, "increment", -1); - - extra_icon = UI_but_extra_operator_icon_add( + but_extra_rna_ptr = UI_but_extra_operator_icon_add( but, "FILE_OT_filenum", WM_OP_EXEC_REGION_WIN, ICON_ADD); - but_extra_rna_ptr = UI_but_extra_operator_icon_opptr_get(extra_icon); RNA_int_set(but_extra_rna_ptr, "increment", 1); } diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c index 1996f05b36a..6fb64de7e85 100644 --- a/source/blender/editors/space_image/image_buttons.c +++ b/source/blender/editors/space_image/image_buttons.c @@ -800,8 +800,7 @@ void uiTemplateImage(uiLayout *layout, C, ptr, propname, - "IMAGE_OT_new", - NULL, + ima ? NULL : "IMAGE_OT_new", "IMAGE_OT_open", NULL, UI_TEMPLATE_ID_FILTER_ALL, diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c index 218fc3b7141..b82fcf3db47 100644 --- a/source/blender/editors/space_nla/nla_buttons.c +++ b/source/blender/editors/space_nla/nla_buttons.c @@ -292,9 +292,8 @@ static void nla_panel_animdata(const bContext *C, Panel *panel) (bContext *)C, &adt_ptr, "action", - NULL, "ACTION_OT_new", - "ACTION_OT_duplicate_assign", + NULL, "NLA_OT_action_unlink", UI_TEMPLATE_ID_FILTER_ALL, false, diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 0f02d2165ac..bf38f6d606a 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -738,7 +738,6 @@ static void node_shader_buts_tex_image(uiLayout *layout, bContext *C, PointerRNA ptr, "image", "IMAGE_OT_new", - NULL, "IMAGE_OT_open", NULL, UI_TEMPLATE_ID_FILTER_ALL, @@ -776,7 +775,6 @@ static void node_shader_buts_tex_environment(uiLayout *layout, bContext *C, Poin ptr, "image", "IMAGE_OT_new", - NULL, "IMAGE_OT_open", NULL, UI_TEMPLATE_ID_FILTER_ALL, @@ -1364,7 +1362,6 @@ static void node_composit_buts_image(uiLayout *layout, bContext *C, PointerRNA * ptr, "image", "IMAGE_OT_new", - NULL, "IMAGE_OT_open", NULL, UI_TEMPLATE_ID_FILTER_ALL, @@ -1396,8 +1393,7 @@ static void node_composit_buts_viewlayers(uiLayout *layout, bContext *C, Pointer bNode *node = ptr->data; uiLayout *col, *row; - uiTemplateID( - layout, C, ptr, "scene", NULL, NULL, NULL, NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); + uiTemplateID(layout, C, ptr, "scene", NULL, NULL, NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); if (!node->id) { return; @@ -1519,8 +1515,7 @@ static void node_composit_buts_defocus(uiLayout *layout, bContext *C, PointerRNA col = uiLayoutColumn(layout, false); uiItemR(col, ptr, "use_preview", DEFAULT_FLAGS, NULL, ICON_NONE); - uiTemplateID( - layout, C, ptr, "scene", NULL, NULL, NULL, NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); + uiTemplateID(layout, C, ptr, "scene", NULL, NULL, NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); col = uiLayoutColumn(layout, false); uiItemR(col, ptr, "use_zbuffer", DEFAULT_FLAGS, NULL, ICON_NONE); @@ -2143,17 +2138,8 @@ static void node_composit_buts_ycc(uiLayout *layout, bContext *UNUSED(C), Pointe static void node_composit_buts_movieclip(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiTemplateID(layout, - C, - ptr, - "clip", - NULL, - NULL, - "CLIP_OT_open", - NULL, - UI_TEMPLATE_ID_FILTER_ALL, - false, - NULL); + uiTemplateID( + layout, C, ptr, "clip", NULL, "CLIP_OT_open", NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); } static void node_composit_buts_movieclip_ex(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -2161,17 +2147,8 @@ static void node_composit_buts_movieclip_ex(uiLayout *layout, bContext *C, Point bNode *node = ptr->data; PointerRNA clipptr; - uiTemplateID(layout, - C, - ptr, - "clip", - NULL, - NULL, - "CLIP_OT_open", - NULL, - UI_TEMPLATE_ID_FILTER_ALL, - false, - NULL); + uiTemplateID( + layout, C, ptr, "clip", NULL, "CLIP_OT_open", NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); if (!node->id) { return; @@ -2186,17 +2163,8 @@ static void node_composit_buts_stabilize2d(uiLayout *layout, bContext *C, Pointe { bNode *node = ptr->data; - uiTemplateID(layout, - C, - ptr, - "clip", - NULL, - NULL, - "CLIP_OT_open", - NULL, - UI_TEMPLATE_ID_FILTER_ALL, - false, - NULL); + uiTemplateID( + layout, C, ptr, "clip", NULL, "CLIP_OT_open", NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); if (!node->id) { return; @@ -2221,17 +2189,8 @@ static void node_composit_buts_moviedistortion(uiLayout *layout, bContext *C, Po { bNode *node = ptr->data; - uiTemplateID(layout, - C, - ptr, - "clip", - NULL, - NULL, - "CLIP_OT_open", - NULL, - UI_TEMPLATE_ID_FILTER_ALL, - false, - NULL); + uiTemplateID( + layout, C, ptr, "clip", NULL, "CLIP_OT_open", NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); if (!node->id) { return; @@ -2559,8 +2518,7 @@ static void node_composit_buts_mask(uiLayout *layout, bContext *C, PointerRNA *p { bNode *node = ptr->data; - uiTemplateID( - layout, C, ptr, "mask", NULL, NULL, NULL, NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); + uiTemplateID(layout, C, ptr, "mask", NULL, NULL, NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); uiItemR(layout, ptr, "use_feather", DEFAULT_FLAGS, NULL, ICON_NONE); uiItemR(layout, ptr, "size_source", DEFAULT_FLAGS, "", ICON_NONE); @@ -2581,8 +2539,7 @@ static void node_composit_buts_keyingscreen(uiLayout *layout, bContext *C, Point { bNode *node = ptr->data; - uiTemplateID( - layout, C, ptr, "clip", NULL, NULL, NULL, NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); + uiTemplateID(layout, C, ptr, "clip", NULL, NULL, NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); if (node->id) { MovieClip *clip = (MovieClip *)node->id; @@ -2618,17 +2575,8 @@ static void node_composit_buts_trackpos(uiLayout *layout, bContext *C, PointerRN { bNode *node = ptr->data; - uiTemplateID(layout, - C, - ptr, - "clip", - NULL, - NULL, - "CLIP_OT_open", - NULL, - UI_TEMPLATE_ID_FILTER_ALL, - false, - NULL); + uiTemplateID( + layout, C, ptr, "clip", NULL, "CLIP_OT_open", NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); if (node->id) { MovieClip *clip = (MovieClip *)node->id; @@ -2668,17 +2616,8 @@ static void node_composit_buts_planetrackdeform(uiLayout *layout, bContext *C, P bNode *node = ptr->data; NodePlaneTrackDeformData *data = node->storage; - uiTemplateID(layout, - C, - ptr, - "clip", - NULL, - NULL, - "CLIP_OT_open", - NULL, - UI_TEMPLATE_ID_FILTER_ALL, - false, - NULL); + uiTemplateID( + layout, C, ptr, "clip", NULL, "CLIP_OT_open", NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); if (node->id) { MovieClip *clip = (MovieClip *)node->id; @@ -3116,7 +3055,6 @@ static void node_texture_buts_image(uiLayout *layout, bContext *C, PointerRNA *p ptr, "image", "IMAGE_OT_new", - NULL, "IMAGE_OT_open", NULL, UI_TEMPLATE_ID_FILTER_ALL, diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c index e26cc8d8d41..447f5b4210b 100644 --- a/source/blender/makesrna/intern/rna_ui_api.c +++ b/source/blender/makesrna/intern/rna_ui_api.c @@ -480,7 +480,6 @@ static void rna_uiTemplateID(uiLayout *layout, PointerRNA *ptr, const char *propname, const char *newop, - const char *duplicateop, const char *openop, const char *unlinkop, int filter, @@ -499,8 +498,7 @@ static void rna_uiTemplateID(uiLayout *layout, /* Get translated name (label). */ name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate); - uiTemplateID( - layout, C, ptr, propname, newop, duplicateop, openop, unlinkop, filter, live_icon, name); + uiTemplateID(layout, C, ptr, propname, newop, openop, unlinkop, filter, live_icon, name); } static void rna_uiTemplateAnyID(uiLayout *layout, @@ -1158,11 +1156,8 @@ void RNA_api_ui_layout(StructRNA *srna) api_ui_item_rna_common(func); RNA_def_string(func, "new", NULL, 0, "", "Operator identifier to create a new ID block"); RNA_def_string( - func, "duplicate", NULL, 0, "", "Operator identifier to duplicate the selected ID block"); - RNA_def_string( func, "open", NULL, 0, "", "Operator identifier to open a file for creating a new ID block"); - RNA_def_string( - func, "unlink", NULL, 0, "", "Operator identifier to unlink the selected ID block"); + RNA_def_string(func, "unlink", NULL, 0, "", "Operator identifier to unlink the ID block"); RNA_def_enum(func, "filter", id_template_filter_items, diff --git a/source/blender/modifiers/intern/MOD_displace.c b/source/blender/modifiers/intern/MOD_displace.c index 5359736d9fc..abe78943508 100644 --- a/source/blender/modifiers/intern/MOD_displace.c +++ b/source/blender/modifiers/intern/MOD_displace.c @@ -437,7 +437,7 @@ static void panel_draw(const bContext *C, Panel *panel) uiLayoutSetPropSep(layout, true); - uiTemplateID(layout, C, ptr, "texture", "texture.new", NULL, NULL, NULL, 0, ICON_NONE, NULL); + uiTemplateID(layout, C, ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL); col = uiLayoutColumn(layout, false); uiLayoutSetActive(col, has_texture); diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index dcf52ace8c6..5ef17aeddd1 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -1119,7 +1119,6 @@ static void panel_draw(const bContext *C, Panel *panel) "node.new_geometry_node_group_assign", nullptr, nullptr, - nullptr, 0, false, nullptr); diff --git a/source/blender/modifiers/intern/MOD_volume_displace.cc b/source/blender/modifiers/intern/MOD_volume_displace.cc index a916eff6617..745e089b8ff 100644 --- a/source/blender/modifiers/intern/MOD_volume_displace.cc +++ b/source/blender/modifiers/intern/MOD_volume_displace.cc @@ -113,8 +113,7 @@ static void panel_draw(const bContext *C, Panel *panel) uiLayoutSetPropSep(layout, true); - uiTemplateID( - layout, C, ptr, "texture", "texture.new", nullptr, nullptr, nullptr, 0, ICON_NONE, nullptr); + uiTemplateID(layout, C, ptr, "texture", "texture.new", nullptr, nullptr, 0, ICON_NONE, nullptr); uiItemR(layout, ptr, "texture_map_mode", 0, "Texture Mapping", ICON_NONE); if (vdmd->texture_map_mode == MOD_VOLUME_DISPLACE_MAP_OBJECT) { diff --git a/source/blender/modifiers/intern/MOD_warp.c b/source/blender/modifiers/intern/MOD_warp.c index 8ad15edff93..9d3d5b0658c 100644 --- a/source/blender/modifiers/intern/MOD_warp.c +++ b/source/blender/modifiers/intern/MOD_warp.c @@ -466,17 +466,7 @@ static void texture_panel_draw(const bContext *C, Panel *panel) int texture_coords = RNA_enum_get(ptr, "texture_coords"); - uiTemplateID(layout, - C, - ptr, - "texture", - "texture.new", - "texture.duplicate", - NULL, - NULL, - 0, - ICON_NONE, - NULL); + uiTemplateID(layout, C, ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL); uiLayoutSetPropSep(layout, true); diff --git a/source/blender/modifiers/intern/MOD_wave.c b/source/blender/modifiers/intern/MOD_wave.c index 94d8a80f2b4..863656b85a5 100644 --- a/source/blender/modifiers/intern/MOD_wave.c +++ b/source/blender/modifiers/intern/MOD_wave.c @@ -436,17 +436,7 @@ static void texture_panel_draw(const bContext *C, Panel *panel) int texture_coords = RNA_enum_get(ptr, "texture_coords"); - uiTemplateID(layout, - C, - ptr, - "texture", - "texture.new", - "texture.duplicate", - NULL, - NULL, - 0, - ICON_NONE, - NULL); + uiTemplateID(layout, C, ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL); uiLayoutSetPropSep(layout, true); diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index 26b29100d30..c5e2ecb9660 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -363,7 +363,6 @@ void weightvg_ui_common(const bContext *C, PointerRNA *ob_ptr, PointerRNA *ptr, ptr, "mask_texture", "texture.new", - "texture.duplicate", NULL, NULL, 0, diff --git a/source/blender/windowmanager/intern/wm_operator_type.c b/source/blender/windowmanager/intern/wm_operator_type.c index f5cdd4490cb..4c4fd2b1a8e 100644 --- a/source/blender/windowmanager/intern/wm_operator_type.c +++ b/source/blender/windowmanager/intern/wm_operator_type.c @@ -596,7 +596,7 @@ char *WM_operatortype_description(struct bContext *C, struct wmOperatorType *ot, struct PointerRNA *properties) { - if (C && ot->get_description && properties) { + if (ot->get_description && properties) { char *description = ot->get_description(C, ot, properties); if (description) { |