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:
Diffstat (limited to 'source/blender/editors')
-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
19 files changed, 650 insertions, 1276 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,