added cut/copy/paste
This commit is contained in:
+104
-30
@@ -66,15 +66,17 @@ void Timeline::seek(long p) {
|
||||
|
||||
// reset all clip audio
|
||||
for (int i=0;i<sequence->clip_count();i++) {
|
||||
Clip& c = sequence->get_clip(i);
|
||||
c.reset_audio = true;
|
||||
c.frame_sample_index = 0;
|
||||
c.audio_buffer_write = 0;
|
||||
Clip* c = sequence->get_clip(i);
|
||||
c->reset_audio = true;
|
||||
c->frame_sample_index = 0;
|
||||
c->audio_buffer_write = 0;
|
||||
}
|
||||
clear_audio_ibuffer();
|
||||
audio_ibuffer_read = 0;
|
||||
|
||||
playhead = p;
|
||||
|
||||
repaint_timeline();
|
||||
}
|
||||
|
||||
bool Timeline::toggle_play() {
|
||||
@@ -105,9 +107,9 @@ void Timeline::set_sequence(Sequence *s) {
|
||||
if (sequence != NULL) {
|
||||
// clean up - close all open clips
|
||||
for (int i=0;i<sequence->clip_count();i++) {
|
||||
Clip& c = sequence->get_clip(i);
|
||||
if (c.open) {
|
||||
close_clip(&c);
|
||||
Clip* c = sequence->get_clip(i);
|
||||
if (c->open) {
|
||||
close_clip(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -139,6 +141,7 @@ bool Timeline::focused() {
|
||||
|
||||
void Timeline::undo() {
|
||||
if (sequence != NULL) {
|
||||
current_clips.clear();
|
||||
sequence->undo();
|
||||
ui->video_area->redraw_clips();
|
||||
ui->audio_area->redraw_clips();
|
||||
@@ -147,6 +150,7 @@ void Timeline::undo() {
|
||||
|
||||
void Timeline::redo() {
|
||||
if (sequence != NULL) {
|
||||
current_clips.clear();
|
||||
sequence->redo();
|
||||
ui->video_area->redraw_clips();
|
||||
ui->audio_area->redraw_clips();
|
||||
@@ -177,8 +181,8 @@ void Timeline::redraw_all_clips() {
|
||||
void Timeline::select_all() {
|
||||
selections.clear();
|
||||
for (int i=0;i<sequence->clip_count();i++) {
|
||||
Clip& c = sequence->get_clip(i);
|
||||
selections.append({c.timeline_in, c.timeline_out, c.track});
|
||||
Clip* c = sequence->get_clip(i);
|
||||
selections.append({c->timeline_in, c->timeline_out, c->track});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -204,12 +208,12 @@ void Timeline::delete_selection(bool ripple_delete) {
|
||||
for (int i=0;i<sequence->clip_count();i++) {
|
||||
// check every clip after and see if it'll collide
|
||||
// NOTE, we could probably re-use the validation code for the ripple tool here for optimization (since it's technically better code I think)
|
||||
Clip& c = sequence->get_clip(i);
|
||||
if (c.timeline_in >= ripple_point) {
|
||||
Clip* c = sequence->get_clip(i);
|
||||
if (c->timeline_in >= ripple_point) {
|
||||
for (int j=0;j<sequence->clip_count();j++) {
|
||||
Clip& cc = sequence->get_clip(j);
|
||||
if (cc.timeline_in < ripple_point) {
|
||||
validator = c.timeline_in - ripple_length - cc.timeline_out;
|
||||
Clip* cc = sequence->get_clip(j);
|
||||
if (cc->timeline_in < ripple_point) {
|
||||
validator = c->timeline_in - ripple_length - cc->timeline_out;
|
||||
if (validator < 0) ripple_length += validator;
|
||||
|
||||
if (ripple_length <= 0) {
|
||||
@@ -239,10 +243,10 @@ void Timeline::zoom_out() {
|
||||
|
||||
void Timeline::ripple(long ripple_point, long ripple_length) {
|
||||
for (int i=0;i<sequence->clip_count();i++) {
|
||||
Clip& c = sequence->get_clip(i);
|
||||
if (c.timeline_in >= ripple_point) {
|
||||
c.timeline_in += ripple_length;
|
||||
c.timeline_out += ripple_length;
|
||||
Clip* c = sequence->get_clip(i);
|
||||
if (c->timeline_in >= ripple_point) {
|
||||
c->timeline_in += ripple_length;
|
||||
c->timeline_out += ripple_length;
|
||||
}
|
||||
}
|
||||
for (int i=0;i<selections.size();i++) {
|
||||
@@ -300,10 +304,10 @@ void Timeline::on_pushButton_5_clicked()
|
||||
}
|
||||
|
||||
bool Timeline::is_clip_selected(int clip_index) {
|
||||
Clip& clip = sequence->get_clip(clip_index);
|
||||
Clip* clip = sequence->get_clip(clip_index);
|
||||
for (int i=0;i<selections.size();i++) {
|
||||
const Selection& s = selections.at(i);
|
||||
if (clip.track == s.track && clip.timeline_in >= s.in && clip.timeline_out <= s.out) {
|
||||
if (clip->track == s.track && clip->timeline_in >= s.in && clip->timeline_out <= s.out) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -342,6 +346,85 @@ void Timeline::on_snappingButton_toggled(bool checked)
|
||||
snapping = checked;
|
||||
}
|
||||
|
||||
void Timeline::copy(bool del) {
|
||||
bool cleared = false;
|
||||
bool copied = false;
|
||||
|
||||
long min_in = 0;
|
||||
|
||||
for (int i=0;i<sequence->clip_count();i++) {
|
||||
Clip* c = sequence->get_clip(i);
|
||||
for (int j=0;j<selections.size();j++) {
|
||||
const Selection& s = selections.at(j);
|
||||
if (s.track == c->track && !((c->timeline_in < s.in && c->timeline_out < s.in) || (c->timeline_in > s.out && c->timeline_out > s.out))) {
|
||||
if (!cleared) {
|
||||
clip_clipboard.clear();
|
||||
cleared = true;
|
||||
}
|
||||
|
||||
Clip* copied_clip = c->copy();
|
||||
|
||||
if (copied_clip->timeline_in < s.in) {
|
||||
copied_clip->clip_in += (s.in - copied_clip->timeline_in);
|
||||
copied_clip->timeline_in = s.in;
|
||||
}
|
||||
|
||||
if (copied_clip->timeline_out > s.out) {
|
||||
copied_clip->timeline_out = s.out;
|
||||
}
|
||||
|
||||
if (copied) {
|
||||
min_in = qMin(min_in, s.in);
|
||||
} else {
|
||||
min_in = s.in;
|
||||
copied = true;
|
||||
}
|
||||
|
||||
clip_clipboard.append(copied_clip);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=0;i<clip_clipboard.size();i++) {
|
||||
// initialize all timeline_ins to 0 or offsets of
|
||||
clip_clipboard[i]->timeline_in -= min_in;
|
||||
clip_clipboard[i]->timeline_out -= min_in;
|
||||
}
|
||||
|
||||
if (del && copied) {
|
||||
delete_selection(false);
|
||||
}
|
||||
}
|
||||
|
||||
void Timeline::paste() {
|
||||
if (clip_clipboard.size() > 0) {
|
||||
for (int i=0;i<clip_clipboard.size();i++) {
|
||||
Clip* c = clip_clipboard.at(i);
|
||||
sequence->delete_area(c->timeline_in + playhead, c->timeline_out + playhead, c->track);
|
||||
Clip* cc = c->copy();
|
||||
cc->timeline_in += playhead;
|
||||
cc->timeline_out += playhead;
|
||||
sequence->add_clip(cc);
|
||||
}
|
||||
redraw_all_clips();
|
||||
}
|
||||
}
|
||||
|
||||
bool Timeline::split_selection() {
|
||||
bool split = false;
|
||||
for (int j=0;j<sequence->clip_count();j++) {
|
||||
for (int i=0;i<selections.size();i++) {
|
||||
const Selection& s = selections.at(i);
|
||||
if (s.track == sequence->get_clip(j)->track) {
|
||||
sequence->split_clip(j, s.in);
|
||||
sequence->split_clip(j, s.out);
|
||||
split = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return split;
|
||||
}
|
||||
|
||||
void Timeline::split_at_playhead() {
|
||||
bool split_selected = false;
|
||||
|
||||
@@ -356,16 +439,7 @@ void Timeline::split_at_playhead() {
|
||||
|
||||
// split a selection if not
|
||||
if (!split_selected) {
|
||||
for (int j=0;j<sequence->clip_count();j++) {
|
||||
for (int i=0;i<selections.size();i++) {
|
||||
const Selection& s = selections.at(i);
|
||||
if (s.track == sequence->get_clip(j).track) {
|
||||
sequence->split_clip(j, s.in);
|
||||
sequence->split_clip(j, s.out);
|
||||
split_selected = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
split_selected = split_selection();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user