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
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')
-rw-r--r--source/blender/editors/include/UI_interface.h34
-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
-rw-r--r--source/blender/editors/render/render_intern.h3
-rw-r--r--source/blender/editors/render/render_ops.c3
-rw-r--r--source/blender/editors/render/render_shading.c236
-rw-r--r--source/blender/editors/space_action/action_data.c178
-rw-r--r--source/blender/editors/space_action/action_intern.h1
-rw-r--r--source/blender/editors/space_action/action_ops.c2
-rw-r--r--source/blender/editors/space_api/spacetypes.c2
-rw-r--r--source/blender/editors/space_clip/clip_buttons.c1
-rw-r--r--source/blender/editors/space_file/file_panels.c9
-rw-r--r--source/blender/editors/space_image/image_buttons.c3
-rw-r--r--source/blender/editors/space_nla/nla_buttons.c3
-rw-r--r--source/blender/editors/space_node/drawnode.c94
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c9
-rw-r--r--source/blender/modifiers/intern/MOD_displace.c2
-rw-r--r--source/blender/modifiers/intern/MOD_nodes.cc1
-rw-r--r--source/blender/modifiers/intern/MOD_volume_displace.cc3
-rw-r--r--source/blender/modifiers/intern/MOD_warp.c12
-rw-r--r--source/blender/modifiers/intern/MOD_wave.c12
-rw-r--r--source/blender/modifiers/intern/MOD_weightvg_util.c1
-rw-r--r--source/blender/windowmanager/intern/wm_operator_type.c2
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) {