diff options
author | Joseph Eagar <joeedh@gmail.com> | 2009-08-06 13:56:14 +0400 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2009-08-06 13:56:14 +0400 |
commit | 38de6d14e4e7a55a4109313942df3ae9211b1aeb (patch) | |
tree | 83288d248bc7a4794b8b34e607f3e319e905b381 /source/blender/editors/screen | |
parent | 416a3bf4a14a951642cace5ee8033c4c20dd9f66 (diff) | |
parent | 1e4fb484001994f4e164aab7b44c9578df59f67d (diff) |
merge with 2.5 (not trunk, last merge message said that on accident) at r22252
Diffstat (limited to 'source/blender/editors/screen')
-rw-r--r-- | source/blender/editors/screen/area.c | 61 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_context.c | 23 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_edit.c | 40 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_intern.h | 1 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_ops.c | 351 | ||||
-rw-r--r-- | source/blender/editors/screen/screendump.c | 4 |
6 files changed, 359 insertions, 121 deletions
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index cdb4322d7f2..79ba11a5c55 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -330,7 +330,7 @@ void ED_region_do_draw(bContext *C, ARegion *ar) glClear(GL_COLOR_BUFFER_BIT); UI_ThemeColor(TH_TEXT); - BLF_draw_default(20, 6, 0.0f, ar->headerstr); + BLF_draw_default(20, 8, 0.0f, ar->headerstr); } else if(at->draw) { at->draw(C, ar); @@ -910,13 +910,6 @@ void area_copy_data(ScrArea *sa1, ScrArea *sa2, int swap_space) ARegion *newar= BKE_area_region_copy(st, ar); BLI_addtail(&sa1->regionbase, newar); } - -#ifndef DISABLE_PYTHON - /* scripts */ - BPY_free_scriptlink(&sa1->scriptlink); - sa1->scriptlink= sa2->scriptlink; - BPY_copy_scriptlink(&sa1->scriptlink); /* copies internal pointers */ -#endif } /* *********** Space switching code *********** */ @@ -1063,7 +1056,7 @@ static char *windowtype_pup(void) "|Video Sequence Editor %x8" //143 "|Timeline %x15" //163 - "|Audio Window %x11" //163 + // "|Audio Window %x11" //163 "|Text Editor %x9" //179 "|%l" //192 @@ -1080,7 +1073,7 @@ static char *windowtype_pup(void) "|%l" //293 - "|Scripts Window %x14"//313 + // "|Scripts Window %x14"//313 "|Console %x18" ); } @@ -1092,7 +1085,7 @@ static void spacefunc(struct bContext *C, void *arg1, void *arg2) } /* returns offset for next button in header */ -int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco) +int ED_area_header_switchbutton(const bContext *C, uiBlock *block, int yco) { ScrArea *sa= CTX_wm_area(C); uiBut *but; @@ -1105,9 +1098,18 @@ int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco) "Click for menu of available types."); uiButSetFunc(but, spacefunc, NULL, NULL); - xco += XIC + 14; + return xco + XIC + 14; +} + +int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco) +{ + ScrArea *sa= CTX_wm_area(C); + int xco= 8; + xco= ED_area_header_switchbutton(C, block, yco); + uiBlockSetEmboss(block, UI_EMBOSSN); + if (sa->flag & HEADER_NO_PULLDOWN) { uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, 0, ICON_DISCLOSURE_TRI_RIGHT, @@ -1122,16 +1124,15 @@ int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco) &(sa->flag), 0, 0, 0, 0, "Hide pulldown menus"); } - xco+=XIC; - + uiBlockSetEmboss(block, UI_EMBOSS); - return xco; + return xco + XIC; } /************************ standard UI regions ************************/ -void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *context) +void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *context, int contextnr) { ScrArea *sa= CTX_wm_area(C); uiStyle *style= U.uistyles.first; @@ -1141,7 +1142,10 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex View2D *v2d= &ar->v2d; View2DScrollers *scrollers; float col[3]; - int xco, yco, x, y, miny=0, w, em, header, triangle, open; + int xco, yco, x, y, miny=0, w, em, header, triangle, open, newcontext= 0; + + if(contextnr >= 0) + newcontext= UI_view2d_tab_set(v2d, contextnr); if(vertical) { w= v2d->cur.xmax - v2d->cur.xmin; @@ -1241,22 +1245,27 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex /* before setting the view */ if(vertical) { - v2d->keepofs |= V2D_LOCKOFS_X; - v2d->keepofs &= ~V2D_LOCKOFS_Y; + v2d->keepofs |= V2D_LOCKOFS_X|V2D_KEEPOFS_Y; + v2d->keepofs &= ~(V2D_LOCKOFS_Y|V2D_KEEPOFS_X); // don't jump back when panels close or hide - y= MAX2(-y, -v2d->cur.ymin); + if(!newcontext) + y= MAX2(-y, -v2d->cur.ymin); + else + y= -y; } else { - v2d->keepofs &= ~V2D_LOCKOFS_X; - v2d->keepofs |= V2D_LOCKOFS_Y; - + v2d->keepofs |= V2D_LOCKOFS_Y|V2D_KEEPOFS_X; + v2d->keepofs &= ~(V2D_LOCKOFS_X|V2D_KEEPOFS_Y); + // don't jump back when panels close or hide - x= MAX2(x, v2d->cur.xmax); + if(!newcontext) + x= MAX2(x, v2d->cur.xmax); y= -y; } - UI_view2d_totRect_set(v2d, x, y); + // +V2D_SCROLL_HEIGHT is workaround to set the actual height + UI_view2d_totRect_set(v2d, x+V2D_SCROLL_WIDTH, y+V2D_SCROLL_HEIGHT); /* set the view */ UI_view2d_view_ortho(C, v2d); @@ -1280,6 +1289,8 @@ void ED_region_panels_init(wmWindowManager *wm, ARegion *ar) // XXX quick hacks for files saved with 2.5 already (i.e. the builtin defaults file) // scrollbars for button regions ar->v2d.scroll |= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM); + ar->v2d.keepzoom |= V2D_KEEPZOOM; + // correctly initialised User-Prefs? if(!(ar->v2d.align & V2D_ALIGN_NO_POS_Y)) ar->v2d.flag &= ~V2D_IS_INITIALISED; diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c index 19750833b4d..3842dd3d62f 100644 --- a/source/blender/editors/screen/screen_context.c +++ b/source/blender/editors/screen/screen_context.c @@ -50,7 +50,8 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult "scene", "selected_objects", "selected_bases", "selected_editable_objects", "selected_editable_bases" "active_base", "active_object", "edit_object", - "sculpt_object", "vpaint_object", "wpaint_object", NULL}; + "sculpt_object", "vertex_paint_object", "weight_paint_object", + "texture_paint_object", "brush", "particle_edit_object", NULL}; CTX_data_dir_set(result, dir); return 1; @@ -93,7 +94,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult } else if(CTX_data_equals(member, "active_base")) { if(scene->basact) - CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, &scene->basact); + CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, scene->basact); return 1; } @@ -116,19 +117,31 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult return 1; } - else if(CTX_data_equals(member, "vpaint_object")) { + else if(CTX_data_equals(member, "vertex_paint_object")) { if(G.f & G_VERTEXPAINT && scene->basact) CTX_data_id_pointer_set(result, &scene->basact->object->id); return 1; } - else if(CTX_data_equals(member, "wpaint_object")) { + else if(CTX_data_equals(member, "weight_paint_object")) { if(G.f & G_WEIGHTPAINT && scene->basact) CTX_data_id_pointer_set(result, &scene->basact->object->id); return 1; } - + else if(CTX_data_equals(member, "texture_paint_object")) { + if(G.f & G_TEXTUREPAINT && scene->basact) + CTX_data_id_pointer_set(result, &scene->basact->object->id); + + return 1; + } + else if(CTX_data_equals(member, "particle_edit_object")) { + if(G.f & G_PARTICLEEDIT && scene->basact) + CTX_data_id_pointer_set(result, &scene->basact->object->id); + + return 1; + } + return 0; } diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index e7a61514010..926768c98ab 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -54,6 +54,7 @@ #include "ED_screen.h" #include "ED_screen_types.h" +/* XXX actually should be not here... solve later */ #include "wm_subwindow.h" #include "screen_intern.h" /* own module include */ @@ -404,7 +405,7 @@ ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac /* empty screen, with 1 dummy area without spacedata */ /* uses window size */ -bScreen *screen_add(wmWindow *win, Scene *scene, char *name) +bScreen *ED_screen_add(wmWindow *win, Scene *scene, char *name) { bScreen *sc; ScrVert *sv1, *sv2, *sv3, *sv4; @@ -465,7 +466,6 @@ static void screen_copy(bScreen *to, bScreen *from) sa->spacedata.first= sa->spacedata.last= NULL; sa->regionbase.first= sa->regionbase.last= NULL; sa->actionzones.first= sa->actionzones.last= NULL; - sa->scriptlink.totscript= 0; area_copy_data(sa, saf, 0); } @@ -603,21 +603,6 @@ void select_connected_scredge(bScreen *sc, ScrEdge *edge) } } -/* helper call for below, correct buttons view */ -static void screen_test_scale_region(ListBase *regionbase, float facx, float facy) -{ - ARegion *ar; - - for(ar= regionbase->first; ar; ar= ar->next) { - if(ar->regiontype==RGN_TYPE_WINDOW) { - ar->v2d.cur.xmin *= facx; - ar->v2d.cur.xmax *= facx; - ar->v2d.cur.ymin *= facy; - ar->v2d.cur.ymax *= facy; - } - } -} - /* test if screen vertices should be scaled */ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey) { @@ -668,19 +653,6 @@ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey) CLAMP(sv->vec.y, 0, winsizey); } - - /* keep buttons view2d same size */ - for(sa= sc->areabase.first; sa; sa= sa->next) { - SpaceLink *sl; - - if(sa->spacetype==SPACE_BUTS) - screen_test_scale_region(&sa->regionbase, facx, facy); - - for(sl= sa->spacedata.first; sl; sl= sl->next) - if(sl->spacetype==SPACE_BUTS) - screen_test_scale_region(&sl->regionbase, facx, facy); - } - } /* test for collapsed areas. This could happen in some blender version... */ @@ -948,7 +920,7 @@ bScreen *ED_screen_duplicate(wmWindow *win, bScreen *sc) if(sc->full != SCREENNORMAL) return NULL; /* XXX handle this case! */ /* make new empty screen: */ - newsc= screen_add(win, sc->scene, sc->id.name+2); + newsc= ED_screen_add(win, sc->scene, sc->id.name+2); /* copy all data */ screen_copy(newsc, sc); /* set in window */ @@ -1369,8 +1341,6 @@ void ED_screen_set_scene(bContext *C, Scene *scene) ED_update_for_newframe(C, 1); -// set_radglobal(); - /* complete redraw */ WM_event_add_notifier(C, NC_WINDOW, NULL); @@ -1435,7 +1405,7 @@ void ed_screen_fullarea(bContext *C, ScrArea *sa) oldscreen->full = SCREENFULL; - sc= screen_add(CTX_wm_window(C), CTX_data_scene(C), "temp"); + sc= ED_screen_add(CTX_wm_window(C), CTX_data_scene(C), "temp"); sc->full = SCREENFULL; // XXX /* timer */ @@ -1507,7 +1477,7 @@ void ED_screen_animation_timer(bContext *C, int redraws, int enable) screen->animtimer= WM_event_add_window_timer(win, TIMER0, (1.0/FPS)); sad->ar= CTX_wm_region(C); sad->redraws= redraws; - sad->reverse= (enable < 0); + sad->flag= (enable < 0) ? ANIMPLAY_FLAG_REVERSE : 0; screen->animtimer->customdata= sad; } diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h index a0804f3e633..2b3a816f8de 100644 --- a/source/blender/editors/screen/screen_intern.h +++ b/source/blender/editors/screen/screen_intern.h @@ -36,7 +36,6 @@ struct Scene; void area_copy_data (ScrArea *sa1, ScrArea *sa2, int swap_space); /* screen_edit.c */ -bScreen *screen_add(struct wmWindow *win, struct Scene *scene, char *name); ScrEdge *screen_findedge(bScreen *sc, ScrVert *v1, ScrVert *v2); ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac); int screen_area_join(bContext *C, bScreen* scr, ScrArea *sa1, ScrArea *sa2); diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index b6204b25b6d..57fd96c8b39 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -31,6 +31,7 @@ #include "BLI_arithb.h" #include "BLI_blenlib.h" #include "BLI_editVert.h" +#include "BLI_dlrbTree.h" #include "DNA_armature_types.h" #include "DNA_image_types.h" @@ -39,6 +40,7 @@ #include "DNA_mesh_types.h" #include "DNA_curve_types.h" #include "DNA_scene_types.h" +#include "DNA_meta_types.h" #include "BKE_blender.h" #include "BKE_colortools.h" @@ -64,6 +66,7 @@ #include "ED_mesh.h" #include "ED_object.h" #include "ED_screen_types.h" +#include "ED_keyframes_draw.h" #include "RE_pipeline.h" #include "IMB_imbuf.h" @@ -75,6 +78,8 @@ #include "UI_interface.h" #include "UI_resources.h" +#include "wm_window.h" + #include "screen_intern.h" /* own module include */ #define KM_MODAL_CANCEL 1 @@ -165,11 +170,11 @@ int ED_operator_buttons_active(bContext *C) int ED_operator_node_active(bContext *C) { - if(ed_spacetype_test(C, SPACE_NODE)) { - SpaceNode *snode= (SpaceNode *)CTX_wm_space_data(C); - if(snode->edittree) - return 1; - } + SpaceNode *snode= CTX_wm_space_node(C); + + if(snode && snode->edittree) + return 1; + return 0; } @@ -300,6 +305,14 @@ int ED_operator_editlattice(bContext *C) return 0; } +int ED_operator_editmball(bContext *C) +{ + Object *obedit= CTX_data_edit_object(C); + if(obedit && obedit->type==OB_MBALL) + return NULL != ((MetaBall *)obedit->data)->editelems; + return 0; +} + /* *************************** action zone operator ************************** */ /* operator state vars used: @@ -493,7 +506,7 @@ static int actionzone_modal(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_RUNNING_MODAL; } -void SCREEN_OT_actionzone(wmOperatorType *ot) +static void SCREEN_OT_actionzone(wmOperatorType *ot) { /* identifiers */ ot->name= "Handle area action zones"; @@ -659,7 +672,7 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, wmEvent *event) newwin= WM_window_open(C, &rect); /* allocs new screen and adds to newly created window, using window size */ - newsc= screen_add(newwin, CTX_data_scene(C), sc->id.name+2); + newsc= ED_screen_add(newwin, CTX_data_scene(C), sc->id.name+2); newwin->screen= newsc; /* copy area to new screen */ @@ -912,7 +925,7 @@ static int area_move_modal(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_RUNNING_MODAL; } -void SCREEN_OT_area_move(wmOperatorType *ot) +static void SCREEN_OT_area_move(wmOperatorType *ot) { /* identifiers */ ot->name= "Move area edges"; @@ -1228,7 +1241,7 @@ static EnumPropertyItem prop_direction_items[] = { {'v', "VERTICAL", 0, "Vertical", ""}, {0, NULL, 0, NULL, NULL}}; -void SCREEN_OT_area_split(wmOperatorType *ot) +static void SCREEN_OT_area_split(wmOperatorType *ot) { ot->name = "Split area"; ot->idname = "SCREEN_OT_area_split"; @@ -1362,7 +1375,6 @@ static void SCREEN_OT_region_scale(wmOperatorType *ot) /* ************** frame change operator ***************************** */ - /* function to be called outside UI context, or for redo */ static int frame_offset_exec(bContext *C, wmOperator *op) { @@ -1377,7 +1389,7 @@ static int frame_offset_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_frame_offset(wmOperatorType *ot) +static void SCREEN_OT_frame_offset(wmOperatorType *ot) { ot->name = "Frame Offset"; ot->idname = "SCREEN_OT_frame_offset"; @@ -1391,6 +1403,124 @@ void SCREEN_OT_frame_offset(wmOperatorType *ot) RNA_def_int(ot->srna, "delta", 0, INT_MIN, INT_MAX, "Delta", "", INT_MIN, INT_MAX); } + +/* function to be called outside UI context, or for redo */ +static int frame_jump_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + + if (RNA_boolean_get(op->ptr, "end")) + CFRA= PEFRA; + else + CFRA= PSFRA; + + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); + + return OPERATOR_FINISHED; +} + +static void SCREEN_OT_frame_jump(wmOperatorType *ot) +{ + ot->name = "Jump to Endpoint"; + ot->idname = "SCREEN_OT_frame_jump"; + + ot->exec= frame_jump_exec; + + ot->poll= ED_operator_screenactive; + ot->flag= 0; + + /* rna */ + RNA_def_boolean(ot->srna, "end", 0, "Last Frame", "Jump to the last frame of the frame range."); +} + + +/* ************** jump to keyframe operator ***************************** */ + +/* helper function - find actkeycolumn that occurs on cframe, or the nearest one if not found */ +// TODO: make this an API func? +static ActKeyColumn *cfra_find_nearest_next_ak (ActKeyColumn *ak, float cframe, short next) +{ + ActKeyColumn *akn= NULL; + + /* sanity checks */ + if (ak == NULL) + return NULL; + + /* check if this is a match, or whether it is in some subtree */ + if (cframe < ak->cfra) + akn= cfra_find_nearest_next_ak(ak->left, cframe, next); + else if (cframe > ak->cfra) + akn= cfra_find_nearest_next_ak(ak->right, cframe, next); + + /* if no match found (or found match), just use the current one */ + if (akn == NULL) + return ak; + else + return akn; +} + +/* function to be called outside UI context, or for redo */ +static int keyframe_jump_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_active_object(C); + DLRBT_Tree keys; + ActKeyColumn *ak; + short next= RNA_boolean_get(op->ptr, "next"); + + /* sanity checks */ + if (scene == NULL) + return OPERATOR_CANCELLED; + + /* init binarytree-list for getting keyframes */ + BLI_dlrbTree_init(&keys); + + /* populate tree with keyframe nodes */ + if (scene && scene->adt) + scene_to_keylist(NULL, scene, &keys, NULL); + if (ob && ob->adt) + ob_to_keylist(NULL, ob, &keys, NULL); + + /* build linked-list for searching */ + BLI_dlrbTree_linkedlist_sync(&keys); + + /* find nearest keyframe in the right direction */ + ak= cfra_find_nearest_next_ak(keys.root, (float)scene->r.cfra, next); + + /* set the new frame (if keyframe found) */ + if (ak) { + if (next && ak->next) + scene->r.cfra= (int)ak->next->cfra; + else if (!next && ak->prev) + scene->r.cfra= (int)ak->prev->cfra; + else { + printf("ERROR: no suitable keyframe found. Using %f as new frame \n", ak->cfra); + scene->r.cfra= (int)ak->cfra; // XXX + } + } + + /* free temp stuff */ + BLI_dlrbTree_free(&keys); + + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, CTX_data_scene(C)); + + return OPERATOR_FINISHED; +} + +static void SCREEN_OT_keyframe_jump(wmOperatorType *ot) +{ + ot->name = "Jump to Keyframe"; + ot->idname = "SCREEN_OT_keyframe_jump"; + + ot->exec= keyframe_jump_exec; + + ot->poll= ED_operator_screenactive; + ot->flag= 0; + + /* rna */ + RNA_def_boolean(ot->srna, "next", 1, "Next Keyframe", ""); +} + /* ************** switch screen operator ***************************** */ @@ -1433,7 +1563,7 @@ static int screen_set_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } -void SCREEN_OT_screen_set(wmOperatorType *ot) +static void SCREEN_OT_screen_set(wmOperatorType *ot) { ot->name = "Set Screen"; ot->idname = "SCREEN_OT_screen_set"; @@ -1456,7 +1586,7 @@ static int screen_full_area_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_screen_full_area(wmOperatorType *ot) +static void SCREEN_OT_screen_full_area(wmOperatorType *ot) { ot->name = "Toggle Make Area Fullscreen"; ot->idname = "SCREEN_OT_screen_full_area"; @@ -1728,7 +1858,7 @@ static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event) } /* Operator for joining two areas (space types) */ -void SCREEN_OT_area_join(wmOperatorType *ot) +static void SCREEN_OT_area_join(wmOperatorType *ot) { /* identifiers */ ot->name= "Join area"; @@ -1761,7 +1891,7 @@ static int repeat_last_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } -void SCREEN_OT_repeat_last(wmOperatorType *ot) +static void SCREEN_OT_repeat_last(wmOperatorType *ot) { /* identifiers */ ot->name= "Repeat Last"; @@ -1813,7 +1943,7 @@ static int repeat_history_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_repeat_history(wmOperatorType *ot) +static void SCREEN_OT_repeat_history(wmOperatorType *ot) { /* identifiers */ ot->name= "Repeat History"; @@ -1846,7 +1976,7 @@ static int redo_last_invoke(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_CANCELLED; } -void SCREEN_OT_redo_last(wmOperatorType *ot) +static void SCREEN_OT_redo_last(wmOperatorType *ot) { /* identifiers */ ot->name= "Redo Last"; @@ -1889,7 +2019,7 @@ static int region_split_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_region_split(wmOperatorType *ot) +static void SCREEN_OT_region_split(wmOperatorType *ot) { /* identifiers */ ot->name= "Split Region"; @@ -1978,7 +2108,7 @@ static int region_foursplit_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_region_foursplit(wmOperatorType *ot) +static void SCREEN_OT_region_foursplit(wmOperatorType *ot) { /* identifiers */ ot->name= "Split Region in 4 Parts"; @@ -2016,7 +2146,7 @@ static int region_flip_exec(bContext *C, wmOperator *op) } -void SCREEN_OT_region_flip(wmOperatorType *ot) +static void SCREEN_OT_region_flip(wmOperatorType *ot) { /* identifiers */ ot->name= "Flip Region"; @@ -2090,39 +2220,50 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event) if(scene->audio.flag & AUDIO_SYNC) { int step = floor(wt->duration * FPS); - if (sad->reverse) // XXX does this option work with audio? + if (sad->flag & ANIMPLAY_FLAG_REVERSE) // XXX does this option work with audio? scene->r.cfra -= step; else scene->r.cfra += step; wt->duration -= ((float)step)/FPS; } else { - if (sad->reverse) + if (sad->flag & ANIMPLAY_FLAG_REVERSE) scene->r.cfra--; else scene->r.cfra++; } - if (sad->reverse) { - /* jump back to end */ + /* reset 'jumped' flag before checking if we need to jump... */ + sad->flag &= ~ANIMPLAY_FLAG_JUMPED; + + if (sad->flag & ANIMPLAY_FLAG_REVERSE) { + /* jump back to end? */ if (scene->r.psfra) { - if(scene->r.cfra < scene->r.psfra) + if (scene->r.cfra < scene->r.psfra) { scene->r.cfra= scene->r.pefra; + sad->flag |= ANIMPLAY_FLAG_JUMPED; + } } else { - if(scene->r.cfra < scene->r.sfra) + if (scene->r.cfra < scene->r.sfra) { scene->r.cfra= scene->r.efra; + sad->flag |= ANIMPLAY_FLAG_JUMPED; + } } } else { - /* jump back to start */ + /* jump back to start? */ if (scene->r.psfra) { - if(scene->r.cfra > scene->r.pefra) + if (scene->r.cfra > scene->r.pefra) { scene->r.cfra= scene->r.psfra; + sad->flag |= ANIMPLAY_FLAG_JUMPED; + } } else { - if(scene->r.cfra > scene->r.efra) + if (scene->r.cfra > scene->r.efra) { scene->r.cfra= scene->r.sfra; + sad->flag |= ANIMPLAY_FLAG_JUMPED; + } } } @@ -2162,6 +2303,10 @@ static void SCREEN_OT_animation_step(wmOperatorType *ot) /* ****************** anim player, starts or ends timer ***************** */ +/* helper for screen_animation_play() - only to be used for TimeLine */ +// NOTE: defined in time_header.c for now... +extern ARegion *time_top_left_3dwindow(bScreen *screen); + /* toggle operator */ static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event) { @@ -2171,22 +2316,39 @@ static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event) ED_screen_animation_timer(C, 0, 0); } else { + ScrArea *sa= CTX_wm_area(C); int mode= (RNA_boolean_get(op->ptr, "reverse")) ? -1 : 1; - ED_screen_animation_timer(C, TIME_REGION|TIME_ALL_3D_WIN, mode); - - if(screen->animtimer) { - wmTimer *wt= screen->animtimer; - ScreenAnimData *sad= wt->customdata; + /* timeline gets special treatment since it has it's own menu for determining redraws */ + if ((sa) && (sa->spacetype == SPACE_TIME)) { + SpaceTime *stime= (SpaceTime *)sa->spacedata.first; + + ED_screen_animation_timer(C, stime->redraws, mode); - sad->ar= CTX_wm_region(C); + /* update region if TIME_REGION was set, to leftmost 3d window */ + if(screen->animtimer && (stime->redraws & TIME_REGION)) { + wmTimer *wt= screen->animtimer; + ScreenAnimData *sad= wt->customdata; + + sad->ar= time_top_left_3dwindow(screen); + } + } + else { + ED_screen_animation_timer(C, TIME_REGION|TIME_ALL_3D_WIN, mode); + + if(screen->animtimer) { + wmTimer *wt= screen->animtimer; + ScreenAnimData *sad= wt->customdata; + + sad->ar= CTX_wm_region(C); + } } } return OPERATOR_FINISHED; } -void SCREEN_OT_animation_play(wmOperatorType *ot) +static void SCREEN_OT_animation_play(wmOperatorType *ot) { /* identifiers */ ot->name= "Animation player"; @@ -2235,7 +2397,7 @@ static int border_select_do(bContext *C, wmOperator *op) return 1; } -void SCREEN_OT_border_select(wmOperatorType *ot) +static void SCREEN_OT_border_select(wmOperatorType *ot) { /* identifiers */ ot->name= "Border select"; @@ -2362,13 +2524,36 @@ static ScrArea *find_empty_image_area(bContext *C) } #endif // XXX not used -static void screen_set_image_output(bContext *C) +/* new window uses x,y to set position */ +static void screen_set_image_output(bContext *C, int mx, int my) { Scene *scene= CTX_data_scene(C); ScrArea *sa; SpaceImage *sima; - if(scene->r.displaymode==R_OUTPUT_SCREEN) { + if(scene->r.displaymode==R_OUTPUT_WINDOW) { + rcti rect; + int sizex, sizey; + + sizex= 10 + (scene->r.xsch*scene->r.size)/100; + sizey= 40 + (scene->r.ysch*scene->r.size)/100; + + /* arbitrary... miniature image window views don't make much sense */ + if(sizex < 320) sizex= 320; + if(sizey < 256) sizey= 256; + + /* XXX some magic to calculate postition */ + rect.xmin= mx + CTX_wm_window(C)->posx - sizex/2; + rect.ymin= my + CTX_wm_window(C)->posy - sizey/2; + rect.xmax= rect.xmin + sizex; + rect.ymax= rect.ymin + sizey; + + /* changes context! */ + WM_window_open_temp(C, &rect, WM_WINDOW_RENDER); + + sa= CTX_wm_area(C); + } + else if(scene->r.displaymode==R_OUTPUT_SCREEN) { /* this function returns with changed context */ ED_screen_full_newspace(C, CTX_wm_area(C), SPACE_IMAGE); sa= CTX_wm_area(C); @@ -2428,7 +2613,7 @@ static int screen_render_exec(bContext *C, wmOperator *op) } RE_test_break_cb(re, NULL, (int (*)(void *)) blender_test_break); - if(RNA_boolean_get(op->ptr, "anim")) + if(RNA_boolean_get(op->ptr, "animation")) RE_BlenderAnim(re, scene, scene->r.sfra, scene->r.efra, scene->frame_step); else RE_BlenderFrame(re, scene, scene->r.cfra); @@ -2701,13 +2886,13 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) // store spare /* ensure at least 1 area shows result */ - screen_set_image_output(C); + screen_set_image_output(C, event->x, event->y); /* job custom data */ rj= MEM_callocN(sizeof(RenderJob), "render job"); rj->scene= scene; rj->win= CTX_wm_window(C); - rj->anim= RNA_boolean_get(op->ptr, "anim"); + rj->anim= RNA_boolean_get(op->ptr, "animation"); rj->iuser.scene= scene; rj->iuser.ok= 1; @@ -2749,7 +2934,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) /* contextual render, using current scene, view3d? */ -void SCREEN_OT_render(wmOperatorType *ot) +static void SCREEN_OT_render(wmOperatorType *ot) { /* identifiers */ ot->name= "Render"; @@ -2763,7 +2948,7 @@ void SCREEN_OT_render(wmOperatorType *ot) ot->poll= ED_operator_screenactive; RNA_def_int(ot->srna, "layers", 0, 0, INT_MAX, "Layers", "", 0, INT_MAX); - RNA_def_boolean(ot->srna, "anim", 0, "Animation", ""); + RNA_def_boolean(ot->srna, "animation", 0, "Animation", ""); } /* *********************** cancel render viewer *************** */ @@ -2773,7 +2958,12 @@ static int render_view_cancel_exec(bContext *C, wmOperator *unused) ScrArea *sa= CTX_wm_area(C); SpaceImage *sima= sa->spacedata.first; - if(sima->flag & SI_PREVSPACE) { + /* test if we have a temp screen in front */ + if(CTX_wm_window(C)->screen->full==SCREENTEMP) { + wm_window_lower(CTX_wm_window(C)); + } + /* determine if render already shows */ + else if(sima->flag & SI_PREVSPACE) { sima->flag &= ~SI_PREVSPACE; if(sima->flag & SI_FULLWINDOW) { @@ -2791,7 +2981,7 @@ static int render_view_cancel_exec(bContext *C, wmOperator *unused) return OPERATOR_FINISHED; } -void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot) +static void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot) { /* identifiers */ ot->name= "Cancel Render View"; @@ -2804,12 +2994,16 @@ void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot) /* *********************** show render viewer *************** */ -static int render_view_show_exec(bContext *C, wmOperator *unused) +static int render_view_show_invoke(bContext *C, wmOperator *unused, wmEvent *event) { ScrArea *sa= find_area_showing_r_result(C); - + + /* test if we have a temp screen in front */ + if(CTX_wm_window(C)->screen->full==SCREENTEMP) { + wm_window_lower(CTX_wm_window(C)); + } /* determine if render already shows */ - if(sa) { + else if(sa) { SpaceImage *sima= sa->spacedata.first; if(sima->flag & SI_PREVSPACE) { @@ -2826,20 +3020,58 @@ static int render_view_show_exec(bContext *C, wmOperator *unused) } } else { - screen_set_image_output(C); + screen_set_image_output(C, event->x, event->y); } return OPERATOR_FINISHED; } -void SCREEN_OT_render_view_show(struct wmOperatorType *ot) +static void SCREEN_OT_render_view_show(struct wmOperatorType *ot) { /* identifiers */ ot->name= "Show/Hide Render View"; ot->idname= "SCREEN_OT_render_view_show"; /* api callbacks */ - ot->exec= render_view_show_exec; + ot->invoke= render_view_show_invoke; + ot->poll= ED_operator_screenactive; +} + +/* *********** show user pref window ****** */ + +static int userpref_show_invoke(bContext *C, wmOperator *unused, wmEvent *event) +{ + ScrArea *sa; + rcti rect; + int sizex, sizey; + + sizex= 800; + sizey= 480; + + /* some magic to calculate postition */ + rect.xmin= event->x + CTX_wm_window(C)->posx - sizex/2; + rect.ymin= event->y + CTX_wm_window(C)->posy - sizey/2; + rect.xmax= rect.xmin + sizex; + rect.ymax= rect.ymin + sizey; + + /* changes context! */ + WM_window_open_temp(C, &rect, WM_WINDOW_USERPREFS); + + sa= CTX_wm_area(C); + + + return OPERATOR_FINISHED; +} + + +static void SCREEN_OT_userpref_show(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Show/Hide User Preferences"; + ot->idname= "SCREEN_OT_userpref_show"; + + /* api callbacks */ + ot->invoke= userpref_show_invoke; ot->poll= ED_operator_screenactive; } @@ -2870,9 +3102,13 @@ void ED_operatortypes_screen(void) WM_operatortype_append(SCREEN_OT_screen_full_area); WM_operatortype_append(SCREEN_OT_screenshot); WM_operatortype_append(SCREEN_OT_screencast); + WM_operatortype_append(SCREEN_OT_userpref_show); /*frame changes*/ WM_operatortype_append(SCREEN_OT_frame_offset); + WM_operatortype_append(SCREEN_OT_frame_jump); + WM_operatortype_append(SCREEN_OT_keyframe_jump); + WM_operatortype_append(SCREEN_OT_animation_step); WM_operatortype_append(SCREEN_OT_animation_play); @@ -2940,7 +3176,6 @@ void ED_keymap_screen(wmWindowManager *wm) RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_screen_set", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "delta", -1); WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", UPARROWKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", DOWNARROWKEY, KM_PRESS, KM_CTRL, 0); - WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", SPACEKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "SCREEN_OT_screenshot", F3KEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "SCREEN_OT_screencast", F3KEY, KM_PRESS, KM_ALT, 0); @@ -2968,9 +3203,13 @@ void ED_keymap_screen(wmWindowManager *wm) /* render */ WM_keymap_add_item(keymap, "SCREEN_OT_render", F12KEY, KM_PRESS, 0, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_render", F12KEY, KM_PRESS, KM_CTRL, 0)->ptr, "animation", 1); WM_keymap_add_item(keymap, "SCREEN_OT_render_view_cancel", ESCKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SCREEN_OT_render_view_show", F11KEY, KM_PRESS, 0, 0); + /* user prefs */ + WM_keymap_add_item(keymap, "SCREEN_OT_userpref_show", UKEY, KM_PRESS, KM_ALT, 0); + /* Anim Playback ------------------------------------------------ */ keymap= WM_keymap_listbase(wm, "Frames", 0, 0); @@ -2980,6 +3219,12 @@ void ED_keymap_screen(wmWindowManager *wm) RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", -1); RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", RIGHTARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", 1); + WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", UPARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 1); + + WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", PAGEUPKEY, KM_PRESS, KM_CTRL, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", PAGEDOWNKEY, KM_PRESS, KM_CTRL, 0)->ptr, "next", 0); + /* play (forward and backwards) */ WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT, 0); RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "reverse", 1); diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c index 81da74217ec..2ae2712d02d 100644 --- a/source/blender/editors/screen/screendump.c +++ b/source/blender/editors/screen/screendump.c @@ -173,7 +173,7 @@ void SCREEN_OT_screenshot(wmOperatorType *ot) ot->flag= 0; - RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH); + WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE); RNA_def_boolean(ot->srna, "full", 1, "Full Screen", ""); } @@ -242,7 +242,7 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update) if(sj->dumprect) { if(mh) { - mh->append_movie(&rd, cfra, sj->dumprect, sj->dumpsx, sj->dumpsy); + mh->append_movie(&rd, cfra, (int *)sj->dumprect, sj->dumpsx, sj->dumpsy); printf("Append frame %d\n", cfra); } else { |