[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54894] trunk/blender/source/blender/ editors/space_sequencer/sequencer_add.c: == Sequencer ==

Peter Schlaile peter at schlaile.de
Wed Feb 27 01:04:09 CET 2013


Revision: 54894
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54894
Author:   schlaile
Date:     2013-02-27 00:04:07 +0000 (Wed, 27 Feb 2013)
Log Message:
-----------
== Sequencer ==

This fixes the placement code of new files added to the sequencer timeline.

The old code tried to guess the strip position from the current mouse
pointer position.

Annoying effect: if you add a new strip using the menu, especially if the
file editor pops up, the strip ends up in nowheres land (most likely around
track 40, frame -200).

New behaviour: strips are always placed at cfra, which is the
sequencer equivalent to the 3D cursor (and that's where new objects in 
3D editing end up).

Bonus feature: we try our best to guess the right track by finding the
nearest strip by type.

The patch was inspired by 
[#32766] VSE: Add Strip on Current Frame

Thanks to venomgfx for the idea!

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c	2013-02-26 23:12:42 UTC (rev 54893)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c	2013-02-27 00:04:07 UTC (rev 54894)
@@ -126,23 +126,53 @@
 	}
 }
 
-static void sequencer_generic_invoke_xy__internal(bContext *C, wmOperator *op, wmEvent *event, int flag)
+static int sequencer_generic_invoke_xy_guess_channel(bContext * C, wmOperator *op, int type)
 {
+	Sequence *tgt = NULL;
+	Sequence *seq;
+	Scene *scene = CTX_data_scene(C);
+	Editing *ed = BKE_sequencer_editing_get(scene, TRUE);
+	int cfra = (int) CFRA;
+	int proximity = INT_MAX;
+
+	if (!ed || !ed->seqbasep) {
+		return 1;
+	}
+
+	for (seq = ed->seqbasep->first; seq; seq = seq->next) {
+		if ((type == -1 || seq->type == type) 
+		    && seq->enddisp < cfra 
+		    && cfra - seq->enddisp < proximity) {
+			tgt = seq;
+			proximity = cfra - seq->enddisp;
+		}
+	}
+	
+	if (tgt) {
+		return tgt->machine;
+	}
+	return 1;
+}
+
+static void sequencer_generic_invoke_xy__internal(bContext *C, wmOperator *op, wmEvent *event, int flag, int type)
+{
 	View2D *v2d = UI_view2d_fromcontext(C);
+	Scene *scene = CTX_data_scene(C);
 	
 	float mval_v2d[2];
+	int cfra = (int) CFRA;
 	
-	UI_view2d_region_to_view(v2d, event->mval[0], event->mval[1], &mval_v2d[0], &mval_v2d[1]);
-
 	/* effect strips don't need a channel initialized from the mouse */
 	if (!(flag & SEQPROP_NOCHAN)) {
-		RNA_int_set(op->ptr, "channel", (int)mval_v2d[1] + 0.5f);
+		RNA_int_set(op->ptr, "channel", 
+			    sequencer_generic_invoke_xy_guess_channel(
+				    C, op, type));
 	}
 
-	RNA_int_set(op->ptr, "frame_start", (int)mval_v2d[0]);
+	RNA_int_set(op->ptr, "frame_start", cfra);
 	
 	if ((flag & SEQPROP_ENDFRAME) && RNA_struct_property_is_set(op->ptr, "frame_end") == 0)
-		RNA_int_set(op->ptr, "frame_end", (int)mval_v2d[0] + 25);  // XXX arbitary but ok for now.
+		RNA_int_set(op->ptr, "frame_end", cfra + 25);  // XXX arbitary but ok for now.
 
 	if (!(flag & SEQPROP_NOPATHS)) {
 		sequencer_generic_invoke_path__internal(C, op, "filepath");
@@ -277,7 +307,7 @@
 	if (!RNA_struct_property_is_set(op->ptr, "scene"))
 		return WM_enum_search_invoke(C, op, event);
 
-	sequencer_generic_invoke_xy__internal(C, op, event, 0);
+	sequencer_generic_invoke_xy__internal(C, op, event, 0, SEQ_TYPE_SCENE);
 	return sequencer_add_scene_strip_exec(C, op);
 	// needs a menu
 	// return WM_menu_invoke(C, op, event);
@@ -375,7 +405,7 @@
 	if (!RNA_struct_property_is_set(op->ptr, "clip"))
 		return WM_enum_search_invoke(C, op, event);
 
-	sequencer_generic_invoke_xy__internal(C, op, event, 0);
+	sequencer_generic_invoke_xy__internal(C, op, event, 0, SEQ_TYPE_MOVIECLIP);
 	return sequencer_add_movieclip_strip_exec(C, op);
 	// needs a menu
 	// return WM_menu_invoke(C, op, event);
@@ -472,7 +502,7 @@
 	if (!RNA_struct_property_is_set(op->ptr, "mask"))
 		return WM_enum_search_invoke(C, op, event);
 
-	sequencer_generic_invoke_xy__internal(C, op, event, 0);
+	sequencer_generic_invoke_xy__internal(C, op, event, 0, SEQ_TYPE_MASK);
 	return sequencer_add_mask_strip_exec(C, op);
 	// needs a menu
 	// return WM_menu_invoke(C, op, event);
@@ -587,11 +617,11 @@
 	if ((RNA_struct_property_is_set(op->ptr, "files") && RNA_collection_length(op->ptr, "files")) ||
 	    RNA_struct_property_is_set(op->ptr, "filepath"))
 	{
-		sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_NOPATHS);
+		sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_NOPATHS, SEQ_TYPE_MOVIE);
 		return sequencer_add_movie_strip_exec(C, op);
 	}
 	
