#include "clip.h"
#include "clipedit.h"
#include "commercials.h"
+#include "convert.h"
#include "cplayback.h"
#include "ctimebar.h"
#include "cwindow.h"
void MWindow::add_audio_track_entry(int above, Track *dst)
{
- undo->update_undo_before();
+ undo_before();
add_audio_track(above, dst);
save_backup();
- undo->update_undo_after(_("add track"), LOAD_ALL);
+ undo_after(_("add track"), LOAD_ALL);
restart_brender();
gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
gui->activate_timeline();
-
-// gui->get_scrollbars(0);
-// gui->canvas->draw();
-// gui->patchbay->update();
-// gui->cursor->draw(1);
-// gui->canvas->flash();
-// gui->canvas->activate();
cwindow->refresh_frame(CHANGE_EDL);
}
void MWindow::add_video_track_entry(Track *dst)
{
- undo->update_undo_before();
+ undo_before();
add_video_track(1, dst);
- undo->update_undo_after(_("add track"), LOAD_ALL);
+ undo_after(_("add track"), LOAD_ALL);
restart_brender();
gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
gui->activate_timeline();
-// gui->get_scrollbars(0);
-// gui->canvas->draw();
-// gui->patchbay->update();
-// gui->cursor->draw(1);
-// gui->canvas->flash();
-// gui->canvas->activate();
cwindow->refresh_frame(CHANGE_EDL);
save_backup();
}
void MWindow::add_subttl_track_entry(Track *dst)
{
- undo->update_undo_before();
+ undo_before();
add_subttl_track(1, dst);
- undo->update_undo_after(_("add track"), LOAD_ALL);
+ undo_after(_("add track"), LOAD_ALL);
restart_brender();
gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
gui->activate_timeline();
-// gui->get_scrollbars(0);
-// gui->canvas->draw();
-// gui->patchbay->update();
-// gui->cursor->draw(1);
-// gui->canvas->flash();
-// gui->canvas->activate();
cwindow->refresh_frame(CHANGE_EDL);
save_backup();
}
{
int w, h;
- undo->update_undo_before();
+ undo_before();
// Get w and h
w = indexable->get_w();
}
}
-
+#ifdef GLx4
if( ((edl->session->output_w % 4) ||
(edl->session->output_h % 4)) &&
edl->session->playback_config->vconfig->driver == PLAYBACK_X11_GL ) {
_("This project's dimensions are not multiples of 4 so\n"
"it can't be rendered by OpenGL."));
}
-
+#endif
// Get aspect ratio
if( defaults->get("AUTOASPECT", 0) ) {
create_aspect_ratio(
save_backup();
- undo->update_undo_after(_("asset to all"), LOAD_ALL);
+ undo_after(_("asset to all"), LOAD_ALL);
restart_brender();
gui->update(1, FORCE_REDRAW, 1, 1, 1, 1, 0);
sync_parameters(CHANGE_ALL);
if( indexable->have_video() ) {
int w, h;
- undo->update_undo_before();
+ undo_before();
// Get w and h
w = indexable->get_w();
h = indexable->get_h();
edl->session->output_w = w;
edl->session->output_h = h;
-
+#ifdef GLx4
if( ((edl->session->output_w % 4) ||
(edl->session->output_h % 4)) &&
edl->session->playback_config->vconfig->driver == PLAYBACK_X11_GL ) {
_("This project's dimensions are not multiples of 4 so\n"
"it can't be rendered by OpenGL."));
}
-
+#endif
// Get aspect ratio
if( defaults->get("AUTOASPECT", 0) ) {
create_aspect_ratio(edl->session->aspect_w,
save_backup();
- undo->update_undo_after(_("asset to size"), LOAD_ALL);
+ undo_after(_("asset to size"), LOAD_ALL);
restart_brender();
sync_parameters(CHANGE_ALL);
}
session->drag_assets->get(0)->have_video() ) {
double new_framerate = session->drag_assets->get(0)->get_frame_rate();
double old_framerate = edl->session->frame_rate;
- undo->update_undo_before();
+ undo_before();
edl->session->frame_rate = new_framerate;
edl->resample(old_framerate, new_framerate, TRACK_VIDEO);
save_backup();
- undo->update_undo_after(_("asset to rate"), LOAD_ALL);
+ undo_after(_("asset to rate"), LOAD_ALL);
restart_brender();
gui->update(1, FORCE_REDRAW, 1, 1, 1, 1, 0);
sync_parameters(CHANGE_ALL);
void MWindow::clear_entry()
{
- undo->update_undo_before();
+ undo_before();
clear(1);
edl->optimize();
save_backup();
- undo->update_undo_after(_("clear"), LOAD_EDITS | LOAD_TIMEBAR);
+ undo_after(_("clear"), LOAD_EDITS | LOAD_TIMEBAR);
restart_brender();
update_plugin_guis();
void MWindow::set_automation_mode(int mode)
{
- undo->update_undo_before();
+ undo_before();
speed_before();
edl->tracks->set_automation_mode(
edl->local_session->get_selectionstart(),
save_backup();
char string[BCSTRLEN];
sprintf(string,"set %s", FloatAuto::curve_name(mode));
- undo->update_undo_after(string,
+ undo_after(string,
!changed_edl ? LOAD_AUTOMATION :
LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
update_gui(changed_edl);
void MWindow::clear_automation()
{
- undo->update_undo_before();
+ undo_before();
speed_before();
edl->tracks->clear_automation(edl->local_session->get_selectionstart(),
edl->local_session->get_selectionend());
int changed_edl = speed_after(1);
save_backup();
- undo->update_undo_after(_("clear keyframes"),
+ undo_after(_("clear keyframes"),
!changed_edl ? LOAD_AUTOMATION :
LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
update_gui(changed_edl);
int MWindow::clear_default_keyframe()
{
- undo->update_undo_before();
+ undo_before();
speed_before();
edl->tracks->clear_default_keyframe();
int changed_edl = speed_after(1);
save_backup();
- undo->update_undo_after(_("clear default keyframe"),
+ undo_after(_("clear default keyframe"),
!changed_edl ? LOAD_AUTOMATION :
LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
update_gui(changed_edl);
void MWindow::clear_labels()
{
- undo->update_undo_before();
+ undo_before();
clear_labels(edl->local_session->get_selectionstart(),
edl->local_session->get_selectionend());
- undo->update_undo_after(_("clear labels"), LOAD_TIMEBAR);
+ undo_after(_("clear labels"), LOAD_TIMEBAR);
gui->update_timebar(1);
cwindow->update(0, 0, 0, 0, 1);
int MWindow::clear_labels(double start, double end)
{
+ if( start == end ) {
+ start = 0;
+ end = edl->tracks->total_length();
+ }
edl->labels->clear(start, end, 0);
return 0;
}
+void MWindow::clear_hard_edges()
+{
+ undo_before();
+ clear_hard_edges(edl->local_session->get_selectionstart(),
+ edl->local_session->get_selectionend());
+ edl->optimize();
+ save_backup();
+ undo_after(_("clear hard edges"), LOAD_EDITS);
+ restart_brender();
+ gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
+ cwindow->refresh_frame(CHANGE_EDL);
+}
+
+int MWindow::clear_hard_edges(double start, double end)
+{
+ if( start == end ) {
+ start = 0;
+ end = edl->tracks->total_length();
+ }
+ edl->clear_hard_edges(start, end);
+ return 0;
+}
+
+void MWindow::clear_select()
+{
+ edl->tracks->clear_selected_edits();
+ gui->draw_overlays(1);
+}
+
void MWindow::concatenate_tracks()
{
- undo->update_undo_before();
+ undo_before();
edl->tracks->concatenate_tracks(edl->session->plugins_follow_edits,
edl->session->autos_follow_edits);
save_backup();
- undo->update_undo_after(_("concatenate tracks"), LOAD_EDITS);
+ undo_after(_("concatenate tracks"), LOAD_EDITS);
restart_brender();
gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
}
+int MWindow::copy_flags(int copy_flags)
+{
+ if( !edl->session->labels_follow_edits )
+ copy_flags &= ~COPY_LABELS;
+ if( !edl->session->autos_follow_edits )
+ copy_flags &= ~COPY_AUTOS;
+ if( !edl->session->plugins_follow_edits )
+ copy_flags &= ~COPY_PLUGINS;
+ return copy_flags;
+}
+
void MWindow::copy()
{
copy(edl->local_session->get_selectionstart(),
if( start == end ) return 1;
FileXML file;
- edl->copy(start, end, 0, &file, "", 1);
+ edl->copy(copy_flags(), start, end, &file, "", 1);
const char *file_string = file.string();
long file_length = strlen(file_string);
gui->to_clipboard(file_string, file_length, BC_PRIMARY_SELECTION);
return 0;
}
-
// Uses cropping coordinates in edl session to crop and translate video.
// We modify the projector since camera automation depends on the track size.
-void MWindow::crop_video()
+void MWindow::crop_video(int mode)
{
-
- undo->update_undo_before();
+ undo_before();
// Clamp EDL crop region
if( edl->session->crop_x1 > edl->session->crop_x2 ) {
edl->session->crop_x1 ^= edl->session->crop_x2;
edl->session->crop_y2 ^= edl->session->crop_y1;
edl->session->crop_y1 ^= edl->session->crop_y2;
}
-
- float old_projector_x = (float)edl->session->output_w / 2;
- float old_projector_y = (float)edl->session->output_h / 2;
- float new_projector_x = (float)(edl->session->crop_x1 + edl->session->crop_x2) / 2;
- float new_projector_y = (float)(edl->session->crop_y1 + edl->session->crop_y2) / 2;
- float projector_offset_x = -(new_projector_x - old_projector_x);
- float projector_offset_y = -(new_projector_y - old_projector_y);
-
- edl->tracks->translate_projector(projector_offset_x, projector_offset_y);
-
- edl->session->output_w = edl->session->crop_x2 - edl->session->crop_x1;
- edl->session->output_h = edl->session->crop_y2 - edl->session->crop_y1;
- edl->session->crop_x1 = 0;
- edl->session->crop_y1 = 0;
- edl->session->crop_x2 = edl->session->output_w;
- edl->session->crop_y2 = edl->session->output_h;
+ switch( mode ) {
+ case CROP_REFORMAT: {
+ float ctr_x = edl->session->output_w / 2.;
+ float ctr_y = edl->session->output_h / 2.;
+ float new_x = (edl->session->crop_x1 + edl->session->crop_x2) / 2.;
+ float new_y = (edl->session->crop_y1 + edl->session->crop_y2) / 2.;
+ float dx = -(new_x - ctr_x), dy = -(new_y - ctr_y);
+ edl->tracks->translate_projector(dx, dy, 1);
+
+ edl->session->output_w = edl->session->crop_x2 - edl->session->crop_x1;
+ edl->session->output_h = edl->session->crop_y2 - edl->session->crop_y1;
+ edl->session->crop_x1 = edl->session->crop_y1 = 0;
+ edl->session->crop_x2 = edl->session->output_w;
+ edl->session->crop_y2 = edl->session->output_h;
+ break; }
+ case CROP_RESIZE: {
+ float old_w = edl->session->output_w;
+ float old_h = edl->session->output_h;
+ float new_w = edl->session->crop_x2 - edl->session->crop_x1;
+ float new_h = edl->session->crop_y2 - edl->session->crop_y1;
+ if( !new_w ) new_w = 1;
+ if( !new_h ) new_h = 1;
+ float xzoom = old_w / new_w, yzoom = old_h / new_h;
+ float new_z = bmin(xzoom, yzoom);
+ float new_x = (edl->session->crop_x1 + edl->session->crop_x2) / 2.;
+ float new_y = (edl->session->crop_y1 + edl->session->crop_y2) / 2.;
+ edl->tracks->crop_resize(new_x, new_y, new_z);
+
+ edl->session->crop_x1 = 0;
+ edl->session->crop_y1 = 0;
+ edl->session->crop_x2 = edl->session->output_w;
+ edl->session->crop_y2 = edl->session->output_h;
+ break; }
+ case CROP_SHRINK: {
+ float old_w = edl->session->output_w;
+ float old_h = edl->session->output_h;
+ float new_w = edl->session->crop_x2 - edl->session->crop_x1;
+ float new_h = edl->session->crop_y2 - edl->session->crop_y1;
+ if( !new_w ) new_w = 1;
+ if( !new_h ) new_h = 1;
+ float xzoom = old_w / new_w, yzoom = old_h / new_h;
+ float new_z = bmin(xzoom, yzoom);
+
+ float new_x = (edl->session->crop_x1 + edl->session->crop_x2) / 2.;
+ float new_y = (edl->session->crop_y1 + edl->session->crop_y2) / 2.;
+ edl->tracks->crop_shrink(new_x, new_y, new_z);
+ break; }
+ }
// Recalculate aspect ratio
if( defaults->get("AUTOASPECT", 0) ) {
edl->session->output_h);
}
- undo->update_undo_after(_("crop"), LOAD_ALL);
+ undo_after(_("crop"), LOAD_ALL);
restart_brender();
cwindow->refresh_frame(CHANGE_ALL);
void MWindow::blade(double position)
{
- undo->update_undo_before();
+ undo_before();
edl->blade(position);
edl->optimize();
save_backup();
- undo->update_undo_after(_("blade"), LOAD_EDITS | LOAD_TIMEBAR);
+ undo_after(_("blade"), LOAD_EDITS | LOAD_TIMEBAR);
restart_brender();
update_plugin_guis();
gui->update(1, FORCE_REDRAW, 1, 1, 1, 1, 0);
void MWindow::cut(double start, double end, double new_position)
{
- undo->update_undo_before();
+ undo_before();
copy(start, end);
edl->clear(start, end,
edl->session->labels_follow_edits,
edl->optimize();
save_backup();
- undo->update_undo_after(_("split | cut"), LOAD_EDITS | LOAD_TIMEBAR);
+ undo_after(_("split | cut"), LOAD_EDITS | LOAD_TIMEBAR);
if( new_position >= 0 ) {
edl->local_session->set_selectionstart(new_position);
edl->local_session->set_selectionend(new_position);
int MWindow::cut_automation()
{
- undo->update_undo_before();
+ undo_before();
speed_before();
copy_automation();
edl->tracks->clear_automation(edl->local_session->get_selectionstart(),
edl->local_session->get_selectionend());
int changed_edl = speed_after(1);
save_backup();
- undo->update_undo_after(_("cut keyframes"),
+ undo_after(_("cut keyframes"),
!changed_edl ? LOAD_AUTOMATION :
LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
update_gui(changed_edl);
int MWindow::cut_default_keyframe()
{
- undo->update_undo_before();
+ undo_before();
speed_before();
copy_default_keyframe();
edl->tracks->clear_default_keyframe();
int changed_edl = speed_after(1);
save_backup();
- undo->update_undo_after(_("cut default keyframe"),
+ undo_after(_("cut default keyframe"),
!changed_edl ? LOAD_AUTOMATION :
LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
update_gui(changed_edl);
}
-void MWindow::delete_track()
-{
- if( edl->tracks->last )
- delete_track(edl->tracks->last);
-}
-
void MWindow::delete_tracks()
{
- undo->update_undo_before();
+ undo_before();
edl->tracks->delete_tracks();
- undo->update_undo_after(_("delete tracks"), LOAD_ALL);
+ undo_after(_("delete tracks"), LOAD_ALL);
save_backup();
restart_brender();
void MWindow::delete_track(Track *track)
{
- undo->update_undo_before();
+ undo_before();
edl->tracks->delete_track(track);
- undo->update_undo_after(_("delete track"), LOAD_ALL);
+ undo_after(_("delete track"), LOAD_ALL);
restart_brender();
update_plugin_states();
Track *dest_track = session->track_highlighted;
if( !dest_track ) return;
- undo->update_undo_before();
+ undo_before();
for( int i=0; i<session->drag_pluginservers->total; ++i ) {
PluginServer *plugin = session->drag_pluginservers->values[i];
}
save_backup();
- undo->update_undo_after(_("insert effect"), LOAD_EDITS | LOAD_PATCHES);
+ undo_after(_("insert effect"), LOAD_EDITS | LOAD_PATCHES);
restart_brender();
sync_parameters(CHANGE_EDL);
// GUI updated in TrackCanvas, after current_operations are reset
{
if( !dest_track ) return;
- undo->update_undo_before();
+ undo_before();
double start = 0;
double length = dest_track->get_length();
}
save_backup();
- undo->update_undo_after(_("insert effect"), LOAD_EDITS | LOAD_PATCHES);
+ undo_after(_("insert effect"), LOAD_EDITS | LOAD_PATCHES);
restart_brender();
sync_parameters(CHANGE_EDL);
gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
int MWindow::modify_edithandles()
{
- undo->update_undo_before();
+ undo_before();
+ int handle_mode = edl->session->edit_handle_mode[session->drag_button];
edl->modify_edithandles(session->drag_start,
- session->drag_position,
- session->drag_handle,
- edl->session->edit_handle_mode[session->drag_button],
+ session->drag_position, session->drag_handle, handle_mode,
edl->session->labels_follow_edits,
edl->session->plugins_follow_edits,
- edl->session->autos_follow_edits);
-
+ edl->session->autos_follow_edits,
+ session->drag_edit->group_id);
finish_modify_handles();
//printf("MWindow::modify_handles 1\n");
return 0;
int MWindow::modify_pluginhandles()
{
- undo->update_undo_before();
+ undo_before();
edl->modify_pluginhandles(session->drag_start,
session->drag_position,
void MWindow::finish_modify_handles()
{
int edit_mode = edl->session->edit_handle_mode[session->drag_button];
-
- if( (session->drag_handle == 1 && edit_mode != MOVE_NO_EDITS) ||
- (session->drag_handle == 0 && edit_mode == MOVE_ONE_EDIT) ) {
-//printf("MWindow::finish_modify_handles %d\n", __LINE__);
- edl->local_session->set_selectionstart(session->drag_position);
- edl->local_session->set_selectionend(session->drag_position);
- }
- else
- if( edit_mode != MOVE_NO_EDITS ) {
-//printf("MWindow::finish_modify_handles %d\n", __LINE__);
- edl->local_session->set_selectionstart(session->drag_start);
- edl->local_session->set_selectionend(session->drag_start);
- }
-
-// clamp the selection to 0
- if( edl->local_session->get_selectionstart(1) < 0 ) {
- edl->local_session->set_selectionstart(0);
- edl->local_session->set_selectionend(0);
- }
- undo->update_undo_after(_("drag handle"), LOAD_EDITS | LOAD_TIMEBAR);
+ double position = -1;
+ switch( edit_mode ) {
+ case MOVE_RIPPLE:
+ position = !session->drag_handle ?
+ session->drag_start : session->drag_position;
+ break;
+ case MOVE_ROLL:
+ case MOVE_SLIDE:
+ position = session->drag_position;
+ break;
+ case MOVE_SLIP:
+ case MOVE_EDGE:
+ position = session->drag_start;
+ break;
+ }
+ if( position >= 0 ) {
+ edl->local_session->set_selectionstart(position);
+ edl->local_session->set_selectionend(position);
+ }
+ undo_after(_("drag handle"), LOAD_EDITS | LOAD_TIMEBAR);
save_backup();
restart_brender();
void MWindow::match_output_size(Track *track)
{
- undo->update_undo_before();
+ undo_before();
track->track_w = edl->session->output_w;
track->track_h = edl->session->output_h;
save_backup();
- undo->update_undo_after(_("match output size"), LOAD_ALL);
+ undo_after(_("match output size"), LOAD_ALL);
restart_brender();
sync_parameters(CHANGE_EDL);
}
-EDL *MWindow::selected_edits_to_clip(int packed,
- double *start_position, Track **start_track,
- int edit_labels, int edit_autos, int edit_plugins)
-{
- double start = DBL_MAX, end = DBL_MIN;
- Track *first_track=0, *last_track = 0;
- for( Track *track=edl->tracks->first; track; track=track->next ) {
- if( !track->record ) continue;
- int empty = 1;
- for( Edit *edit=track->edits->first; edit; edit=edit->next ) {
- if( !edit->is_selected || edit->silence() ) continue;
- double edit_pos = track->from_units(edit->startproject);
- if( start > edit_pos ) start = edit_pos;
- if( end < (edit_pos+=edit->length) ) end = edit_pos;
- empty = 0;
- }
- if( empty ) continue;
- if( !first_track ) first_track = track;
- last_track = track;
- }
- if( start_position ) *start_position = start;
- if( start_track ) *start_track = first_track;
- if( !first_track ) return 0;
- EDL *new_edl = new EDL();
- new_edl->create_objects();
- new_edl->copy_session(edl);
- const char *text = _("new_edl edit");
- new_edl->set_path(text);
- strcpy(new_edl->local_session->clip_title, text);
- strcpy(new_edl->local_session->clip_notes, text);
- new_edl->session->video_tracks = 0;
- new_edl->session->audio_tracks = 0;
- for( Track *track=edl->tracks->first; track; track=track->next ) {
- if( !track->record ) continue;
- if( first_track ) {
- if( first_track != track ) continue;
- first_track = 0;
- }
- Track *new_track = 0;
- if( !packed )
- new_track = new_edl->add_new_track(track->data_type);
- int64_t start_pos = track->to_units(start, 0);
- int64_t end_pos = track->to_units(end, 0);
- int64_t startproject = 0;
- Edit *edit = track->edits->first;
- for( ; edit; edit=edit->next ) {
- if( !edit->is_selected || edit->silence() ) continue;
- if( edit->startproject < start_pos ) continue;
- if( edit->startproject >= end_pos ) break;
- int64_t edit_start_pos = edit->startproject;
- int64_t edit_end_pos = edit->startproject + edit->length;
- if( !new_track )
- new_track = new_edl->add_new_track(track->data_type);
- int64_t edit_pos = edit_start_pos - start_pos;
- if( !packed && edit_pos > startproject ) {
- Edit *silence = new Edit(new_edl, new_track);
- silence->startproject = startproject;
- silence->length = edit_pos - startproject;
- new_track->edits->append(silence);
- startproject = edit_pos;
- }
- int64_t clip_start_pos = startproject;
- Edit *clip_edit = new Edit(new_edl, new_track);
- clip_edit->copy_from(edit);
- clip_edit->startproject = startproject;
- startproject += clip_edit->length;
- new_track->edits->append(clip_edit);
- if( edit_labels ) {
- double edit_start = track->from_units(edit_start_pos);
- double edit_end = track->from_units(edit_end_pos);
- double clip_start = new_track->from_units(clip_start_pos);
- Label *label = edl->labels->first;
- for( ; label; label=label->next ) {
- if( label->position < edit_start ) continue;
- if( label->position >= edit_end ) break;
- double clip_position = label->position - edit_start + clip_start;
- Label *clip_label = new_edl->labels->first;
- while( clip_label && clip_label->position<clip_position )
- clip_label = clip_label->next;
- if( clip_label && clip_label->position == clip_position ) continue;
- Label *new_label = new Label(new_edl,
- new_edl->labels, clip_position, label->textstr);
- new_edl->labels->insert_before(clip_label, new_label);
- }
- }
- if( edit_autos ) {
- Automation *automation = track->automation;
- Automation *new_automation = new_track->automation;
- for( int i=0; i<AUTOMATION_TOTAL; ++i ) {
- Autos *autos = automation->autos[i];
- if( !autos ) continue;
- Autos *new_autos = new_automation->autos[i];
- new_autos->default_auto->copy_from(autos->default_auto);
- Auto *aut0 = autos->first;
- for( ; aut0; aut0=aut0->next ) {
- if( aut0->position < edit_start_pos ) continue;
- if( aut0->position >= edit_end_pos ) break;
- Auto *new_auto = new_autos->new_auto();
- new_auto->copy_from(aut0);
- int64_t clip_position = aut0->position - edit_start_pos + clip_start_pos;
- new_auto->position = clip_position;
- new_autos->append(new_auto);
- }
- }
- }
- if( edit_plugins ) {
- while( new_track->plugin_set.size() < track->plugin_set.size() )
- new_track->plugin_set.append(0);
- for( int i=0; i<track->plugin_set.total; ++i ) {
- PluginSet *plugin_set = track->plugin_set[i];
- if( !plugin_set ) continue;
- PluginSet *new_plugin_set = new_track->plugin_set[i];
- if( !new_plugin_set ) {
- new_plugin_set = new PluginSet(new_edl, new_track);
- new_track->plugin_set[i] = new_plugin_set;
- }
- Plugin *plugin = (Plugin*)plugin_set->first;
- int64_t startplugin = new_plugin_set->length();
- for( ; plugin ; plugin=(Plugin*)plugin->next ) {
- if( plugin->silence() ) continue;
- int64_t plugin_start_pos = plugin->startproject;
- int64_t plugin_end_pos = plugin_start_pos + plugin->length;
- if( plugin_end_pos < start_pos ) continue;
- if( plugin_start_pos > end_pos ) break;
- if( plugin_start_pos < edit_start_pos )
- plugin_start_pos = edit_start_pos;
- if( plugin_end_pos > edit_end_pos )
- plugin_end_pos = edit_end_pos;
- if( plugin_start_pos >= plugin_end_pos ) continue;
- int64_t plugin_pos = plugin_start_pos - start_pos;
- if( !packed && plugin_pos > startplugin ) {
- Plugin *silence = new Plugin(new_edl, new_track, "");
- silence->startproject = startplugin;
- silence->length = plugin_pos - startplugin;
- new_plugin_set->append(silence);
- startplugin = plugin_pos;
- }
- Plugin *new_plugin = new Plugin(new_edl, new_track, plugin->title);
- new_plugin->copy_base(plugin);
- new_plugin->startproject = startplugin;
- new_plugin->length = plugin_end_pos - plugin_start_pos;
- startplugin += new_plugin->length;
- new_plugin_set->append(new_plugin);
- KeyFrames *keyframes = plugin->keyframes;
- KeyFrames *new_keyframes = new_plugin->keyframes;
- new_keyframes->default_auto->copy_from(keyframes->default_auto);
- new_keyframes->default_auto->position = new_plugin->startproject;
- KeyFrame *keyframe = (KeyFrame*)keyframes->first;
- for( ; keyframe; keyframe=(KeyFrame*)keyframe->next ) {
- if( keyframe->position < edit_start_pos ) continue;
- if( keyframe->position >= edit_end_pos ) break;
- KeyFrame *clip_keyframe = new KeyFrame(new_edl, new_keyframes);
- clip_keyframe->copy_from(keyframe);
- int64_t key_position = keyframe->position - start_pos;
- if( packed )
- key_position += new_plugin->startproject - plugin_pos;
- clip_keyframe->position = key_position;
- new_keyframes->append(clip_keyframe);
- }
- }
- }
- }
- }
- if( last_track == track ) break;
- }
- return new_edl;
-}
-
-void MWindow::selected_edits_to_clipboard(int packed)
-{
- EDL *new_edl = selected_edits_to_clip(packed, 0, 0,
- edl->session->labels_follow_edits,
- edl->session->autos_follow_edits,
- edl->session->plugins_follow_edits);
- if( !new_edl ) return;
- double length = new_edl->tracks->total_length();
- FileXML file;
- new_edl->copy(0, length, 1, &file, "", 1);
- const char *file_string = file.string();
- long file_length = strlen(file_string);
- gui->to_clipboard(file_string, file_length, BC_PRIMARY_SELECTION);
- gui->to_clipboard(file_string, file_length, SECONDARY_SELECTION);
- new_edl->remove_user();
-}
-
void MWindow::delete_edit(Edit *edit, const char *msg, int collapse)
{
ArrayList<Edit*> edits;
void MWindow::delete_edits(ArrayList<Edit*> *edits, const char *msg, int collapse)
{
if( !edits->size() ) return;
- undo->update_undo_before();
+ undo_before();
+ if( edl->session->labels_follow_edits )
+ edl->delete_edit_labels(edits, collapse);
edl->delete_edits(edits, collapse);
edl->optimize();
save_backup();
- undo->update_undo_after(msg, LOAD_EDITS);
+ undo_after(msg, LOAD_EDITS);
restart_brender();
cwindow->refresh_frame(CHANGE_EDL);
void MWindow::move_edits(ArrayList<Edit*> *edits,
- Track *track,
- double position,
- int behaviour)
+ Track *track, double position, int mode)
{
- undo->update_undo_before();
-
- EDL *clip = selected_edits_to_clip(0, 0, 0,
- edl->session->labels_follow_edits,
- edl->session->autos_follow_edits,
- edl->session->plugins_follow_edits);
- edl->delete_edits(edits, 0);
- paste_edits(clip, track, position, behaviour, 1,
+ undo_before();
+// lockout timebar labels update
+// labels can be deleted with tooltip repeater running
+ cwindow->gui->lock_window("Tracks::move_edits");
+ edl->tracks->move_edits(edits, track, position,
edl->session->labels_follow_edits,
- edl->session->autos_follow_edits,
- edl->session->plugins_follow_edits);
- edl->tracks->clear_selected_edits();
+ edl->session->plugins_follow_edits,
+ edl->session->autos_follow_edits, mode);
+ cwindow->gui->timebar->update(1);
+ cwindow->gui->unlock_window();
save_backup();
- undo->update_undo_after(_("move edit"), LOAD_ALL);
+ undo_after(_("move edit"), LOAD_ALL);
restart_brender();
cwindow->refresh_frame(CHANGE_EDL);
gui->update(1, NORMAL_DRAW, 1, 0, 0, 0, 0);
}
-void MWindow::paste_edits(EDL *clip, Track *first_track, double position, int overwrite,
- int edit_edits, int edit_labels, int edit_autos, int edit_plugins)
+void MWindow::selected_edits_to_clipboard(int packed)
{
- if( !first_track )
- first_track = edl->tracks->first;
- Track *src = clip->tracks->first;
- for( Track *track=first_track; track && src; track=track->next ) {
- if( !track->record ) continue;
- int64_t pos = track->to_units(position, 0);
- if( edit_edits ) {
- for( Edit *edit=src->edits->first; edit; edit=edit->next ) {
- if( edit->silence() ) continue;
- int64_t start = pos + edit->startproject;
- int64_t len = edit->length, end = start + len;
- if( overwrite )
- track->edits->clear(start, end);
- Edit *dst = track->edits->insert_new_edit(start);
- dst->copy_from(edit);
- dst->startproject = start;
- dst->is_selected = 1;
- while( (dst=dst->next) != 0 )
- dst->startproject += edit->length;
- if( overwrite ) continue;
- if( edit_labels && track == first_track ) {
- double dst_pos = track->from_units(start);
- double dst_len = track->from_units(len);
- for( Label *label=edl->labels->first; label; label=label->next ) {
- if( label->position >= dst_pos )
- label->position += dst_len;
- }
- }
- if( edit_autos ) {
- for( int i=0; i<AUTOMATION_TOTAL; ++i ) {
- Autos *autos = track->automation->autos[i];
- if( !autos ) continue;
- for( Auto *aut0=autos->first; aut0; aut0=aut0->next ) {
- if( aut0->position >= start )
- aut0->position += edit->length;
- }
- }
- }
- if( edit_plugins ) {
- for( int i=0; i<track->plugin_set.size(); ++i ) {
- PluginSet *plugin_set = track->plugin_set[i];
- Plugin *plugin = (Plugin *)plugin_set->first;
- for( ; plugin; plugin=(Plugin *)plugin->next ) {
- if( plugin->startproject >= start )
- plugin->startproject += edit->length;
- Auto *default_keyframe = plugin->keyframes->default_auto;
- if( default_keyframe->position >= start )
- default_keyframe->position += edit->length;
- KeyFrame *keyframe = (KeyFrame*)plugin->keyframes->first;
- for( ; keyframe; keyframe=(KeyFrame*)keyframe->next ) {
- if( keyframe->position >= start )
- keyframe->position += edit->length;
- }
- }
- }
- }
- }
- }
- if( edit_autos ) {
- for( int i=0; i<AUTOMATION_TOTAL; ++i ) {
- Autos *src_autos = src->automation->autos[i];
- if( !src_autos ) continue;
- Autos *autos = track->automation->autos[i];
- for( Auto *aut0=src_autos->first; aut0; aut0=aut0->next ) {
- int64_t auto_pos = pos + aut0->position;
- autos->insert_auto(auto_pos, aut0);
- }
- }
- }
- if( edit_plugins ) {
- for( int i=0; i<src->plugin_set.size(); ++i ) {
- PluginSet *plugin_set = src->plugin_set[i];
- if( !plugin_set ) continue;
- while( i >= track->plugin_set.size() )
- track->plugin_set.append(0);
- PluginSet *dst_plugin_set = track->plugin_set[i];
- if( !dst_plugin_set ) {
- dst_plugin_set = new PluginSet(edl, track);
- track->plugin_set[i] = dst_plugin_set;
- }
- Plugin *plugin = (Plugin *)plugin_set->first;
- if( plugin ) track->expand_view = 1;
- for( ; plugin; plugin=(Plugin *)plugin->next ) {
- int64_t start = pos + plugin->startproject;
- int64_t end = start + plugin->length;
- if( overwrite )
- dst_plugin_set->clear(start, end, 1);
- Plugin *dst = dst_plugin_set->insert_plugin(
- plugin->title, start, end-start,
- plugin->plugin_type, &plugin->shared_location,
- (KeyFrame*)plugin->keyframes->default_auto, 0);
- KeyFrame *keyframe = (KeyFrame*)plugin->keyframes->first;
- for( ; keyframe; keyframe=(KeyFrame*)keyframe->next ) {
- int64_t keyframe_pos = pos + keyframe->position;
- dst->keyframes->insert_auto(keyframe_pos, keyframe);
- }
- }
- }
- }
- src = src->next;
- }
- if( edit_labels ) {
- Label *edl_label = edl->labels->first;
- for( Label *label=clip->labels->first; label; label=label->next ) {
- double label_pos = position + label->position;
- int exists = 0;
- while( edl_label &&
- !(exists=edl->equivalent(edl_label->position, label_pos)) &&
- edl_label->position < position ) edl_label = edl_label->next;
- if( exists ) continue;
- edl->labels->insert_before(edl_label,
- new Label(edl, edl->labels, label_pos, label->textstr));
- }
- }
- edl->optimize();
+ EDL *new_edl = edl->selected_edits_to_clip(packed, 0, 0,
+ edl->session->labels_follow_edits,
+ edl->session->autos_follow_edits,
+ edl->session->plugins_follow_edits);
+ if( !new_edl ) return;
+ FileXML file;
+ new_edl->copy(COPY_EDL, &file, "", 1);
+ const char *file_string = file.string();
+ long file_length = strlen(file_string);
+ gui->to_clipboard(file_string, file_length, BC_PRIMARY_SELECTION);
+ gui->to_clipboard(file_string, file_length, SECONDARY_SELECTION);
+ new_edl->remove_user();
}
void MWindow::paste_clipboard(Track *first_track, double position, int overwrite,
EDL *clip = new EDL();
clip->create_objects();
if( !clip->load_xml(&file, LOAD_ALL) ) {
- undo->update_undo_before();
- paste_edits(clip, first_track, position, overwrite,
+ undo_before();
+ edl->paste_edits(clip, first_track, position, overwrite,
edit_edits, edit_labels, edit_autos, edit_plugins);
save_backup();
- undo->update_undo_after(_("paste clip"), LOAD_ALL);
+ undo_after(_("paste clip"), LOAD_ALL);
restart_brender();
cwindow->refresh_frame(CHANGE_EDL);
void MWindow::move_group(EDL *group, Track *first_track, double position, int overwrite)
{
- undo->update_undo_before();
+ undo_before();
+// lockout timebar labels update
+// labels can be deleted with tooltip repeater running
+ cwindow->gui->lock_window("Tracks::move_group");
ArrayList<Edit *>edits;
edl->tracks->get_selected_edits(&edits);
+ if( edl->session->labels_follow_edits )
+ edl->delete_edit_labels(&edits, 0);
edl->delete_edits(&edits, 0);
- paste_edits(group, first_track, position, overwrite, 1,
+ edl->paste_edits(group, first_track, position, overwrite, 1,
edl->session->labels_follow_edits,
edl->session->autos_follow_edits,
edl->session->plugins_follow_edits);
+ cwindow->gui->timebar->update(1);
+ cwindow->gui->unlock_window();
// big debate over whether to do this, must either clear selected, or no tweaking
// edl->tracks->clear_selected_edits();
save_backup();
- undo->update_undo_after(_("move group"), LOAD_ALL);
+ undo_after(_("move group"), LOAD_ALL);
restart_brender();
cwindow->refresh_frame(CHANGE_EDL);
void MWindow::move_effect(Plugin *plugin, Track *track, int64_t position)
{
- undo->update_undo_before();
+ undo_before();
edl->tracks->move_effect(plugin, track, position);
save_backup();
- undo->update_undo_after(_("paste effect"), LOAD_ALL);
+ undo_after(_("paste effect"), LOAD_ALL);
restart_brender();
cwindow->refresh_frame(CHANGE_EDL);
void MWindow::move_effect(Plugin *plugin, PluginSet *plugin_set, int64_t position)
{
- undo->update_undo_before();
+ undo_before();
edl->tracks->move_effect(plugin, plugin_set, position);
save_backup();
- undo->update_undo_after(_("move effect"), LOAD_ALL);
+ undo_after(_("move effect"), LOAD_ALL);
restart_brender();
cwindow->refresh_frame(CHANGE_EDL);
void MWindow::move_plugins_up(PluginSet *plugin_set)
{
- undo->update_undo_before();
+ undo_before();
plugin_set->track->move_plugins_up(plugin_set);
save_backup();
- undo->update_undo_after(_("move effect up"), LOAD_ALL);
+ undo_after(_("move effect up"), LOAD_ALL);
restart_brender();
gui->update(1, NORMAL_DRAW, 0, 0, 0, 0, 0);
sync_parameters(CHANGE_EDL);
void MWindow::move_plugins_down(PluginSet *plugin_set)
{
- undo->update_undo_before();
+ undo_before();
plugin_set->track->move_plugins_down(plugin_set);
save_backup();
- undo->update_undo_after(_("move effect down"), LOAD_ALL);
+ undo_after(_("move effect down"), LOAD_ALL);
restart_brender();
gui->update(1, NORMAL_DRAW, 0, 0, 0, 0, 0);
sync_parameters(CHANGE_EDL);
void MWindow::move_track_down(Track *track)
{
- undo->update_undo_before();
+ undo_before();
edl->tracks->move_track_down(track);
save_backup();
- undo->update_undo_after(_("move track down"), LOAD_ALL);
+ undo_after(_("move track down"), LOAD_ALL);
restart_brender();
gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
void MWindow::move_tracks_down()
{
- undo->update_undo_before();
+ undo_before();
edl->tracks->move_tracks_down();
save_backup();
- undo->update_undo_after(_("move tracks down"), LOAD_ALL);
+ undo_after(_("move tracks down"), LOAD_ALL);
restart_brender();
gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
void MWindow::move_track_up(Track *track)
{
- undo->update_undo_before();
+ undo_before();
edl->tracks->move_track_up(track);
save_backup();
- undo->update_undo_after(_("move track up"), LOAD_ALL);
+ undo_after(_("move track up"), LOAD_ALL);
restart_brender();
gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
sync_parameters(CHANGE_EDL);
void MWindow::move_tracks_up()
{
- undo->update_undo_before();
+ undo_before();
edl->tracks->move_tracks_up();
save_backup();
- undo->update_undo_after(_("move tracks up"), LOAD_ALL);
+ undo_after(_("move tracks up"), LOAD_ALL);
restart_brender();
gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
sync_parameters(CHANGE_EDL);
double start = edl->local_session->get_selectionstart();
double end = edl->local_session->get_selectionend();
if( start != end ) {
- undo->update_undo_before();
+ undo_before();
edl->clear(start, end, 0,
edl->session->plugins_follow_edits,
edl->session->autos_follow_edits);
edl->session->autos_follow_edits);
save_backup();
- undo->update_undo_after(_("mute"), LOAD_EDITS);
+ undo_after(_("mute"), LOAD_EDITS);
restart_brender();
update_plugin_guis();
double dst_start = edl->local_session->get_selectionstart();
double dst_len = edl->local_session->get_selectionend() - dst_start;
- undo->update_undo_before();
+ undo_before();
if( !EQUIV(dst_len, 0) && (dst_len < overwrite_len) ) {
// in/out points or selection present and shorter than overwrite range
// shorten the copy range
overwrite_len = dst_len;
}
- source->copy(src_start, src_start + overwrite_len, 0, &file, "", 1);
+ source->copy(copy_flags(), src_start, src_start + overwrite_len, &file, "", 1);
// HACK around paste_edl get_start/endselection on its own
// so we need to clear only when not using both io points
// FIXME: need to write simple overwrite_edl to be used for overwrite function
if( edl->local_session->get_inpoint() < 0 ||
- edl->local_session->get_outpoint() < 0 )
- edl->clear(dst_start, dst_start + overwrite_len, 0, 0, 0);
+ edl->local_session->get_outpoint() < 0 )
+ edl->clear(dst_start, dst_start + overwrite_len,
+ edl->session->labels_follow_edits,
+ edl->session->plugins_follow_edits,
+ edl->session->autos_follow_edits);
- paste(dst_start, dst_start + overwrite_len, &file, 0, 0, 0, 0, 0);
+ paste(dst_start, dst_start + overwrite_len, &file,
+ edl->session->labels_follow_edits,
+ edl->session->plugins_follow_edits,
+ edl->session->autos_follow_edits, 0, 0);
edl->local_session->set_selectionstart(dst_start + overwrite_len);
edl->local_session->set_selectionend(dst_start + overwrite_len);
save_backup();
- undo->update_undo_after(_("overwrite"), LOAD_EDITS);
+ undo_after(_("overwrite"), LOAD_EDITS);
restart_brender();
update_plugin_guis();
if( len ) {
char *string = new char[len];
- undo->update_undo_before();
+ undo_before();
gui->from_clipboard(string, len, BC_PRIMARY_SELECTION);
FileXML file;
file.read_from_string(string);
save_backup();
- undo->update_undo_after(_("paste"), LOAD_EDITS | LOAD_TIMEBAR);
+ undo_after(_("paste"), LOAD_EDITS | LOAD_TIMEBAR);
restart_brender();
update_plugin_guis();
gui->update(1, FORCE_REDRAW, 1, 1, 0, 1, 0);
int MWindow::paste_assets(double position, Track *dest_track, int overwrite)
{
int result = 0;
- undo->update_undo_before();
+ undo_before();
if( session->drag_assets->total ) {
load_assets(session->drag_assets,
save_backup();
- undo->update_undo_after(_("paste assets"), LOAD_EDITS);
+ undo_after(_("paste assets"), LOAD_EDITS);
restart_brender();
gui->update(1, FORCE_REDRAW, 1, 0, 0, 1, 0);
sync_parameters(CHANGE_EDL);
load_mode = LOADMODE_ASSETSONLY;
const int debug = 0;
if( debug ) printf("MWindow::load_assets %d\n", __LINE__);
- if( position < 0 ) position = edl->local_session->get_selectionstart();
+ if( position < 0 )
+ position = edl->local_session->get_selectionstart();
ArrayList<EDL*> new_edls;
for( int i=0; i<new_assets->total; ++i ) {
Indexable *indexable = new_assets->get(i);
if( indexable->is_asset ) {
- remove_asset_from_caches((Asset*)indexable);
+ remove_from_caches(indexable);
}
EDL *new_edl = new EDL;
new_edl->create_objects();
int64_t len = gui->clipboard_len(BC_PRIMARY_SELECTION);
if( len ) {
- undo->update_undo_before();
+ undo_before();
speed_before();
char *string = new char[len];
gui->from_clipboard(string, len, BC_PRIMARY_SELECTION);
edl->session->typeless_keyframes);
int changed_edl = speed_after(1);
save_backup();
- undo->update_undo_after(_("paste keyframes"),
+ undo_after(_("paste keyframes"),
!changed_edl ? LOAD_AUTOMATION :
LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
update_gui(changed_edl);
int64_t len = gui->clipboard_len(BC_PRIMARY_SELECTION);
if( len ) {
- undo->update_undo_before();
+ undo_before();
speed_before();
char *string = new char[len];
gui->from_clipboard(string, len, BC_PRIMARY_SELECTION);
edl->session->typeless_keyframes);
// edl->tracks->paste_default_keyframe(&file);
int changed_edl = speed_after(1);
- undo->update_undo_after(_("paste default keyframe"),
+ undo_after(_("paste default keyframe"),
!changed_edl ? LOAD_AUTOMATION :
LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
save_backup();
default:
continue;
}
+// re-label only if not already labeled
+ if( new_edl->local_session->asset2edl )
+ strcpy(current->title, edl->tracks->last->title);
destination_tracks.append(edl->tracks->last);
}
else
// Recycle existing tracks of master EDL
if( load_mode == LOADMODE_CONCATENATE ||
- load_mode == LOADMODE_PASTE ||
- load_mode == LOADMODE_NESTED ) {
-//PRINT_TRACE
-
-// The point of this is to shift forward labels after the selection so they can
-// then be shifted back to their original locations without recursively
-// shifting back every paste.
- if( (load_mode == LOADMODE_PASTE || load_mode == LOADMODE_NESTED) &&
- edl->session->labels_follow_edits )
- edl->labels->clear(edl->local_session->get_selectionstart(),
- edl->local_session->get_selectionend(), 1);
-
+ load_mode == LOADMODE_PASTE ) {
Track *current = first_track ? first_track : edl->tracks->first;
for( ; current; current=NEXT ) {
if( current->record ) {
}
}
//PRINT_TRACE
-
}
//PRINT_TRACE
int destination_track = 0;
// Add assets and prepare index files
for( Asset *new_asset=new_edl->assets->first;
new_asset; new_asset=new_asset->next ) {
- mainindexes->add_next_asset(0, new_asset);
+ mainindexes->add_indexable(new_asset);
}
// Capture index file status from mainindex test
edl->update_assets(new_edl);
//PRINT_TRACE
// Get starting point of insertion. Need this to paste labels.
switch( load_mode ) {
+ case LOADMODE_NOTHING:
+ continue;
case LOADMODE_REPLACE:
- case LOADMODE_NEW_TRACKS:
current_position = 0;
break;
+ case LOADMODE_NEW_TRACKS:
+ if( !overwrite )
+ current_position = 0;
+ break;
case LOADMODE_CONCATENATE:
case LOADMODE_REPLACE_CONCATENATE:
break;
case LOADMODE_PASTE:
- case LOADMODE_NESTED:
destination_track = 0;
if( i == 0 ) {
for( int j=0; j<destination_tracks.total; ++j ) {
edl->add_clip(new_edl);
break;
}
-//PRINT_TRACE
// Insert edl
if( load_mode != LOADMODE_RESOURCESONLY &&
load_mode != LOADMODE_ASSETSONLY ) {
// Insert labels
-//printf("MWindow::paste_edls %f %f\n", current_position, edl_length);
- if( load_mode == LOADMODE_PASTE ||
- load_mode == LOADMODE_NESTED )
- edl->labels->insert_labels(new_edl->labels,
- destination_tracks.total ? paste_position[0] : 0.0,
- edl_length,
- edit_labels);
- else
- edl->labels->insert_labels(new_edl->labels,
- current_position,
- edl_length,
- edit_labels);
-//PRINT_TRACE
+ if( edit_labels ) {
+ if( load_mode == LOADMODE_PASTE )
+ edl->labels->insert_labels(new_edl->labels,
+ destination_tracks.total ? paste_position[0] : 0.0,
+ edl_length, 1);
+ else
+ edl->labels->insert_labels(new_edl->labels, current_position,
+ edl_length, 1);
+ }
double total_length = new_edl->tracks->total_length();
for( Track *new_track=new_edl->tracks->first;
new_track; new_track=new_track->next ) {
break;
case LOADMODE_PASTE:
- case LOADMODE_NESTED:
current_position = paste_position[destination_track];
paste_position[destination_track] += new_track->get_length();
break;
}
}
- if( load_mode == LOADMODE_PASTE ||
- load_mode == LOADMODE_NESTED )
+ if( load_mode == LOADMODE_PASTE )
current_position += edl_length;
}
if( edl->session->frame_rate > 0 )
end += 1./edl->session->frame_rate;
}
- undo->update_undo_before(_("silence"), this);
+ undo_before(_("silence"), this);
edl->paste_silence(start, end,
edl->session->labels_follow_edits,
edl->session->plugins_follow_edits,
edl->session->autos_follow_edits);
edl->optimize();
save_backup();
- undo->update_undo_after(_("silence"), LOAD_EDITS | LOAD_TIMEBAR);
+ undo_after(_("silence"), LOAD_EDITS | LOAD_TIMEBAR);
update_plugin_guis();
restart_brender();
void MWindow::detach_transition(Transition *transition)
{
- undo->update_undo_before();
+ undo_before();
hide_plugin(transition, 1);
int is_video = (transition->edit->track->data_type == TRACK_VIDEO);
transition->edit->detach_transition();
save_backup();
- undo->update_undo_after(_("detach transition"), LOAD_ALL);
+ undo_after(_("detach transition"), LOAD_ALL);
if( is_video ) restart_brender();
gui->update(0, NORMAL_DRAW, 0, 0, 0, 0, 0);
{
gui->lock_window("MWindow::detach_transitions 1");
- undo->update_undo_before();
+ undo_before();
double start = edl->local_session->get_selectionstart();
double end = edl->local_session->get_selectionend();
edl->tracks->clear_transitions(start, end);
save_backup();
- undo->update_undo_after(_("detach transitions"), LOAD_EDITS);
+ undo_after(_("detach transitions"), LOAD_EDITS);
sync_parameters(CHANGE_EDL);
gui->update(0, NORMAL_DRAW, 0, 0, 0, 0, 0);
// Only the first transition gets dropped.
PluginServer *server = session->drag_pluginservers->values[0];
- undo->update_undo_before();
+ undo_before();
edl->tracks->paste_transition(server, session->edit_highlighted);
save_backup();
- undo->update_undo_after(_("transition"), LOAD_EDITS);
+ undo_after(_("transition"), LOAD_EDITS);
if( server->video ) restart_brender();
sync_parameters(CHANGE_ALL);
{
gui->lock_window("MWindow::detach_transitions 1");
- undo->update_undo_before();
+ undo_before();
double start = edl->local_session->get_selectionstart();
double end = edl->local_session->get_selectionend();
edl->tracks->paste_transitions(start, end, track_type, title);
save_backup();
- undo->update_undo_after(_("attach transitions"), LOAD_EDITS);
+ undo_after(_("attach transitions"), LOAD_EDITS);
sync_parameters(CHANGE_EDL);
gui->update(0, NORMAL_DRAW, 0, 0, 0, 0, 0);
void MWindow::paste_transition_cwindow(Track *dest_track)
{
PluginServer *server = session->drag_pluginservers->values[0];
- undo->update_undo_before();
+ undo_before();
edl->tracks->paste_video_transition(server, 1);
save_backup();
- undo->update_undo_after(_("transition"), LOAD_EDITS);
+ undo_after(_("transition"), LOAD_EDITS);
restart_brender();
gui->update(0, NORMAL_DRAW, 0, 0, 0, 0, 0);
sync_parameters(CHANGE_ALL);
return;
}
- undo->update_undo_before();
+ undo_before();
edl->tracks->paste_audio_transition(server);
save_backup();
- undo->update_undo_after(_("transition"), LOAD_EDITS);
+ undo_after(_("transition"), LOAD_EDITS);
sync_parameters(CHANGE_EDL);
gui->update(0, NORMAL_DRAW, 0, 0, 0, 0, 0);
return;
}
- undo->update_undo_before();
+ undo_before();
edl->tracks->paste_video_transition(server);
save_backup();
- undo->update_undo_after(_("transition"), LOAD_EDITS);
+ undo_after(_("transition"), LOAD_EDITS);
sync_parameters(CHANGE_EDL);
restart_brender();
{
gui->lock_window("MWindow::shuffle_edits 1");
- undo->update_undo_before();
+ undo_before();
double start = edl->local_session->get_selectionstart();
double end = edl->local_session->get_selectionend();
edl->tracks->shuffle_edits(start, end);
save_backup();
- undo->update_undo_after(_("shuffle edits"), LOAD_EDITS | LOAD_TIMEBAR);
+ undo_after(_("shuffle edits"), LOAD_EDITS | LOAD_TIMEBAR);
sync_parameters(CHANGE_EDL);
restart_brender();
{
gui->lock_window("MWindow::reverse_edits 1");
- undo->update_undo_before();
+ undo_before();
double start = edl->local_session->get_selectionstart();
double end = edl->local_session->get_selectionend();
edl->tracks->reverse_edits(start, end);
save_backup();
- undo->update_undo_after(_("reverse edits"), LOAD_EDITS | LOAD_TIMEBAR);
+ undo_after(_("reverse edits"), LOAD_EDITS | LOAD_TIMEBAR);
sync_parameters(CHANGE_EDL);
restart_brender();
{
gui->lock_window("MWindow::align_edits 1");
- undo->update_undo_before();
+ undo_before();
double start = edl->local_session->get_selectionstart();
double end = edl->local_session->get_selectionend();
edl->tracks->align_edits(start, end);
save_backup();
- undo->update_undo_after(_("align edits"), LOAD_EDITS | LOAD_TIMEBAR);
+ undo_after(_("align edits"), LOAD_EDITS | LOAD_TIMEBAR);
sync_parameters(CHANGE_EDL);
restart_brender();
{
gui->lock_window("MWindow::set_edit_length 1");
- undo->update_undo_before();
+ undo_before();
double start = edl->local_session->get_selectionstart();
double end = edl->local_session->get_selectionend();
edl->tracks->set_edit_length(start, end, length);
save_backup();
- undo->update_undo_after(_("edit length"), LOAD_EDITS | LOAD_TIMEBAR);
+ undo_after(_("edit length"), LOAD_EDITS | LOAD_TIMEBAR);
sync_parameters(CHANGE_EDL);
restart_brender();
{
gui->lock_window("MWindow::set_transition_length 1");
- undo->update_undo_before();
+ undo_before();
//double start = edl->local_session->get_selectionstart();
//double end = edl->local_session->get_selectionend();
edl->tracks->set_transition_length(transition, length);
save_backup();
- undo->update_undo_after(_("transition length"), LOAD_EDITS);
+ undo_after(_("transition length"), LOAD_EDITS);
edl->session->default_transition_length = length;
sync_parameters(CHANGE_PARAMS);
{
gui->lock_window("MWindow::set_transition_length 2");
- undo->update_undo_before();
+ undo_before();
double start = edl->local_session->get_selectionstart();
double end = edl->local_session->get_selectionend();
edl->tracks->set_transition_length(start, end, length);
save_backup();
- undo->update_undo_after(_("transition length"), LOAD_EDITS);
+ undo_after(_("transition length"), LOAD_EDITS);
edl->session->default_transition_length = length;
sync_parameters(CHANGE_PARAMS);
gui->update(1, FORCE_REDRAW, 1, 1, 1, 1, 1);
gui->update_proxy_toggle();
gui->unlock_window();
- cwindow->update(1, 1, 1, 1, 1);
cwindow->gui->unlock_window();
+ cwindow->update(1, 1, 1, 1, 1);
for( int i=0; i < vwindows.size(); ++i ) {
if( vwindows.get(i)->is_running() ) {
void MWindow::resize_track(Track *track, int w, int h)
{
- undo->update_undo_before();
+ undo_before();
// We have to move all maskpoints so they do not move in relation to image areas
((MaskAutos*)track->automation->autos[AUTOMATION_MASK])->translate_masks(
(w - track->track_w) / 2,
(h - track->track_h) / 2);
track->track_w = w;
track->track_h = h;
- undo->update_undo_after(_("resize track"), LOAD_ALL);
+ undo_after(_("resize track"), LOAD_ALL);
save_backup();
restart_brender();
}
-void MWindow::set_inpoint(int is_mwindow)
+void MWindow::set_inpoint()
{
- undo->update_undo_before();
+ undo_before();
edl->set_inpoint(edl->local_session->get_selectionstart(1));
save_backup();
- undo->update_undo_after(_("in point"), LOAD_TIMEBAR);
-
- if( !is_mwindow ) {
- gui->lock_window("MWindow::set_inpoint 1");
- }
+ undo_after(_("in point"), LOAD_TIMEBAR);
gui->update_timebar(1);
- if( !is_mwindow ) {
- gui->unlock_window();
- }
- if( is_mwindow ) {
- cwindow->gui->lock_window("MWindow::set_inpoint 2");
- }
+ cwindow->gui->lock_window("MWindow::set_inpoint 2");
cwindow->gui->timebar->update(1);
- if( is_mwindow ) {
- cwindow->gui->unlock_window();
- }
+ cwindow->gui->unlock_window();
}
-void MWindow::set_outpoint(int is_mwindow)
+void MWindow::set_outpoint()
{
- undo->update_undo_before();
+ undo_before();
edl->set_outpoint(edl->local_session->get_selectionend(1));
save_backup();
- undo->update_undo_after(_("out point"), LOAD_TIMEBAR);
+ undo_after(_("out point"), LOAD_TIMEBAR);
- if( !is_mwindow ) {
- gui->lock_window("MWindow::set_outpoint 1");
- }
gui->update_timebar(1);
- if( !is_mwindow ) {
- gui->unlock_window();
- }
-
- if( is_mwindow ) {
- cwindow->gui->lock_window("MWindow::set_outpoint 2");
- }
+ cwindow->gui->lock_window("MWindow::set_outpoint 2");
cwindow->gui->timebar->update(1);
- if( is_mwindow ) {
- cwindow->gui->unlock_window();
- }
+ cwindow->gui->unlock_window();
}
-void MWindow::unset_inoutpoint(int is_mwindow)
+void MWindow::unset_inoutpoint()
{
- undo->update_undo_before();
+ undo_before();
edl->unset_inoutpoint();
save_backup();
- undo->update_undo_after(_("clear in/out"), LOAD_TIMEBAR);
+ undo_after(_("clear in/out"), LOAD_TIMEBAR);
- if( !is_mwindow ) {
- gui->lock_window("MWindow::unset_inoutpoint 1");
- }
gui->update_timebar(1);
- if( !is_mwindow ) {
- gui->unlock_window();
- }
-
- if( is_mwindow ) {
- cwindow->gui->lock_window("MWindow::unset_inoutpoint 2");
- }
+ cwindow->gui->lock_window("MWindow::unset_inoutpoint 2");
cwindow->gui->timebar->update(1);
- if( is_mwindow ) {
- cwindow->gui->unlock_window();
- }
+ cwindow->gui->unlock_window();
}
void MWindow::splice(EDL *source, int all)
FileXML file;
LocalSession *src = source->local_session;
- undo->update_undo_before();
+ undo_before();
double source_start = all ? 0 :
src->inpoint_valid() ? src->get_inpoint() :
src->outpoint_valid() ? 0 : src->get_selectionstart();
src->outpoint_valid() ? src->get_outpoint() :
src->inpoint_valid() ? source->tracks->total_length() :
src->get_selectionend();
- source->copy(source_start, source_end, 1, &file, "", 1);
+ source->copy(COPY_EDL, source_start, source_end, &file, "", 1);
//file.dump();
double start = edl->local_session->get_selectionstart();
//double end = edl->local_session->get_selectionend();
edl->local_session->set_selectionend(start + source_end - source_start);
save_backup();
- undo->update_undo_after(_("splice"), LOAD_EDITS | LOAD_TIMEBAR);
+ undo_after(_("splice"), LOAD_EDITS | LOAD_TIMEBAR);
update_plugin_guis();
restart_brender();
gui->update(1, NORMAL_DRAW, 1, 1, 0, 1, 0);
time_t now; time(&now);
struct tm dtm; localtime_r(&now, &dtm);
char *cp = new_edl->local_session->clip_notes;
- int n, sz = sizeof(new_edl->local_session->clip_notes)-1;
- if( txt && *txt ) {
- n = snprintf(cp, sz, "%s", txt);
- cp += n; sz -= n;
- }
- n = snprintf(cp, sz,
+ char *ep = cp + sizeof(new_edl->local_session->clip_notes)-1;
+ if( txt && *txt )
+ cp += snprintf(cp, ep-cp, "%s", txt);
+ cp += snprintf(cp, ep-cp,
"%02d/%02d/%02d %02d:%02d:%02d, +%s\n",
dtm.tm_year+1900, dtm.tm_mon+1, dtm.tm_mday,
dtm.tm_hour, dtm.tm_min, dtm.tm_sec, duration);
- cp += n; sz -= n;
if( path && *path ) {
FileSystem fs;
char title[BCTEXTLEN];
fs.extract_name(title, path);
- n = snprintf(cp, sz, "%s", title);
- cp += n; sz -= n;
+ cp += snprintf(cp, ep-cp, "%s", title);
}
- cp[n] = 0;
sprintf(new_edl->local_session->clip_icon,
- "clip_%02d%02d%02d-%02d%02d%02d.png",
+ "clip_%02d%02d%02d-%02d%02d%02d-%d.png",
dtm.tm_year+1900, dtm.tm_mon+1, dtm.tm_mday,
- dtm.tm_hour, dtm.tm_min, dtm.tm_sec);
+ dtm.tm_hour, dtm.tm_min, dtm.tm_sec,
+ new_edl->id);
new_edl->folder_no = AW_CLIP_FOLDER;
edl->update_assets(new_edl);
int cur_x, cur_y;
}
// Don't copy all since we don't want the clips twice.
- edl->copy(start, end, 0, &file, "", 1);
+ edl->copy(copy_flags(), start, end, &file, "", 1);
EDL *new_edl = new EDL(edl);
new_edl->create_objects();
gui->unlock_window();
}
-int MWindow::toggle_label(int is_mwindow)
+int MWindow::toggle_label()
{
double position1, position2;
- undo->update_undo_before();
-
- if( cwindow->playback_engine->is_playing_back ) {
- position1 = position2 =
- cwindow->playback_engine->get_tracking_position();
- }
- else {
- position1 = edl->local_session->get_selectionstart(1);
- position2 = edl->local_session->get_selectionend(1);
- }
+ undo_before();
+ position1 = edl->local_session->get_selectionstart(1);
+ position2 = edl->local_session->get_selectionend(1);
position1 = edl->align_to_frame(position1, 0);
position2 = edl->align_to_frame(position2, 0);
-//printf("MWindow::toggle_label 1\n");
-
edl->labels->toggle_label(position1, position2);
save_backup();
- if( !is_mwindow ) {
- gui->lock_window("MWindow::toggle_label 1");
- }
gui->update_timebar(0);
gui->activate_timeline();
gui->flush();
- if( !is_mwindow ) {
- gui->unlock_window();
- }
- if( is_mwindow ) {
- cwindow->gui->lock_window("MWindow::toggle_label 2");
- }
+ cwindow->gui->lock_window("MWindow::toggle_label 2");
cwindow->gui->timebar->update(1);
- if( is_mwindow ) {
- cwindow->gui->unlock_window();
- }
-
+ cwindow->gui->unlock_window();
awindow->gui->async_update_assets();
- undo->update_undo_after(_("label"), LOAD_TIMEBAR);
+ undo_after(_("label"), LOAD_TIMEBAR);
return 0;
}
void MWindow::trim_selection()
{
- undo->update_undo_before();
+ undo_before();
edl->trim_selection(edl->local_session->get_selectionstart(),
edl->session->autos_follow_edits);
save_backup();
- undo->update_undo_after(_("trim selection"), LOAD_EDITS | LOAD_TIMEBAR);
+ undo_after(_("trim selection"), LOAD_EDITS | LOAD_TIMEBAR);
update_plugin_guis();
gui->update(1, FORCE_REDRAW, 1, 1, 1, 1, 0);
cwindow->update(1, 0, 0, 0, 1);
gui->update(1, FORCE_REDRAW, 1, 1, 1, 1, 1);
gui->update_proxy_toggle();
gui->unlock_window();
- cwindow->update(1, 1, 1, 1, 1);
cwindow->gui->unlock_window();
+ cwindow->update(1, 1, 1, 1, 1);
for( int i=0; i<vwindows.size(); ++i ) {
if( vwindows.get(i)->is_running() ) {
void MWindow::new_folder(const char *new_folder, int is_clips)
{
- undo->update_undo_before();
+ undo_before();
if( edl->new_folder(new_folder, is_clips) ) {
MainError::show_error(_("create new folder failed"));
}
- undo->update_undo_after(_("new folder"), LOAD_ALL);
+ undo_after(_("new folder"), LOAD_ALL);
awindow->gui->async_update_assets();
}
void MWindow::delete_folder(char *folder)
{
- undo->update_undo_before();
+ undo_before();
if( edl->delete_folder(folder) < 0 ) {
MainError::show_error(_("delete folder failed"));
}
- undo->update_undo_after(_("del folder"), LOAD_ALL);
+ undo_after(_("del folder"), LOAD_ALL);
awindow->gui->async_update_assets();
}
void MWindow::map_audio(int pattern)
{
- undo->update_undo_before();
+ undo_before();
remap_audio(pattern);
- undo->update_undo_after(
+ undo_after(
pattern == MWindow::AUDIO_1_TO_1 ? _("map 1:1") : _("map 5.1:2"),
LOAD_AUTOMATION);
sync_parameters(CHANGE_PARAMS);
edl->rescale_proxy(orig_scale, new_scale);
}
-void MWindow::add_proxy(int use_scaler,
- ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets)
+void MWindow::add_proxy(ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets)
+{
+ edl->add_proxy(orig_assets, proxy_assets);
+}
+
+void MWindow::start_convert(Asset *format_asset, const char *suffix,
+ float beep, int to_proxy, int remove_originals)
+{
+ if( !convert_render )
+ convert_render = new ConvertRender(this);
+ convert_render->set_format(format_asset, suffix, to_proxy);
+ int found = convert_render->find_convertable_assets(edl);
+ if( convert_render->needed_idxbls.size() > 0 )
+ convert_render->start_convert(beep, remove_originals);
+ else if( found > 0 )
+ finish_convert(remove_originals);
+ else if( found < 0 )
+ eprintf(_("convert assets format error"));
+ else
+ eprintf(_("No convertable assets found"));
+}
+
+void MWindow::finish_convert(int remove_originals)
{
- edl->add_proxy(use_scaler, orig_assets, proxy_assets);
+ gui->lock_window("MWindow::finish_convert");
+ undo_before();
+ edl->replace_assets(
+ convert_render->orig_idxbls,
+ convert_render->orig_copies);
+ if( remove_originals ) {
+ remove_assets_from_project(0, 0, 0,
+ &convert_render->orig_idxbls, 0);
+ }
+ save_backup();
+ undo_after(_("convert"), LOAD_ALL);
+
+ update_plugin_guis();
+ gui->update(1, FORCE_REDRAW, 1, 1, 1, 1, 0);
+ cwindow->update(1, 0, 0, 0, 1);
+ awindow->gui->async_update_assets();
+ cwindow->refresh_frame(CHANGE_EDL);
+ gui->unlock_window();
}
void MWindow::cut_commercials()
{
#ifdef HAVE_COMMERCIAL
- undo->update_undo_before();
+ undo_before();
commercials->scan_media();
edl->optimize();
save_backup();
- undo->update_undo_after(_("cut ads"), LOAD_EDITS | LOAD_TIMEBAR);
+ undo_after(_("cut ads"), LOAD_EDITS | LOAD_TIMEBAR);
restart_brender();
update_plugin_guis();
return result;
}
+void MWindow::collect_effects()
+{
+ FileXML file;
+ const char *file_string = "";
+ EDL *group = 0;
+ int ret = edl->collect_effects(group);
+ switch( ret ) {
+ case COLLECT_EFFECTS_RECORD:
+ eprintf(_("Selected edit track not armed."));
+ break;
+ case COLLECT_EFFECTS_MULTIPLE:
+ eprintf(_("More than one edit selected on a track."));
+ break;
+ case COLLECT_EFFECTS_MISSING:
+ eprintf(_("No effects under selected edit."));
+ break;
+ case COLLECT_EFFECTS_EMPTY:
+ eprintf(_("No edits selected."));
+ break;
+ case COLLECT_EFFECTS_MASTER:
+ eprintf(_("Shared effect added without master."));
+ break;
+ case 0:
+ group->save_xml(&file, "");
+ file_string = file.string();
+ group->remove_user();
+ }
+ long file_length = strlen(file_string);
+ gui->to_clipboard(file_string, file_length, BC_PRIMARY_SELECTION);
+ gui->to_clipboard(file_string, file_length, SECONDARY_SELECTION);
+}
+
+void MWindow::paste_effects()
+{
+ char *string = 0;
+ int64_t len = gui->clipboard_len(BC_PRIMARY_SELECTION);
+ if( len ) {
+ string = new char[len];
+ gui->from_clipboard(string, len, BC_PRIMARY_SELECTION);
+ }
+ if( !string || !string[0] ) {
+ eprintf(_("Error clipboard buffer empty."));
+ return;
+ }
+ FileXML file;
+ file.read_from_string(string);
+ EDL *group = new EDL();
+ group->create_objects();
+ if( !group->load_xml(&file, LOAD_ALL) ) {
+ undo_before();
+ int ret = edl->insert_effects(group);
+ switch( ret ) {
+ case INSERT_EFFECTS_RECORD:
+ eprintf(_("Selected edit track not armed."));
+ break;
+ case INSERT_EFFECTS_TYPE:
+ eprintf(_("Track type mismatched."));
+ break;
+ case INSERT_EFFECTS_MULTIPLE:
+ eprintf(_("More than one edit selected on a track."));
+ break;
+ case INSERT_EFFECTS_MISSING:
+ eprintf(_("Too few target edits to add group effects."));
+ break;
+ case INSERT_EFFECTS_EXTRA:
+ eprintf(_("Too many target edits to add group effects."));
+ break;
+ case INSERT_EFFECTS_MASTER:
+ eprintf(_("Shared effect added without master."));
+ break;
+ case 0:
+ break;
+ }
+ save_backup();
+ undo_after(_("paste effects"), LOAD_ALL);
+ restart_brender();
+ cwindow->refresh_frame(CHANGE_EDL);
+ update_plugin_guis();
+ gui->update(1, NORMAL_DRAW, 1, 0, 0, 0, 0);
+ }
+ else
+ eprintf(_("Error loading clip from clipboard buffer."));
+ delete [] string;
+ group->remove_user();
+}
+