[Bf-blender-cvs] [72a051f9578] blender2.8: Cleanup: remove generation context from image new operator.

Brecht Van Lommel noreply at git.blender.org
Tue Jul 3 12:29:26 CEST 2018


Commit: 72a051f9578a92ef1d3977c060c6465b43175886
Author: Brecht Van Lommel
Date:   Tue Jul 3 12:18:06 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB72a051f9578a92ef1d3977c060c6465b43175886

Cleanup: remove generation context from image new operator.

===================================================================

M	release/scripts/startup/bl_ui/space_view3d_toolbar.py
M	source/blender/editors/space_image/image_ops.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 8d78d674922..62cff9d6e42 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -247,18 +247,14 @@ class VIEW3D_PT_imapaint_tools_missing(Panel, View3DPaintPanel):
                 col.label("Missing Canvas", icon='INFO')
                 col.label("Add or assign a canvas image below")
                 col.label("Canvas Image:")
-                # todo this should be combinded into a single row
-                col.template_ID(toolsettings, "canvas", open="image.open")
-                col.operator("image.new", text="New").gen_context = 'PAINT_CANVAS'
+                col.template_ID(toolsettings, "canvas", new="image.new", open="image.open")
 
         if toolsettings.missing_stencil:
             col.separator()
             col.label("Missing Stencil", icon='INFO')
             col.label("Add or assign a stencil image below")
             col.label("Stencil Image:")
-            # todo this should be combinded into a single row
-            col.template_ID(toolsettings, "stencil_image", open="image.open")
-            col.operator("image.new", text="New").gen_context = 'PAINT_STENCIL'
+            col.template_ID(toolsettings, "stencil_image", new="image.new", open="image.open")
 
 
 # TODO, move to space_view3d.py
@@ -585,9 +581,7 @@ class VIEW3D_PT_slots_projectpaint(View3DPanel, Panel):
             mesh = ob.data
             uv_text = mesh.uv_layers.active.name if mesh.uv_layers.active else ""
             col.label("Canvas Image:")
-            # todo this should be combinded into a single row
-            col.template_ID(settings, "canvas", open="image.open")
-            col.operator("image.new", text="New").gen_context = 'PAINT_CANVAS'
+            col.template_ID(settings, "canvas", new="image.new", open="image.open")
             col.label("UV Map:")
             col.menu("VIEW3D_MT_tools_projectpaint_uvlayer", text=uv_text, translate=False)
 
@@ -635,8 +629,7 @@ class VIEW3D_PT_stencil_projectpaint(View3DPanel, Panel):
         colsub.alignment = 'RIGHT'
         colsub.label("Stencil Image")
         colsub = split.column()
-        colsub.template_ID(ipaint, "stencil_image", open="image.open")
-        colsub.operator("image.new", text="New").gen_context = 'PAINT_STENCIL'
+        colsub.template_ID(ipaint, "stencil_image", new="image.new", open="image.open")
 
         row = col.row(align=True)
         row.prop(ipaint, "stencil_color", text="Display Color")
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 3efdce3ea6d..f852f601db2 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1231,7 +1231,6 @@ static int image_open_exec(bContext *C, wmOperator *op)
 	Object *obedit = CTX_data_edit_object(C);
 	ImageUser *iuser = NULL;
 	ImageOpenData *iod = op->customdata;
-	PointerRNA idptr;
 	Image *ima = NULL;
 	char filepath[FILE_MAX];
 	int frame_seq_len = 0;
@@ -1297,8 +1296,9 @@ static int image_open_exec(bContext *C, wmOperator *op)
 		 * pointer use also increases user, so this compensates it */
 		id_us_min(&ima->id);
 
-		RNA_id_pointer_create(&ima->id, &idptr);
-		RNA_property_pointer_set(&iod->pprop.ptr, iod->pprop.prop, idptr);
+		PointerRNA imaptr;
+		RNA_id_pointer_create(&ima->id, &imaptr);
+		RNA_property_pointer_set(&iod->pprop.ptr, iod->pprop.prop, imaptr);
 		RNA_property_update(C, &iod->pprop.ptr, iod->pprop.prop);
 	}
 
@@ -2382,6 +2382,30 @@ enum {
 	GEN_CONTEXT_PAINT_STENCIL = 2
 };
 
