[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12279] trunk/blender/source/blender: Sequencer...

Campbell Barton cbarton at metavr.com
Thu Oct 18 14:35:59 CEST 2007


Revision: 12279
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12279
Author:   campbellbarton
Date:     2007-10-18 14:35:58 +0200 (Thu, 18 Oct 2007)

Log Message:
-----------
Sequencer...
snapping to unselecrted strips didnt work (I didnt notice find_neighboring_sequence needed them to be touching, added find_next_prev_sequence to get the next/prev seq)
added select linked (L and Ctrl+L)
added Ctrl +/- select more/less

Modified Paths:
--------------
    trunk/blender/source/blender/include/BIF_editseq.h
    trunk/blender/source/blender/makesdna/DNA_sequence_types.h
    trunk/blender/source/blender/src/editseq.c
    trunk/blender/source/blender/src/header_seq.c
    trunk/blender/source/blender/src/space.c

Modified: trunk/blender/source/blender/include/BIF_editseq.h
===================================================================
--- trunk/blender/source/blender/include/BIF_editseq.h	2007-10-18 09:18:04 UTC (rev 12278)
+++ trunk/blender/source/blender/include/BIF_editseq.h	2007-10-18 12:35:58 UTC (rev 12279)
@@ -48,11 +48,14 @@
 void				del_seq(void);
 void				enter_meta(void);
 void				exit_meta(void);
-struct Sequence*	find_neighboring_sequence(struct Sequence *test, int lr);
+struct Sequence*	find_neighboring_sequence(struct Sequence *test, int lr, int sel);
+struct Sequence*	find_next_prev_sequence(struct Sequence *test, int lr, int sel);
 struct Sequence*	find_nearest_seq(int *hand);
 int					insert_gap(int gap, int cfra);
 void				make_meta(void);
 void				select_channel_direction(struct Sequence *test,int lr);
+void				select_more_seq(void);
+void				select_less_seq(void);
 void				mouse_select_seq(void);
 void				no_gaps(void);
 void				seq_snap(short event);
@@ -70,6 +73,7 @@
 void				select_surround_from_last();
 void				select_dir_from_last(int lr);
 void				select_neighbor_from_last(int lr);
+void				select_linked_seq(int mode);
 struct Sequence*	alloc_sequence(ListBase *lb, int cfra, int machine); /*used from python*/
 int 				check_single_image_seq(struct Sequence *seq);
 

Modified: trunk/blender/source/blender/makesdna/DNA_sequence_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_sequence_types.h	2007-10-18 09:18:04 UTC (rev 12278)
+++ trunk/blender/source/blender/makesdna/DNA_sequence_types.h	2007-10-18 12:35:58 UTC (rev 12279)
@@ -88,21 +88,22 @@
 
 typedef struct Sequence {
 
-	struct Sequence *next, *prev, *newseq;
-	void *lib;
-	char name[24];
+	struct Sequence *next, *prev;
+	struct Sequence *newseq; /* should not be saved in DNA - only used for recursive duplicate and recently select more/less */
+	char name[24]; /* name, not set by default and dosnt need to be unique as with ID's */
 
 	short flag, type;	/*flags bitmap (see below) and the type of sequence*/
-	int len;
+	int len; /* the length of the contense of this strip - before handles are applied */
 	int start, startofs, endofs;
 	int startstill, endstill;
-	int machine, depth;
+	int machine, depth; /*machine - the strip channel, depth - the depth in the sequence when dealing with metastrips */
 	int startdisp, enddisp;	/*starting and ending points in the sequence*/
 	float mul, handsize;
-	int sfra;		/* starting frame according to the timeline of the scene */
+					/* is sfra needed anymore? - it looks like its only used in one place */
+	int sfra;		/* starting frame according to the timeline of the scene. */
 
 	Strip *strip;
-	StripElem *curelem;
+	StripElem *curelem;	/* reference the current frame - value from give_stripelem */
 
 	struct Ipo *ipo;
 	struct Scene *scene;
@@ -114,8 +115,7 @@
 	/* pointers for effects: */
 	struct Sequence *seq1, *seq2, *seq3;
 
-	/* meta */
-	ListBase seqbase;
+	ListBase seqbase;	/* list of strips for metastrips */
 
 	struct bSound *sound;	/* the linked "bSound" object */
         struct hdaudio *hdaudio; /* external hdaudio object */

Modified: trunk/blender/source/blender/src/editseq.c
===================================================================
--- trunk/blender/source/blender/src/editseq.c	2007-10-18 09:18:04 UTC (rev 12278)
+++ trunk/blender/source/blender/src/editseq.c	2007-10-18 12:35:58 UTC (rev 12279)
@@ -304,46 +304,92 @@
 		|| (get_sequence_effect_num_inputs(seq->type) == 0);
 }
 
