[Bf-blender-cvs] [acbea27dd81] temp-vse-channels-edge-panning: Use v2d edge panning as node editor does

Richard Antalik noreply at git.blender.org
Wed Mar 9 18:10:51 CET 2022


Commit: acbea27dd81f592f0baa7ea41e2e0687295a1283
Author: Richard Antalik
Date:   Tue Mar 8 19:44:11 2022 +0100
Branches: temp-vse-channels-edge-panning
https://developer.blender.org/rBacbea27dd81f592f0baa7ea41e2e0687295a1283

Use v2d edge panning as node editor does

===================================================================

M	release/scripts/presets/keyconfig/keymap_data/blender_default.py
M	source/blender/blenloader/intern/versioning_300.c
M	source/blender/editors/transform/transform_convert_sequencer.c
M	source/blender/editors/transform/transform_ops.c

===================================================================

diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index 94454ad50e8..ccc093ee46d 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -2849,8 +2849,10 @@ def km_sequencer(params):
         ("sequencer.slip", {"type": 'S', "value": 'PRESS'}, None),
         ("wm.context_set_int", {"type": 'O', "value": 'PRESS'},
          {"properties": [("data_path", 'scene.sequence_editor.overlay_frame'), ("value", 0)]}),
-        ("transform.seq_slide", {"type": 'G', "value": 'PRESS'}, None),
-        ("transform.seq_slide", {"type": params.select_mouse, "value": 'CLICK_DRAG'}, None),
+        ("transform.seq_slide", {"type": 'G', "value": 'PRESS'},
+         {"properties": [("view2d_edge_pan", True)]}),
+        ("transform.seq_slide", {"type": params.select_mouse, "value": 'CLICK_DRAG'},
+         {"properties": [("view2d_edge_pan", True)]}),
         ("transform.transform", {"type": 'E', "value": 'PRESS'},
          {"properties": [("mode", 'TIME_EXTEND')]}),
         ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
diff --git a/source/blender/blenloader/intern/versioning_300.c b/source/blender/blenloader/intern/versioning_300.c
index 2a840ea585a..5269f58fb94 100644
--- a/source/blender/blenloader/intern/versioning_300.c
+++ b/source/blender/blenloader/intern/versioning_300.c
@@ -2567,6 +2567,31 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
     }
   }
 
+  if (!MAIN_VERSION_ATLEAST(bmain, 302, 5)) {
+    /* Sequencer channels region. */
+    for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) {
+      LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
+        LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
+          if (sl->spacetype != SPACE_SEQ) {
+            continue;
+          }
+          if (ELEM(((SpaceSeq *)sl)->view, SEQ_VIEW_PREVIEW, SEQ_VIEW_SEQUENCE_PREVIEW)) {
+            continue;
+          }
+
+          ARegion *timeline_region = BKE_area_find_region_type(area, RGN_TYPE_WINDOW);
+
+          if (timeline_region == NULL) {
+            continue;
+          }
+
+          timeline_region->v2d.cur.ymax = 8.5f;
+          timeline_region->v2d.align &= ~V2D_ALIGN_NO_NEG_Y;
+        }
+      }
+    }
+  }
+
   /**
    * Versioning code until next subversion bump goes here.
    *
diff --git a/source/blender/editors/transform/transform_convert_sequencer.c b/source/blender/editors/transform/transform_convert_sequencer.c
index 513d45ef4bf..91ff696b31b 100644
--- a/source/blender/editors/transform/transform_convert_sequencer.c
+++ b/source/blender/editors/transform/transform_convert_sequencer.c
@@ -53,6 +53,10 @@ typedef struct TransSeq {
   TransDataSeq *tdseq;
   int selection_channel_range_min;
   int selection_channel_range_max;
+
+  /* Initial rect of the view2d, used for computing offset during edge panning */
+  rctf initial_v2d_cur;
+  View2DEdgePanData edge_pan;
 } TransSeq;
 
 /* -------------------------------------------------------------------- */