+typedef struct ImageNewData {
+	PropertyPointerRNA pprop;
+} ImageNewData;
+
+static ImageNewData *image_new_init(bContext *C, wmOperator *op)
+{
+	if (op->customdata) {
+		return op->customdata;
+	}
+
+	ImageNewData *data = MEM_callocN(sizeof(ImageNewData), __func__);
+	UI_context_active_but_prop_get_templateID(C, &data->pprop.ptr, &data->pprop.prop);
+	op->customdata = data;
+	return data;
+}
+
+static void image_new_free(wmOperator *op)
+{
+	if (op->customdata) {
+		MEM_freeN(op->customdata);
+		op->customdata = NULL;
+	}
+}
+
 static int image_new_exec(bContext *C, wmOperator *op)
 {
 	SpaceImage *sima;
@@ -2389,13 +2413,11 @@ static int image_new_exec(bContext *C, wmOperator *op)
 	Object *obedit;
 	Image *ima;
 	Main *bmain;
-	PointerRNA ptr, idptr;
 	PropertyRNA *prop;
 	char name_buffer[MAX_ID_NAME - 2];
 	const char *name;
 	float color[4];
 	int width, height, floatbuf, gen_type, alpha;
-	int gen_context;
 	int stereo3d;
 
 	/* retrieve state */
@@ -2419,7 +2441,6 @@ static int image_new_exec(bContext *C, wmOperator *op)
 	gen_type = RNA_enum_get(op->ptr, "generated_type");
 	RNA_float_get_array(op->ptr, "color", color);
 	alpha = RNA_boolean_get(op->ptr, "alpha");
-	gen_context = RNA_enum_get(op->ptr, "gen_context");
 	stereo3d = RNA_boolean_get(op->ptr, "use_stereo_3d");
 
 	if (!alpha)
@@ -2427,79 +2448,44 @@ static int image_new_exec(bContext *C, wmOperator *op)
 
 	ima = BKE_image_add_generated(bmain, width, height, name, alpha ? 32 : 24, floatbuf, gen_type, color, stereo3d);
 
-	if (!ima)
+	if (!ima) {
+		image_new_free(op);
 		return OPERATOR_CANCELLED;
+	}
 
 	/* hook into UI */
-	UI_context_active_but_prop_get_templateID(C, &ptr, &prop);
+	ImageNewData *data = image_new_init(C, op);
 
-	if (prop) {
+	if (data->pprop.prop) {
 		/* when creating new ID blocks, use is already 1, but RNA
 		 * pointer use also increases user, so this compensates it */
 		id_us_min(&ima->id);
 
-		RNA_id_pointer_create(&ima->id, &idptr);
-		RNA_property_pointer_set(&ptr, prop, idptr);
-		RNA_property_update(C, &ptr, prop);
+		PointerRNA imaptr;
+		RNA_id_pointer_create(&ima->id, &imaptr);
+		RNA_property_pointer_set(&data->pprop.ptr, data->pprop.prop, imaptr);
+		RNA_property_update(C, &data->pprop.ptr, data->pprop.prop);
 	}
 	else if (sima) {
 		ED_space_image_set(bmain, sima, scene, obedit, ima);
 	}
-	else if (gen_context == GEN_CONTEXT_PAINT_CANVAS) {
-		bScreen *sc;
-		Object *ob = CTX_data_active_object(C);
-
-		if (scene->toolsettings->imapaint.canvas)
-			id_us_min(&scene->toolsettings->imapaint.canvas->id);
-		scene->toolsettings->imapaint.canvas = ima;
-
-		for (sc = bmain->screen.first; sc; sc = sc->id.next) {
-			ScrArea *sa;
-			for (sa = sc->areabase.first; sa; sa = sa->next) {
-				SpaceLink *sl;
-				for (sl = sa->spacedata.first; sl; sl = sl->next) {
-					if (sl->spacetype == SPACE_IMAGE) {
-						SpaceImage *sima_other = (SpaceImage *)sl;
-
-						if (!sima_other->pin) {
-							ED_space_image_set(bmain, sima_other, scene, obedit, ima);
-						}
-					}
-				}
-			}
-		}
-		BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
-		WM_event_add_notifier(C, NC_SCENE | ND_TOOLSETTINGS, NULL);
-	}
-	else if (gen_context == GEN_CONTEXT_PAINT_STENCIL) {
-		Object *ob = CTX_data_active_object(C);
-		if (scene->toolsettings->imapaint.stencil)
-			id_us_min(&scene->toolsettings->imapaint.stencil->id);
-		scene->toolsettings->imapaint.stencil = ima;
-		BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
-		WM_event_add_notifier(C, NC_SCENE | ND_TOOLSETTINGS, NULL);
-	}
-	else {
-		Tex *tex = CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data;
-		if (tex && tex->type == TEX_IMAGE) {
-			if (tex->ima)
-				id_us_min(&tex->ima->id);
-			tex->ima = ima;
-			ED_area_tag_redraw(CTX_wm_area(C));
-		}
-	}
 
 	BKE_image_signal(bmain, ima, (sima) ? &sima->iuser : NULL, IMA_SIGNAL_USER_NEW_IMAGE);
 
 	WM_event_add_notifier(C, NC_IMAGE | NA_ADDED, ima);
 
+	image_new_free(op);
+
 	return OPERATOR_FINISHED;
 }
 
-/* XXX, Ton is not a fan of OK buttons but using this function to avoid undo/redo bug while in mesh-editmode, - campbell */
-/* XXX Note: the WM_operator_props_dialog_popup() doesn't work for UI_context_active_but_prop_get_templateID(), image is not being that way */
 static int image_new_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
 {
+	/* Get property in advance, it doesn't work after WM_operator_props_dialog_popup. */
+	ImageNewData *data;
+	op->customdata = data = MEM_callocN(sizeof(ImageNewData), __func__);
+	UI_context_active_but_prop_get_templateID(C, &data->pprop.ptr, &data->pprop.prop);
+
 	/* Better for user feedback. */
 	RNA_string_set(op->ptr, "name", DATA_(IMA_DEF_NAME));
 	return WM_operator_props_dialog_popup(C, op, 15 * UI_UNIT_X, 5 * UI_UNIT_Y);
@@ -2552,18 +2538,16 @@ static void image_new_draw(bContext *UNUSED(C), wmOperator *op)
 #endif
 }
 
+static void image_new_cancel(bContext *UNUSED(C), wmOperator *op)
+{
+	image_new_free(op);
+}
+
 void IMAGE_OT_new(wmOperatorType *ot)
 {
 	PropertyRNA *prop;
 	static float default_color[4] = {0.0f, 0.0f, 0.0f, 1.0f};
 
-	static const EnumPropertyItem gen_context_items[] = {
-		{GEN_CONTEXT_NONE, "NONE", 0, "None", ""},
-		{GEN_CONTEXT_PAINT_CANVAS, "PAINT_CANVAS", 0, "Paint Canvas", ""},
-		{GEN_CONTEXT_PAINT_STENCIL, "PAINT_STENCIL", 0, "Paint Stencil", ""},
-		{0, NULL, 0, NULL, NULL}
-	};
-
 	/* identifiers */
 	ot->name = "New Image";
 	ot->description = "Create a new image";
@@ -2573,6 +2557,7 @@ void IMAGE_OT_new(wmOperatorType *ot)
 	ot->exec = image_new_exec;
 	ot->invoke = image_new_invoke;
 	ot->ui = image_new_draw;
+	ot->cancel = image_new_cancel;
 
 	/* flags */
 	ot->flag = OPTYPE_UNDO;
@@ -2590,7 +2575,6 @@ void IMAGE_OT_new(wmOperatorType *ot)
 	RNA_def_enum(ot->srna, "generated_type", rna_enum_image_generated_type_items, IMA_GENTYPE_BLANK,
 	             "Generated Type", "Fill the image with a grid for UV map testing");
 	RNA_def_boolean(ot->srna, "float", 0, "32 bit Float", "Create image with 32 bit floating point bit depth");
-	prop = RNA_def_enum(ot->srna, "gen_context", gen_context_items, 0, "Gen Context", "Generation context");
 	RNA_def_property_flag(prop, PROP_HIDDEN);
 	prop = RNA_def_boolean(ot->srna, "use_stereo_3d", 0, "Stereo 3D", "Create an image with left and right views");
 	RNA_def_property_flag(prop, PROP_SKIP_SAVE | PROP_HIDDEN);



More information about the Bf-blender-cvs mailing list