Cleanup: remove generation context from image new operator.

This commit is contained in:
Brecht Van Lommel 2018-07-03 12:18:06 +02:00
parent b4ccec6742
commit 72a051f957
2 changed files with 53 additions and 76 deletions

@ -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")

@ -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);