@@ -610,6 +614,13 @@ 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
@@ -630,6 +641,11 @@ void createTransSeqData(TransInfo *t)
     return;
   }
 
+  /* Disable cursor wrapping for edge pan. */
+  if (t->mode == TFM_TRANSLATION) {
+    t->flag |= T_NO_CURSOR_WRAP;
+  }
+
   tc->custom.type.free_cb = freeSeqData;
   t->frame_side = transform_convert_frame_side_dir_get(t, (float)CFRA);
 
@@ -669,6 +685,17 @@ void createTransSeqData(TransInfo *t)
   td2d = tc->data_2d = MEM_callocN(tc->data_len * sizeof(TransData2D), "TransSeq TransData2D");
   ts->tdseq = tdsq = MEM_callocN(tc->data_len * sizeof(TransDataSeq), "TransSeq TransDataSeq");
 
+  /* 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);
+  ts->initial_v2d_cur = t->region->v2d.cur;
+
   /* loop 2: build transdata array */
   SeqToTransData_build(t, ed->seqbasep, td, td2d, tdsq);
 
@@ -708,6 +735,26 @@ BLI_INLINE void trans_update_seq(Scene *sce, Sequence *seq, int old_start, int s
 
 static void flushTransSeq(TransInfo *t)
 {
+  TransSeq *ts = (TransSeq *)TRANS_DATA_CONTAINER_FIRST_SINGLE(t)->custom.type.data;
+
+  if (t->options & CTX_VIEW2D_EDGE_PAN) {
+    if (t->state == TRANS_CANCEL) {
+      UI_view2d_edge_pan_cancel(t->context, &ts->edge_pan);
+    }
+    else {
+      /* Edge panning functions expect window coordinates, mval is relative to region */
+      const int xy[2] = {
+          t->region->winrct.xmin + t->mval[0],
+          t->region->winrct.ymin + t->mval[1],
+      };
+      UI_view2d_edge_pan_apply(t->context, &ts->edge_pan, xy);
+    }
+  }
+
+  /* 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;
+
   /* Editing null check already done */
   ListBase *seqbasep = seqbase_active_get(t);
 
@@ -723,7 +770,13 @@ static void flushTransSeq(TransInfo *t)
   for (a = 0, td = tc->data, td2d = tc->data_2d; a < tc->data_len; a++, td++, td2d++) {
     tdsq = (TransDataSeq *)td->extra;
     seq = tdsq->seq;
-    new_frame = round_fl_to_int(td2d->loc[0]);
+
+    float loc[2];
+    copy_v2_v2(loc, td2d->loc);
+    /* additional offset due to change in view2D rect */
+    BLI_rctf_transform_pt_v(rect_dst, rect_src, loc, loc);
+
+    new_frame = round_fl_to_int(loc[0]);
 
     switch (tdsq->sel_flag) {
       case SELECT:
@@ -731,7 +784,7 @@ static void flushTransSeq(TransInfo *t)
           const int offset = new_frame - tdsq->start_offset - seq->start;
           SEQ_transform_translate_sequence(t->scene, seq, offset);
         }
-        seq->machine = round_fl_to_int(td2d->loc[1]);
+        seq->machine = round_fl_to_int(loc[1]);
         CLAMP(seq->machine, 1, MAXSEQ);
         break;
 
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index 936aca7d2e0..20ac63e93f1 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -1255,7 +1255,7 @@ static void TRANSFORM_OT_seq_slide(struct wmOperatorType *ot)
 
   WM_operatortype_props_advanced_begin(ot);
 
-  Transform_Properties(ot, P_SNAP);
+  Transform_Properties(ot, P_SNAP | P_VIEW2D_EDGE_PAN);
 }
 
 static void TRANSFORM_OT_rotate_normal(struct wmOperatorType *ot)



More information about the Bf-blender-cvs mailing list