Revision: 18642
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18642
Author:   campbellbarton
Date:     2009-01-24 06:38:25 +0100 (Sat, 24 Jan 2009)

Log Message:
-----------
added back extend (Ekey) to sequener transform, works with nested metastrips 
too.

Modified Paths:
--------------
    
branches/blender2.5/blender/source/blender/editors/space_sequencer/sequencer_edit.c
    branches/blender2.5/blender/source/blender/editors/transform/transform.h
    
branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c
    branches/blender2.5/blender/source/blender/editors/transform/transform_ops.c

Modified: 
branches/blender2.5/blender/source/blender/editors/space_sequencer/sequencer_edit.c
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/space_sequencer/sequencer_edit.c
 2009-01-23 23:14:02 UTC (rev 18641)
+++ 
branches/blender2.5/blender/source/blender/editors/space_sequencer/sequencer_edit.c
 2009-01-24 05:38:25 UTC (rev 18642)
@@ -2336,7 +2336,6 @@
 
 static int sequencer_cut_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
-       Scene *scene= CTX_data_scene(C);
        ARegion *ar= CTX_wm_region(C);
        View2D *v2d= UI_view2d_fromcontext(C);
        

Modified: 
branches/blender2.5/blender/source/blender/editors/transform/transform.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/transform/transform.h    
2009-01-23 23:14:02 UTC (rev 18641)
+++ branches/blender2.5/blender/source/blender/editors/transform/transform.h    
2009-01-24 05:38:25 UTC (rev 18642)
@@ -154,6 +154,7 @@
 typedef struct TransDataSeq {
        struct Sequence *seq;
        int flag;               /* a copy of seq->flag that may be modified for 
nested strips */
+       short start_offset; /* use this so we can have transform data at the 
strips start, but apply correctly to the start frame  */
        short sel_flag; /* one of SELECT, SEQ_LEFTSEL and SEQ_RIGHTSEL */
        
 } TransDataSeq;
@@ -219,6 +220,7 @@
     short       imval[2];       /* initial mouse position               */
        short       idx_max;            /* maximum index on the input vector    
*/
        float           snap[3];                /* Snapping Gears               
                                */
+       char            frame_side;             /* Mouse side of the cfra, 'L', 
'R' or 'B' */
        
        float           viewmat[4][4];  /* copy from G.vd, prevents feedback,   
*/
        float           viewinv[4][4];  /* and to make sure we don't have to    
*/

Modified: 
branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c
        2009-01-23 23:14:02 UTC (rev 18641)
+++ 
branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c
        2009-01-24 05:38:25 UTC (rev 18642)
@@ -2324,15 +2324,10 @@
                seq= tdsq->seq;
                new_frame= (int)(td2d->loc[0] + 0.5f);
 
-               /* TODO, only use seq flags for non nested strips
-                * seq_tx_handle_xlimits used below is only correct when your 
not using metastrips.
-                * meta children should ignore those flags
-                */
-
                switch (tdsq->sel_flag) {
                case SELECT:
                        if (seq->type != SEQ_META) /* for meta's, their 
children move */
-                               seq->start= new_frame;
+                               seq->start= new_frame - tdsq->start_offset;
                        
                        if (seq->depth==0) {
                                seq->machine= (int)(td2d->loc[1] + 0.5f);
@@ -2364,6 +2359,17 @@
                }
                seq_prev= seq;
        }
+
+       if (t->mode == TFM_TIME_TRANSLATE) { /* originally TFM_TIME_EXTEND, 
transform changes */
+               /* Special annoying case here, need to calc metas with 
TFM_TIME_EXTEND only */
+               seq= ((Editing *)t->scene->ed)->seqbasep->first;
+
+               while(seq) {
+                       if (seq->type == SEQ_META && seq->flag & SELECT)
+                               calc_sequence(seq);
+                       seq= seq->next;
+               }
+       }
 }
 
 /* ********************* UV ****************** */
