Commit: ca5a429cad0cd701e491e544db8405c17b28c97a Author: Richard Antalik Date: Wed Mar 9 19:22:12 2022 +0100 Branches: temp-vse-channels-edge-panning https://developer.blender.org/rBca5a429cad0cd701e491e544db8405c17b28c97a
Add limiting option for edge panning. Perhaps v2d->min and max could be used, but in sequencer content is displayed beyond this boundary, so will have to check if I can do it so it is consistent with current behavior. =================================================================== M source/blender/editors/include/UI_view2d.h M source/blender/editors/interface/view2d_edge_pan.c M source/blender/editors/transform/transform_convert_node.c M source/blender/editors/transform/transform_convert_sequencer.c =================================================================== diff --git a/source/blender/editors/include/UI_view2d.h b/source/blender/editors/include/UI_view2d.h index b69d3008f1d..3f8ec4b5481 100644 --- a/source/blender/editors/include/UI_view2d.h +++ b/source/blender/editors/include/UI_view2d.h @@ -447,6 +447,8 @@ typedef struct View2DEdgePanData { struct ARegion *region; /** View2d we're operating in. */ struct View2D *v2d; + /* Limit maximum pannable area */ + struct rctf limit; /** Panning should only start once being in the inside rect once (e.g. adding nodes can happen * outside). */ @@ -491,6 +493,11 @@ void UI_view2d_edge_pan_init(struct bContext *C, float max_speed, float delay, float zoom_influence); +/** + * Set area which can be panned + */ +void UI_view2d_edge_pan_set_limits( + struct View2DEdgePanData *vpd, float xmin, float xmax, float ymin, float ymax); void UI_view2d_edge_pan_reset(struct View2DEdgePanData *vpd); diff --git a/source/blender/editors/interface/view2d_edge_pan.c b/source/blender/editors/interface/view2d_edge_pan.c index 1f54fd6f669..0d9378b600b 100644 --- a/source/blender/editors/interface/view2d_edge_pan.c +++ b/source/blender/editors/interface/view2d_edge_pan.c @@ -67,6 +67,7 @@ void UI_view2d_edge_pan_init(bContext *C, vpd->area = CTX_wm_area(C); vpd->region = CTX_wm_region(C); vpd->v2d = &vpd->region->v2d; + BLI_rctf_init(&vpd->limit, -FLT_MAX, FLT_MAX, -FLT_MAX, FLT_MAX); BLI_assert(speed_ramp > 0.0f); vpd->inside_pad = inside_pad; @@ -87,6 +88,12 @@ void UI_view2d_edge_pan_init(bContext *C, UI_view2d_edge_pan_reset(vpd); } +void UI_view2d_edge_pan_set_limits( + View2DEdgePanData *vpd, float xmin, float xmax, float ymin, float ymax) +{ + BLI_rctf_init(&vpd->limit, xmin, xmax, ymin, ymax); +} + void UI_view2d_edge_pan_reset(View2DEdgePanData *vpd) { vpd->edge_pan_start_time_x = 0.0; @@ -220,20 +227,23 @@ void UI_view2d_edge_pan_apply(bContext *C, View2DEdgePanData *vpd, const int xy[ vpd->enabled = true; } + rctf *cur = &vpd->v2d->cur; + rctf *limit = &vpd->limit; + int pan_dir_x = 0; int pan_dir_y = 0; if (vpd->enabled && ((vpd->outside_pad == 0) || BLI_rcti_isect_pt_v(&outside_rect, xy))) { /* Find whether the mouse is beyond X and Y edges. */ - if (xy[0] > inside_rect.xmax) { + if (xy[0] > inside_rect.xmax && cur->xmax < limit->xmax) { pan_dir_x = 1; } - else if (xy[0] < inside_rect.xmin) { + else if (xy[0] < inside_rect.xmin && cur->xmin > limit->xmin) { pan_dir_x = -1; } - if (xy[1] > inside_rect.ymax) { + if (xy[1] > inside_rect.ymax && cur->ymax < limit->ymax) { pan_dir_y = 1; } - else if (xy[1] < inside_rect.ymin) { + else if (xy[1] < inside_rect.ymin && cur->ymin > limit->ymin) { pan_dir_y = -1; } } diff --git a/source/blender/editors/transform/transform_convert_node.c b/source/blender/editors/transform/transform_convert_node.c index 7a4b03b640c..df49f893927 100644 --- a/source/blender/editors/transform/transform_convert_node.c +++ b/source/blender/editors/transform/transform_convert_node.c @@ -98,12 +98,12 @@ void createTransNodeData(TransInfo *t) View2DEdgePanData *customdata = MEM_callocN(sizeof(*customdata), __func__); UI_view2d_edge_pan_init(t->context, customdata, - NODE_EDGE_PAN_INSIDE_PAD, - NODE_EDGE_PAN_OUTSIDE_PAD, - NODE_EDGE_PAN_SPEED_RAMP, - NODE_EDGE_PAN_MAX_SPEED, - NODE_EDGE_PAN_DELAY, - NODE_EDGE_PAN_ZOOM_INFLUENCE); + SEQ_EDGE_PAN_INSIDE_PAD, + SEQ_EDGE_PAN_OUTSIDE_PAD, + SEQ_EDGE_PAN_SPEED_RAMP, + SEQ_EDGE_PAN_MAX_SPEED, + SEQ_EDGE_PAN_DELAY, + SEQ_EDGE_PAN_ZOOM_INFLUENCE); t->custom.type.data = customdata; t->custom.type.use_free = true; diff --git a/source/blender/editors/transform/transform_convert_sequencer.c b/source/blender/editors/transform/transform_convert_sequencer.c index 04ed1bb08d3..273ebac79c0 100644 --- a/source/blender/editors/transform/transform_convert_sequencer.c +++ b/source/blender/editors/transform/transform_convert_sequencer.c @@ -34,6 +34,13 @@ #include "transform.h" #include "transform_convert.h" +#define SEQ_EDGE_PAN_INSIDE_PAD 2 +#define SEQ_EDGE_PAN_OUTSIDE_PAD 0 /* Disable clamping for panning, use whole screen. */ +#define SEQ_EDGE_PAN_SPEED_RAMP 1 +#define SEQ_EDGE_PAN_MAX_SPEED 40 /* In UI units per second, slower than default. */ +#define SEQ_EDGE_PAN_DELAY 1.0f +#define SEQ_EDGE_PAN_ZOOM_INFLUENCE 0.5f + /** Used for sequencer transform. */ typedef struct TransDataSeq { struct Sequence *seq; @@ -615,13 +622,6 @@ static void freeSeqData(TransInfo *t, TransDataContainer *tc, TransCustomData *c free_transform_custom_data(custom_data); } -#define NODE_EDGE_PAN_INSIDE_PAD 2 -#define NODE_EDGE_PAN_OUTSIDE_PAD 0 /* Disable clamping for node panning, use whole screen. */ -#define NODE_EDGE_PAN_SPEED_RAMP 1 -#define NODE_EDGE_PAN_MAX_SPEED 40 /* In UI units per second, slower than default. */ -#define NODE_EDGE_PAN_DELAY 1.0f -#define NODE_EDGE_PAN_ZOOM_INFLUENCE 0.5f - void createTransSeqData(TransInfo *t) { #define XXX_DURIAN_ANIM_TX_HACK @@ -689,12 +689,13 @@ void createTransSeqData(TransInfo *t) /* Custom data to enable edge panning during transformation. */ UI_view2d_edge_pan_init(t->context, &ts->edge_pan, - NODE_EDGE_PAN_INSIDE_PAD, - NODE_EDGE_PAN_OUTSIDE_PAD, - NODE_EDGE_PAN_SPEED_RAMP, - NODE_EDGE_PAN_MAX_SPEED, - NODE_EDGE_PAN_DELAY, - NODE_EDGE_PAN_ZOOM_INFLUENCE); + SEQ_EDGE_PAN_INSIDE_PAD, + SEQ_EDGE_PAN_OUTSIDE_PAD, + SEQ_EDGE_PAN_SPEED_RAMP, + SEQ_EDGE_PAN_MAX_SPEED, + SEQ_EDGE_PAN_DELAY, + SEQ_EDGE_PAN_ZOOM_INFLUENCE); + UI_view2d_edge_pan_set_limits(&ts->edge_pan, -FLT_MAX, FLT_MAX, 1, MAXSEQ + 1); ts->initial_v2d_cur = t->region->v2d.cur; /* loop 2: build transdata array */ @@ -738,6 +739,10 @@ static void view2d_edge_pan_loc_compensate(TransInfo *t, float loc_in[2], float { TransSeq *ts = (TransSeq *)TRANS_DATA_CONTAINER_FIRST_SINGLE(t)->custom.type.data; + /* Initial and current view2D rects for additional transform due to view panning and zooming */ + const rctf *rect_src = &ts->initial_v2d_cur; + const rctf *rect_dst = &t->region->v2d.cur; + if (t->options & CTX_VIEW2D_EDGE_PAN) { SpaceSeq *sseq = CTX_wm_space_seq(t->context); sseq->flag |= SPACE_SEQ_CLAMP_SMOOTH; @@ -755,10 +760,6 @@ static void view2d_edge_pan_loc_compensate(TransInfo *t, float loc_in[2], float } } - /* Initial and current view2D rects for additional transform due to view panning and zooming */ - const rctf *rect_src = &ts->initial_v2d_cur; - const rctf *rect_dst = &t->region->v2d.cur; - copy_v2_v2(r_loc, loc_in); /* Additional offset due to change in view2D rect. */ BLI_rctf_transform_pt_v(rect_dst, rect_src, r_loc, r_loc); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs