2011-02-23 10:52:22 +00:00
|
|
|
/*
|
2009-01-12 19:02:08 +00:00
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2009-01-12 19:02:08 +00:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s): Blender Foundation, 2003-2009
|
|
|
|
*
|
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
|
|
*/
|
|
|
|
|
2011-02-27 20:29:51 +00:00
|
|
|
/** \file blender/editors/space_sequencer/sequencer_edit.c
|
|
|
|
* \ingroup spseq
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <math.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#ifndef WIN32
|
|
|
|
#include <unistd.h>
|
|
|
|
#else
|
|
|
|
#include <io.h>
|
|
|
|
#endif
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
|
|
|
#include "BLI_blenlib.h"
|
2009-11-10 20:43:45 +00:00
|
|
|
#include "BLI_math.h"
|
2009-01-12 19:02:08 +00:00
|
|
|
#include "BLI_storage_types.h"
|
2011-01-07 18:36:47 +00:00
|
|
|
#include "BLI_utildefines.h"
|
== Sequencer ==
This patch adds:
* support for proxy building again (missing feature from Blender 2.49)
additionally to the way, Blender 2.49 worked, you can select several
strips at once and make Blender build proxies in the background (using
the job system)
Also a new thing: movie proxies are now build into AVI files, and
the proxy system is moved into ImBuf-library, so that other parts
of blender can also benefit from it.
* Timecode support: to fix seeking issues with files, that have
a) varying frame rates
b) very large GOP lengths
c) are broken inbetween
d) use different time code tracks
the proxy builder can now also build timecode indices, which are
used (optionally) for seeking.
For the first time, it is possible, to do frame exact seeking on
all file types.
* Support for different video-streams in one video file (can be
selected in sequencer, other parts of blender can also use it,
but UI has to be added accordingly)
* IMPORTANT: this patch *requires* ffmpeg 0.7 or newer, since
older versions don't support the pkt_pts field, that is essential
for building timecode indices.
Windows and Mac libs are already updated, Linux-users have to build
their own ffmpeg verions until distros keep up.
2011-08-28 14:46:03 +00:00
|
|
|
#include "BLI_threads.h"
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
#include "DNA_scene_types.h"
|
|
|
|
#include "DNA_userdef_types.h"
|
|
|
|
|
|
|
|
#include "BKE_context.h"
|
|
|
|
#include "BKE_global.h"
|
2010-08-13 14:23:44 +00:00
|
|
|
#include "BKE_main.h"
|
2009-12-13 14:56:45 +00:00
|
|
|
#include "BKE_sequencer.h"
|
2009-01-23 23:14:02 +00:00
|
|
|
#include "BKE_report.h"
|
2009-08-09 21:16:39 +00:00
|
|
|
#include "BKE_sound.h"
|
2009-01-12 19:02:08 +00:00
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
#include "WM_api.h"
|
2009-01-12 19:02:08 +00:00
|
|
|
#include "WM_types.h"
|
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
#include "RNA_define.h"
|
2011-04-01 08:51:12 +00:00
|
|
|
#include "RNA_enum_types.h"
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
|
|
|
|
/* for menu/popup icons etc etc*/
|
|
|
|
|
|
|
|
#include "ED_screen.h"
|
2009-07-08 16:17:47 +00:00
|
|
|
#include "ED_transform.h"
|
2009-12-14 21:42:25 +00:00
|
|
|
#include "ED_sequencer.h"
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
#include "UI_view2d.h"
|
|
|
|
|
|
|
|
/* own include */
|
|
|
|
#include "sequencer_intern.h"
|
|
|
|
|
2010-10-16 08:03:28 +00:00
|
|
|
static int okee(const char *UNUSED(dummy)) {return 0;}
|
New Operators, duplicate is shift+d, Add operators are accessible from the header.
SEQUENCER_OT_add_duplicate(mode=1)
SEQUENCER_OT_add_image_strip(name='', start_frame=0, channel=1, filename='', replace_sel=True)
SEQUENCER_OT_add_movie_strip(name='', start_frame=0, channel=1, filename='', replace_sel=True)
SEQUENCER_OT_add_sound_strip(name='', start_frame=0, channel=1, filename='', replace_sel=True)
Some of these use the file selector, Note that sound isn't working yet because editsound.c functions are not yet in 2.5 and Operators dont have a way to recieve an array of strings so SEQUENCER_OT_add_image_strip only adds 1 image at the moment.
2009-01-22 15:52:04 +00:00
|
|
|
|
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
/* XXX */
|
2009-01-26 09:13:15 +00:00
|
|
|
/* RNA Enums, used in multiple files */
|
|
|
|
EnumPropertyItem sequencer_prop_effect_types[] = {
|
2009-06-16 00:52:21 +00:00
|
|
|
{SEQ_CROSS, "CROSS", 0, "Crossfade", "Crossfade effect strip type"},
|
|
|
|
{SEQ_ADD, "ADD", 0, "Add", "Add effect strip type"},
|
|
|
|
{SEQ_SUB, "SUBTRACT", 0, "Subtract", "Subtract effect strip type"},
|
|
|
|
{SEQ_ALPHAOVER, "ALPHA_OVER", 0, "Alpha Over", "Alpha Over effect strip type"},
|
|
|
|
{SEQ_ALPHAUNDER, "ALPHA_UNDER", 0, "Alpha Under", "Alpha Under effect strip type"},
|
|
|
|
{SEQ_GAMCROSS, "GAMMA_CROSS", 0, "Gamma Cross", "Gamma Cross effect strip type"},
|
|
|
|
{SEQ_MUL, "MULTIPLY", 0, "Multiply", "Multiply effect strip type"},
|
|
|
|
{SEQ_OVERDROP, "OVER_DROP", 0, "Alpha Over Drop", "Alpha Over Drop effect strip type"},
|
|
|
|
{SEQ_PLUGIN, "PLUGIN", 0, "Plugin", "Plugin effect strip type"},
|
|
|
|
{SEQ_WIPE, "WIPE", 0, "Wipe", "Wipe effect strip type"},
|
|
|
|
{SEQ_GLOW, "GLOW", 0, "Glow", "Glow effect strip type"},
|
|
|
|
{SEQ_TRANSFORM, "TRANSFORM", 0, "Transform", "Transform effect strip type"},
|
|
|
|
{SEQ_COLOR, "COLOR", 0, "Color", "Color effect strip type"},
|
2011-08-29 15:01:55 +00:00
|
|
|
{SEQ_SPEED, "SPEED", 0, "Speed", "Color effect strip type"},
|
== Sequencer ==
This adds MULTICAM-editing support for blender. (Well, the beginning of.)
There is now a new effect track, named MULTICAM, which just selects
one of the lower tracks.
Doesn't sound that exciting, but if you combine this with A/B-Trim (moving
split points of two directly connected tracks around, while magically
resizing both strips, something to be added), you just do:
* add several tracks for your camera angles
* (optionally) sync those tracks
* add one multicam track on top
Use that multicam-track to edit your movie. (Either using fcurves on the
multicam source selector or using knife-tool and A/B-Trim.)
Compare that to:
* add several tracks
* add cross fades between them
* do some python scripting to add several fcurves to make that beast
somewhat work.
* cry out loud, using it, if you have to move cut points around
Alternatively, even harder:
* just edit the old way and put strip after strip
You might think, that this isn't really helpfull for animators, but
consider using scene-strips (in OpenGL-mode) for input, that are set for
different camera angles and can now be intercut a lot more easily...
Also: small fix on the way: the speed effect can now be used in cascade.
(Don't know, if anyone used it that way, but now it works.)
2010-04-25 12:53:39 +00:00
|
|
|
{SEQ_MULTICAM, "MULTICAM", 0, "Multicam Selector", ""},
|
2011-05-16 17:14:47 +00:00
|
|
|
{SEQ_ADJUSTMENT, "ADJUSTMENT", 0, "Adjustment Layer", ""},
|
2009-06-16 00:52:21 +00:00
|
|
|
{0, NULL, 0, NULL, NULL}
|
2009-01-26 09:13:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* mute operator */
|
|
|
|
|
2009-12-15 10:04:54 +00:00
|
|
|
EnumPropertyItem prop_side_types[] = {
|
2009-06-16 00:52:21 +00:00
|
|
|
{SEQ_SIDE_LEFT, "LEFT", 0, "Left", ""},
|
|
|
|
{SEQ_SIDE_RIGHT, "RIGHT", 0, "Right", ""},
|
|
|
|
{SEQ_SIDE_BOTH, "BOTH", 0, "Both", ""},
|
|
|
|
{0, NULL, 0, NULL, NULL}
|
2009-01-31 09:58:38 +00:00
|
|
|
};
|
2009-01-12 19:02:08 +00:00
|
|
|
|
2011-02-14 17:55:27 +00:00
|
|
|
static EnumPropertyItem prop_side_lr_types[] = {
|
2009-12-15 10:04:54 +00:00
|
|
|
{SEQ_SIDE_LEFT, "LEFT", 0, "Left", ""},
|
|
|
|
{SEQ_SIDE_RIGHT, "RIGHT", 0, "Right", ""},
|
|
|
|
{0, NULL, 0, NULL, NULL}
|
|
|
|
};
|
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
typedef struct TransSeq {
|
|
|
|
int start, machine;
|
|
|
|
int startstill, endstill;
|
|
|
|
int startdisp, enddisp;
|
|
|
|
int startofs, endofs;
|
2011-07-05 16:31:21 +00:00
|
|
|
int anim_startofs, anim_endofs;
|
2011-06-11 17:05:20 +00:00
|
|
|
/* int final_left, final_right; */ /* UNUSED */
|
2009-01-12 19:02:08 +00:00
|
|
|
int len;
|
|
|
|
} TransSeq;
|
|
|
|
|
== Sequencer ==
This patch adds:
* support for proxy building again (missing feature from Blender 2.49)
additionally to the way, Blender 2.49 worked, you can select several
strips at once and make Blender build proxies in the background (using
the job system)
Also a new thing: movie proxies are now build into AVI files, and
the proxy system is moved into ImBuf-library, so that other parts
of blender can also benefit from it.
* Timecode support: to fix seeking issues with files, that have
a) varying frame rates
b) very large GOP lengths
c) are broken inbetween
d) use different time code tracks
the proxy builder can now also build timecode indices, which are
used (optionally) for seeking.
For the first time, it is possible, to do frame exact seeking on
all file types.
* Support for different video-streams in one video file (can be
selected in sequencer, other parts of blender can also use it,
but UI has to be added accordingly)
* IMPORTANT: this patch *requires* ffmpeg 0.7 or newer, since
older versions don't support the pkt_pts field, that is essential
for building timecode indices.
Windows and Mac libs are already updated, Linux-users have to build
their own ffmpeg verions until distros keep up.
2011-08-28 14:46:03 +00:00
|
|
|
/* ********************************************************************** */
|
|
|
|
|
|
|
|
/* ***************** proxy job manager ********************** */
|
|
|
|
|
|
|
|
typedef struct ProxyBuildJob {
|
|
|
|
Scene *scene;
|
|
|
|
struct Main * main;
|
|
|
|
ListBase queue;
|
|
|
|
ThreadMutex queue_lock;
|
|
|
|
} ProxyJob;
|
|
|
|
|
|
|
|
static void proxy_freejob(void *pjv)
|
|
|
|
{
|
|
|
|
ProxyJob *pj= pjv;
|
|
|
|
Sequence * seq;
|
|
|
|
|
|
|
|
for (seq = pj->queue.first; seq; seq = seq->next) {
|
|
|
|
BLI_remlink(&pj->queue, seq);
|
|
|
|
seq_free_sequence_recurse(pj->scene, seq);
|
|
|
|
}
|
|
|
|
|
|
|
|
BLI_mutex_end(&pj->queue_lock);
|
|
|
|
|
|
|
|
MEM_freeN(pj);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* only this runs inside thread */
|
|
|
|
static void proxy_startjob(void *pjv, short *stop, short *do_update, float *progress)
|
|
|
|
{
|
|
|
|
ProxyJob *pj = pjv;
|
|
|
|
|
|
|
|
while (!*stop) {
|
|
|
|
Sequence * seq;
|
|
|
|
|
|
|
|
BLI_mutex_lock(&pj->queue_lock);
|
|
|
|
|
|
|
|
if (!pj->queue.first) {
|
|
|
|
BLI_mutex_unlock(&pj->queue_lock);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
seq = pj->queue.first;
|
|
|
|
|
|
|
|
BLI_remlink(&pj->queue, seq);
|
|
|
|
BLI_mutex_unlock(&pj->queue_lock);
|
|
|
|
|
|
|
|
seq_proxy_rebuild(pj->main, pj->scene, seq,
|
|
|
|
stop, do_update, progress);
|
|
|
|
seq_free_sequence_recurse(pj->scene, seq);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*stop) {
|
|
|
|
fprintf(stderr,
|
|
|
|
"Canceling proxy rebuild on users request...\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void proxy_endjob(void *UNUSED(customdata))
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2011-09-16 08:20:21 +00:00
|
|
|
static void seq_proxy_build_job(const bContext *C, Sequence * seq)
|
== Sequencer ==
This patch adds:
* support for proxy building again (missing feature from Blender 2.49)
additionally to the way, Blender 2.49 worked, you can select several
strips at once and make Blender build proxies in the background (using
the job system)
Also a new thing: movie proxies are now build into AVI files, and
the proxy system is moved into ImBuf-library, so that other parts
of blender can also benefit from it.
* Timecode support: to fix seeking issues with files, that have
a) varying frame rates
b) very large GOP lengths
c) are broken inbetween
d) use different time code tracks
the proxy builder can now also build timecode indices, which are
used (optionally) for seeking.
For the first time, it is possible, to do frame exact seeking on
all file types.
* Support for different video-streams in one video file (can be
selected in sequencer, other parts of blender can also use it,
but UI has to be added accordingly)
* IMPORTANT: this patch *requires* ffmpeg 0.7 or newer, since
older versions don't support the pkt_pts field, that is essential
for building timecode indices.
Windows and Mac libs are already updated, Linux-users have to build
their own ffmpeg verions until distros keep up.
2011-08-28 14:46:03 +00:00
|
|
|
{
|
|
|
|
wmJob * steve;
|
|
|
|
ProxyJob *pj;
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
ScrArea * sa= CTX_wm_area(C);
|
|
|
|
|
|
|
|
seq = seq_dupli_recursive(scene, scene, seq, 0);
|
|
|
|
|
|
|
|
steve = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C),
|
|
|
|
sa, "Building Proxies", WM_JOB_PROGRESS);
|
|
|
|
|
|
|
|
pj = WM_jobs_get_customdata(steve);
|
|
|
|
|
|
|
|
if (!pj) {
|
|
|
|
pj = MEM_callocN(sizeof(ProxyJob), "proxy rebuild job");
|
|
|
|
|
|
|
|
pj->scene= scene;
|
|
|
|
pj->main = CTX_data_main(C);
|
|
|
|
|
|
|
|
BLI_mutex_init(&pj->queue_lock);
|
|
|
|
|
|
|
|
WM_jobs_customdata(steve, pj, proxy_freejob);
|
|
|
|
WM_jobs_timer(steve, 0.1, NC_SCENE|ND_SEQUENCER,
|
|
|
|
NC_SCENE|ND_SEQUENCER);
|
|
|
|
WM_jobs_callbacks(steve, proxy_startjob, NULL, NULL,
|
|
|
|
proxy_endjob);
|
|
|
|
}
|
|
|
|
|
|
|
|
BLI_mutex_lock(&pj->queue_lock);
|
|
|
|
BLI_addtail(&pj->queue, seq);
|
|
|
|
BLI_mutex_unlock(&pj->queue_lock);
|
|
|
|
|
|
|
|
if (!WM_jobs_is_running(steve)) {
|
|
|
|
G.afbreek = 0;
|
|
|
|
WM_jobs_start(CTX_wm_manager(C), steve);
|
|
|
|
}
|
|
|
|
|
|
|
|
ED_area_tag_redraw(CTX_wm_area(C));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ********************************************************************** */
|
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
void seq_rectf(Sequence *seq, rctf *rectf)
|
|
|
|
{
|
|
|
|
if(seq->startstill) rectf->xmin= seq->start;
|
|
|
|
else rectf->xmin= seq->startdisp;
|
2009-01-25 14:53:41 +00:00
|
|
|
rectf->ymin= seq->machine+SEQ_STRIP_OFSBOTTOM;
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
if(seq->endstill) rectf->xmax= seq->start+seq->len;
|
|
|
|
else rectf->xmax= seq->enddisp;
|
2009-01-25 14:53:41 +00:00
|
|
|
rectf->ymax= seq->machine+SEQ_STRIP_OFSTOP;
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
|
2011-08-15 16:18:04 +00:00
|
|
|
static void UNUSED_FUNCTION(change_plugin_seq)(Scene *scene, char *str) /* called from fileselect */
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-12 19:02:08 +00:00
|
|
|
struct SeqEffectHandle sh;
|
2010-06-21 17:37:50 +00:00
|
|
|
Sequence *last_seq= seq_active_get(scene);
|
2009-01-12 19:02:08 +00:00
|
|
|
|
2010-10-07 10:04:07 +00:00
|
|
|
if(last_seq==NULL || last_seq->type != SEQ_PLUGIN) return;
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
sh = get_sequence_effect(last_seq);
|
|
|
|
sh.free(last_seq);
|
|
|
|
sh.init_plugin(last_seq, str);
|
|
|
|
|
|
|
|
last_seq->machine = MAX3(last_seq->seq1->machine,
|
|
|
|
last_seq->seq2->machine,
|
|
|
|
last_seq->seq3->machine);
|
|
|
|
|
2009-12-21 16:57:39 +00:00
|
|
|
if( seq_test_overlap(ed->seqbasep, last_seq) ) shuffle_seq(ed->seqbasep, last_seq, scene);
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void boundbox_seq(Scene *scene, rctf *rect)
|
|
|
|
{
|
|
|
|
Sequence *seq;
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-12 19:02:08 +00:00
|
|
|
float min[2], max[2];
|
|
|
|
|
2009-01-28 22:36:34 +00:00
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
if(ed==NULL) return;
|
|
|
|
|
|
|
|
min[0]= 0.0;
|
|
|
|
max[0]= EFRA+1;
|
|
|
|
min[1]= 0.0;
|
|
|
|
max[1]= 8.0;
|
|
|
|
|
|
|
|
seq= ed->seqbasep->first;
|
|
|
|
while(seq) {
|
|
|
|
|
|
|
|
if( min[0] > seq->startdisp-1) min[0]= seq->startdisp-1;
|
|
|
|
if( max[0] < seq->enddisp+1) max[0]= seq->enddisp+1;
|
2011-03-27 17:22:04 +00:00
|
|
|
if( max[1] < seq->machine+2) max[1]= seq->machine+2;
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
seq= seq->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
rect->xmin= min[0];
|
|
|
|
rect->xmax= max[0];
|
|
|
|
rect->ymin= min[1];
|
|
|
|
rect->ymax= max[1];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2011-02-14 17:55:27 +00:00
|
|
|
static int mouse_frame_side(View2D *v2d, short mouse_x, int frame )
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
{
|
2011-05-12 16:47:36 +00:00
|
|
|
int mval[2];
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
float mouseloc[2];
|
|
|
|
|
|
|
|
mval[0]= mouse_x;
|
|
|
|
mval[1]= 0;
|
|
|
|
|
|
|
|
/* choose the side based on which side of the playhead the mouse is on */
|
|
|
|
UI_view2d_region_to_view(v2d, mval[0], mval[1], &mouseloc[0], &mouseloc[1]);
|
|
|
|
|
2009-02-15 17:24:09 +00:00
|
|
|
return mouseloc[0] > frame ? SEQ_SIDE_RIGHT : SEQ_SIDE_LEFT;
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
Sequence *find_neighboring_sequence(Scene *scene, Sequence *test, int lr, int sel)
|
|
|
|
{
|
2009-02-15 17:24:09 +00:00
|
|
|
/* sel - 0==unselected, 1==selected, -1==done care*/
|
2009-01-12 19:02:08 +00:00
|
|
|
Sequence *seq;
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-12 19:02:08 +00:00
|
|
|
|
2009-01-28 22:36:34 +00:00
|
|
|
if(ed==NULL) return NULL;
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
if (sel>0) sel = SELECT;
|
|
|
|
|
2009-02-15 17:24:09 +00:00
|
|
|
for(seq= ed->seqbasep->first; seq; seq= seq->next) {
|
2009-01-12 19:02:08 +00:00
|
|
|
if( (seq!=test) &&
|
|
|
|
(test->machine==seq->machine) &&
|
|
|
|
((sel == -1) || (sel && (seq->flag & SELECT)) || (sel==0 && (seq->flag & SELECT)==0) ))
|
|
|
|
{
|
|
|
|
switch (lr) {
|
2009-02-15 17:24:09 +00:00
|
|
|
case SEQ_SIDE_LEFT:
|
2009-01-12 19:02:08 +00:00
|
|
|
if (test->startdisp == (seq->enddisp)) {
|
|
|
|
return seq;
|
|
|
|
}
|
|
|
|
break;
|
2009-02-15 17:24:09 +00:00
|
|
|
case SEQ_SIDE_RIGHT:
|
2009-01-12 19:02:08 +00:00
|
|
|
if (test->enddisp == (seq->startdisp)) {
|
|
|
|
return seq;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2011-02-14 17:55:27 +00:00
|
|
|
static Sequence *find_next_prev_sequence(Scene *scene, Sequence *test, int lr, int sel)
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
2009-02-15 17:24:09 +00:00
|
|
|
/* sel - 0==unselected, 1==selected, -1==done care*/
|
2009-01-12 19:02:08 +00:00
|
|
|
Sequence *seq,*best_seq = NULL;
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
int dist, best_dist;
|
|
|
|
best_dist = MAXFRAME*2;
|
|
|
|
|
2009-01-28 22:36:34 +00:00
|
|
|
|
|
|
|
if(ed==NULL) return NULL;
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
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) {
|
2009-02-15 17:24:09 +00:00
|
|
|
case SEQ_SIDE_LEFT:
|
2009-01-12 19:02:08 +00:00
|
|
|
if (seq->enddisp <= test->startdisp) {
|
|
|
|
dist = test->enddisp - seq->startdisp;
|
|
|
|
}
|
|
|
|
break;
|
2009-02-15 17:24:09 +00:00
|
|
|
case SEQ_SIDE_RIGHT:
|
2009-01-12 19:02:08 +00:00
|
|
|
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 */
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-05-12 16:47:36 +00:00
|
|
|
Sequence *find_nearest_seq(Scene *scene, View2D *v2d, int *hand, const int mval[2])
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
|
|
|
Sequence *seq;
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-12 19:02:08 +00:00
|
|
|
float x, y;
|
|
|
|
float pixelx;
|
|
|
|
float handsize;
|
|
|
|
float displen;
|
2009-02-15 17:24:09 +00:00
|
|
|
*hand= SEQ_SIDE_NONE;
|
2009-01-12 19:02:08 +00:00
|
|
|
|
2009-01-28 22:36:34 +00:00
|
|
|
|
|
|
|
if(ed==NULL) return NULL;
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
pixelx = (v2d->cur.xmax - v2d->cur.xmin)/(v2d->mask.xmax - v2d->mask.xmin);
|
|
|
|
|
|
|
|
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
|
|
|
|
|
|
|
seq= ed->seqbasep->first;
|
|
|
|
|
|
|
|
while(seq) {
|
|
|
|
if(seq->machine == (int)y) {
|
|
|
|
/* check for both normal strips, and strips that have been flipped horizontally */
|
|
|
|
if( ((seq->startdisp < seq->enddisp) && (seq->startdisp<=x && seq->enddisp>=x)) ||
|
|
|
|
((seq->startdisp > seq->enddisp) && (seq->startdisp>=x && seq->enddisp<=x)) )
|
|
|
|
{
|
2009-01-23 23:14:02 +00:00
|
|
|
if(seq_tx_test(seq)) {
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
/* clamp handles to defined size in pixel space */
|
|
|
|
|
|
|
|
handsize = seq->handsize;
|
|
|
|
displen = (float)abs(seq->startdisp - seq->enddisp);
|
|
|
|
|
|
|
|
if (displen / pixelx > 16) { /* dont even try to grab the handles of small strips */
|
|
|
|
/* Set the max value to handle to 1/3 of the total len when its less then 28.
|
|
|
|
* This is important because otherwise selecting handles happens even when you click in the middle */
|
|
|
|
|
|
|
|
if ((displen/3) < 30*pixelx) {
|
|
|
|
handsize = displen/3;
|
|
|
|
} else {
|
|
|
|
CLAMP(handsize, 7*pixelx, 30*pixelx);
|
|
|
|
}
|
|
|
|
|
|
|
|
if( handsize+seq->startdisp >=x )
|
2009-02-15 17:24:09 +00:00
|
|
|
*hand= SEQ_SIDE_LEFT;
|
2009-01-12 19:02:08 +00:00
|
|
|
else if( -handsize+seq->enddisp <=x )
|
2009-02-15 17:24:09 +00:00
|
|
|
*hand= SEQ_SIDE_RIGHT;
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return seq;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
seq= seq->next;
|
|
|
|
}
|
2011-04-03 10:04:16 +00:00
|
|
|
return NULL;
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int seq_is_parent(Sequence *par, Sequence *seq)
|
|
|
|
{
|
|
|
|
return ((par->seq1 == seq) || (par->seq2 == seq) || (par->seq3 == seq));
|
|
|
|
}
|
|
|
|
|
|
|
|
static int seq_is_predecessor(Sequence *pred, Sequence *seq)
|
|
|
|
{
|
|
|
|
if (!pred) return 0;
|
|
|
|
if(pred == seq) return 0;
|
|
|
|
else if(seq_is_parent(pred, seq)) return 1;
|
|
|
|
else if(pred->seq1 && seq_is_predecessor(pred->seq1, seq)) return 1;
|
|
|
|
else if(pred->seq2 && seq_is_predecessor(pred->seq2, seq)) return 1;
|
|
|
|
else if(pred->seq3 && seq_is_predecessor(pred->seq3, seq)) return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
void deselect_all_seq(Scene *scene)
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
|
|
|
Sequence *seq;
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-12 19:02:08 +00:00
|
|
|
|
2009-01-28 22:36:34 +00:00
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
if(ed==NULL) return;
|
|
|
|
|
|
|
|
SEQP_BEGIN(ed, seq) {
|
2010-06-24 10:04:18 +00:00
|
|
|
seq->flag &= ~SEQ_ALLSEL;
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
SEQ_END
|
|
|
|
|
|
|
|
}
|
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
void recurs_sel_seq(Sequence *seqm)
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
|
|
|
Sequence *seq;
|
|
|
|
|
|
|
|
seq= seqm->seqbase.first;
|
|
|
|
while(seq) {
|
|
|
|
|
2010-06-24 10:04:18 +00:00
|
|
|
if(seqm->flag & (SEQ_LEFTSEL+SEQ_RIGHTSEL)) seq->flag &= ~SEQ_ALLSEL;
|
2009-01-12 19:02:08 +00:00
|
|
|
else if(seqm->flag & SELECT) seq->flag |= SELECT;
|
2010-06-24 10:04:18 +00:00
|
|
|
else seq->flag &= ~SEQ_ALLSEL;
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
if(seq->seqbase.first) recurs_sel_seq(seq);
|
|
|
|
|
|
|
|
seq= seq->next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-12-03 17:05:21 +00:00
|
|
|
int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequence **selseq1, Sequence **selseq2, Sequence **selseq3, const char **error_str)
|
2009-01-20 14:19:39 +00:00
|
|
|
{
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed = seq_give_editing(scene, FALSE);
|
2011-04-03 10:04:16 +00:00
|
|
|
Sequence *seq1= NULL, *seq2= NULL, *seq3= NULL, *seq;
|
2009-01-20 14:19:39 +00:00
|
|
|
|
2009-01-26 09:13:15 +00:00
|
|
|
*error_str= NULL;
|
|
|
|
|
2009-01-20 14:19:39 +00:00
|
|
|
if (!activeseq)
|
2010-06-21 17:37:50 +00:00
|
|
|
seq2= seq_active_get(scene);
|
2009-01-20 14:19:39 +00:00
|
|
|
|
|
|
|
for(seq=ed->seqbasep->first; seq; seq=seq->next) {
|
|
|
|
if(seq->flag & SELECT) {
|
2010-07-16 14:00:57 +00:00
|
|
|
if (seq->type == SEQ_SOUND && get_sequence_effect_num_inputs(type) != 0) {
|
2009-01-26 09:13:15 +00:00
|
|
|
*error_str= "Can't apply effects to audio sequence strips";
|
2009-01-20 14:19:39 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if((seq != activeseq) && (seq != seq2)) {
|
2011-04-03 10:04:16 +00:00
|
|
|
if(seq2 == NULL) seq2= seq;
|
|
|
|
else if(seq1 == NULL) seq1= seq;
|
|
|
|
else if(seq3 == NULL) seq3= seq;
|
2010-03-22 09:30:00 +00:00
|
|
|
else {
|
2009-01-26 09:13:15 +00:00
|
|
|
*error_str= "Can't apply effect to more than 3 sequence strips";
|
|
|
|
return 0;
|
2010-03-22 09:30:00 +00:00
|
|
|
}
|
2009-01-20 14:19:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-04-21 13:11:51 +00:00
|
|
|
|
2009-01-20 14:19:39 +00:00
|
|
|
/* make sequence selection a little bit more intuitive
|
|
|
|
for 3 strips: the last-strip should be sequence3 */
|
2011-04-03 10:04:16 +00:00
|
|
|
if (seq3 != NULL && seq2 != NULL) {
|
2009-01-20 14:19:39 +00:00
|
|
|
Sequence *tmp = seq2;
|
|
|
|
seq2 = seq3;
|
|
|
|
seq3 = tmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
switch(get_sequence_effect_num_inputs(type)) {
|
|
|
|
case 0:
|
2011-04-03 10:04:16 +00:00
|
|
|
*selseq1 = *selseq2 = *selseq3 = NULL;
|
2009-01-26 09:13:15 +00:00
|
|
|
return 1; /* succsess */
|
2009-01-20 14:19:39 +00:00
|
|
|
case 1:
|
2011-04-03 10:04:16 +00:00
|
|
|
if(seq2==NULL) {
|
2009-01-26 09:13:15 +00:00
|
|
|
*error_str= "Need at least one selected sequence strip";
|
2009-01-20 14:19:39 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2011-04-03 10:04:16 +00:00
|
|
|
if(seq1==NULL) seq1= seq2;
|
|
|
|
if(seq3==NULL) seq3= seq2;
|
2009-01-20 14:19:39 +00:00
|
|
|
case 2:
|
2011-04-03 10:04:16 +00:00
|
|
|
if(seq1==NULL || seq2==NULL) {
|
2009-01-26 09:13:15 +00:00
|
|
|
*error_str= "Need 2 selected sequence strips";
|
2009-01-20 14:19:39 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2011-04-03 10:04:16 +00:00
|
|
|
if(seq3 == NULL) seq3= seq2;
|
2009-01-20 14:19:39 +00:00
|
|
|
}
|
|
|
|
|
2009-01-26 09:13:15 +00:00
|
|
|
if (seq1==NULL && seq2==NULL && seq3==NULL) {
|
|
|
|
*error_str= "TODO: in what cases does this happen?";
|
|
|
|
return 0;
|
|
|
|
}
|
2009-01-20 14:19:39 +00:00
|
|
|
|
|
|
|
*selseq1= seq1;
|
|
|
|
*selseq2= seq2;
|
|
|
|
*selseq3= seq3;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
static Sequence *del_seq_find_replace_recurs(Scene *scene, Sequence *seq)
|
|
|
|
{
|
|
|
|
Sequence *seq1, *seq2, *seq3;
|
|
|
|
|
|
|
|
/* try to find a replacement input sequence, and flag for later deletion if
|
|
|
|
no replacement can be found */
|
|
|
|
|
|
|
|
if(!seq)
|
|
|
|
return NULL;
|
|
|
|
else if(!(seq->type & SEQ_EFFECT))
|
|
|
|
return ((seq->flag & SELECT)? NULL: seq);
|
|
|
|
else if(!(seq->flag & SELECT)) {
|
|
|
|
/* try to find replacement for effect inputs */
|
|
|
|
seq1= del_seq_find_replace_recurs(scene, seq->seq1);
|
|
|
|
seq2= del_seq_find_replace_recurs(scene, seq->seq2);
|
|
|
|
seq3= del_seq_find_replace_recurs(scene, seq->seq3);
|
|
|
|
|
|
|
|
if(seq1==seq->seq1 && seq2==seq->seq2 && seq3==seq->seq3);
|
|
|
|
else if(seq1 || seq2 || seq3) {
|
|
|
|
seq->seq1= (seq1)? seq1: (seq2)? seq2: seq3;
|
|
|
|
seq->seq2= (seq2)? seq2: (seq1)? seq1: seq3;
|
|
|
|
seq->seq3= (seq3)? seq3: (seq1)? seq1: seq2;
|
|
|
|
|
|
|
|
update_changed_seq_and_deps(scene, seq, 1, 1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
seq->flag |= SELECT; /* mark for delete */
|
|
|
|
}
|
|
|
|
|
|
|
|
if (seq->flag & SELECT) {
|
|
|
|
if((seq1 = del_seq_find_replace_recurs(scene, seq->seq1))) return seq1;
|
|
|
|
if((seq2 = del_seq_find_replace_recurs(scene, seq->seq2))) return seq2;
|
|
|
|
if((seq3 = del_seq_find_replace_recurs(scene, seq->seq3))) return seq3;
|
|
|
|
else return NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return seq;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void recurs_del_seq_flag(Scene *scene, ListBase *lb, short flag, short deleteall)
|
|
|
|
{
|
|
|
|
Sequence *seq, *seqn;
|
2010-06-21 17:37:50 +00:00
|
|
|
Sequence *last_seq = seq_active_get(scene);
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
seq= lb->first;
|
|
|
|
while(seq) {
|
|
|
|
seqn= seq->next;
|
|
|
|
if((seq->flag & flag) || deleteall) {
|
|
|
|
BLI_remlink(lb, seq);
|
2010-06-21 17:37:50 +00:00
|
|
|
if(seq==last_seq) seq_active_set(scene, NULL);
|
2009-01-12 19:02:08 +00:00
|
|
|
if(seq->type==SEQ_META) recurs_del_seq_flag(scene, &seq->seqbase, flag, 1);
|
2009-08-09 21:16:39 +00:00
|
|
|
seq_free_sequence(scene, seq);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
seq= seqn;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-10-16 08:03:28 +00:00
|
|
|
static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe)
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
|
|
|
TransSeq ts;
|
2011-04-03 10:04:16 +00:00
|
|
|
Sequence *seqn = NULL;
|
2009-01-12 19:02:08 +00:00
|
|
|
int skip_dup = FALSE;
|
|
|
|
|
|
|
|
/* backup values */
|
|
|
|
ts.start= seq->start;
|
|
|
|
ts.machine= seq->machine;
|
|
|
|
ts.startstill= seq->startstill;
|
|
|
|
ts.endstill= seq->endstill;
|
|
|
|
ts.startdisp= seq->startdisp;
|
|
|
|
ts.enddisp= seq->enddisp;
|
2011-07-05 16:31:21 +00:00
|
|
|
ts.startofs= seq->startofs;
|
|
|
|
ts.endofs= seq->endofs;
|
|
|
|
ts.anim_startofs= seq->anim_startofs;
|
|
|
|
ts.anim_endofs= seq->anim_endofs;
|
2009-01-12 19:02:08 +00:00
|
|
|
ts.len= seq->len;
|
|
|
|
|
|
|
|
/* First Strip! */
|
|
|
|
/* strips with extended stillfames before */
|
|
|
|
|
|
|
|
if ((seq->startstill) && (cutframe <seq->start)) {
|
|
|
|
/* don't do funny things with METAs ... */
|
|
|
|
if (seq->type == SEQ_META) {
|
|
|
|
skip_dup = TRUE;
|
|
|
|
seq->startstill = seq->start - cutframe;
|
|
|
|
} else {
|
|
|
|
seq->start= cutframe -1;
|
|
|
|
seq->startstill= cutframe -seq->startdisp -1;
|
|
|
|
seq->anim_endofs += seq->len - 1;
|
|
|
|
seq->endstill= 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* normal strip */
|
|
|
|
else if ((cutframe >=seq->start)&&(cutframe <=(seq->start+seq->len))) {
|
|
|
|
seq->endofs = 0;
|
|
|
|
seq->endstill = 0;
|
|
|
|
seq->anim_endofs += (seq->start+seq->len) - cutframe;
|
|
|
|
}
|
|
|
|
/* strips with extended stillframes after */
|
|
|
|
else if (((seq->start+seq->len) < cutframe) && (seq->endstill)) {
|
|
|
|
seq->endstill -= seq->enddisp - cutframe;
|
|
|
|
/* don't do funny things with METAs ... */
|
|
|
|
if (seq->type == SEQ_META) {
|
|
|
|
skip_dup = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-10-16 08:03:28 +00:00
|
|
|
reload_sequence_new_file(scene, seq, FALSE);
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seq);
|
2010-07-20 12:22:45 +00:00
|
|
|
new_tstripdata(seq);
|
2009-08-09 21:16:39 +00:00
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
if (!skip_dup) {
|
|
|
|
/* Duplicate AFTER the first change */
|
2010-10-04 15:31:04 +00:00
|
|
|
seqn = seq_dupli_recursive(scene, NULL, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (seqn) {
|
|
|
|
seqn->flag |= SELECT;
|
|
|
|
|
|
|
|
/* Second Strip! */
|
|
|
|
/* strips with extended stillframes before */
|
|
|
|
if ((seqn->startstill) && (cutframe == seqn->start + 1)) {
|
|
|
|
seqn->start = ts.start;
|
|
|
|
seqn->startstill= ts.start- cutframe;
|
2011-07-05 16:31:21 +00:00
|
|
|
seqn->anim_endofs = ts.anim_endofs;
|
2009-01-12 19:02:08 +00:00
|
|
|
seqn->endstill = ts.endstill;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* normal strip */
|
|
|
|
else if ((cutframe>=seqn->start)&&(cutframe<=(seqn->start+seqn->len))) {
|
|
|
|
seqn->start = cutframe;
|
|
|
|
seqn->startstill = 0;
|
|
|
|
seqn->startofs = 0;
|
2011-07-05 16:31:21 +00:00
|
|
|
seqn->endofs = ts.endofs;
|
2009-01-12 19:02:08 +00:00
|
|
|
seqn->anim_startofs += cutframe - ts.start;
|
2011-07-05 16:31:21 +00:00
|
|
|
seqn->anim_endofs = ts.anim_endofs;
|
2009-01-12 19:02:08 +00:00
|
|
|
seqn->endstill = ts.endstill;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* strips with extended stillframes after */
|
|
|
|
else if (((seqn->start+seqn->len) < cutframe) && (seqn->endstill)) {
|
|
|
|
seqn->start = cutframe;
|
|
|
|
seqn->startofs = 0;
|
|
|
|
seqn->anim_startofs += ts.len-1;
|
|
|
|
seqn->endstill = ts.enddisp - cutframe -1;
|
|
|
|
seqn->startstill = 0;
|
|
|
|
}
|
|
|
|
|
2010-10-16 08:03:28 +00:00
|
|
|
reload_sequence_new_file(scene, seqn, FALSE);
|
2010-07-13 15:19:15 +00:00
|
|
|
calc_sequence(scene, seqn);
|
2010-07-20 12:22:45 +00:00
|
|
|
new_tstripdata(seqn);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
return seqn;
|
|
|
|
}
|
|
|
|
|
2010-10-16 08:03:28 +00:00
|
|
|
static Sequence *cut_seq_soft(Scene *scene, Sequence * seq, int cutframe)
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
|
|
|
TransSeq ts;
|
2011-04-03 10:04:16 +00:00
|
|
|
Sequence *seqn = NULL;
|
2009-01-12 19:02:08 +00:00
|
|
|
int skip_dup = FALSE;
|
|
|
|
|
|
|
|
/* backup values */
|
|
|
|
ts.start= seq->start;
|
|
|
|
ts.machine= seq->machine;
|
|
|
|
ts.startstill= seq->startstill;
|
|
|
|
ts.endstill= seq->endstill;
|
|
|
|
ts.startdisp= seq->startdisp;
|
|
|
|
ts.enddisp= seq->enddisp;
|
|
|
|
ts.startofs= seq->startofs;
|
|
|
|
ts.endofs= seq->endofs;
|
2011-07-05 16:31:21 +00:00
|
|
|
ts.anim_startofs= seq->anim_startofs;
|
|
|
|
ts.anim_endofs= seq->anim_endofs;
|
2009-01-12 19:02:08 +00:00
|
|
|
ts.len= seq->len;
|
|
|
|
|
|
|
|
/* First Strip! */
|
|
|
|
/* strips with extended stillfames before */
|
|
|
|
|
|
|
|
if ((seq->startstill) && (cutframe <seq->start)) {
|
|
|
|
/* don't do funny things with METAs ... */
|
|
|
|
if (seq->type == SEQ_META) {
|
|
|
|
skip_dup = TRUE;
|
|
|
|
seq->startstill = seq->start - cutframe;
|
|
|
|
} else {
|
|
|
|
seq->start= cutframe -1;
|
|
|
|
seq->startstill= cutframe -seq->startdisp -1;
|
|
|
|
seq->endofs = seq->len - 1;
|
|
|
|
seq->endstill= 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* normal strip */
|
|
|
|
else if ((cutframe >=seq->start)&&(cutframe <=(seq->start+seq->len))) {
|
|
|
|
seq->endofs = (seq->start+seq->len) - cutframe;
|
|
|
|
}
|
|
|
|
/* strips with extended stillframes after */
|
|
|
|
else if (((seq->start+seq->len) < cutframe) && (seq->endstill)) {
|
|
|
|
seq->endstill -= seq->enddisp - cutframe;
|
|
|
|
/* don't do funny things with METAs ... */
|
|
|
|
if (seq->type == SEQ_META) {
|
|
|
|
skip_dup = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seq);
|
2010-07-20 12:22:45 +00:00
|
|
|
new_tstripdata(seq);
|
2009-08-09 21:16:39 +00:00
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
if (!skip_dup) {
|
|
|
|
/* Duplicate AFTER the first change */
|
2010-10-04 15:31:04 +00:00
|
|
|
seqn = seq_dupli_recursive(scene, NULL, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (seqn) {
|
|
|
|
seqn->flag |= SELECT;
|
|
|
|
|
|
|
|
/* Second Strip! */
|
|
|
|
/* strips with extended stillframes before */
|
|
|
|
if ((seqn->startstill) && (cutframe == seqn->start + 1)) {
|
|
|
|
seqn->start = ts.start;
|
|
|
|
seqn->startstill= ts.start- cutframe;
|
|
|
|
seqn->endofs = ts.endofs;
|
|
|
|
seqn->endstill = ts.endstill;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* normal strip */
|
|
|
|
else if ((cutframe>=seqn->start)&&(cutframe<=(seqn->start+seqn->len))) {
|
|
|
|
seqn->startstill = 0;
|
|
|
|
seqn->startofs = cutframe - ts.start;
|
|
|
|
seqn->endofs = ts.endofs;
|
|
|
|
seqn->endstill = ts.endstill;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* strips with extended stillframes after */
|
|
|
|
else if (((seqn->start+seqn->len) < cutframe) && (seqn->endstill)) {
|
|
|
|
seqn->start = cutframe - ts.len +1;
|
|
|
|
seqn->startofs = ts.len-1;
|
|
|
|
seqn->endstill = ts.enddisp - cutframe -1;
|
|
|
|
seqn->startstill = 0;
|
|
|
|
}
|
|
|
|
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seqn);
|
2010-07-20 12:22:45 +00:00
|
|
|
new_tstripdata(seqn);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
return seqn;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* like duplicate, but only duplicate and cut overlapping strips,
|
|
|
|
* strips to the left of the cutframe are ignored and strips to the right are moved into the new list */
|
2010-10-16 08:03:28 +00:00
|
|
|
static int cut_seq_list(Scene *scene, ListBase *old, ListBase *new, int cutframe,
|
|
|
|
Sequence * (*cut_seq)(Scene *, Sequence *, int))
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
|
|
|
int did_something = FALSE;
|
2010-12-03 12:30:59 +00:00
|
|
|
Sequence *seq, *seq_next_iter;
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
seq= old->first;
|
|
|
|
|
|
|
|
while(seq) {
|
2010-12-03 12:30:59 +00:00
|
|
|
seq_next_iter = seq->next; /* we need this because we may remove seq */
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
seq->tmp= NULL;
|
|
|
|
if(seq->flag & SELECT) {
|
|
|
|
if(cutframe > seq->startdisp &&
|
|
|
|
cutframe < seq->enddisp) {
|
2010-10-16 08:03:28 +00:00
|
|
|
Sequence * seqn = cut_seq(scene, seq, cutframe);
|
2009-01-12 19:02:08 +00:00
|
|
|
if (seqn) {
|
|
|
|
BLI_addtail(new, seqn);
|
|
|
|
}
|
|
|
|
did_something = TRUE;
|
|
|
|
} else if (seq->enddisp <= cutframe) {
|
|
|
|
/* do nothing */
|
|
|
|
} else if (seq->startdisp >= cutframe) {
|
|
|
|
/* move into new list */
|
|
|
|
BLI_remlink(old, seq);
|
|
|
|
BLI_addtail(new, seq);
|
|
|
|
}
|
|
|
|
}
|
2010-12-03 12:30:59 +00:00
|
|
|
seq = seq_next_iter;
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
return did_something;
|
|
|
|
}
|
|
|
|
|
2011-02-14 17:55:27 +00:00
|
|
|
static int insert_gap(Scene *scene, int gap, int cfra)
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
|
|
|
Sequence *seq;
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-12 19:02:08 +00:00
|
|
|
int done=0;
|
|
|
|
|
|
|
|
/* all strips >= cfra are shifted */
|
2009-01-28 22:36:34 +00:00
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
if(ed==NULL) return 0;
|
|
|
|
|
|
|
|
SEQP_BEGIN(ed, seq) {
|
|
|
|
if(seq->startdisp >= cfra) {
|
|
|
|
seq->start+= gap;
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seq);
|
2009-01-12 19:02:08 +00:00
|
|
|
done= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SEQ_END
|
|
|
|
|
|
|
|
return done;
|
|
|
|
}
|
|
|
|
|
2011-08-15 16:18:04 +00:00
|
|
|
static void UNUSED_FUNCTION(touch_seq_files)(Scene *scene)
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
|
|
|
Sequence *seq;
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-12 19:02:08 +00:00
|
|
|
char str[256];
|
|
|
|
|
|
|
|
/* touch all strips with movies */
|
2009-01-28 22:36:34 +00:00
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
if(ed==NULL) return;
|
|
|
|
|
|
|
|
if(okee("Touch and print selected movies")==0) return;
|
|
|
|
|
2011-08-15 16:18:04 +00:00
|
|
|
WM_cursor_wait(1);
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
SEQP_BEGIN(ed, seq) {
|
|
|
|
if(seq->flag & SELECT) {
|
|
|
|
if(seq->type==SEQ_MOVIE) {
|
|
|
|
if(seq->strip && seq->strip->stripdata) {
|
2010-10-18 06:41:16 +00:00
|
|
|
BLI_make_file_string(G.main->name, str, seq->strip->dir, seq->strip->stripdata->name);
|
2009-01-12 19:02:08 +00:00
|
|
|
BLI_touch(seq->name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SEQ_END
|
|
|
|
|
2011-08-15 16:18:04 +00:00
|
|
|
WM_cursor_wait(0);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
|
2010-10-16 08:03:28 +00:00
|
|
|
/*
|
|
|
|
static void set_filter_seq(Scene *scene)
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
|
|
|
Sequence *seq;
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-12 19:02:08 +00:00
|
|
|
|
2009-01-28 22:36:34 +00:00
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
if(ed==NULL) return;
|
|
|
|
|
|
|
|
if(okee("Set Deinterlace")==0) return;
|
|
|
|
|
|
|
|
SEQP_BEGIN(ed, seq) {
|
|
|
|
if(seq->flag & SELECT) {
|
|
|
|
if(seq->type==SEQ_MOVIE) {
|
|
|
|
seq->flag |= SEQ_FILTERY;
|
2010-10-16 08:03:28 +00:00
|
|
|
reload_sequence_new_file(scene, seq, FALSE);
|
2010-05-08 16:36:28 +00:00
|
|
|
calc_sequence(scene, seq);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SEQ_END
|
|
|
|
}
|
2010-10-16 08:03:28 +00:00
|
|
|
*/
|
2009-01-12 19:02:08 +00:00
|
|
|
|
2011-08-15 16:18:04 +00:00
|
|
|
static void UNUSED_FUNCTION(seq_remap_paths)(Scene *scene)
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
2010-06-21 17:37:50 +00:00
|
|
|
Sequence *seq, *last_seq = seq_active_get(scene);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-12 19:02:08 +00:00
|
|
|
char from[FILE_MAX], to[FILE_MAX], stripped[FILE_MAX];
|
|
|
|
|
2009-01-28 22:36:34 +00:00
|
|
|
|
|
|
|
if(last_seq==NULL)
|
2009-01-12 19:02:08 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
BLI_strncpy(from, last_seq->strip->dir, FILE_MAX);
|
|
|
|
// XXX if (0==sbutton(from, 0, sizeof(from)-1, "From: "))
|
|
|
|
// return;
|
|
|
|
|
|
|
|
strcpy(to, from);
|
|
|
|
// XXX if (0==sbutton(to, 0, sizeof(to)-1, "To: "))
|
|
|
|
// return;
|
|
|
|
|
|
|
|
if (strcmp(to, from)==0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
SEQP_BEGIN(ed, seq) {
|
|
|
|
if(seq->flag & SELECT) {
|
|
|
|
if(strncmp(seq->strip->dir, from, strlen(from))==0) {
|
|
|
|
printf("found %s\n", seq->strip->dir);
|
|
|
|
|
|
|
|
/* strip off the beginning */
|
|
|
|
stripped[0]= 0;
|
|
|
|
BLI_strncpy(stripped, seq->strip->dir + strlen(from), FILE_MAX);
|
|
|
|
|
|
|
|
/* new path */
|
2011-02-13 03:21:27 +00:00
|
|
|
BLI_snprintf(seq->strip->dir, sizeof(seq->strip->dir), "%s%s", to, stripped);
|
2009-01-12 19:02:08 +00:00
|
|
|
printf("new %s\n", seq->strip->dir);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SEQ_END
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-08-15 16:18:04 +00:00
|
|
|
static void UNUSED_FUNCTION(no_gaps)(Scene *scene)
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-12 19:02:08 +00:00
|
|
|
int cfra, first= 0, done;
|
|
|
|
|
2009-01-28 22:36:34 +00:00
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
if(ed==NULL) return;
|
|
|
|
|
|
|
|
for(cfra= CFRA; cfra<=EFRA; cfra++) {
|
|
|
|
if(first==0) {
|
|
|
|
if( evaluate_seq_frame(scene, cfra) ) first= 1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
done= 1;
|
|
|
|
while( evaluate_seq_frame(scene, cfra) == 0) {
|
|
|
|
done= insert_gap(scene, -1, cfra);
|
|
|
|
if(done==0) break;
|
|
|
|
}
|
|
|
|
if(done==0) break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2009-01-25 14:53:41 +00:00
|
|
|
#if 0
|
2009-01-12 19:02:08 +00:00
|
|
|
static int seq_get_snaplimit(View2D *v2d)
|
|
|
|
{
|
|
|
|
/* fake mouse coords to get the snap value
|
|
|
|
a bit lazy but its only done once pre transform */
|
|
|
|
float xmouse, ymouse, x;
|
2011-05-12 16:47:36 +00:00
|
|
|
int mval[2] = {24, 0}; /* 24 screen px snap */
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
UI_view2d_region_to_view(v2d, mval[0], mval[1], &xmouse, &ymouse);
|
|
|
|
x = xmouse;
|
|
|
|
mval[0] = 0;
|
|
|
|
UI_view2d_region_to_view(v2d, mval[0], mval[1], &xmouse, &ymouse);
|
|
|
|
return (int)(x - xmouse);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2009-06-09 21:29:59 +00:00
|
|
|
/* Operator functions */
|
2010-05-06 07:19:55 +00:00
|
|
|
int sequencer_edit_poll(bContext *C)
|
|
|
|
{
|
|
|
|
return (seq_give_editing(CTX_data_scene(C), FALSE) != NULL);
|
|
|
|
}
|
|
|
|
|
2011-08-12 06:08:22 +00:00
|
|
|
int sequencer_strip_poll(bContext *C)
|
|
|
|
{
|
|
|
|
Editing *ed;
|
|
|
|
return (((ed= seq_give_editing(CTX_data_scene(C), FALSE)) != NULL) && (ed->act_seq != NULL));
|
|
|
|
}
|
|
|
|
|
|
|
|
int sequencer_strip_has_path_poll(bContext *C)
|
|
|
|
{
|
|
|
|
Editing *ed;
|
|
|
|
Sequence *seq;
|
|
|
|
return (((ed= seq_give_editing(CTX_data_scene(C), FALSE)) != NULL) && ((seq= ed->act_seq) != NULL) && (SEQ_HAS_PATH(seq)));
|
|
|
|
}
|
|
|
|
|
2010-07-08 10:03:29 +00:00
|
|
|
int sequencer_view_poll(bContext *C)
|
|
|
|
{
|
|
|
|
SpaceSeq *sseq= CTX_wm_space_seq(C);
|
|
|
|
Editing *ed= seq_give_editing(CTX_data_scene(C), FALSE);
|
|
|
|
if (ed && sseq && (sseq->mainb == SEQ_DRAW_IMG_IMBUF))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2009-06-09 21:29:59 +00:00
|
|
|
|
|
|
|
/* snap operator*/
|
|
|
|
static int sequencer_snap_exec(bContext *C, wmOperator *op)
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
2009-06-09 21:29:59 +00:00
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-12 19:02:08 +00:00
|
|
|
Sequence *seq;
|
2009-06-09 21:29:59 +00:00
|
|
|
int snap_frame;
|
|
|
|
|
|
|
|
snap_frame= RNA_int_get(op->ptr, "frame");
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
/* also check metas */
|
2010-11-09 04:56:52 +00:00
|
|
|
for(seq= ed->seqbasep->first; seq; seq= seq->next) {
|
2009-01-12 19:02:08 +00:00
|
|
|
if (seq->flag & SELECT && !(seq->depth==0 && seq->flag & SEQ_LOCK) &&
|
2010-03-22 09:30:00 +00:00
|
|
|
seq_tx_test(seq)) {
|
2009-01-12 19:02:08 +00:00
|
|
|
if((seq->flag & (SEQ_LEFTSEL+SEQ_RIGHTSEL))==0) {
|
2010-11-09 04:56:52 +00:00
|
|
|
/* simple but no anim update */
|
|
|
|
/* seq->start= snap_frame-seq->startofs+seq->startstill; */
|
|
|
|
|
|
|
|
seq_translate(scene, seq, (snap_frame-seq->startofs+seq->startstill) - seq->start);
|
2009-01-12 19:02:08 +00:00
|
|
|
} else {
|
|
|
|
if(seq->flag & SEQ_LEFTSEL) {
|
2009-06-09 21:29:59 +00:00
|
|
|
seq_tx_set_final_left(seq, snap_frame);
|
2009-01-12 19:02:08 +00:00
|
|
|
} else { /* SEQ_RIGHTSEL */
|
2009-06-09 21:29:59 +00:00
|
|
|
seq_tx_set_final_right(seq, snap_frame);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
2009-01-21 07:01:20 +00:00
|
|
|
seq_tx_handle_xlimits(seq, seq->flag & SEQ_LEFTSEL, seq->flag & SEQ_RIGHTSEL);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seq);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-10-29 19:40:45 +00:00
|
|
|
/* test for effects and overlap
|
|
|
|
* dont use SEQP_BEGIN since that would be recursive */
|
|
|
|
for(seq= ed->seqbasep->first; seq; seq= seq->next) {
|
2009-01-12 19:02:08 +00:00
|
|
|
if(seq->flag & SELECT && !(seq->depth==0 && seq->flag & SEQ_LOCK)) {
|
|
|
|
seq->flag &= ~SEQ_OVERLAP;
|
2009-01-25 14:53:41 +00:00
|
|
|
if( seq_test_overlap(ed->seqbasep, seq) ) {
|
2009-12-21 16:57:39 +00:00
|
|
|
shuffle_seq(ed->seqbasep, seq, scene);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(seq->type & SEQ_EFFECT) {
|
|
|
|
if(seq->seq1 && (seq->seq1->flag & SELECT))
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seq);
|
2009-01-12 19:02:08 +00:00
|
|
|
else if(seq->seq2 && (seq->seq2->flag & SELECT))
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seq);
|
2009-01-12 19:02:08 +00:00
|
|
|
else if(seq->seq3 && (seq->seq3->flag & SELECT))
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seq);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* as last: */
|
|
|
|
sort_seq(scene);
|
2009-06-09 21:29:59 +00:00
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
2009-06-09 21:29:59 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_snap_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
2009-06-09 21:29:59 +00:00
|
|
|
Scene *scene = CTX_data_scene(C);
|
|
|
|
|
|
|
|
int snap_frame;
|
2009-01-12 19:02:08 +00:00
|
|
|
|
2009-06-09 21:29:59 +00:00
|
|
|
snap_frame= CFRA;
|
2009-01-12 19:02:08 +00:00
|
|
|
|
2009-06-09 21:29:59 +00:00
|
|
|
RNA_int_set(op->ptr, "frame", snap_frame);
|
|
|
|
return sequencer_snap_exec(C, op);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
|
2009-06-09 21:29:59 +00:00
|
|
|
void SEQUENCER_OT_snap(struct wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Snap strips";
|
|
|
|
ot->idname= "SEQUENCER_OT_snap";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Frame where selected strips will be snapped";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
2009-06-09 21:29:59 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->invoke= sequencer_snap_invoke;
|
|
|
|
ot->exec= sequencer_snap_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-06-09 21:29:59 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
2009-09-12 17:16:12 +00:00
|
|
|
RNA_def_int(ot->srna, "frame", 0, INT_MIN, INT_MAX, "Frame", "Frame where selected strips will be snapped", INT_MIN, INT_MAX);
|
2009-06-09 21:29:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* mute operator */
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
static int sequencer_mute_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
Sequence *seq;
|
|
|
|
int selected;
|
|
|
|
|
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
|
|
|
selected= !RNA_boolean_get(op->ptr, "unselected");
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
|
2009-01-12 19:02:08 +00:00
|
|
|
for(seq= ed->seqbasep->first; seq; seq= seq->next) {
|
|
|
|
if ((seq->flag & SEQ_LOCK)==0) {
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
if(selected){ /* mute unselected */
|
2009-12-08 13:57:51 +00:00
|
|
|
if(seq->flag & SELECT)
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
seq->flag |= SEQ_MUTE;
|
|
|
|
}
|
|
|
|
else {
|
2009-12-08 13:57:51 +00:00
|
|
|
if((seq->flag & SELECT)==0)
|
2009-01-12 19:02:08 +00:00
|
|
|
seq->flag |= SEQ_MUTE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
|
2011-08-07 11:54:58 +00:00
|
|
|
seq_update_muting(ed);
|
2009-12-08 13:57:51 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
void SEQUENCER_OT_mute(struct wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Mute Strips";
|
|
|
|
ot->idname= "SEQUENCER_OT_mute";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Mute selected strips";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_mute_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
2011-09-19 12:26:20 +00:00
|
|
|
RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Mute unselected rather than selected strips");
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* unmute operator */
|
|
|
|
static int sequencer_unmute_exec(bContext *C, wmOperator *op)
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
Scene *scene= CTX_data_scene(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-12 19:02:08 +00:00
|
|
|
Sequence *seq;
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
int selected;
|
|
|
|
|
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
|
|
|
selected= !RNA_boolean_get(op->ptr, "unselected");
|
2009-01-12 19:02:08 +00:00
|
|
|
|
|
|
|
for(seq= ed->seqbasep->first; seq; seq= seq->next) {
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
if ((seq->flag & SEQ_LOCK)==0) {
|
|
|
|
if(selected){ /* unmute unselected */
|
2009-12-08 13:57:51 +00:00
|
|
|
if(seq->flag & SELECT)
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
seq->flag &= ~SEQ_MUTE;
|
|
|
|
}
|
|
|
|
else {
|
2009-12-08 13:57:51 +00:00
|
|
|
if((seq->flag & SELECT)==0)
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
seq->flag &= ~SEQ_MUTE;
|
|
|
|
}
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
}
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
|
2011-08-07 11:54:58 +00:00
|
|
|
seq_update_muting(ed);
|
2009-12-08 13:57:51 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
void SEQUENCER_OT_unmute(struct wmOperatorType *ot)
|
2009-01-12 19:02:08 +00:00
|
|
|
{
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
/* identifiers */
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->name= "Un-Mute Strips";
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
ot->idname= "SEQUENCER_OT_unmute";
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->description="Un-Mute unselected rather than selected strips";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_unmute_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
2011-09-19 12:26:20 +00:00
|
|
|
RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "UnMute unselected rather than selected strips");
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
}
|
2009-01-12 19:02:08 +00:00
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
|
2009-01-25 14:53:41 +00:00
|
|
|
/* lock operator */
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_lock_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-01-25 14:53:41 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-25 14:53:41 +00:00
|
|
|
Sequence *seq;
|
|
|
|
|
|
|
|
for(seq= ed->seqbasep->first; seq; seq= seq->next) {
|
|
|
|
if (seq->flag & SELECT) {
|
|
|
|
seq->flag |= SEQ_LOCK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
2009-01-25 14:53:41 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_lock(struct wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Lock Strips";
|
|
|
|
ot->idname= "SEQUENCER_OT_lock";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Lock the active strip so that it can't be transformed";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
2009-01-25 14:53:41 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_lock_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
2009-01-25 14:53:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* unlock operator */
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_unlock_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-01-25 14:53:41 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-25 14:53:41 +00:00
|
|
|
Sequence *seq;
|
|
|
|
|
|
|
|
for(seq= ed->seqbasep->first; seq; seq= seq->next) {
|
|
|
|
if (seq->flag & SELECT) {
|
|
|
|
seq->flag &= ~SEQ_LOCK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
2009-01-25 14:53:41 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_unlock(struct wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "UnLock Strips";
|
|
|
|
ot->idname= "SEQUENCER_OT_unlock";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Unlock the active strip so that it can't be transformed";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
2009-01-25 14:53:41 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_unlock_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
2009-01-25 14:53:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* reload operator */
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_reload_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-01-25 14:53:41 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-25 14:53:41 +00:00
|
|
|
Sequence *seq;
|
|
|
|
|
|
|
|
for(seq= ed->seqbasep->first; seq; seq= seq->next) {
|
|
|
|
if(seq->flag & SELECT) {
|
|
|
|
update_changed_seq_and_deps(scene, seq, 0, 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
2009-01-25 14:53:41 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_reload(struct wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Reload Strips";
|
|
|
|
ot->idname= "SEQUENCER_OT_reload";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Reload strips in the sequencer";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
2009-01-25 14:53:41 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_reload_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
2011-08-19 20:25:25 +00:00
|
|
|
ot->flag= OPTYPE_REGISTER; /* no undo, the data changed is stored outside 'main' */
|
2009-01-25 14:53:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* reload operator */
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_refresh_all_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-01-25 14:53:41 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-25 14:53:41 +00:00
|
|
|
|
2010-07-19 20:01:18 +00:00
|
|
|
free_imbuf_seq(scene, &ed->seqbase, FALSE, FALSE);
|
2009-01-25 14:53:41 +00:00
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
2009-01-25 14:53:41 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_refresh_all(struct wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Refresh Sequencer";
|
|
|
|
ot->idname= "SEQUENCER_OT_refresh_all";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Refresh the sequencer editor";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
2009-01-25 14:53:41 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_refresh_all_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-01-25 14:53:41 +00:00
|
|
|
}
|
|
|
|
|
2010-07-03 22:25:22 +00:00
|
|
|
static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Sequence *seq1, *seq2, *seq3, *last_seq = seq_active_get(scene);
|
2010-12-03 17:05:21 +00:00
|
|
|
const char *error_msg;
|
2010-07-03 22:25:22 +00:00
|
|
|
|
|
|
|
if(!seq_effect_find_selected(scene, last_seq, last_seq->type, &seq1, &seq2, &seq3, &error_msg)) {
|
|
|
|
BKE_report(op->reports, RPT_ERROR, error_msg);
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
/* see reassigning would create a cycle */
|
|
|
|
if( seq_is_predecessor(seq1, last_seq) ||
|
|
|
|
seq_is_predecessor(seq2, last_seq) ||
|
|
|
|
seq_is_predecessor(seq3, last_seq)
|
|
|
|
) {
|
|
|
|
BKE_report(op->reports, RPT_ERROR, "Can't reassign inputs: no cycles allowed");
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
|
|
|
last_seq->seq1 = seq1;
|
|
|
|
last_seq->seq2 = seq2;
|
|
|
|
last_seq->seq3 = seq3;
|
|
|
|
|
|
|
|
update_changed_seq_and_deps(scene, last_seq, 1, 1);
|
|
|
|
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
2011-02-14 17:55:27 +00:00
|
|
|
static int sequencer_effect_poll(bContext *C)
|
2010-07-03 22:25:22 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
|
|
|
|
|
|
|
if(ed) {
|
|
|
|
Sequence *last_seq= seq_active_get(scene);
|
|
|
|
if(last_seq && (last_seq->type & SEQ_EFFECT)) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_reassign_inputs(struct wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Reassign Inputs";
|
|
|
|
ot->idname= "SEQUENCER_OT_reassign_inputs";
|
2011-09-19 12:26:20 +00:00
|
|
|
ot->description="Reassign the inputs for the effect strip";
|
2010-07-03 22:25:22 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_reassign_inputs_exec;
|
|
|
|
ot->poll= sequencer_effect_poll;
|
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-10-30 12:04:00 +00:00
|
|
|
static int sequencer_swap_inputs_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Sequence *seq, *last_seq = seq_active_get(scene);
|
|
|
|
|
|
|
|
if(last_seq->seq1==NULL || last_seq->seq2 == NULL) {
|
|
|
|
BKE_report(op->reports, RPT_ERROR, "No valid inputs to swap");
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
|
|
|
seq = last_seq->seq1;
|
|
|
|
last_seq->seq1 = last_seq->seq2;
|
|
|
|
last_seq->seq2 = seq;
|
|
|
|
|
|
|
|
update_changed_seq_and_deps(scene, last_seq, 1, 1);
|
|
|
|
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
void SEQUENCER_OT_swap_inputs(struct wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Swap Inputs";
|
|
|
|
ot->idname= "SEQUENCER_OT_swap_inputs";
|
2011-09-19 12:26:20 +00:00
|
|
|
ot->description="Swap the first two inputs for the effect strip";
|
2010-10-30 12:04:00 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_swap_inputs_exec;
|
|
|
|
ot->poll= sequencer_effect_poll;
|
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
/* cut operator */
|
|
|
|
static EnumPropertyItem prop_cut_types[] = {
|
2009-06-16 00:52:21 +00:00
|
|
|
{SEQ_CUT_SOFT, "SOFT", 0, "Soft", ""},
|
|
|
|
{SEQ_CUT_HARD, "HARD", 0, "Hard", ""},
|
|
|
|
{0, NULL, 0, NULL, NULL}
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static int sequencer_cut_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
int cut_side, cut_hard, cut_frame;
|
|
|
|
|
|
|
|
ListBase newlist;
|
|
|
|
int changed;
|
2009-01-28 22:36:34 +00:00
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
cut_frame= RNA_int_get(op->ptr, "frame");
|
|
|
|
cut_hard= RNA_enum_get(op->ptr, "type");
|
|
|
|
cut_side= RNA_enum_get(op->ptr, "side");
|
|
|
|
|
|
|
|
newlist.first= newlist.last= NULL;
|
|
|
|
|
|
|
|
if (cut_hard==SEQ_CUT_HARD) {
|
2010-10-16 08:03:28 +00:00
|
|
|
changed = cut_seq_list(scene, ed->seqbasep, &newlist, cut_frame, cut_seq_hard);
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
} else {
|
2010-10-16 08:03:28 +00:00
|
|
|
changed = cut_seq_list(scene, ed->seqbasep, &newlist, cut_frame, cut_seq_soft);
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (newlist.first) { /* got new strips ? */
|
|
|
|
Sequence *seq;
|
2010-12-21 14:49:34 +00:00
|
|
|
BLI_movelisttolist(ed->seqbasep, &newlist);
|
2009-01-31 09:58:38 +00:00
|
|
|
|
|
|
|
if (cut_side != SEQ_SIDE_BOTH) {
|
|
|
|
SEQP_BEGIN(ed, seq) {
|
|
|
|
if (cut_side==SEQ_SIDE_LEFT) {
|
|
|
|
if ( seq->startdisp >= cut_frame ) {
|
2010-06-24 10:04:18 +00:00
|
|
|
seq->flag &= ~SEQ_ALLSEL;
|
2009-01-31 09:58:38 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ( seq->enddisp <= cut_frame ) {
|
2010-06-24 10:04:18 +00:00
|
|
|
seq->flag &= ~SEQ_ALLSEL;
|
2009-01-31 09:58:38 +00:00
|
|
|
}
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
|
|
|
}
|
2009-01-31 09:58:38 +00:00
|
|
|
SEQ_END;
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
/* as last: */
|
|
|
|
sort_seq(scene);
|
|
|
|
}
|
2009-01-12 19:02:08 +00:00
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int sequencer_cut_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
2009-01-24 06:08:46 +00:00
|
|
|
Scene *scene = CTX_data_scene(C);
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
View2D *v2d= UI_view2d_fromcontext(C);
|
2010-05-19 08:44:38 +00:00
|
|
|
|
|
|
|
int cut_side= SEQ_SIDE_BOTH;
|
|
|
|
int cut_frame= CFRA;
|
|
|
|
|
2010-05-06 07:19:55 +00:00
|
|
|
if (ED_operator_sequencer_active(C) && v2d)
|
2011-05-20 07:40:05 +00:00
|
|
|
cut_side= mouse_frame_side(v2d, event->mval[0], cut_frame);
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
|
|
|
|
RNA_int_set(op->ptr, "frame", cut_frame);
|
|
|
|
RNA_enum_set(op->ptr, "side", cut_side);
|
|
|
|
/*RNA_enum_set(op->ptr, "type", cut_hard); */ /*This type is set from the key shortcut */
|
|
|
|
|
|
|
|
return sequencer_cut_exec(C, op);
|
2009-01-12 19:02:08 +00:00
|
|
|
}
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
void SEQUENCER_OT_cut(struct wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Cut Strips";
|
|
|
|
ot->idname= "SEQUENCER_OT_cut";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Cut the selected strips";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->invoke= sequencer_cut_invoke;
|
|
|
|
ot->exec= sequencer_cut_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
RNA_def_int(ot->srna, "frame", 0, INT_MIN, INT_MAX, "Frame", "Frame where selected strips will be cut", INT_MIN, INT_MAX);
|
2009-09-12 17:16:12 +00:00
|
|
|
RNA_def_enum(ot->srna, "type", prop_cut_types, SEQ_CUT_SOFT, "Type", "The type of cut operation to perform on strips");
|
2009-01-31 09:58:38 +00:00
|
|
|
RNA_def_enum(ot->srna, "side", prop_side_types, SEQ_SIDE_BOTH, "Side", "The side that remains selected after cutting");
|
Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
2009-01-19 21:42:18 +00:00
|
|
|
}
|
|
|
|
|
2009-01-21 18:47:09 +00:00
|
|
|
/* duplicate operator */
|
2010-07-07 16:37:41 +00:00
|
|
|
static int apply_unique_name_cb(Sequence *seq, void *arg_pt)
|
|
|
|
{
|
|
|
|
Scene *scene= (Scene *)arg_pt;
|
|
|
|
char name[sizeof(seq->name)-2];
|
|
|
|
|
|
|
|
strcpy(name, seq->name+2);
|
|
|
|
seqbase_unique_name_recursive(&scene->ed->seqbase, seq);
|
|
|
|
seq_dupe_animdata(scene, name, seq->name+2);
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_add_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-01-21 18:47:09 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-21 18:47:09 +00:00
|
|
|
|
2010-06-24 10:04:18 +00:00
|
|
|
ListBase nseqbase= {NULL, NULL};
|
2009-01-21 18:47:09 +00:00
|
|
|
|
2009-01-28 22:36:34 +00:00
|
|
|
if(ed==NULL)
|
|
|
|
return OPERATOR_CANCELLED;
|
2009-01-21 18:47:09 +00:00
|
|
|
|
2010-10-04 15:31:04 +00:00
|
|
|
seqbase_dupli_recursive(scene, NULL, &nseqbase, ed->seqbasep, SEQ_DUPE_CONTEXT);
|
2009-01-21 18:47:09 +00:00
|
|
|
|
2010-06-24 10:04:18 +00:00
|
|
|
if(nseqbase.first) {
|
|
|
|
Sequence * seq= nseqbase.first;
|
|
|
|
/* rely on the nseqbase list being added at the end */
|
2010-12-21 14:49:34 +00:00
|
|
|
BLI_movelisttolist(ed->seqbasep, &nseqbase);
|
2009-01-21 18:47:09 +00:00
|
|
|
|
2010-07-07 16:37:41 +00:00
|
|
|
for( ; seq; seq= seq->next)
|
|
|
|
seq_recursive_apply(seq, apply_unique_name_cb, scene);
|
2010-02-16 17:58:50 +00:00
|
|
|
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
return OPERATOR_CANCELLED;
|
2009-01-21 18:47:09 +00:00
|
|
|
}
|
|
|
|
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
|
2009-01-21 18:47:09 +00:00
|
|
|
{
|
|
|
|
sequencer_add_duplicate_exec(C, op);
|
|
|
|
|
2011-03-22 12:53:36 +00:00
|
|
|
RNA_enum_set(op->ptr, "mode", TFM_TRANSLATION);
|
2009-12-10 10:36:32 +00:00
|
|
|
WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
|
2009-01-21 18:47:09 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
2009-07-08 21:41:35 +00:00
|
|
|
void SEQUENCER_OT_duplicate(wmOperatorType *ot)
|
2009-01-21 18:47:09 +00:00
|
|
|
{
|
|
|
|
/* identifiers */
|
2011-04-19 11:17:29 +00:00
|
|
|
ot->name= "Duplicate Strips";
|
2009-07-08 21:41:35 +00:00
|
|
|
ot->idname= "SEQUENCER_OT_duplicate";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Duplicate the selected strips";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
2009-01-21 18:47:09 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->invoke= sequencer_add_duplicate_invoke;
|
|
|
|
ot->exec= sequencer_add_duplicate_exec;
|
|
|
|
ot->poll= ED_operator_sequencer_active;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
2009-01-21 18:47:09 +00:00
|
|
|
/* to give to transform */
|
2011-04-01 08:51:12 +00:00
|
|
|
RNA_def_enum(ot->srna, "mode", transform_mode_types, TFM_TRANSLATION, "Mode", "");
|
2009-01-21 18:47:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* delete operator */
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_delete_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-01-21 18:47:09 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-21 18:47:09 +00:00
|
|
|
Sequence *seq;
|
|
|
|
MetaStack *ms;
|
|
|
|
int nothingSelected = TRUE;
|
|
|
|
|
2010-06-21 17:37:50 +00:00
|
|
|
seq=seq_active_get(scene);
|
2009-01-21 18:47:09 +00:00
|
|
|
if (seq && seq->flag & SELECT) { /* avoid a loop since this is likely to be selected */
|
|
|
|
nothingSelected = FALSE;
|
|
|
|
} else {
|
|
|
|
for (seq = ed->seqbasep->first; seq; seq = seq->next) {
|
|
|
|
if (seq->flag & SELECT) {
|
|
|
|
nothingSelected = FALSE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nothingSelected)
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
|
|
|
|
/* for effects, try to find a replacement input */
|
|
|
|
for(seq=ed->seqbasep->first; seq; seq=seq->next)
|
|
|
|
if((seq->type & SEQ_EFFECT) && !(seq->flag & SELECT))
|
|
|
|
del_seq_find_replace_recurs(scene, seq);
|
|
|
|
|
|
|
|
/* delete all selected strips */
|
|
|
|
recurs_del_seq_flag(scene, ed->seqbasep, SELECT, 0);
|
|
|
|
|
|
|
|
/* updates lengths etc */
|
|
|
|
seq= ed->seqbasep->first;
|
|
|
|
while(seq) {
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seq);
|
2009-01-21 18:47:09 +00:00
|
|
|
seq= seq->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* free parent metas */
|
|
|
|
ms= ed->metastack.last;
|
|
|
|
while(ms) {
|
|
|
|
ms->parseq->strip->len= 0; /* force new alloc */
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, ms->parseq);
|
2009-01-21 18:47:09 +00:00
|
|
|
ms= ms->prev;
|
|
|
|
}
|
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
2009-01-21 18:47:09 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SEQUENCER_OT_delete(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Erase Strips";
|
|
|
|
ot->idname= "SEQUENCER_OT_delete";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Erase selected strips from the sequencer";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
2009-01-21 18:47:09 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->invoke= WM_operator_confirm;
|
|
|
|
ot->exec= sequencer_delete_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
2009-01-21 18:47:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-08-14 03:59:22 +00:00
|
|
|
/* offset clear operator */
|
|
|
|
static int sequencer_offset_clear_exec(bContext *C, wmOperator *UNUSED(op))
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
|
|
|
Sequence *seq;
|
|
|
|
|
|
|
|
/* for effects, try to find a replacement input */
|
|
|
|
for(seq=ed->seqbasep->first; seq; seq=seq->next) {
|
|
|
|
if((seq->type & SEQ_EFFECT)==0 && (seq->flag & SELECT)) {
|
|
|
|
seq->startofs= seq->endofs= seq->startstill= seq->endstill= 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* updates lengths etc */
|
|
|
|
seq= ed->seqbasep->first;
|
|
|
|
while(seq) {
|
|
|
|
calc_sequence(scene, seq);
|
|
|
|
seq= seq->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
for(seq=ed->seqbasep->first; seq; seq=seq->next) {
|
|
|
|
if((seq->type & SEQ_EFFECT)==0 && (seq->flag & SELECT)) {
|
|
|
|
if(seq_test_overlap(ed->seqbasep, seq)) {
|
|
|
|
shuffle_seq(ed->seqbasep, seq, scene);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SEQUENCER_OT_offset_clear(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Clear Strip Offset";
|
|
|
|
ot->idname= "SEQUENCER_OT_offset_clear";
|
|
|
|
ot->description="Clear strip offsets from the start and end frames";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_offset_clear_exec;
|
|
|
|
ot->poll= sequencer_edit_poll;
|
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-01-21 18:47:09 +00:00
|
|
|
/* separate_images operator */
|
|
|
|
static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-21 18:47:09 +00:00
|
|
|
|
2011-01-09 01:17:56 +00:00
|
|
|
Sequence *seq, *seq_new;
|
2009-01-21 18:47:09 +00:00
|
|
|
Strip *strip_new;
|
|
|
|
StripElem *se, *se_new;
|
|
|
|
int start_ofs, cfra, frame_end;
|
2009-10-19 21:34:38 +00:00
|
|
|
int step= RNA_int_get(op->ptr, "length");
|
2009-01-21 18:47:09 +00:00
|
|
|
|
2010-07-03 17:47:06 +00:00
|
|
|
seq= ed->seqbasep->first; /* poll checks this is valid */
|
2009-01-21 18:47:09 +00:00
|
|
|
|
|
|
|
while (seq) {
|
|
|
|
if((seq->flag & SELECT) && (seq->type == SEQ_IMAGE) && (seq->len > 1)) {
|
|
|
|
/* remove seq so overlap tests dont conflict,
|
|
|
|
see seq_free_sequence below for the real free'ing */
|
|
|
|
BLI_remlink(ed->seqbasep, seq);
|
2010-07-03 17:47:06 +00:00
|
|
|
/* if(seq->ipo) seq->ipo->id.us--; */
|
|
|
|
/* XXX, remove fcurve and assign to split image strips */
|
2009-01-21 18:47:09 +00:00
|
|
|
|
|
|
|
start_ofs = cfra = seq_tx_get_final_left(seq, 0);
|
|
|
|
frame_end = seq_tx_get_final_right(seq, 0);
|
|
|
|
|
|
|
|
while (cfra < frame_end) {
|
|
|
|
/* new seq */
|
|
|
|
se = give_stripelem(seq, cfra);
|
|
|
|
|
2011-07-06 10:58:23 +00:00
|
|
|
seq_new= seq_dupli_recursive(scene, scene, seq, SEQ_DUPE_UNIQUE_NAME);
|
2011-08-05 06:26:54 +00:00
|
|
|
BLI_addtail(ed->seqbasep, seq_new);
|
2011-07-06 10:58:23 +00:00
|
|
|
|
|
|
|
seq_new->start= start_ofs;
|
2009-01-21 18:47:09 +00:00
|
|
|
seq_new->type= SEQ_IMAGE;
|
|
|
|
seq_new->len = 1;
|
|
|
|
seq_new->endstill = step-1;
|
|
|
|
|
|
|
|
/* new strip */
|
2011-07-06 10:58:23 +00:00
|
|
|
strip_new= seq_new->strip;
|
2009-01-21 18:47:09 +00:00
|
|
|
strip_new->len= 1;
|
|
|
|
strip_new->us= 1;
|
|
|
|
|
|
|
|
/* new stripdata */
|
2011-07-06 10:58:23 +00:00
|
|
|
se_new= strip_new->stripdata;
|
2011-01-09 01:17:56 +00:00
|
|
|
BLI_strncpy(se_new->name, se->name, sizeof(se_new->name));
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seq_new);
|
2010-07-03 17:47:06 +00:00
|
|
|
|
|
|
|
if(step > 1) {
|
|
|
|
seq_new->flag &= ~SEQ_OVERLAP;
|
|
|
|
if (seq_test_overlap(ed->seqbasep, seq_new)) {
|
|
|
|
shuffle_seq(ed->seqbasep, seq_new, scene);
|
|
|
|
}
|
2009-01-21 18:47:09 +00:00
|
|
|
}
|
|
|
|
|
2010-07-03 17:47:06 +00:00
|
|
|
/* XXX, COPY FCURVES */
|
2009-12-13 03:20:29 +00:00
|
|
|
|
2009-01-21 18:47:09 +00:00
|
|
|
cfra++;
|
|
|
|
start_ofs += step;
|
|
|
|
}
|
|
|
|
|
2009-08-09 21:16:39 +00:00
|
|
|
seq_free_sequence(scene, seq);
|
2009-01-21 18:47:09 +00:00
|
|
|
seq = seq->next;
|
|
|
|
} else {
|
|
|
|
seq = seq->next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* as last: */
|
|
|
|
sort_seq(scene);
|
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
2009-01-21 18:47:09 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-04-12 20:32:42 +00:00
|
|
|
void SEQUENCER_OT_images_separate(wmOperatorType *ot)
|
2009-01-21 18:47:09 +00:00
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Separate Images";
|
2009-04-12 20:32:42 +00:00
|
|
|
ot->idname= "SEQUENCER_OT_images_separate";
|
2011-09-19 12:26:20 +00:00
|
|
|
ot->description="On image sequence strips, it returns a strip for each image";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
2009-01-21 18:47:09 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_separate_images_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
2009-10-19 21:34:38 +00:00
|
|
|
|
|
|
|
RNA_def_int(ot->srna, "length", 1, 1, 1000, "Length", "Length of each frame", 1, INT_MAX);
|
2009-01-21 18:47:09 +00:00
|
|
|
}
|
2009-01-23 23:14:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* META Operators */
|
|
|
|
|
|
|
|
/* separate_meta_toggle operator */
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_meta_toggle_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-01-23 23:14:02 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2010-06-21 17:37:50 +00:00
|
|
|
Sequence *last_seq= seq_active_get(scene);
|
2009-01-23 23:14:02 +00:00
|
|
|
MetaStack *ms;
|
|
|
|
|
|
|
|
if(last_seq && last_seq->type==SEQ_META && last_seq->flag & SELECT) {
|
|
|
|
/* Enter Metastrip */
|
|
|
|
ms= MEM_mallocN(sizeof(MetaStack), "metastack");
|
|
|
|
BLI_addtail(&ed->metastack, ms);
|
|
|
|
ms->parseq= last_seq;
|
|
|
|
ms->oldbasep= ed->seqbasep;
|
|
|
|
|
|
|
|
ed->seqbasep= &last_seq->seqbase;
|
|
|
|
|
2010-06-21 17:37:50 +00:00
|
|
|
seq_active_set(scene, NULL);
|
2009-01-23 23:14:02 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* Exit Metastrip (if possible) */
|
|
|
|
|
|
|
|
Sequence *seq;
|
|
|
|
|
|
|
|
if(ed->metastack.first==NULL)
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
ms= ed->metastack.last;
|
|
|
|
BLI_remlink(&ed->metastack, ms);
|
|
|
|
|
|
|
|
ed->seqbasep= ms->oldbasep;
|
|
|
|
|
|
|
|
/* recalc all: the meta can have effects connected to it */
|
|
|
|
for(seq= ed->seqbasep->first; seq; seq= seq->next)
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seq);
|
2009-01-23 23:14:02 +00:00
|
|
|
|
2010-06-21 17:37:50 +00:00
|
|
|
seq_active_set(scene, ms->parseq);
|
2009-01-23 23:14:02 +00:00
|
|
|
|
|
|
|
ms->parseq->flag |= SELECT;
|
|
|
|
recurs_sel_seq(ms->parseq);
|
|
|
|
|
|
|
|
MEM_freeN(ms);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2011-08-07 11:54:58 +00:00
|
|
|
seq_update_muting(ed);
|
2009-12-08 13:57:51 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
|
|
|
|
2009-01-23 23:14:02 +00:00
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_meta_toggle(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Toggle Meta Strip";
|
|
|
|
ot->idname= "SEQUENCER_OT_meta_toggle";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Toggle a metastrip (to edit enclosed strips)";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
2009-01-23 23:14:02 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_meta_toggle_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
2009-01-23 23:14:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* separate_meta_make operator */
|
|
|
|
static int sequencer_meta_make_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-23 23:14:02 +00:00
|
|
|
|
2010-07-05 10:12:24 +00:00
|
|
|
Sequence *seq, *seqm, *next, *last_seq = seq_active_get(scene);
|
2009-12-24 19:50:43 +00:00
|
|
|
int channel_max= 1;
|
2009-01-23 23:14:02 +00:00
|
|
|
|
2009-12-17 23:29:11 +00:00
|
|
|
if(seqbase_isolated_sel_check(ed->seqbasep)==FALSE) {
|
2009-01-23 23:14:02 +00:00
|
|
|
BKE_report(op->reports, RPT_ERROR, "Please select all related strips");
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* remove all selected from main list, and put in meta */
|
|
|
|
|
2009-12-17 23:29:11 +00:00
|
|
|
seqm= alloc_sequence(ed->seqbasep, 1, 1); /* channel number set later */
|
2009-12-13 03:20:29 +00:00
|
|
|
strcpy(seqm->name+2, "MetaStrip");
|
2009-01-23 23:14:02 +00:00
|
|
|
seqm->type= SEQ_META;
|
|
|
|
seqm->flag= SELECT;
|
|
|
|
|
|
|
|
seq= ed->seqbasep->first;
|
|
|
|
while(seq) {
|
|
|
|
next= seq->next;
|
|
|
|
if(seq!=seqm && (seq->flag & SELECT)) {
|
2009-12-17 23:29:11 +00:00
|
|
|
channel_max= MAX2(seq->machine, channel_max);
|
2009-01-23 23:14:02 +00:00
|
|
|
BLI_remlink(ed->seqbasep, seq);
|
|
|
|
BLI_addtail(&seqm->seqbase, seq);
|
|
|
|
}
|
|
|
|
seq= next;
|
|
|
|
}
|
2010-07-05 10:12:24 +00:00
|
|
|
seqm->machine= last_seq ? last_seq->machine : channel_max;
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seqm);
|
2009-01-23 23:14:02 +00:00
|
|
|
|
|
|
|
seqm->strip= MEM_callocN(sizeof(Strip), "metastrip");
|
|
|
|
seqm->strip->len= seqm->len;
|
|
|
|
seqm->strip->us= 1;
|
|
|
|
|
2010-06-21 17:37:50 +00:00
|
|
|
seq_active_set(scene, seqm);
|
2009-01-23 23:14:02 +00:00
|
|
|
|
2009-12-21 16:57:39 +00:00
|
|
|
if( seq_test_overlap(ed->seqbasep, seqm) ) shuffle_seq(ed->seqbasep, seqm, scene);
|
2009-01-23 23:14:02 +00:00
|
|
|
|
2011-08-07 11:54:58 +00:00
|
|
|
seq_update_muting(ed);
|
2009-12-13 03:20:29 +00:00
|
|
|
|
2010-02-16 17:58:50 +00:00
|
|
|
seqbase_unique_name_recursive(&scene->ed->seqbase, seqm);
|
2009-12-13 03:20:29 +00:00
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
|
|
|
|
2009-01-23 23:14:02 +00:00
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_meta_make(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Make Meta Strip";
|
|
|
|
ot->idname= "SEQUENCER_OT_meta_make";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Group selected strips into a metastrip";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
2009-01-23 23:14:02 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->invoke= WM_operator_confirm;
|
|
|
|
ot->exec= sequencer_meta_make_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
2009-01-23 23:14:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int seq_depends_on_meta(Sequence *seq, Sequence *seqm)
|
|
|
|
{
|
|
|
|
if (seq == seqm) return 1;
|
|
|
|
else if (seq->seq1 && seq_depends_on_meta(seq->seq1, seqm)) return 1;
|
|
|
|
else if (seq->seq2 && seq_depends_on_meta(seq->seq2, seqm)) return 1;
|
|
|
|
else if (seq->seq3 && seq_depends_on_meta(seq->seq3, seqm)) return 1;
|
|
|
|
else return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* separate_meta_make operator */
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_meta_separate_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-01-23 23:14:02 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-23 23:14:02 +00:00
|
|
|
|
2010-06-21 17:37:50 +00:00
|
|
|
Sequence *seq, *last_seq = seq_active_get(scene); /* last_seq checks ed==NULL */
|
2009-01-23 23:14:02 +00:00
|
|
|
|
2009-01-28 22:36:34 +00:00
|
|
|
if(last_seq==NULL || last_seq->type!=SEQ_META)
|
2009-01-23 23:14:02 +00:00
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
2010-12-21 14:49:34 +00:00
|
|
|
BLI_movelisttolist(ed->seqbasep, &last_seq->seqbase);
|
2009-01-23 23:14:02 +00:00
|
|
|
|
2011-04-03 10:04:16 +00:00
|
|
|
last_seq->seqbase.first= NULL;
|
|
|
|
last_seq->seqbase.last= NULL;
|
2009-01-23 23:14:02 +00:00
|
|
|
|
|
|
|
BLI_remlink(ed->seqbasep, last_seq);
|
2009-08-09 21:16:39 +00:00
|
|
|
seq_free_sequence(scene, last_seq);
|
2009-01-23 23:14:02 +00:00
|
|
|
|
|
|
|
/* emtpy meta strip, delete all effects depending on it */
|
|
|
|
for(seq=ed->seqbasep->first; seq; seq=seq->next)
|
|
|
|
if((seq->type & SEQ_EFFECT) && seq_depends_on_meta(seq, last_seq))
|
|
|
|
seq->flag |= SEQ_FLAG_DELETE;
|
|
|
|
|
|
|
|
recurs_del_seq_flag(scene, ed->seqbasep, SEQ_FLAG_DELETE, 0);
|
|
|
|
|
2010-10-29 19:40:45 +00:00
|
|
|
/* test for effects and overlap
|
|
|
|
* dont use SEQP_BEGIN since that would be recursive */
|
|
|
|
for(seq= ed->seqbasep->first; seq; seq= seq->next) {
|
2009-01-23 23:14:02 +00:00
|
|
|
if(seq->flag & SELECT) {
|
|
|
|
seq->flag &= ~SEQ_OVERLAP;
|
2010-10-29 19:40:45 +00:00
|
|
|
if(seq_test_overlap(ed->seqbasep, seq)) {
|
2009-12-21 16:57:39 +00:00
|
|
|
shuffle_seq(ed->seqbasep, seq, scene);
|
2009-01-23 23:14:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sort_seq(scene);
|
2011-08-07 11:54:58 +00:00
|
|
|
seq_update_muting(ed);
|
2009-12-08 13:57:51 +00:00
|
|
|
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
2009-01-23 23:14:02 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_meta_separate(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "UnMeta Strip";
|
|
|
|
ot->idname= "SEQUENCER_OT_meta_separate";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Put the contents of a metastrip back in the sequencer";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
2009-01-23 23:14:02 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->invoke= WM_operator_confirm;
|
|
|
|
ot->exec= sequencer_meta_separate_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
2009-01-23 23:14:02 +00:00
|
|
|
}
|
|
|
|
|
2009-01-25 14:53:41 +00:00
|
|
|
/* view_all operator */
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_view_all_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-12-14 21:42:25 +00:00
|
|
|
{
|
2009-12-24 19:50:43 +00:00
|
|
|
//Scene *scene= CTX_data_scene(C);
|
2009-12-14 21:42:25 +00:00
|
|
|
bScreen *sc= CTX_wm_screen(C);
|
|
|
|
ScrArea *area= CTX_wm_area(C);
|
2009-12-24 19:50:43 +00:00
|
|
|
//ARegion *ar= CTX_wm_region(C);
|
2009-12-14 21:42:25 +00:00
|
|
|
View2D *v2d= UI_view2d_fromcontext(C);
|
|
|
|
|
|
|
|
v2d->cur= v2d->tot;
|
|
|
|
UI_view2d_curRect_validate(v2d);
|
|
|
|
UI_view2d_sync(sc, area, v2d, V2D_LOCK_COPY);
|
|
|
|
|
|
|
|
ED_area_tag_redraw(CTX_wm_area(C));
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_view_all(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "View All";
|
|
|
|
ot->idname= "SEQUENCER_OT_view_all";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="View all the strips in the sequencer";
|
2009-12-14 21:42:25 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_view_all_exec;
|
|
|
|
ot->poll= ED_operator_sequencer_active;
|
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* view_all operator */
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_view_all_preview_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-01-25 14:53:41 +00:00
|
|
|
{
|
2010-02-07 19:07:56 +00:00
|
|
|
bScreen *sc= CTX_wm_screen(C);
|
2009-01-25 14:53:41 +00:00
|
|
|
ScrArea *area= CTX_wm_area(C);
|
2010-02-08 13:55:31 +00:00
|
|
|
#if 0
|
2009-01-25 14:53:41 +00:00
|
|
|
ARegion *ar= CTX_wm_region(C);
|
|
|
|
SpaceSeq *sseq= area->spacedata.first;
|
2010-02-08 13:55:31 +00:00
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
#endif
|
2010-02-07 19:07:56 +00:00
|
|
|
View2D *v2d= UI_view2d_fromcontext(C);
|
2009-01-25 14:53:41 +00:00
|
|
|
|
2010-02-07 19:07:56 +00:00
|
|
|
v2d->cur= v2d->tot;
|
|
|
|
UI_view2d_curRect_validate(v2d);
|
|
|
|
UI_view2d_sync(sc, area, v2d, V2D_LOCK_COPY);
|
|
|
|
|
|
|
|
#if 0
|
2009-12-14 21:42:25 +00:00
|
|
|
/* Like zooming on an image view */
|
|
|
|
float zoomX, zoomY;
|
|
|
|
int width, height, imgwidth, imgheight;
|
2009-01-25 14:53:41 +00:00
|
|
|
|
2009-12-14 21:42:25 +00:00
|
|
|
width = ar->winx;
|
|
|
|
height = ar->winy;
|
2009-01-25 14:53:41 +00:00
|
|
|
|
2009-12-14 21:42:25 +00:00
|
|
|
seq_reset_imageofs(sseq);
|
2009-01-25 14:53:41 +00:00
|
|
|
|
2009-12-14 21:42:25 +00:00
|
|
|
imgwidth= (scene->r.size*scene->r.xsch)/100;
|
|
|
|
imgheight= (scene->r.size*scene->r.ysch)/100;
|
2009-01-25 14:53:41 +00:00
|
|
|
|
2009-12-14 21:42:25 +00:00
|
|
|
/* Apply aspect, dosnt need to be that accurate */
|
2010-03-05 14:06:39 +00:00
|
|
|
imgwidth= (int)(imgwidth * (scene->r.xasp / scene->r.yasp));
|
2009-01-25 14:53:41 +00:00
|
|
|
|
2009-12-14 21:42:25 +00:00
|
|
|
if (((imgwidth >= width) || (imgheight >= height)) &&
|
|
|
|
((width > 0) && (height > 0))) {
|
2009-01-25 14:53:41 +00:00
|
|
|
|
2009-12-14 21:42:25 +00:00
|
|
|
/* Find the zoom value that will fit the image in the image space */
|
|
|
|
zoomX = ((float)width) / ((float)imgwidth);
|
|
|
|
zoomY = ((float)height) / ((float)imgheight);
|
|
|
|
sseq->zoom= (zoomX < zoomY) ? zoomX : zoomY;
|
2009-01-25 14:53:41 +00:00
|
|
|
|
2009-12-14 21:42:25 +00:00
|
|
|
sseq->zoom = 1.0f / power_of_2(1/ MIN2(zoomX, zoomY) );
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
sseq->zoom= 1.0f;
|
|
|
|
}
|
2010-02-07 19:07:56 +00:00
|
|
|
#endif
|
2009-01-25 14:53:41 +00:00
|
|
|
|
|
|
|
ED_area_tag_redraw(CTX_wm_area(C));
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
2009-12-14 21:42:25 +00:00
|
|
|
void SEQUENCER_OT_view_all_preview(wmOperatorType *ot)
|
2009-01-25 14:53:41 +00:00
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "View All";
|
2009-12-14 21:42:25 +00:00
|
|
|
ot->idname= "SEQUENCER_OT_view_all_preview";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Zoom preview to fit in the area";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
2009-01-25 14:53:41 +00:00
|
|
|
/* api callbacks */
|
2009-12-14 21:42:25 +00:00
|
|
|
ot->exec= sequencer_view_all_preview_exec;
|
2009-01-25 14:53:41 +00:00
|
|
|
ot->poll= ED_operator_sequencer_active;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER;
|
2009-01-25 14:53:41 +00:00
|
|
|
}
|
|
|
|
|
2010-06-17 14:22:54 +00:00
|
|
|
|
|
|
|
static int sequencer_view_zoom_ratio_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
RenderData *r= &CTX_data_scene(C)->r;
|
|
|
|
View2D *v2d= UI_view2d_fromcontext(C);
|
|
|
|
|
|
|
|
float ratio= RNA_float_get(op->ptr, "ratio");
|
|
|
|
|
|
|
|
float winx= (int)(r->size * r->xsch)/100;
|
|
|
|
float winy= (int)(r->size * r->ysch)/100;
|
|
|
|
|
|
|
|
float facx= (v2d->mask.xmax - v2d->mask.xmin) / winx;
|
|
|
|
float facy= (v2d->mask.ymax - v2d->mask.ymin) / winy;
|
|
|
|
|
2010-07-16 16:54:39 +00:00
|
|
|
BLI_resize_rctf(&v2d->cur, (int)(winx*facx*ratio) + 1, (int)(winy*facy*ratio) + 1);
|
2010-06-17 14:22:54 +00:00
|
|
|
|
|
|
|
ED_region_tag_redraw(CTX_wm_region(C));
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_view_zoom_ratio(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Sequencer View Zoom Ratio";
|
|
|
|
ot->idname= "SEQUENCER_OT_view_zoom_ratio";
|
2010-12-31 03:54:28 +00:00
|
|
|
ot->description = "Change zoom ratio of sequencer preview";
|
2010-06-17 14:22:54 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_view_zoom_ratio_exec;
|
|
|
|
ot->poll= ED_operator_sequencer_active;
|
|
|
|
|
|
|
|
/* properties */
|
|
|
|
RNA_def_float(ot->srna, "ratio", 1.0f, 0.0f, FLT_MAX,
|
2011-09-19 12:26:20 +00:00
|
|
|
"Ratio", "Zoom ratio, 1.0 is 1:1, higher is zoomed in, lower is zoomed out", -FLT_MAX, FLT_MAX);
|
2010-06-17 14:22:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-01-01 19:10:31 +00:00
|
|
|
#if 0
|
2009-12-14 21:42:25 +00:00
|
|
|
static EnumPropertyItem view_type_items[] = {
|
|
|
|
{SEQ_VIEW_SEQUENCE, "SEQUENCER", ICON_SEQ_SEQUENCER, "Sequencer", ""},
|
|
|
|
{SEQ_VIEW_PREVIEW, "PREVIEW", ICON_SEQ_PREVIEW, "Image Preview", ""},
|
|
|
|
{SEQ_VIEW_SEQUENCE_PREVIEW, "SEQUENCER_PREVIEW", ICON_SEQ_SEQUENCER, "Sequencer and Image Preview", ""},
|
|
|
|
{0, NULL, 0, NULL, NULL}};
|
2010-01-01 19:10:31 +00:00
|
|
|
#endif
|
2009-01-25 14:53:41 +00:00
|
|
|
|
|
|
|
/* view_all operator */
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_view_toggle_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-12-14 21:42:25 +00:00
|
|
|
{
|
2009-12-17 11:16:28 +00:00
|
|
|
SpaceSeq *sseq= (SpaceSeq *)CTX_wm_space_data(C);
|
2009-12-14 21:42:25 +00:00
|
|
|
|
|
|
|
sseq->view++;
|
|
|
|
if (sseq->view > SEQ_VIEW_SEQUENCE_PREVIEW) sseq->view = SEQ_VIEW_SEQUENCE;
|
|
|
|
|
2011-09-05 19:34:27 +00:00
|
|
|
ED_area_tag_refresh(CTX_wm_area(C));
|
2009-12-14 21:42:25 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_view_toggle(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "View Toggle";
|
|
|
|
ot->idname= "SEQUENCER_OT_view_toggle";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Toggle between sequencer views (sequence, preview, both)";
|
2009-12-14 21:42:25 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_view_toggle_exec;
|
|
|
|
ot->poll= ED_operator_sequencer_active;
|
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* view_selected operator */
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_view_selected_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-01-25 14:53:41 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
View2D *v2d= UI_view2d_fromcontext(C);
|
|
|
|
ScrArea *area= CTX_wm_area(C);
|
|
|
|
bScreen *sc= CTX_wm_screen(C);
|
2009-01-28 22:36:34 +00:00
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-01-25 14:53:41 +00:00
|
|
|
Sequence *seq;
|
|
|
|
|
|
|
|
int xmin= MAXFRAME*2;
|
|
|
|
int xmax= -MAXFRAME*2;
|
|
|
|
int ymin= MAXSEQ+1;
|
|
|
|
int ymax= 0;
|
|
|
|
int orig_height;
|
|
|
|
int ymid;
|
|
|
|
int ymargin= 1;
|
|
|
|
int xmargin= FPS;
|
|
|
|
|
2009-01-28 22:36:34 +00:00
|
|
|
if(ed==NULL)
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
2009-01-25 14:53:41 +00:00
|
|
|
for(seq=ed->seqbasep->first; seq; seq=seq->next) {
|
|
|
|
if(seq->flag & SELECT) {
|
|
|
|
xmin= MIN2(xmin, seq->startdisp);
|
|
|
|
xmax= MAX2(xmax, seq->enddisp);
|
|
|
|
|
|
|
|
ymin= MIN2(ymin, seq->machine);
|
|
|
|
ymax= MAX2(ymax, seq->machine);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ymax != 0) {
|
|
|
|
|
|
|
|
xmax += xmargin;
|
|
|
|
xmin -= xmargin;
|
|
|
|
ymax += ymargin;
|
|
|
|
ymin -= ymargin;
|
|
|
|
|
|
|
|
orig_height= v2d->cur.ymax - v2d->cur.ymin;
|
|
|
|
|
|
|
|
v2d->cur.xmin= xmin;
|
|
|
|
v2d->cur.xmax= xmax;
|
|
|
|
|
|
|
|
v2d->cur.ymin= ymin;
|
|
|
|
v2d->cur.ymax= ymax;
|
|
|
|
|
|
|
|
/* only zoom out vertically */
|
|
|
|
if (orig_height > v2d->cur.ymax - v2d->cur.ymin) {
|
|
|
|
ymid= (v2d->cur.ymax + v2d->cur.ymin) / 2;
|
|
|
|
|
|
|
|
v2d->cur.ymin= ymid - (orig_height/2);
|
|
|
|
v2d->cur.ymax= ymid + (orig_height/2);
|
|
|
|
}
|
|
|
|
|
|
|
|
UI_view2d_curRect_validate(v2d);
|
|
|
|
UI_view2d_sync(sc, area, v2d, V2D_LOCK_COPY);
|
|
|
|
|
|
|
|
ED_area_tag_redraw(CTX_wm_area(C));
|
|
|
|
}
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_view_selected(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "View Selected";
|
|
|
|
ot->idname= "SEQUENCER_OT_view_selected";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Zoom the sequencer on the selected strips";
|
2009-09-12 17:16:12 +00:00
|
|
|
|
2009-01-25 14:53:41 +00:00
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_view_selected_exec;
|
|
|
|
ot->poll= ED_operator_sequencer_active;
|
2009-01-31 19:40:40 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER;
|
2009-01-25 14:53:41 +00:00
|
|
|
}
|
2009-10-28 19:53:25 +00:00
|
|
|
|
|
|
|
|
|
|
|
static int find_next_prev_edit(Scene *scene, int cfra, int side)
|
|
|
|
{
|
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
|
|
|
Sequence *seq,*best_seq = NULL,*frame_seq = NULL;
|
|
|
|
|
|
|
|
int dist, best_dist;
|
|
|
|
best_dist = MAXFRAME*2;
|
|
|
|
|
|
|
|
if(ed==NULL) return cfra;
|
|
|
|
|
|
|
|
for(seq= ed->seqbasep->first; seq; seq= seq->next) {
|
|
|
|
dist = MAXFRAME*2;
|
|
|
|
|
|
|
|
switch (side) {
|
|
|
|
case SEQ_SIDE_LEFT:
|
|
|
|
if (seq->startdisp < cfra) {
|
|
|
|
dist = cfra - seq->startdisp;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case SEQ_SIDE_RIGHT:
|
|
|
|
if (seq->startdisp > cfra) {
|
|
|
|
dist = seq->startdisp - cfra;
|
|
|
|
} else if (seq->startdisp == cfra) {
|
|
|
|
frame_seq=seq;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (dist < best_dist) {
|
|
|
|
best_dist = dist;
|
|
|
|
best_seq = seq;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if no sequence to the right is found and the
|
|
|
|
frame is on the start of the last sequence,
|
|
|
|
move to the end of the last sequence */
|
|
|
|
if (frame_seq) cfra = frame_seq->enddisp;
|
|
|
|
|
|
|
|
return best_seq ? best_seq->startdisp : cfra;
|
|
|
|
}
|
|
|
|
|
2009-10-29 10:03:34 +00:00
|
|
|
static int next_prev_edit_internal(Scene *scene, int side)
|
|
|
|
{
|
2009-10-28 19:53:25 +00:00
|
|
|
int change=0;
|
|
|
|
int cfra = CFRA;
|
|
|
|
int nfra= find_next_prev_edit(scene, cfra, side);
|
|
|
|
|
|
|
|
if (nfra != cfra) {
|
|
|
|
CFRA = nfra;
|
|
|
|
change= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return change;
|
|
|
|
}
|
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
/* move frame to next edit point operator */
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_next_edit_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-10-28 19:53:25 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
if(!next_prev_edit_internal(scene, SEQ_SIDE_RIGHT))
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
|
|
|
|
|
2009-10-28 19:53:25 +00:00
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_next_edit(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Next Edit";
|
|
|
|
ot->idname= "SEQUENCER_OT_next_edit";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Move frame to next edit point";
|
2009-10-28 19:53:25 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_next_edit_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-10-28 19:53:25 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
|
|
|
/* properties */
|
|
|
|
}
|
|
|
|
|
|
|
|
/* move frame to previous edit point operator */
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_previous_edit_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-10-28 19:53:25 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
if(!next_prev_edit_internal(scene, SEQ_SIDE_LEFT))
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
|
2009-10-28 19:53:25 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_previous_edit(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Previous Edit";
|
|
|
|
ot->idname= "SEQUENCER_OT_previous_edit";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Move frame to previous edit point";
|
2009-10-28 19:53:25 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_previous_edit_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-10-28 19:53:25 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
2009-10-30 20:40:41 +00:00
|
|
|
/* properties */
|
|
|
|
}
|
|
|
|
|
2010-02-07 23:41:17 +00:00
|
|
|
static void swap_sequence(Scene* scene, Sequence* seqa, Sequence* seqb)
|
2009-10-30 20:40:41 +00:00
|
|
|
{
|
|
|
|
int gap = seqb->startdisp - seqa->enddisp;
|
2010-07-29 11:47:00 +00:00
|
|
|
seqb->start = (seqb->start - seqb->startdisp) + seqa->startdisp;
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seqb);
|
2010-07-29 11:47:00 +00:00
|
|
|
seqa->start = (seqa->start - seqa->startdisp) + seqb->enddisp + gap;
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, seqa);
|
2009-10-30 20:40:41 +00:00
|
|
|
}
|
|
|
|
|
2010-02-08 13:55:31 +00:00
|
|
|
#if 0
|
2009-10-30 20:40:41 +00:00
|
|
|
static Sequence* sequence_find_parent(Scene* scene, Sequence* child)
|
|
|
|
{
|
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
|
|
|
Sequence *parent= NULL;
|
|
|
|
Sequence *seq;
|
|
|
|
|
|
|
|
if(ed==NULL) return NULL;
|
|
|
|
|
|
|
|
for(seq= ed->seqbasep->first; seq; seq= seq->next) {
|
|
|
|
if ( (seq != child) && seq_is_parent(seq, child) ) {
|
|
|
|
parent = seq;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-02-08 13:55:31 +00:00
|
|
|
return parent;
|
2009-10-30 20:40:41 +00:00
|
|
|
}
|
2010-02-08 13:55:31 +00:00
|
|
|
#endif
|
2009-10-30 20:40:41 +00:00
|
|
|
|
2009-12-15 10:04:54 +00:00
|
|
|
static int sequencer_swap_exec(bContext *C, wmOperator *op)
|
2009-10-30 20:40:41 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2010-06-21 17:37:50 +00:00
|
|
|
Sequence *active_seq = seq_active_get(scene);
|
2009-12-13 15:48:57 +00:00
|
|
|
Sequence *seq, *iseq;
|
2009-12-15 10:04:54 +00:00
|
|
|
int side= RNA_enum_get(op->ptr, "side");
|
2009-10-30 20:40:41 +00:00
|
|
|
|
|
|
|
if(active_seq==NULL) return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
seq = find_next_prev_sequence(scene, active_seq, side, -1);
|
|
|
|
|
|
|
|
if(seq) {
|
|
|
|
|
|
|
|
/* disallow effect strips */
|
2010-04-25 15:39:04 +00:00
|
|
|
if (get_sequence_effect_num_inputs(seq->type) >= 1 && (seq->effectdata || seq->seq1 || seq->seq2 || seq->seq3))
|
2009-10-30 20:40:41 +00:00
|
|
|
return OPERATOR_CANCELLED;
|
2010-04-25 15:39:04 +00:00
|
|
|
if ((get_sequence_effect_num_inputs(active_seq->type) >= 1) && (active_seq->effectdata || active_seq->seq1 || active_seq->seq2 || active_seq->seq3))
|
2009-10-30 20:40:41 +00:00
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
switch (side) {
|
|
|
|
case SEQ_SIDE_LEFT:
|
2010-02-07 23:41:17 +00:00
|
|
|
swap_sequence(scene, seq, active_seq);
|
2009-10-30 20:40:41 +00:00
|
|
|
break;
|
|
|
|
case SEQ_SIDE_RIGHT:
|
2010-02-07 23:41:17 +00:00
|
|
|
swap_sequence(scene, active_seq, seq);
|
2009-10-30 20:40:41 +00:00
|
|
|
break;
|
|
|
|
}
|
2009-12-08 13:57:51 +00:00
|
|
|
|
2009-12-13 15:48:57 +00:00
|
|
|
// XXX - should be a generic function
|
|
|
|
for(iseq= scene->ed->seqbasep->first; iseq; iseq= iseq->next) {
|
2009-12-15 11:27:46 +00:00
|
|
|
if((iseq->type & SEQ_EFFECT) && (seq_is_parent(iseq, active_seq) || seq_is_parent(iseq, seq))) {
|
2010-02-07 23:41:17 +00:00
|
|
|
calc_sequence(scene, iseq);
|
2009-12-15 11:27:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* do this in a new loop since both effects need to be calculated first */
|
|
|
|
for(iseq= scene->ed->seqbasep->first; iseq; iseq= iseq->next) {
|
|
|
|
if((iseq->type & SEQ_EFFECT) && (seq_is_parent(iseq, active_seq) || seq_is_parent(iseq, seq))) {
|
|
|
|
/* this may now overlap */
|
|
|
|
if( seq_test_overlap(ed->seqbasep, iseq) ) {
|
2009-12-21 16:57:39 +00:00
|
|
|
shuffle_seq(ed->seqbasep, iseq, scene);
|
2009-12-15 11:27:46 +00:00
|
|
|
}
|
|
|
|
}
|
2009-12-13 15:48:57 +00:00
|
|
|
}
|
|
|
|
|
2009-12-15 11:27:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
sort_seq(scene);
|
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
2009-10-30 20:40:41 +00:00
|
|
|
}
|
|
|
|
|
2009-12-08 13:57:51 +00:00
|
|
|
return OPERATOR_CANCELLED;
|
2009-10-30 20:40:41 +00:00
|
|
|
}
|
|
|
|
|
2009-12-15 10:04:54 +00:00
|
|
|
void SEQUENCER_OT_swap(wmOperatorType *ot)
|
2009-10-30 20:40:41 +00:00
|
|
|
{
|
|
|
|
/* identifiers */
|
2009-12-15 10:35:50 +00:00
|
|
|
ot->name= "Swap Strip";
|
2009-12-15 10:04:54 +00:00
|
|
|
ot->idname= "SEQUENCER_OT_swap";
|
2011-09-19 12:26:20 +00:00
|
|
|
ot->description="Swap active strip with strip to the right or left";
|
2009-10-30 20:40:41 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
2009-12-15 10:04:54 +00:00
|
|
|
ot->exec= sequencer_swap_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-10-30 20:40:41 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
2009-10-28 19:53:25 +00:00
|
|
|
/* properties */
|
2009-12-15 10:04:54 +00:00
|
|
|
RNA_def_enum(ot->srna, "side", prop_side_lr_types, SEQ_SIDE_RIGHT, "Side", "Side of the strip to swap");
|
2009-10-30 21:40:07 +00:00
|
|
|
}
|
2009-11-08 15:03:10 +00:00
|
|
|
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_rendersize_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-11-08 15:03:10 +00:00
|
|
|
{
|
|
|
|
int retval = OPERATOR_CANCELLED;
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
2010-06-21 17:37:50 +00:00
|
|
|
Sequence *active_seq = seq_active_get(scene);
|
2010-11-28 18:54:43 +00:00
|
|
|
StripElem *se = NULL;
|
2009-11-08 15:03:10 +00:00
|
|
|
|
2009-12-15 10:35:50 +00:00
|
|
|
if(active_seq==NULL)
|
|
|
|
return OPERATOR_CANCELLED;
|
2009-11-08 15:03:10 +00:00
|
|
|
|
2010-11-28 18:23:21 +00:00
|
|
|
|
|
|
|
if (active_seq->strip) {
|
|
|
|
switch (active_seq->type) {
|
2009-11-08 15:03:10 +00:00
|
|
|
case SEQ_IMAGE:
|
2010-11-28 18:23:21 +00:00
|
|
|
se = give_stripelem(active_seq, scene->r.cfra);
|
|
|
|
break;
|
2009-11-08 15:03:10 +00:00
|
|
|
case SEQ_MOVIE:
|
2010-11-28 18:23:21 +00:00
|
|
|
se = active_seq->strip->stripdata;
|
2009-11-08 15:03:10 +00:00
|
|
|
break;
|
|
|
|
case SEQ_SCENE:
|
|
|
|
case SEQ_META:
|
|
|
|
case SEQ_RAM_SOUND:
|
|
|
|
case SEQ_HD_SOUND:
|
|
|
|
default:
|
|
|
|
break;
|
2010-11-28 18:23:21 +00:00
|
|
|
}
|
2009-11-08 15:03:10 +00:00
|
|
|
}
|
2010-11-28 18:23:21 +00:00
|
|
|
|
|
|
|
if (se) {
|
|
|
|
// prevent setting the render size if sequence values aren't initialized
|
|
|
|
if ( (se->orig_width > 0) && (se->orig_height > 0) ) {
|
|
|
|
scene->r.xsch= se->orig_width;
|
|
|
|
scene->r.ysch= se->orig_height;
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
|
|
|
|
retval = OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-11-08 15:03:10 +00:00
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_rendersize(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Set Render Size";
|
|
|
|
ot->idname= "SEQUENCER_OT_rendersize";
|
2010-02-10 21:15:44 +00:00
|
|
|
ot->description="Set render size and aspect from active sequence";
|
2009-11-08 15:03:10 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_rendersize_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-11-08 15:03:10 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
|
|
|
/* properties */
|
2009-11-11 09:59:51 +00:00
|
|
|
}
|
|
|
|
|
2009-12-17 16:28:45 +00:00
|
|
|
static void seq_del_sound(Scene *scene, Sequence *seq)
|
|
|
|
{
|
|
|
|
if(seq->type == SEQ_META) {
|
|
|
|
Sequence *iseq;
|
|
|
|
for(iseq= seq->seqbase.first; iseq; iseq= iseq->next) {
|
|
|
|
seq_del_sound(scene, iseq);
|
|
|
|
}
|
|
|
|
}
|
2010-02-07 23:41:17 +00:00
|
|
|
else if(seq->scene_sound) {
|
|
|
|
sound_remove_scene_sound(scene, seq->scene_sound);
|
|
|
|
seq->scene_sound = NULL;
|
2009-12-17 23:29:11 +00:00
|
|
|
}
|
2009-12-17 16:28:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* TODO, validate scenes */
|
2009-12-17 14:45:47 +00:00
|
|
|
static int sequencer_copy_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
2009-12-24 19:50:43 +00:00
|
|
|
Sequence *seq;
|
2009-12-17 14:45:47 +00:00
|
|
|
|
2011-03-25 11:45:55 +00:00
|
|
|
ListBase nseqbase= {NULL, NULL};
|
|
|
|
|
2009-12-17 16:28:45 +00:00
|
|
|
seq_free_clipboard();
|
|
|
|
|
2009-12-17 23:29:11 +00:00
|
|
|
if(seqbase_isolated_sel_check(ed->seqbasep)==FALSE) {
|
|
|
|
BKE_report(op->reports, RPT_ERROR, "Please select all related strips");
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
2011-03-25 11:45:55 +00:00
|
|
|
seqbase_dupli_recursive(scene, NULL, &nseqbase, ed->seqbasep, SEQ_DUPE_UNIQUE_NAME);
|
|
|
|
|
|
|
|
/* To make sure the copied strips have unique names between each other add
|
|
|
|
* them temporarily to the end of the original seqbase. (bug 25932)
|
|
|
|
*/
|
|
|
|
if(nseqbase.first) {
|
|
|
|
Sequence *seq, *first_seq = nseqbase.first;
|
|
|
|
BLI_movelisttolist(ed->seqbasep, &nseqbase);
|
|
|
|
|
|
|
|
for(seq=first_seq; seq; seq=seq->next)
|
|
|
|
seq_recursive_apply(seq, apply_unique_name_cb, scene);
|
|
|
|
|
|
|
|
seqbase_clipboard.first = first_seq;
|
|
|
|
seqbase_clipboard.last = ed->seqbasep->last;
|
|
|
|
|
|
|
|
if(first_seq->prev) {
|
|
|
|
first_seq->prev->next = NULL;
|
|
|
|
ed->seqbasep->last = first_seq->prev;
|
|
|
|
first_seq->prev = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-17 16:28:45 +00:00
|
|
|
seqbase_clipboard_frame= scene->r.cfra;
|
|
|
|
|
|
|
|
/* Need to remove anything that references the current scene */
|
|
|
|
for(seq= seqbase_clipboard.first; seq; seq= seq->next) {
|
|
|
|
seq_del_sound(scene, seq);
|
|
|
|
}
|
2009-12-17 14:45:47 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_copy(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Copy";
|
|
|
|
ot->idname= "SEQUENCER_OT_copy";
|
|
|
|
ot->description="";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_copy_exec;
|
2010-05-06 07:19:55 +00:00
|
|
|
ot->poll= sequencer_edit_poll;
|
2009-12-17 14:45:47 +00:00
|
|
|
|
|
|
|
/* flags */
|
2011-08-19 20:25:25 +00:00
|
|
|
ot->flag= OPTYPE_REGISTER;
|
2009-12-17 14:45:47 +00:00
|
|
|
|
|
|
|
/* properties */
|
|
|
|
}
|
|
|
|
|
2010-10-15 01:36:14 +00:00
|
|
|
static int sequencer_paste_exec(bContext *C, wmOperator *UNUSED(op))
|
2009-12-17 14:45:47 +00:00
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Editing *ed= seq_give_editing(scene, TRUE); /* create if needed */
|
2010-06-24 10:04:18 +00:00
|
|
|
ListBase nseqbase = {NULL, NULL};
|
2009-12-17 16:28:45 +00:00
|
|
|
int ofs;
|
|
|
|
Sequence *iseq;
|
|
|
|
|
|
|
|
deselect_all_seq(scene);
|
|
|
|
ofs = scene->r.cfra - seqbase_clipboard_frame;
|
2009-12-17 14:45:47 +00:00
|
|
|
|
2010-10-04 15:31:04 +00:00
|
|
|
seqbase_dupli_recursive(scene, NULL, &nseqbase, &seqbase_clipboard, SEQ_DUPE_UNIQUE_NAME);
|
2009-12-17 14:45:47 +00:00
|
|
|
|
2009-12-17 16:28:45 +00:00
|
|
|
/* transform pasted strips before adding */
|
|
|
|
if(ofs) {
|
2010-06-24 10:04:18 +00:00
|
|
|
for(iseq= nseqbase.first; iseq; iseq= iseq->next) {
|
2011-04-01 08:51:12 +00:00
|
|
|
seq_translate(scene, iseq, ofs);
|
|
|
|
seq_sound_init(scene, iseq);
|
2009-12-17 16:28:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-03-25 11:45:55 +00:00
|
|
|
iseq = nseqbase.first;
|
|
|
|
|
2010-12-21 14:49:34 +00:00
|
|
|
BLI_movelisttolist(ed->seqbasep, &nseqbase);
|
2009-12-17 16:28:45 +00:00
|
|
|
|
2011-03-25 11:45:55 +00:00
|
|
|
/* make sure the pasted strips have unique names between them */
|
|
|
|
for(; iseq; iseq=iseq->next)
|
|
|
|
seq_recursive_apply(iseq, apply_unique_name_cb, scene);
|
|
|
|
|
2009-12-17 16:28:45 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
2009-12-17 14:45:47 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_paste(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Paste";
|
|
|
|
ot->idname= "SEQUENCER_OT_paste";
|
|
|
|
ot->description="";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_paste_exec;
|
|
|
|
ot->poll= ED_operator_sequencer_active;
|
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
|
|
|
/* properties */
|
|
|
|
}
|
2010-06-21 17:37:50 +00:00
|
|
|
|
|
|
|
static int sequencer_swap_data_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Sequence *seq_act;
|
|
|
|
Sequence *seq_other;
|
2011-05-28 09:59:34 +00:00
|
|
|
const char *error_msg;
|
2010-06-21 17:37:50 +00:00
|
|
|
|
|
|
|
if(seq_active_pair_get(scene, &seq_act, &seq_other) == 0) {
|
|
|
|
BKE_report(op->reports, RPT_ERROR, "Must select 2 strips");
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
2011-05-28 09:59:34 +00:00
|
|
|
if(seq_swap(seq_act, seq_other, &error_msg) == 0) {
|
|
|
|
BKE_report(op->reports, RPT_ERROR, error_msg);
|
2010-06-21 17:37:50 +00:00
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
2010-07-04 10:51:10 +00:00
|
|
|
sound_remove_scene_sound(scene, seq_act->scene_sound);
|
|
|
|
sound_remove_scene_sound(scene, seq_other->scene_sound);
|
|
|
|
|
|
|
|
seq_act->scene_sound= NULL;
|
|
|
|
seq_other->scene_sound= NULL;
|
|
|
|
|
2010-06-21 17:37:50 +00:00
|
|
|
calc_sequence(scene, seq_act);
|
|
|
|
calc_sequence(scene, seq_other);
|
|
|
|
|
2010-07-04 10:51:10 +00:00
|
|
|
if(seq_act->sound) sound_add_scene_sound(scene, seq_act, seq_act->startdisp, seq_act->enddisp, seq_act->startofs + seq_act->anim_startofs);
|
|
|
|
if(seq_other->sound) sound_add_scene_sound(scene, seq_other, seq_other->startdisp, seq_other->enddisp, seq_other->startofs + seq_other->anim_startofs);
|
2010-07-04 10:22:31 +00:00
|
|
|
|
2010-06-21 17:37:50 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_swap_data(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Sequencer Swap Data";
|
|
|
|
ot->idname= "SEQUENCER_OT_swap_data";
|
|
|
|
ot->description="Swap 2 sequencer strips";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_swap_data_exec;
|
|
|
|
ot->poll= ED_operator_sequencer_active;
|
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
|
|
|
/* properties */
|
|
|
|
}
|
|
|
|
|
2010-07-08 10:03:29 +00:00
|
|
|
/* borderselect operator */
|
|
|
|
static int view_ghost_border_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
|
|
|
View2D *v2d= UI_view2d_fromcontext(C);
|
|
|
|
|
|
|
|
rctf rect;
|
|
|
|
|
|
|
|
/* convert coordinates of rect to 'tot' rect coordinates */
|
|
|
|
UI_view2d_region_to_view(v2d, RNA_int_get(op->ptr, "xmin"), RNA_int_get(op->ptr, "ymin"), &rect.xmin, &rect.ymin);
|
|
|
|
UI_view2d_region_to_view(v2d, RNA_int_get(op->ptr, "xmax"), RNA_int_get(op->ptr, "ymax"), &rect.xmax, &rect.ymax);
|
|
|
|
|
|
|
|
if(ed==NULL)
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
rect.xmin /= (float)(ABS(v2d->tot.xmax - v2d->tot.xmin));
|
|
|
|
rect.ymin /= (float)(ABS(v2d->tot.ymax - v2d->tot.ymin));
|
|
|
|
|
|
|
|
rect.xmax /= (float)(ABS(v2d->tot.xmax - v2d->tot.xmin));
|
|
|
|
rect.ymax /= (float)(ABS(v2d->tot.ymax - v2d->tot.ymin));
|
|
|
|
|
2011-03-27 14:59:55 +00:00
|
|
|
rect.xmin+=0.5f;
|
|
|
|
rect.xmax+=0.5f;
|
|
|
|
rect.ymin+=0.5f;
|
|
|
|
rect.ymax+=0.5f;
|
2010-07-08 10:03:29 +00:00
|
|
|
|
|
|
|
CLAMP(rect.xmin, 0.0f, 1.0f);
|
|
|
|
CLAMP(rect.ymin, 0.0f, 1.0f);
|
|
|
|
CLAMP(rect.xmax, 0.0f, 1.0f);
|
|
|
|
CLAMP(rect.ymax, 0.0f, 1.0f);
|
|
|
|
|
|
|
|
scene->ed->over_border= rect;
|
|
|
|
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ****** Border Select ****** */
|
|
|
|
void SEQUENCER_OT_view_ghost_border(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Border Offset View";
|
|
|
|
ot->idname= "SEQUENCER_OT_view_ghost_border";
|
|
|
|
ot->description="Enable border select mode";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->invoke= WM_border_select_invoke;
|
|
|
|
ot->exec= view_ghost_border_exec;
|
|
|
|
ot->modal= WM_border_select_modal;
|
|
|
|
ot->poll= sequencer_view_poll;
|
2011-06-06 11:04:54 +00:00
|
|
|
ot->cancel= WM_border_select_cancel;
|
2010-07-08 10:03:29 +00:00
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= 0;
|
|
|
|
|
|
|
|
/* rna */
|
|
|
|
WM_operator_properties_gesture_border(ot, FALSE);
|
|
|
|
}
|
2011-08-12 06:08:22 +00:00
|
|
|
|
== Sequencer ==
This patch adds:
* support for proxy building again (missing feature from Blender 2.49)
additionally to the way, Blender 2.49 worked, you can select several
strips at once and make Blender build proxies in the background (using
the job system)
Also a new thing: movie proxies are now build into AVI files, and
the proxy system is moved into ImBuf-library, so that other parts
of blender can also benefit from it.
* Timecode support: to fix seeking issues with files, that have
a) varying frame rates
b) very large GOP lengths
c) are broken inbetween
d) use different time code tracks
the proxy builder can now also build timecode indices, which are
used (optionally) for seeking.
For the first time, it is possible, to do frame exact seeking on
all file types.
* Support for different video-streams in one video file (can be
selected in sequencer, other parts of blender can also use it,
but UI has to be added accordingly)
* IMPORTANT: this patch *requires* ffmpeg 0.7 or newer, since
older versions don't support the pkt_pts field, that is essential
for building timecode indices.
Windows and Mac libs are already updated, Linux-users have to build
their own ffmpeg verions until distros keep up.
2011-08-28 14:46:03 +00:00
|
|
|
/* rebuild_proxy operator */
|
|
|
|
static int sequencer_rebuild_proxy_exec(bContext *C, wmOperator *UNUSED(op))
|
|
|
|
{
|
|
|
|
Scene *scene = CTX_data_scene(C);
|
|
|
|
Editing *ed = seq_give_editing(scene, FALSE);
|
|
|
|
Sequence * seq;
|
|
|
|
|
|
|
|
SEQP_BEGIN(ed, seq) {
|
|
|
|
if ((seq->flag & SELECT)) {
|
|
|
|
seq_proxy_build_job(C, seq);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SEQ_END
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_rebuild_proxy(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Rebuild Proxy and Timecode Indices";
|
|
|
|
ot->idname= "SEQUENCER_OT_rebuild_proxy";
|
|
|
|
ot->description="Rebuild all selected proxies and timecode indeces using the job system";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_rebuild_proxy_exec;
|
|
|
|
ot->poll= ED_operator_sequencer_active;
|
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER;
|
|
|
|
}
|
2011-08-12 06:08:22 +00:00
|
|
|
|
|
|
|
/* change ops */
|
|
|
|
|
|
|
|
static EnumPropertyItem prop_change_effect_input_types[] = {
|
|
|
|
{0, "A_B", 0, "A -> B", ""},
|
|
|
|
{1, "B_C", 0, "B -> C", ""},
|
|
|
|
{2, "A_C", 0, "A -> C", ""},
|
|
|
|
{0, NULL, 0, NULL, NULL}
|
|
|
|
};
|
|
|
|
|
|
|
|
static int sequencer_change_effect_input_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
|
|
|
Sequence *seq= seq_active_get(scene);
|
|
|
|
|
|
|
|
Sequence **seq_1, **seq_2;
|
|
|
|
|
|
|
|
switch(RNA_enum_get(op->ptr, "swap")) {
|
|
|
|
case 0:
|
|
|
|
seq_1= &seq->seq1;
|
|
|
|
seq_2= &seq->seq2;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
seq_1= &seq->seq2;
|
|
|
|
seq_2= &seq->seq3;
|
|
|
|
break;
|
|
|
|
default: /* 2 */
|
|
|
|
seq_1= &seq->seq1;
|
|
|
|
seq_2= &seq->seq3;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(*seq_1 == NULL || *seq_2 == NULL) {
|
|
|
|
BKE_report(op->reports, RPT_ERROR, "One of the effect inputs is unset, can't swap");
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
SWAP(Sequence *, *seq_1, *seq_2);
|
|
|
|
}
|
|
|
|
|
|
|
|
update_changed_seq_and_deps(scene, seq, 0, 1);
|
|
|
|
|
|
|
|
/* important else we dont get the imbuf cache flushed */
|
|
|
|
free_imbuf_seq(scene, &ed->seqbase, FALSE, FALSE);
|
|
|
|
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_change_effect_input(struct wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Change Effect Input";
|
|
|
|
ot->idname= "SEQUENCER_OT_change_effect_input";
|
|
|
|
ot->description="";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_change_effect_input_exec;
|
|
|
|
ot->poll= sequencer_effect_poll;
|
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
|
|
|
ot->prop= RNA_def_enum(ot->srna, "swap", prop_change_effect_input_types, 0, "Swap", "The effect inputs to swap");
|
|
|
|
}
|
|
|
|
|
|
|
|
static int sequencer_change_effect_type_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
|
|
|
Sequence *seq= seq_active_get(scene);
|
|
|
|
const int new_type= RNA_enum_get(op->ptr, "type");
|
|
|
|
|
|
|
|
/* free previous effect and init new effect */
|
|
|
|
struct SeqEffectHandle sh;
|
|
|
|
|
|
|
|
if ((seq->type & SEQ_EFFECT) == 0) {
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* can someone explain the logic behind only allowing to increse this,
|
|
|
|
* copied from 2.4x - campbell */
|
|
|
|
if (get_sequence_effect_num_inputs(seq->type) <
|
|
|
|
get_sequence_effect_num_inputs(new_type)
|
|
|
|
) {
|
|
|
|
BKE_report(op->reports, RPT_ERROR, "New effect needs more input strips");
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
sh = get_sequence_effect(seq);
|
|
|
|
sh.free(seq);
|
|
|
|
|
|
|
|
seq->type= new_type;
|
|
|
|
|
|
|
|
sh = get_sequence_effect(seq);
|
|
|
|
sh.init(seq);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* update */
|
|
|
|
update_changed_seq_and_deps(scene, seq, 0, 1);
|
|
|
|
|
|
|
|
/* important else we dont get the imbuf cache flushed */
|
|
|
|
free_imbuf_seq(scene, &ed->seqbase, FALSE, FALSE);
|
|
|
|
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_change_effect_type(struct wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Change Effect Type";
|
|
|
|
ot->idname= "SEQUENCER_OT_change_effect_type";
|
|
|
|
ot->description="";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_change_effect_type_exec;
|
|
|
|
ot->poll= sequencer_effect_poll;
|
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
|
|
|
ot->prop= RNA_def_enum(ot->srna, "type", sequencer_prop_effect_types, SEQ_CROSS, "Type", "Sequencer effect type");
|
|
|
|
}
|
|
|
|
|
|
|
|
static int sequencer_change_path_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Editing *ed= seq_give_editing(scene, FALSE);
|
|
|
|
Sequence *seq= seq_active_get(scene);
|
|
|
|
|
|
|
|
if(seq->type == SEQ_IMAGE) {
|
|
|
|
char directory[FILE_MAX];
|
|
|
|
const int len= RNA_property_collection_length(op->ptr, RNA_struct_find_property(op->ptr, "files"));
|
|
|
|
StripElem *se;
|
|
|
|
|
|
|
|
if(len==0)
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
RNA_string_get(op->ptr, "directory", directory);
|
|
|
|
BLI_strncpy(seq->strip->dir, directory, sizeof(seq->strip->dir));
|
|
|
|
|
|
|
|
if(seq->strip->stripdata) {
|
|
|
|
MEM_freeN(seq->strip->stripdata);
|
|
|
|
}
|
|
|
|
seq->strip->stripdata= se= MEM_callocN(len*sizeof(StripElem), "stripelem");
|
|
|
|
|
|
|
|
RNA_BEGIN(op->ptr, itemptr, "files") {
|
|
|
|
char *filename= RNA_string_get_alloc(&itemptr, "name", NULL, 0);
|
|
|
|
BLI_strncpy(se->name, filename, sizeof(se->name));
|
|
|
|
MEM_freeN(filename);
|
|
|
|
se++;
|
|
|
|
}
|
|
|
|
RNA_END;
|
|
|
|
|
2011-08-14 03:59:22 +00:00
|
|
|
/* reset these else we wont see all the images */
|
|
|
|
seq->anim_startofs= seq->anim_endofs= 0;
|
|
|
|
|
2011-08-12 06:08:22 +00:00
|
|
|
/* correct start/end frames so we dont move
|
|
|
|
* important not to set seq->len= len; allow the function to handle it */
|
|
|
|
reload_sequence_new_file(scene, seq, TRUE);
|
|
|
|
|
|
|
|
calc_sequence(scene, seq);
|
|
|
|
|
|
|
|
/* important else we dont get the imbuf cache flushed */
|
|
|
|
free_imbuf_seq(scene, &ed->seqbase, FALSE, FALSE);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* lame, set rna filepath */
|
|
|
|
PointerRNA seq_ptr;
|
2011-08-14 14:43:11 +00:00
|
|
|
PropertyRNA *prop;
|
2011-08-12 06:08:22 +00:00
|
|
|
char filepath[FILE_MAX];
|
|
|
|
|
|
|
|
RNA_pointer_create(&scene->id, &RNA_Sequence, seq, &seq_ptr);
|
|
|
|
|
|
|
|
RNA_string_get(op->ptr, "filepath", filepath);
|
2011-08-14 14:43:11 +00:00
|
|
|
prop= RNA_struct_find_property(&seq_ptr, "filepath");
|
|
|
|
RNA_property_string_set(&seq_ptr, prop, filepath);
|
|
|
|
RNA_property_update(C, &seq_ptr, prop);
|
2011-08-12 06:08:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int sequencer_change_path_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Sequence *seq= seq_active_get(scene);
|
|
|
|
|
|
|
|
RNA_string_set(op->ptr, "directory", seq->strip->dir);
|
|
|
|
|
|
|
|
/* set default display depending on seq type */
|
|
|
|
if(seq->type == SEQ_IMAGE) {
|
|
|
|
RNA_boolean_set(op->ptr, "filter_movie", 0);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
RNA_boolean_set(op->ptr, "filter_image", 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
WM_event_add_fileselect(C, op);
|
|
|
|
|
|
|
|
return OPERATOR_RUNNING_MODAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SEQUENCER_OT_change_path(struct wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Change Data/Files";
|
|
|
|
ot->idname= "SEQUENCER_OT_change_path";
|
|
|
|
ot->description="";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= sequencer_change_path_exec;
|
|
|
|
ot->invoke= sequencer_change_path_invoke;
|
|
|
|
ot->poll= sequencer_strip_has_path_poll;
|
|
|
|
|
|
|
|
/* flags */
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
|
|
|
WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_DIRECTORY|WM_FILESEL_RELPATH|WM_FILESEL_FILEPATH|WM_FILESEL_FILES);
|
|
|
|
}
|