@@ -3050,7 +3056,7 @@
                float xmouse, ymouse;
                
                UI_view2d_region_to_view(&ac.ar->v2d, t->imval[0], t->imval[1], 
&xmouse, &ymouse);
-               side = (xmouse > CFRA) ? 'R' : 'L';
+               side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side
        }
        else {
                /* normal transform - both sides of current frame are 
considered */
@@ -3292,59 +3298,107 @@
  *
  * seq->depth must be set
  */
-static void SeqTransInfo(Sequence *seq, int *recursive, int *count, int *flag)
+static void SeqTransInfo(TransInfo *t, Sequence *seq, int *recursive, int 
*count, int *flag)
 {
+       /* for extend we need to do some tricks */
+       if (t->mode == TFM_TIME_EXTEND) {
 
-       if (seq->depth == 0) {
+               /* *** Extend Transform *** */
 
-               /* Count */
+               Scene * scene= t->scene;
+               int cfra= CFRA;
+               int left= seq_tx_get_final_left(seq, 0);
+               int right= seq_tx_get_final_right(seq, 0);
 
-               /* Non nested strips (resect selection and handles) */
-               if ((seq->flag & SELECT) == 0 || (seq->flag & SEQ_LOCK) || 
(seq_tx_test(seq) == 0)) {
-                       *recursive= *count= *flag= 0;
-                       return; /* unselected strip, lockedd or the strip is an 
effect - then dont bother */
+               if (seq->depth == 0 && ((seq->flag & SELECT) == 0 || (seq->flag 
& SEQ_LOCK) || (seq_tx_test(seq) == 0))) {
+                       *recursive= 0;
+                       *count= 0;
+                       *flag= 0;
                }
-               else if ((seq->flag & (SEQ_LEFTSEL|SEQ_RIGHTSEL)) == 
(SEQ_LEFTSEL|SEQ_RIGHTSEL)) {
-                       *flag= seq->flag;
-                       *count= 2; /* we need 2 transdata's */
-               } else {
-                       *flag= seq->flag;
-                       *count= 1; /* selected or with a handle selected */
+               else if (seq->type ==SEQ_META) {
+                       
+                       /* for meta's we only ever need to extend their 
children, no matter what depth
+                        * just check the meta's are in the bounds */
+                       if (t->frame_side=='R' && right <= cfra)                
*recursive= 0;
+                       else if (t->frame_side=='L' && left >= cfra)    
*recursive= 0;
+                       else                                                    
                                *recursive= 1;
+                       
+                       *count= 0;
+                       *flag= 0;
                }
+               else {
 
-               /* Recursive */
+                       *recursive= 0;  /* not a meta, so no thinking here */
+                       *count= 1;              /* unless its set to 0, extend 
will never set 2 handles at once */
+                       *flag= (seq->flag | SELECT) & 
~(SEQ_LEFTSEL|SEQ_RIGHTSEL);
 
-               if ((seq->type == SEQ_META) && ((seq->flag & 
(SEQ_LEFTSEL|SEQ_RIGHTSEL)) == 0)) {
-                       /* if any handles are selected, dont recurse */
-                       *recursive = 1;
+                       if (t->frame_side=='R') {
+                               if (right <= cfra)              *count= *flag= 
0;       /* ignore */
+                               else if (left > cfra)   ;       /* keep the 
selection */
+                               else                                    *flag 
|= SEQ_RIGHTSEL;
+                       }
+                       else {
+                               if (left >= cfra)               *count= *flag= 
0;       /* ignore */
+                               else if (right < cfra)  ;       /* keep the 
selection */
+                               else                                    *flag 
|= SEQ_LEFTSEL;
+                       }
                }
-               else {
-                       *recursive = 0;
+       } else {
+
+               /* *** Normal Transform *** */
+
+               if (seq->depth == 0) {
+
+                       /* Count */
+
+                       /* Non nested strips (resect selection and handles) */
+                       if ((seq->flag & SELECT) == 0 || (seq->flag & SEQ_LOCK) 
|| (seq_tx_test(seq) == 0)) {
+                               *recursive= 0;
+                               *count= 0;
+                               *flag= 0;
+                       }
+                       else if ((seq->flag & (SEQ_LEFTSEL|SEQ_RIGHTSEL)) == 
(SEQ_LEFTSEL|SEQ_RIGHTSEL)) {
+                               *flag= seq->flag;
+                               *count= 2; /* we need 2 transdata's */
+                       } else {
+                               *flag= seq->flag;
+                               *count= 1; /* selected or with a handle 
selected */
+                       }
+
+                       /* Recursive */
+
+                       if ((seq->type == SEQ_META) && ((seq->flag & 
(SEQ_LEFTSEL|SEQ_RIGHTSEL)) == 0)) {
+                               /* if any handles are selected, dont recurse */
+                               *recursive = 1;
+                       }
+                       else {
+                               *recursive = 0;
+                       }
                }
-       }
-       else {
-               /* Nested, different rules apply */
-               
-               if (seq->type == SEQ_META) {
-                       /* Meta's can only directly be moved between channels 
since they
-                        * dont have their start and length set directly 
(children affect that)
-                        * since this Meta is nested we dont need any of its 
data infact.
-                        * calc_sequence() will update its settings when run on 
the toplevel meta */
-                       *flag= 0;
-                       *count= 0;
-                       *recursive = 1;
-               }
                else {
-                       *flag= (seq->flag | SELECT) & 
~(SEQ_LEFTSEL|SEQ_RIGHTSEL);
-                       *count= 1; /* ignore the selection for nested */
-                       *recursive = 0;
+                       /* Nested, different rules apply */
+
+                       if (seq->type == SEQ_META) {
+                               /* Meta's can only directly be moved between 
channels since they
+                                * dont have their start and length set 
directly (children affect that)
+                                * since this Meta is nested we dont need any 
of its data infact.
+                                * calc_sequence() will update its settings 
when run on the toplevel meta */
+                               *flag= 0;
+                               *count= 0;
+                               *recursive = 1;
+                       }
+                       else {
+                               *flag= (seq->flag | SELECT) & 
~(SEQ_LEFTSEL|SEQ_RIGHTSEL);
+                               *count= 1; /* ignore the selection for nested */
+                               *recursive = 0;
+                       }
                }
        }
 }
 
 
 
-static int SeqTransCount(ListBase *seqbase, int depth)
+static int SeqTransCount(TransInfo *t, ListBase *seqbase, int depth)
 {
        Sequence *seq;
        int tot= 0, recursive, count, flag;
@@ -3352,11 +3406,11 @@
        for (seq= seqbase->first; seq; seq= seq->next) {
                seq->depth= depth;
 
-               SeqTransInfo(seq, &recursive, &count, &flag); /* ignore the 
flag */
+               SeqTransInfo(t, seq, &recursive, &count, &flag); /* ignore the 
flag */
                tot += count;
 
                if (recursive) {
-                       tot += SeqTransCount(&seq->seqbase, depth+1);
+                       tot += SeqTransCount(t, &seq->seqbase, depth+1);
                }
        }
 
@@ -3364,14 +3418,22 @@
 }
 
 
-static TransData *SeqToTransData(TransData *td, TransData2D *td2d, 
TransDataSeq *tdsq, Sequence *seq, int flag, int sel_flag)
+static TransData *SeqToTransData(TransInfo *t, TransData *td, TransData2D 
*td2d, TransDataSeq *tdsq, Sequence *seq, int flag, int sel_flag)
 {
+       int start_left;
+
        switch(sel_flag) {
        case SELECT:
-               td2d->loc[0] = seq->start; /* hold original location */
+               /* Use seq_tx_get_final_left() and an offset here
+                * so transform has the left hand location of the strip.
+                * tdsq->start_offset is used when flushing the tx data back */
+               start_left= seq_tx_get_final_left(seq, 0);
+               td2d->loc[0]= start_left;
+               tdsq->start_offset= start_left - seq->start; /* use to apply 
the original location */
                break;
        case SEQ_LEFTSEL:
-               td2d->loc[0] = seq_tx_get_final_left(seq, 0);
+               start_left= seq_tx_get_final_left(seq, 0);
+               td2d->loc[0] = start_left;
                break;
        case SEQ_RIGHTSEL:
                td2d->loc[0] = seq_tx_get_final_right(seq, 0);
@@ -3409,10 +3471,14 @@
        Mat3One(td->mtx);
        Mat3One(td->smtx);
 
+       /* Time Transform (extend) */
+       td->val= td2d->loc;
+       td->ival= td2d->loc[0];
+       
        return td;
 }
 
-static int SeqToTransData_Recursive(ListBase *seqbase, TransData *td, 
TransData2D *td2d, TransDataSeq *tdsq)
+static int SeqToTransData_Recursive(TransInfo *t, ListBase *seqbase, TransData 
*td, TransData2D *td2d, TransDataSeq *tdsq)
 {
        Sequence *seq;
        int recursive, count, flag;
@@ -3420,11 +3486,11 @@
        
        for (seq= seqbase->first; seq; seq= seq->next) {
 
-               SeqTransInfo(seq, &recursive, &count, &flag);
+               SeqTransInfo(t, seq, &recursive, &count, &flag);
                
                /* add children first so recalculating metastrips does nested 
strips first */
                if (recursive) {
-                       int tot_children= 
SeqToTransData_Recursive(&seq->seqbase, td, td2d, tdsq);
+                       int tot_children= SeqToTransData_Recursive(t, 
&seq->seqbase, td, td2d, tdsq);
                        
                        td=             td +    tot_children;
                        td2d=   td2d +  tot_children;
@@ -3437,16 +3503,16 @@
                if (flag & SELECT) {
                        if (flag & (SEQ_LEFTSEL|SEQ_RIGHTSEL)) {
                                if (flag & SEQ_LEFTSEL) {

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to