-	sequencer_generic_invoke_xy__internal(C, op, event, 0);
+	sequencer_generic_invoke_xy__internal(C, op, event, 0, SEQ_TYPE_MOVIE);
 	
 	WM_event_add_fileselect(C, op);
 	return OPERATOR_RUNNING_MODAL;
@@ -642,11 +672,11 @@
 	if ((RNA_struct_property_is_set(op->ptr, "files") && RNA_collection_length(op->ptr, "files")) ||
 	    RNA_struct_property_is_set(op->ptr, "filepath"))
 	{
-		sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_NOPATHS);
+		sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_NOPATHS, SEQ_TYPE_SOUND_RAM);
 		return sequencer_add_sound_strip_exec(C, op);
 	}
 	
-	sequencer_generic_invoke_xy__internal(C, op, event, 0);
+	sequencer_generic_invoke_xy__internal(C, op, event, 0, SEQ_TYPE_SOUND_RAM);
 
 	WM_event_add_fileselect(C, op);
 	return OPERATOR_RUNNING_MODAL;
@@ -753,11 +783,12 @@
 
 	/* drag drop has set the names */
 	if (RNA_struct_property_is_set(op->ptr, "files") && RNA_collection_length(op->ptr, "files")) {
-		sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_ENDFRAME | SEQPROP_NOPATHS);
+		sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_ENDFRAME | SEQPROP_NOPATHS, SEQ_TYPE_IMAGE);
 		return sequencer_add_image_strip_exec(C, op);
 	}
 	
-	sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_ENDFRAME);
+	sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_ENDFRAME,
+					      SEQ_TYPE_IMAGE);
 
 	WM_event_add_fileselect(C, op);
 	return OPERATOR_RUNNING_MODAL;
@@ -917,7 +948,7 @@
 		}
 	}
 
-	sequencer_generic_invoke_xy__internal(C, op, event, prop_flag);
+	sequencer_generic_invoke_xy__internal(C, op, event, prop_flag, type);
 
 	return sequencer_add_effect_strip_exec(C, op);
 }




More information about the Bf-blender-cvs mailing list