diff options
Diffstat (limited to 'source/blender/editors/screen/screen_ops.c')
-rw-r--r-- | source/blender/editors/screen/screen_ops.c | 256 |
1 files changed, 142 insertions, 114 deletions
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index b2243f2ccb9..fde1498bc5e 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -89,6 +89,8 @@ #include "UI_resources.h" #include "UI_view2d.h" +#include "GPU_extensions.h" + #include "screen_intern.h" /* own module include */ #define KM_MODAL_CANCEL 1 @@ -260,9 +262,7 @@ bool ED_operator_outliner_active_no_editobject(bContext *C) if (ob && ob == obedit) { return 0; } - else { - return 1; - } + return 1; } return 0; } @@ -362,23 +362,31 @@ bool ED_operator_object_active_editable(bContext *C) return ED_operator_object_active_editable_ex(C, ob); } +/** Object must be editable and fully local (i.e. not an override). */ +bool ED_operator_object_active_local_editable(bContext *C) +{ + Object *ob = ED_object_active_context(C); + return ED_operator_object_active_editable_ex(C, ob) && !ID_IS_OVERRIDE_LIBRARY(ob); +} + bool ED_operator_object_active_editable_mesh(bContext *C) { Object *ob = ED_object_active_context(C); return ((ob != NULL) && !ID_IS_LINKED(ob) && !ed_object_hidden(ob) && (ob->type == OB_MESH) && - !ID_IS_LINKED(ob->data)); + !ID_IS_LINKED(ob->data) && !ID_IS_OVERRIDE_LIBRARY(ob->data)); } bool ED_operator_object_active_editable_font(bContext *C) { Object *ob = ED_object_active_context(C); - return ((ob != NULL) && !ID_IS_LINKED(ob) && !ed_object_hidden(ob) && (ob->type == OB_FONT)); + return ((ob != NULL) && !ID_IS_LINKED(ob) && !ed_object_hidden(ob) && (ob->type == OB_FONT) && + !ID_IS_LINKED(ob->data) && !ID_IS_OVERRIDE_LIBRARY(ob->data)); } bool ED_operator_editable_mesh(bContext *C) { Mesh *mesh = ED_mesh_context(C); - return (mesh != NULL) && !ID_IS_LINKED(mesh); + return (mesh != NULL) && !ID_IS_LINKED(mesh) && !ID_IS_OVERRIDE_LIBRARY(mesh); } bool ED_operator_editmesh(bContext *C) @@ -761,10 +769,10 @@ static AZone *area_actionzone_refresh_xy(ScrArea *area, const int xy[2], const b if (az->type == AZONE_AREA) { break; } - else if (az->type == AZONE_REGION) { + if (az->type == AZONE_REGION) { break; } - else if (az->type == AZONE_FULLSCREEN) { + if (az->type == AZONE_FULLSCREEN) { rcti click_rect; fullscreen_click_rcti_init(&click_rect, az->x1, az->y1, az->x2, az->y2); const bool click_isect = BLI_rcti_isect_pt_v(&click_rect, xy); @@ -996,14 +1004,13 @@ static int actionzone_invoke(bContext *C, wmOperator *op, const wmEvent *event) actionzone_exit(op); return OPERATOR_FINISHED; } - else { - BLI_assert(ELEM(sad->az->type, AZONE_AREA, AZONE_REGION_SCROLL)); - /* add modal handler */ - G.moving |= G_TRANSFORM_WM; - WM_event_add_modal_handler(C, op); - return OPERATOR_RUNNING_MODAL; - } + BLI_assert(ELEM(sad->az->type, AZONE_AREA, AZONE_REGION_SCROLL)); + + /* add modal handler */ + G.moving |= G_TRANSFORM_WM; + WM_event_add_modal_handler(C, op); + return OPERATOR_RUNNING_MODAL; } static int actionzone_modal(bContext *C, wmOperator *op, const wmEvent *event) @@ -1391,9 +1398,7 @@ finally: if (newwin) { return OPERATOR_FINISHED; } - else { - return OPERATOR_CANCELLED; - } + return OPERATOR_CANCELLED; } static void SCREEN_OT_area_dupli(wmOperatorType *ot) @@ -1491,21 +1496,21 @@ static void area_move_set_limits(wmWindow *win, return; } /* top edge */ - else if ((area->v2->editflag && area->v3->editflag)) { + if ((area->v2->editflag && area->v3->editflag)) { *smaller = area->v1->vec.y + size_min; *bigger = area->v1->vec.y + size_max; *use_bigger_smaller_snap = true; return; } /* right edge */ - else if ((area->v3->editflag && area->v4->editflag)) { + if ((area->v3->editflag && area->v4->editflag)) { *smaller = area->v1->vec.x + size_min; *bigger = area->v1->vec.x + size_max; *use_bigger_smaller_snap = true; return; } /* lower edge */ - else if ((area->v4->editflag && area->v1->editflag)) { + if ((area->v4->editflag && area->v1->editflag)) { *smaller = area->v2->vec.y - size_max; *bigger = area->v2->vec.y - size_min; *use_bigger_smaller_snap = true; @@ -1761,7 +1766,7 @@ static void area_move_apply_do(const bContext *C, screen->do_refresh = true; redraw_all = true; } - ED_area_tag_redraw(area); + ED_area_tag_redraw_no_rebuild(area); } } if (redraw_all) { @@ -2045,13 +2050,13 @@ static ScrEdge *area_findsharededge(bScreen *screen, ScrArea *area, ScrArea *sb) if (sav1 == sbv4 && sav2 == sbv3) { /* area to right of sb = W */ return BKE_screen_find_edge(screen, sav1, sav2); } - else if (sav2 == sbv1 && sav3 == sbv4) { /* area to bottom of sb = N */ + if (sav2 == sbv1 && sav3 == sbv4) { /* area to bottom of sb = N */ return BKE_screen_find_edge(screen, sav2, sav3); } - else if (sav3 == sbv2 && sav4 == sbv1) { /* area to left of sb = E */ + if (sav3 == sbv2 && sav4 == sbv1) { /* area to left of sb = E */ return BKE_screen_find_edge(screen, sav3, sav4); } - else if (sav1 == sbv2 && sav4 == sbv3) { /* area on top of sb = S*/ + if (sav1 == sbv2 && sav4 == sbv3) { /* area on top of sb = S*/ return BKE_screen_find_edge(screen, sav1, sav4); } @@ -3027,15 +3032,14 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - else { - areas_do_frame_follow(C, true); - DEG_id_tag_update(&scene->id, ID_RECALC_AUDIO_SEEK); + areas_do_frame_follow(C, true); - WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene); + DEG_id_tag_update(&scene->id, ID_RECALC_AUDIO_SEEK); - return OPERATOR_FINISHED; - } + WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene); + + return OPERATOR_FINISHED; } static void SCREEN_OT_keyframe_jump(wmOperatorType *ot) @@ -3091,17 +3095,16 @@ static int marker_jump_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - else { - CFRA = closest; - areas_do_frame_follow(C, true); + CFRA = closest; - DEG_id_tag_update(&scene->id, ID_RECALC_AUDIO_SEEK); + areas_do_frame_follow(C, true); - WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene); + DEG_id_tag_update(&scene->id, ID_RECALC_AUDIO_SEEK); - return OPERATOR_FINISHED; - } + WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene); + + return OPERATOR_FINISHED; } static void SCREEN_OT_marker_jump(wmOperatorType *ot) @@ -3365,10 +3368,8 @@ static int area_join_invoke(bContext *C, wmOperator *op, const wmEvent *event) if (sad->sa1 == sad->sa2) { return OPERATOR_PASS_THROUGH; } - else { - if (!area_join_init(C, op, sad->sa1, sad->sa2)) { - return OPERATOR_CANCELLED; - } + if (!area_join_init(C, op, sad->sa1, sad->sa2)) { + return OPERATOR_CANCELLED; } } @@ -3676,9 +3677,7 @@ static int repeat_last_exec(bContext *C, wmOperator *UNUSED(op)) if (lastop->type->flag & OPTYPE_REGISTER) { break; } - else { - lastop = lastop->prev; - } + lastop = lastop->prev; } if (lastop) { @@ -4130,12 +4129,6 @@ static void SCREEN_OT_header_toggle_menus(wmOperatorType *ot) /** \name Region Context Menu Operator (Header/Footer/Navbar) * \{ */ -static bool screen_region_context_menu_poll(bContext *C) -{ - ScrArea *area = CTX_wm_area(C); - return (area && area->spacetype != SPACE_STATUSBAR); -} - void ED_screens_header_tools_menu_create(bContext *C, uiLayout *layout, void *UNUSED(arg)) { ScrArea *area = CTX_wm_area(C); @@ -4224,15 +4217,35 @@ void ED_screens_navigation_bar_tools_menu_create(bContext *C, uiLayout *layout, uiItemO(layout, but_flip_str, ICON_NONE, "SCREEN_OT_region_flip"); } +static void ed_screens_statusbar_menu_create(uiLayout *layout, void *UNUSED(arg)) +{ + PointerRNA ptr; + + RNA_pointer_create(NULL, &RNA_PreferencesView, &U, &ptr); + uiItemR(layout, &ptr, "show_statusbar_stats", 0, IFACE_("Scene Statistics"), ICON_NONE); + uiItemR(layout, &ptr, "show_statusbar_memory", 0, IFACE_("System Memory"), ICON_NONE); + if (GPU_mem_stats_supported()) { + uiItemR(layout, &ptr, "show_statusbar_vram", 0, IFACE_("Video Memory"), ICON_NONE); + } + uiItemR(layout, &ptr, "show_statusbar_version", 0, IFACE_("Blender Version"), ICON_NONE); +} + static int screen_context_menu_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event)) { uiPopupMenu *pup; uiLayout *layout; + const ScrArea *area = CTX_wm_area(C); const ARegion *region = CTX_wm_region(C); - if (ELEM(region->regiontype, RGN_TYPE_HEADER, RGN_TYPE_TOOL_HEADER)) { + if (area && area->spacetype == SPACE_STATUSBAR) { + pup = UI_popup_menu_begin(C, IFACE_("Status Bar"), ICON_NONE); + layout = UI_popup_menu_layout(pup); + ed_screens_statusbar_menu_create(layout, NULL); + UI_popup_menu_end(C, pup); + } + else if (ELEM(region->regiontype, RGN_TYPE_HEADER, RGN_TYPE_TOOL_HEADER)) { pup = UI_popup_menu_begin(C, IFACE_("Header"), ICON_NONE); layout = UI_popup_menu_layout(pup); ED_screens_header_tools_menu_create(C, layout, NULL); @@ -4262,7 +4275,6 @@ static void SCREEN_OT_region_context_menu(wmOperatorType *ot) ot->idname = "SCREEN_OT_region_context_menu"; /* api callbacks */ - ot->poll = screen_region_context_menu_poll; ot->invoke = screen_context_menu_invoke; } @@ -4273,68 +4285,67 @@ static void SCREEN_OT_region_context_menu(wmOperatorType *ot) * * Animation Step. * \{ */ +static bool screen_animation_region_supports_time_follow(eSpace_Type spacetype, + eRegionType regiontype) +{ + return (regiontype == RGN_TYPE_WINDOW && + ELEM(spacetype, SPACE_SEQ, SPACE_GRAPH, SPACE_ACTION, SPACE_NLA)) || + (spacetype == SPACE_CLIP && regiontype == RGN_TYPE_PREVIEW); +} -static int match_region_with_redraws(int spacetype, - int regiontype, - int redraws, - bool from_anim_edit) +static bool match_region_with_redraws(const ScrArea *area, + eRegionType regiontype, + eScreen_Redraws_Flag redraws, + bool from_anim_edit) { + const eSpace_Type spacetype = area->spacetype; if (regiontype == RGN_TYPE_WINDOW) { switch (spacetype) { case SPACE_VIEW3D: if ((redraws & TIME_ALL_3D_WIN) || from_anim_edit) { - return 1; + return true; } break; case SPACE_GRAPH: case SPACE_NLA: if ((redraws & TIME_ALL_ANIM_WIN) || from_anim_edit) { - return 1; + return true; } break; case SPACE_ACTION: /* if only 1 window or 3d windows, we do timeline too * NOTE: Now we do action editor in all these cases, since timeline is here. */ if ((redraws & (TIME_ALL_ANIM_WIN | TIME_REGION | TIME_ALL_3D_WIN)) || from_anim_edit) { - return 1; + return true; } break; case SPACE_PROPERTIES: if (redraws & TIME_ALL_BUTS_WIN) { - return 1; + return true; } break; case SPACE_SEQ: if ((redraws & (TIME_SEQ | TIME_ALL_ANIM_WIN)) || from_anim_edit) { - return 1; + return true; } break; case SPACE_NODE: - if (redraws & (TIME_NODES)) { - return 1; + if (redraws & TIME_NODES) { + return true; } break; case SPACE_IMAGE: if ((redraws & TIME_ALL_IMAGE_WIN) || from_anim_edit) { - return 1; + return true; } break; case SPACE_CLIP: if ((redraws & TIME_CLIPS) || from_anim_edit) { - return 1; + return true; } break; - } - } - else if (regiontype == RGN_TYPE_CHANNELS) { - switch (spacetype) { - case SPACE_GRAPH: - case SPACE_ACTION: - case SPACE_NLA: - if (redraws & TIME_ALL_ANIM_WIN) { - return 1; - } + default: break; } } @@ -4345,30 +4356,68 @@ static int match_region_with_redraws(int spacetype, * during playback, so asking people to enable special option * for this is a bit tricky, so add exception here for refreshing * Properties Editor for SpaceClip always */ - return 1; + return true; } if (redraws & TIME_ALL_BUTS_WIN) { - return 1; + return true; } } - else if (ELEM(regiontype, RGN_TYPE_HEADER, RGN_TYPE_TOOL_HEADER)) { + else if (regiontype == RGN_TYPE_HEADER) { if (spacetype == SPACE_ACTION) { - return 1; + /* The timeline shows the current frame in the header. Other headers + * don't need to be updated. */ + SpaceAction *saction = (SpaceAction *)area->spacedata.first; + return saction->mode == SACTCONT_TIMELINE; } } else if (regiontype == RGN_TYPE_PREVIEW) { switch (spacetype) { case SPACE_SEQ: if (redraws & (TIME_SEQ | TIME_ALL_ANIM_WIN)) { - return 1; + return true; } break; case SPACE_CLIP: - return 1; + return true; + default: + break; } } - return 0; + return false; +} + +static void screen_animation_region_tag_redraw(ScrArea *area, + ARegion *region, + const Scene *scene, + eScreen_Redraws_Flag redraws) +{ + /* Do follow time here if editor type supports it */ + if ((redraws & TIME_FOLLOW) && + (screen_animation_region_supports_time_follow(area->spacetype, region->regiontype))) { + float w = BLI_rctf_size_x(®ion->v2d.cur); + if (scene->r.cfra < region->v2d.cur.xmin) { + region->v2d.cur.xmax = scene->r.cfra; + region->v2d.cur.xmin = region->v2d.cur.xmax - w; + ED_region_tag_redraw(region); + return; + } + if (scene->r.cfra > region->v2d.cur.xmax) { + region->v2d.cur.xmin = scene->r.cfra; + region->v2d.cur.xmax = region->v2d.cur.xmin + w; + ED_region_tag_redraw(region); + return; + } + } + + /* No need to do a full redraw as the current frame indicator is only updated. + * We do need to redraw when this area is in full screen as no other areas + * will be tagged for redrawing. */ + if ((region->regiontype == RGN_TYPE_WINDOW) && + (ELEM(area->spacetype, SPACE_GRAPH, SPACE_NLA, SPACE_ACTION, SPACE_SEQ)) && !area->full) { + return; + } + ED_region_tag_redraw(region); } //#define PROFILE_AUDIO_SYNCH @@ -4409,7 +4458,8 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), const wmEv } if (scene_eval == NULL) { - /* Happens when undo/redo system is used during playback, nothing meaningful we can do here. + /* Happens when undo/redo system is used during playback, nothing meaningful we can do + * here. */ } else if (scene_eval->id.recalc & ID_RECALC_AUDIO_SEEK) { @@ -4549,28 +4599,12 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), const wmEv redraw = true; } else if (match_region_with_redraws( - area->spacetype, region->regiontype, sad->redraws, sad->from_anim_edit)) { + area, region->regiontype, sad->redraws, sad->from_anim_edit)) { redraw = true; } if (redraw) { - ED_region_tag_redraw(region); - /* do follow here if editor type supports it */ - if ((sad->redraws & TIME_FOLLOW)) { - if ((region->regiontype == RGN_TYPE_WINDOW && - ELEM(area->spacetype, SPACE_SEQ, SPACE_GRAPH, SPACE_ACTION, SPACE_NLA)) || - (area->spacetype == SPACE_CLIP && region->regiontype == RGN_TYPE_PREVIEW)) { - float w = BLI_rctf_size_x(®ion->v2d.cur); - if (scene->r.cfra < region->v2d.cur.xmin) { - region->v2d.cur.xmax = scene->r.cfra; - region->v2d.cur.xmin = region->v2d.cur.xmax - w; - } - else if (scene->r.cfra > region->v2d.cur.xmax) { - region->v2d.cur.xmin = scene->r.cfra; - region->v2d.cur.xmax = region->v2d.cur.xmin + w; - } - } - } + screen_animation_region_tag_redraw(area, region, scene, sad->redraws); } } } @@ -4893,10 +4927,8 @@ static int userpref_show_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } - else { - BKE_report(op->reports, RPT_ERROR, "Failed to open window!"); - return OPERATOR_CANCELLED; - } + BKE_report(op->reports, RPT_ERROR, "Failed to open window!"); + return OPERATOR_CANCELLED; } static void SCREEN_OT_userpref_show(struct wmOperatorType *ot) @@ -4971,10 +5003,8 @@ static int drivers_editor_show_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } - else { - BKE_report(op->reports, RPT_ERROR, "Failed to open window!"); - return OPERATOR_CANCELLED; - } + BKE_report(op->reports, RPT_ERROR, "Failed to open window!"); + return OPERATOR_CANCELLED; } static void SCREEN_OT_drivers_editor_show(struct wmOperatorType *ot) @@ -5015,10 +5045,8 @@ static int info_log_show_exec(bContext *C, wmOperator *op) false) != NULL) { return OPERATOR_FINISHED; } - else { - BKE_report(op->reports, RPT_ERROR, "Failed to open window!"); - return OPERATOR_CANCELLED; - } + BKE_report(op->reports, RPT_ERROR, "Failed to open window!"); + return OPERATOR_CANCELLED; } static void SCREEN_OT_info_log_show(struct wmOperatorType *ot) |