diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 2 | ||||
-rw-r--r-- | source/blender/editors/interface/interface.c | 14 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_ops.c | 197 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 8 |
4 files changed, 122 insertions, 99 deletions
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index f6d604bdec7..685bef4fdc1 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -443,7 +443,7 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, sho rect= (unsigned char*)ibuf->rect; } - strcpy(ibuf->name, "Untitled"); + strcpy(ibuf->name, "//Untitled"); ibuf->userflags |= IB_BITMAPDIRTY; if (uvtestgrid) { diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index f6a5086773a..d1c4447f215 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -593,9 +593,19 @@ void uiEndBlock(const bContext *C, uiBlock *block) * on matching buttons, we need this to make button event handling non * blocking, while still alowing buttons to be remade each redraw as it * is expected by blender code */ - for(but=block->buttons.first; but; but=but->next) + for(but=block->buttons.first; but; but=but->next) { if(ui_but_update_from_old_block(C, block, but)) ui_check_but(but); + + /* temp? Proper check for greying out */ + if(but->opname) { + wmOperatorType *ot= WM_operatortype_find(but->opname); + if(ot==NULL || ot->poll((bContext *)C)==0) { + but->flag |= UI_BUT_DISABLED; + but->lock = 1; + } + } + } if(block->oldblock) { block->auto_open= block->oldblock->auto_open; @@ -607,7 +617,7 @@ void uiEndBlock(const bContext *C, uiBlock *block) /* handle pending stuff */ if(block->flag & UI_BLOCK_LOOP) ui_menu_block_set_keymaps(C, block); - + /* after keymaps! */ if(block->dobounds == 1) ui_bounds_block(block); else if(block->dobounds == 2) ui_text_bounds_block(block, 0.0f); diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index edbb960785d..0652196842c 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -107,13 +107,28 @@ static void sima_zoom_set_factor(SpaceImage *sima, ARegion *ar, float zoomfac) sima_zoom_set(sima, ar, sima->zoom*zoomfac); } -int space_image_poll(bContext *C) +static int space_image_poll(bContext *C) { - SpaceLink *slink= CTX_wm_space_data(C); + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + if(sima && sima->spacetype==SPACE_IMAGE) + if(ED_space_image_buffer(sima)) + return 1; + return 0; +} - return (slink && (slink->spacetype == SPACE_IMAGE)); +static int space_image_file_exists_poll(bContext *C) +{ + if(space_image_poll(C)) { + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + ImBuf *ibuf= ED_space_image_buffer(sima); + + if(ibuf && BLI_exists(ibuf->name) && BLI_is_writable(ibuf->name)) + return 1; + } + return 0; } + int space_image_main_area_poll(bContext *C) { SpaceLink *slink= CTX_wm_space_data(C); @@ -602,9 +617,9 @@ static int open_exec(bContext *C, wmOperator *op) Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); Image *ima= NULL; - char *str; + char str[FILE_MAX]; - str= RNA_string_get_alloc(op->ptr, "filename", NULL, 0); + RNA_string_get(op->ptr, "filename", str); ima= BKE_add_image_file(str, scene->r.cfra); MEM_freeN(str); @@ -639,13 +654,13 @@ void IMAGE_OT_open(wmOperatorType *ot) /* api callbacks */ ot->exec= open_exec; ot->invoke= open_invoke; - ot->poll= space_image_poll; + ot->poll= ED_operator_image_active; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "File path of image to open."); + RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path of image to open."); } /******************** replace image operator ********************/ @@ -653,14 +668,13 @@ void IMAGE_OT_open(wmOperatorType *ot) static int replace_exec(bContext *C, wmOperator *op) { SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); - char *str; + char str[FILE_MAX]; if(!sima->image) return OPERATOR_CANCELLED; - str= RNA_string_get_alloc(op->ptr, "filename", NULL, 0); + RNA_string_get(op->ptr, "filename", str); BLI_strncpy(sima->image->name, str, sizeof(sima->image->name)-1); /* we cant do much if the str is longer then 240 :/ */ - MEM_freeN(str); BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD); WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image); @@ -699,82 +713,77 @@ void IMAGE_OT_replace(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "File path of image to replace current image with."); + RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path of image to replace current image with."); } /******************** save image as operator ********************/ +/* assumes name is FILE_MAX */ +/* ima->name and ibuf->name should end up the same */ static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOperator *op, char *name) { Image *ima= ED_space_image(sima); ImBuf *ibuf= ED_space_image_buffer(sima); int len; - char str[FILE_MAXDIR+FILE_MAXFILE]; - if (ibuf) { - BLI_strncpy(str, name, sizeof(str)); - - BLI_convertstringcode(str, G.sce); - BLI_convertstringframe(str, scene->r.cfra); - + if (ibuf) { + BLI_convertstringcode(name, G.sce); + BLI_convertstringframe(name, scene->r.cfra); if(scene->r.scemode & R_EXTENSION) { - BKE_add_image_extension(scene, str, sima->imtypenr); + BKE_add_image_extension(scene, name, sima->imtypenr); BKE_add_image_extension(scene, name, sima->imtypenr); } - if(1) { // XXX saveover(str)) { - - /* enforce user setting for RGB or RGBA, but skip BW */ - if(scene->r.planes==32) - ibuf->depth= 32; - else if(scene->r.planes==24) - ibuf->depth= 24; - - WM_cursor_wait(1); - - if(sima->imtypenr==R_MULTILAYER) { - RenderResult *rr= BKE_image_get_renderresult(scene, ima); - if(rr) { - RE_WriteRenderResult(rr, str, scene->r.quality); - - BLI_strncpy(ima->name, name, sizeof(ima->name)); - BLI_strncpy(ibuf->name, str, sizeof(ibuf->name)); - - /* should be function? nevertheless, saving only happens here */ - for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next) - ibuf->userflags &= ~IB_BITMAPDIRTY; - - } - else - BKE_report(op->reports, RPT_ERROR, "Did not write, no Multilayer Image"); - } - else if (BKE_write_ibuf(scene, ibuf, str, sima->imtypenr, scene->r.subimtype, scene->r.quality)) { - BLI_strncpy(ima->name, name, sizeof(ima->name)); - BLI_strncpy(ibuf->name, str, sizeof(ibuf->name)); + /* enforce user setting for RGB or RGBA, but skip BW */ + if(scene->r.planes==32) + ibuf->depth= 32; + else if(scene->r.planes==24) + ibuf->depth= 24; + + WM_cursor_wait(1); + + if(sima->imtypenr==R_MULTILAYER) { + RenderResult *rr= BKE_image_get_renderresult(scene, ima); + if(rr) { + RE_WriteRenderResult(rr, name, scene->r.quality); - ibuf->userflags &= ~IB_BITMAPDIRTY; + BLI_strncpy(ima->name, name, sizeof(ima->name)); + BLI_strncpy(ibuf->name, name, sizeof(ibuf->name)); - /* change type? */ - if( ELEM(ima->source, IMA_SRC_GENERATED, IMA_SRC_VIEWER)) { - ima->source= IMA_SRC_FILE; - ima->type= IMA_TYPE_IMAGE; - } - if(ima->type==IMA_TYPE_R_RESULT) - ima->type= IMA_TYPE_IMAGE; + /* should be function? nevertheless, saving only happens here */ + for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next) + ibuf->userflags &= ~IB_BITMAPDIRTY; - /* name image as how we saved it */ - len= strlen(str); - while (len > 0 && str[len - 1] != '/' && str[len - 1] != '\\') len--; - rename_id(&ima->id, str+len); - } + } else - BKE_reportf(op->reports, RPT_ERROR, "Couldn't write image: %s", str); + BKE_report(op->reports, RPT_ERROR, "Did not write, no Multilayer Image"); + } + else if (BKE_write_ibuf(scene, ibuf, name, sima->imtypenr, scene->r.subimtype, scene->r.quality)) { + BLI_strncpy(ima->name, name, sizeof(ima->name)); + BLI_strncpy(ibuf->name, name, sizeof(ibuf->name)); + + ibuf->userflags &= ~IB_BITMAPDIRTY; + + /* change type? */ + if( ELEM(ima->source, IMA_SRC_GENERATED, IMA_SRC_VIEWER)) { + ima->source= IMA_SRC_FILE; + ima->type= IMA_TYPE_IMAGE; + } + if(ima->type==IMA_TYPE_R_RESULT) + ima->type= IMA_TYPE_IMAGE; + + /* name image as how we saved it */ + len= strlen(name); + while (len > 0 && name[len - 1] != '/' && name[len - 1] != '\\') len--; + rename_id(&ima->id, name+len); + } + else + BKE_reportf(op->reports, RPT_ERROR, "Couldn't write image: %s", name); - WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image); + WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image); - WM_cursor_wait(0); - } + WM_cursor_wait(0); } } @@ -783,14 +792,13 @@ static int save_as_exec(bContext *C, wmOperator *op) SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); Scene *scene= CTX_data_scene(C); Image *ima = ED_space_image(sima); - char *str; + char str[FILE_MAX]; if(!ima) return OPERATOR_CANCELLED; - str= RNA_string_get_alloc(op->ptr, "filename", NULL, 0); + RNA_string_get(op->ptr, "filename", str); save_image_doit(C, sima, scene, op, str); - MEM_freeN(str); return OPERATOR_FINISHED; } @@ -812,7 +820,7 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event) if(ibuf) { char *strp; - strp= filesel_imagetype_string(ima); + strp= filesel_imagetype_string(ima); // XXX unused still /* cant save multilayer sequence, ima->rr isn't valid for a specific frame */ if(ima->rr && !(ima->source==IMA_SRC_SEQUENCE && ima->type==IMA_TYPE_MULTILAYER)) @@ -822,11 +830,14 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event) else sima->imtypenr= BKE_ftype_to_imtype(ibuf->ftype); - // XXX activate_fileselect_menu(FILE_SPECIAL, "Save Image", name, strp, &sima->imtypenr, save_image_doit); - // XXX note: we can give default menu enums to operator for this + if(ibuf->name[0]==0) + BLI_strncpy(ibuf->name, G.ima, FILE_MAX); - image_filesel(C, op, ima->name); + // XXX note: we can give default menu enums to operator for this + image_filesel(C, op, ibuf->name); + MEM_freeN(strp); + return OPERATOR_RUNNING_MODAL; } @@ -848,7 +859,7 @@ void IMAGE_OT_save_as(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "File path to save image to."); + RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path to save image to."); } /******************** save image operator ********************/ @@ -859,28 +870,30 @@ static int save_exec(bContext *C, wmOperator *op) Image *ima = ED_space_image(sima); ImBuf *ibuf= ED_space_image_buffer(sima); Scene *scene= CTX_data_scene(C); - char name[FILE_MAXDIR+FILE_MAXFILE]; + char name[FILE_MAX]; - if(!ima) + if(!ima || !ibuf) return OPERATOR_CANCELLED; /* if exists, saves over without fileselect */ - - strcpy(name, ima->name); - - if(ibuf) { - if(BLI_exists(ibuf->name)) { - if(BKE_image_get_renderresult(scene, ima)) - sima->imtypenr= R_MULTILAYER; - else - sima->imtypenr= BKE_ftype_to_imtype(ibuf->ftype); - - save_image_doit(C, sima, scene, op, ibuf->name); - } - else - return save_as_exec(C, op); - } + BLI_strncpy(name, ibuf->name, FILE_MAX); + if(name[0]==0) + BLI_strncpy(name, G.ima, FILE_MAX); + + if(BLI_exists(name) && BLI_is_writable(name)) { + if(BKE_image_get_renderresult(scene, ima)) + sima->imtypenr= R_MULTILAYER; + else + sima->imtypenr= BKE_ftype_to_imtype(ibuf->ftype); + + save_image_doit(C, sima, scene, op, name); + } + else { + BKE_report(op->reports, RPT_ERROR, "Can not save image."); + return OPERATOR_CANCELLED; + } + return OPERATOR_FINISHED; } @@ -892,7 +905,7 @@ void IMAGE_OT_save(wmOperatorType *ot) /* api callbacks */ ot->exec= save_exec; - ot->poll= space_image_poll; + ot->poll= space_image_file_exists_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1050,7 +1063,7 @@ void IMAGE_OT_new(wmOperatorType *ot) /* api callbacks */ ot->exec= new_exec; - ot->poll= space_image_poll; + ot->poll= ED_operator_image_active; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 3729365694f..b310fb81216 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -357,7 +357,7 @@ static void untitled(char *name) } -static int wm_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event) +static int wm_open_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event) { RNA_string_set(op->ptr, "filename", G.sce); @@ -366,7 +366,7 @@ static int wm_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_RUNNING_MODAL; } -static int wm_mainfile_exec(bContext *C, wmOperator *op) +static int wm_open_mainfile_exec(bContext *C, wmOperator *op) { char filename[FILE_MAX]; RNA_string_get(op->ptr, "filename", filename); @@ -385,8 +385,8 @@ static void WM_OT_open_mainfile(wmOperatorType *ot) ot->name= "Open Blender File"; ot->idname= "WM_OT_open_mainfile"; - ot->invoke= wm_mainfile_invoke; - ot->exec= wm_mainfile_exec; + ot->invoke= wm_open_mainfile_invoke; + ot->exec= wm_open_mainfile_exec; ot->poll= WM_operator_winactive; ot->flag= 0; |