Merge branch 'blender2.7'
[blender.git] / source / blender / editors / render / render_shading.c
index c4effd3a5239cb7380e48f0aaf9b7c32f6d1a0bd..53fc82e3482f12e8d8a069f4cba47ed367244d5a 100644 (file)
@@ -523,29 +523,40 @@ static int new_material_exec(bContext *C, wmOperator *UNUSED(op))
 {
        Material *ma = CTX_data_pointer_get_type(C, "material", &RNA_Material).data;
        Main *bmain = CTX_data_main(C);
-       Object *ob = CTX_data_active_object(C);
        PointerRNA ptr, idptr;
        PropertyRNA *prop;
 
+       /* hook into UI */
+       UI_context_active_but_prop_get_templateID(C, &ptr, &prop);
+
+       Object *ob = (prop && RNA_struct_is_a(ptr.type, &RNA_Object)) ? ptr.data : NULL;
+
        /* add or copy material */
        if (ma) {
                ma = BKE_material_copy(bmain, ma);
        }
        else {
-               if ((!ob) || (ob->type != OB_GPENCIL)) {
-                       ma = BKE_material_add(bmain, DATA_("Material"));
+               const char *name = DATA_("Material");
+               if (!(ob != NULL && ob->type == OB_GPENCIL)) {
+                       ma = BKE_material_add(bmain, name);
                }
                else {
-                       ma = BKE_material_add_gpencil(bmain, DATA_("Material"));
+                       ma = BKE_material_add_gpencil(bmain, name);
                }
                ED_node_shader_default(C, &ma->id);
                ma->use_nodes = true;
        }
 
-       /* hook into UI */
-       UI_context_active_but_prop_get_templateID(C, &ptr, &prop);
 
        if (prop) {
+               if (ob != NULL) {
+                       /* Add slot follows user-preferences for creating new slots,
+                        * RNA pointer assignment doesn't, see: T60014. */
+                       if (give_current_material_p(ob, ob->actcol) == NULL) {
+                               BKE_object_material_slot_add(bmain, ob);
+                       }
+               }
+
                /* when creating new ID blocks, use is already 1, but RNA
                 * pointer use also increases user, so this compensates it */
                id_us_min(&ma->id);
@@ -707,6 +718,12 @@ void SCENE_OT_view_layer_add(wmOperatorType *ot)
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
 }
 
+static bool view_layer_remove_poll(bContext *C)
+{
+       Scene *scene = CTX_data_scene(C);
+       return (scene->view_layers.first != scene->view_layers.last);
+}
+
 static int view_layer_remove_exec(bContext *C, wmOperator *UNUSED(op))
 {
        Main *bmain = CTX_data_main(C);
@@ -731,6 +748,7 @@ void SCENE_OT_view_layer_remove(wmOperatorType *ot)
 
        /* api callbacks */
        ot->exec = view_layer_remove_exec;
+       ot->poll = view_layer_remove_poll;
 
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
@@ -1758,7 +1776,8 @@ void MATERIAL_OT_copy(wmOperatorType *ot)
        ot->exec = copy_material_exec;
 
        /* flags */
-       ot->flag = OPTYPE_REGISTER | OPTYPE_INTERNAL; /* no undo needed since no changes are made to the material */
+       /* no undo needed since no changes are made to the material */
+       ot->flag = OPTYPE_REGISTER | OPTYPE_INTERNAL;
 }
 
 static int paste_material_exec(bContext *C, wmOperator *UNUSED(op))
@@ -1770,6 +1789,7 @@ static int paste_material_exec(bContext *C, wmOperator *UNUSED(op))
 
        paste_matcopybuf(CTX_data_main(C), ma);
 
+       DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE);
        WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING_LINKS, ma);
 
        return OPERATOR_FINISHED;
@@ -1890,7 +1910,8 @@ void TEXTURE_OT_slot_copy(wmOperatorType *ot)
        ot->poll = copy_mtex_poll;
 
        /* flags */
-       ot->flag = OPTYPE_REGISTER | OPTYPE_INTERNAL; /* no undo needed since no changes are made to the mtex */
+       /* no undo needed since no changes are made to the mtex */
+       ot->flag = OPTYPE_REGISTER | OPTYPE_INTERNAL;
 }
 
 static int paste_mtex_exec(bContext *C, wmOperator *UNUSED(op))