-Sequence *find_neighboring_sequence(Sequence *test, int lr) {
-/* looks to the left on lr==1, to the right on lr==2 */
-	Sequence *seq,*foundneighbor = 0;
-	int found=0;
+Sequence *find_neighboring_sequence(Sequence *test, int lr, int sel) {
+/*	looks to the left on lr==1, to the right on lr==2
+	sel - 0==unselected, 1==selected, -1==done care*/
+	Sequence *seq;
 	Editing *ed;
 
 	ed= G.scene->ed;
 	if(ed==0) return 0;
 
+	if (sel>0) sel = SELECT;
+	
 	seq= ed->seqbasep->first;
 	while(seq) {
-		if(seq!=test) {
-			if (test->machine==seq->machine) {
-				if(test->depth==seq->depth) {
-					switch (lr) {
-					case 1:
-						if (test->startdisp == (seq->enddisp)) {
-							foundneighbor=seq;
-							found=1;
-						}
-						break;
-					case 2:
-						if (test->enddisp == (seq->startdisp)) {
-							foundneighbor=seq;
-							found=1;
-						}
-						break;
-					}
+		if(	(seq!=test) &&
+			(test->machine==seq->machine) &&
+			(test->depth==seq->depth) && 
+			((sel == -1) || (sel && (seq->flag & SELECT)) || (sel==0 && (seq->flag & SELECT)==0)  ))
+		{
+			switch (lr) {
+			case 1:
+				if (test->startdisp == (seq->enddisp)) {
+					return seq;
 				}
+				break;
+			case 2:
+				if (test->enddisp == (seq->startdisp)) {
+					return seq;
+				}
+				break;
 			}
 		}
 		seq= seq->next;
 	}
-	if (found==1) {
-		return foundneighbor;
-	} else {
-		return 0;
+	return NULL;
+}
+
+Sequence *find_next_prev_sequence(Sequence *test, int lr, int sel) {
+/*	looks to the left on lr==1, to the right on lr==2
+	sel - 0==unselected, 1==selected, -1==done care*/
+	Sequence *seq,*best_seq = NULL;
+	Editing *ed;
+	
+	int dist, best_dist;
+	best_dist = MAXFRAME*2;
+
+	ed= G.scene->ed;
+	if(ed==0) return 0;
+
+	if (sel) sel = SELECT;
+	
+	seq= ed->seqbasep->first;
+	while(seq) {
+		if(		(seq!=test) &&
+				(test->machine==seq->machine) &&
+				(test->depth==seq->depth) &&
+				((sel == -1) || (sel==seq->flag & SELECT)))
+		{
+			dist = MAXFRAME*2;
+			
+			switch (lr) {
+			case 1:
+				if (seq->enddisp <= test->startdisp) {
+					dist = test->enddisp - seq->startdisp;
+				}
+				break;
+			case 2:
+				if (seq->startdisp >= test->enddisp) {
+					dist = seq->startdisp - test->enddisp;
+				}
+				break;
+			}
+			
+			if (dist==0) {
+				best_seq = seq;
+				break;
+			} else if (dist < best_dist) {
+				best_dist = dist;
+				best_seq = seq;
+			}
+		}
+		seq= seq->next;
 	}
+	return best_seq; /* can be null */
 }
 
+
 Sequence *find_nearest_seq(int *hand)
 {
 	Sequence *seq;
@@ -627,13 +673,13 @@
 {
 	Sequence *neighbor;
 	
-	neighbor=find_neighboring_sequence(test, 1);
+	neighbor=find_neighboring_sequence(test, 1, -1);
 	if (neighbor) {
 		neighbor->flag |= SELECT;
 		recurs_sel_seq(neighbor);
 		neighbor->flag |= SEQ_RIGHTSEL;
 	}
-	neighbor=find_neighboring_sequence(test, 2);
+	neighbor=find_neighboring_sequence(test, 2, -1);
 	if (neighbor) {
 		neighbor->flag |= SELECT;
 		recurs_sel_seq(neighbor);
@@ -660,7 +706,7 @@
 	Sequence *neighbor;
 	int change = 0;
 	if (seq) {
-		neighbor=find_neighboring_sequence(seq, lr);
+		neighbor=find_neighboring_sequence(seq, lr, -1);
 		if (neighbor) {
 			switch (lr) {
 			case 1:
@@ -768,7 +814,7 @@
 		
 				if (G.qual & LR_CTRLKEY) seldir=1;
 					else seldir=2;
-				neighbor=find_neighboring_sequence(seq, seldir);
+				neighbor=find_neighboring_sequence(seq, seldir, -1);
 				if (neighbor) {
 					switch (seldir) {
 					case 1:
@@ -2883,20 +2929,20 @@
 				}
 				
 				/* check seq's next to the active also - nice for quick snapping */
-				if (snap_dist) {
-					seq = find_neighboring_sequence(last_seq, 1); /* left */
+				if (snap_dist && seq_tx_check_left(last_seq)) {
+					seq = find_next_prev_sequence(last_seq, 1, 0); /* left */
 					if(seq && !seq_tx_check_right(seq))
 						TESTSNAP(seq_tx_get_final_right(seq));
 				}
 				
-				if (snap_dist) {
-					seq = find_neighboring_sequence(last_seq, 2); /* right */
+				if (snap_dist && seq_tx_check_right(last_seq)) {
+					seq = find_next_prev_sequence(last_seq, 2, 0); /* right */
 					if(seq && !seq_tx_check_left(seq))
 						TESTSNAP(seq_tx_get_final_left(seq));
 				}
 
 #undef TESTSNAP
-				
+
 				if (abs(ix_old-ix) >= snapdist_max) {
 					/* mouse has moved out of snap range */
 					snapskip = 0;
@@ -3399,6 +3445,107 @@
 	allqueue(REDRAWSEQ, 0);
 }
 
+/* run recursivly to select linked */
+static int select_more_less_seq__internal(int sel, int linked) {
+	Editing *ed;
+	Sequence *seq, *neighbor;
+	int change=0;
+	int isel;
+	
+	ed= G.scene->ed;
+	if(ed==0) return;
+	
+	if (sel) {
+		sel = SELECT;
+		isel = 0;
+	} else {
+		sel = 0;
+		isel = SELECT;
+	}
+	
+	if (!linked) {
+		/* if not linked we only want to touch each seq once, newseq */
+		for(seq= ed->seqbasep->first; seq; seq= seq->next) {
+			seq->newseq = NULL;
+		}
+	}
+	
+	for(seq= ed->seqbasep->first; seq; seq= seq->next) {
+		if((seq->flag & SELECT) == sel) {
+			if ((linked==0 && seq->newseq)==0) {
+				/* only get unselected nabours */
+				neighbor = find_neighboring_sequence(seq, 1, isel);
+				if (neighbor) {
+					if (sel) {neighbor->flag |= SELECT; recurs_sel_seq(neighbor);}
+					else		neighbor->flag &= ~SELECT;
+					if (linked==0) neighbor->newseq = 1;
+					change = 1;
+				}
+				
+				neighbor = find_neighboring_sequence(seq, 2, isel);
+				if (neighbor) {
+					if (sel) {neighbor->flag |= SELECT; recurs_sel_seq(neighbor);}
+					else		neighbor->flag &= ~SELECT;
+					if (linked==0) neighbor->newseq = 1;
+					change = 1;
+				}
+			}
+		}
+	}
+	
+	return change;
+}
+
+void select_less_seq(void)
+{
+	if (select_more_less_seq__internal(0, 0)) {
+		BIF_undo_push("Select Less, Sequencer");
+		allqueue(REDRAWSEQ, 0);
+	}
+}
+
+void select_more_seq(void)
+{
+	if (select_more_less_seq__internal(1, 0)) {
+		BIF_undo_push("Select More, Sequencer");
+		allqueue(REDRAWSEQ, 0);
+	}
+}
+
+/* TODO not all modes supported - if you feel like being picky, add them! ;) */
+void select_linked_seq(int mode) {
+	Editing *ed;
+	Sequence *seq, *mouse_seq;
+	int selected, hand;
+	
+	ed= G.scene->ed;
+	if(ed==0) return;
+	
+	/* replace current selection */
+	if (mode==0 || mode==2) {
+		/* this works like UV, not mesh */
+		if (mode==0) {
+			mouse_seq= find_nearest_seq(&hand);
+			if (!mouse_seq)
+				return; /* user error as with mesh?? */
+			
+			for(seq= ed->seqbasep->first; seq; seq= seq->next) {
+				seq->flag &= ~SELECT;
+			}
+			mouse_seq->flag |= SELECT;
+			recurs_sel_seq(mouse_seq);
+		}
+		
+		selected = 1;
+		while (selected) {
+			selected = select_more_less_seq__internal(1, 1);
+		}
+		BIF_undo_push("Select Linked, Sequencer");
+		allqueue(REDRAWSEQ, 0);
+	}
+	/* TODO - more modes... */
+}
+
 void seq_snap_menu(void)
 {
 	short event;

Modified: trunk/blender/source/blender/src/header_seq.c
===================================================================
--- trunk/blender/source/blender/src/header_seq.c	2007-10-18 09:18:04 UTC (rev 12278)
+++ trunk/blender/source/blender/src/header_seq.c	2007-10-18 12:35:58 UTC (rev 12279)
@@ -194,6 +194,9 @@
 	case 6:

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list