revamped undo system in preparation for marker support

This commit is contained in:
itsmattkc
2018-09-14 00:28:41 +10:00
parent 8b2408d4c1
commit c783a2a1b2
22 changed files with 850 additions and 347 deletions
+3 -3
View File
@@ -62,9 +62,9 @@ void NewSequenceDialog::on_buttonBox_accepted()
s->audio_frequency = ui->audio_frequency_combobox->currentData().toInt();
s->audio_layout = AV_CH_LAYOUT_STEREO;
TimelineAction* ta = new TimelineAction();
panel_project->new_sequence(ta, s, true, NULL);
undo_stack.push(ta);
ComboAction* ca = new ComboAction();
panel_project->new_sequence(ca, s, true, NULL);
undo_stack.push(ca);
}
void NewSequenceDialog::on_comboBox_currentIndexChanged(int index)
+2 -2
View File
@@ -83,8 +83,8 @@ void ReplaceClipMediaDialog::replace() {
use_same_media_in_points->isChecked()
);
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL && c->media == old_media) {
rcmc->clips.append(c);
}
+3 -8
View File
@@ -622,9 +622,7 @@ void MainWindow::on_actionSlide_Tool_triggered()
}
void MainWindow::on_actionFolder_triggered() {
TimelineAction* ta = new TimelineAction();
ta->add_media(panel_project->new_folder(0), panel_project->get_selected_folder());
undo_stack.push(ta);
undo_stack.push(new AddMediaCommand(panel_project->new_folder(0), panel_project->get_selected_folder()));
}
void MainWindow::fileMenu_About_To_Be_Shown() {
@@ -688,12 +686,9 @@ void MainWindow::on_actionSet_Out_Point_triggered()
if (panel_timeline->focused()) panel_timeline->set_out_point();
}
void MainWindow::on_actionClear_In_Out_triggered()
{
void MainWindow::on_actionClear_In_Out_triggered() {
if (panel_timeline->focused() && sequence->using_workarea) {
TimelineAction* ta = new TimelineAction();
ta->set_in_out(sequence, false, 0, 0);
undo_stack.push(ta);
undo_stack.push(new SetTimelineInOutCommand(sequence, false, 0, 0));
panel_timeline->repaint_timeline();
}
}
+4 -2
View File
@@ -79,7 +79,8 @@ SOURCES += \
effects/audio/audionoiseeffect.cpp \
effects/video/boxblureffect.cpp \
dialogs/demonotice.cpp \
effects/audio/toneeffect.cpp
effects/audio/toneeffect.cpp \
project/marker.cpp
HEADERS += \
mainwindow.h \
@@ -135,7 +136,8 @@ HEADERS += \
effects/audio/audionoiseeffect.h \
effects/video/boxblureffect.h \
dialogs/demonotice.h \
effects/audio/toneeffect.h
effects/audio/toneeffect.h \
project/marker.h
FORMS += \
mainwindow.ui \
+10 -10
View File
@@ -62,23 +62,23 @@ void EffectControls::set_zoom(bool in) {
}
void EffectControls::menu_select(QAction* q) {
TimelineAction* ta = new TimelineAction();
ComboAction* ca = new ComboAction();
for (int i=0;i<selected_clips.size();i++) {
Clip* c = sequence->get_clip(selected_clips.at(i));
Clip* c = sequence->clips.at(selected_clips.at(i));
if ((c->track < 0) == video_menu) {
if (transition_menu) {
if (c->opening_transition == NULL) {
ta->add_transition(sequence, selected_clips.at(i), q->data().toInt(), TA_OPENING_TRANSITION);
ca->append(new AddTransitionCommand(c, q->data().toInt(), TA_OPENING_TRANSITION));
}
if (c->closing_transition == NULL) {
ta->add_transition(sequence, selected_clips.at(i), q->data().toInt(), TA_CLOSING_TRANSITION);
ca->append(new AddTransitionCommand(c, q->data().toInt(), TA_CLOSING_TRANSITION));
}
} else {
ta->add_effect(sequence, selected_clips.at(i), q->data().toInt());
ca->append(new AddEffectCommand(c, q->data().toInt()));
}
}
}
undo_stack.push(ta);
undo_stack.push(ca);
if (transition_menu) {
panel_timeline->redraw_all_clips(true);
} else {
@@ -167,7 +167,7 @@ void EffectControls::clear_effects(bool clear_cache) {
void EffectControls::deselect_all_effects(QWidget* sender) {
for (int i=0;i<selected_clips.size();i++) {
Clip* c = sequence->get_clip(selected_clips.at(i));
Clip* c = sequence->clips.at(selected_clips.at(i));
for (int j=0;j<c->effects.size();j++) {
if (c->effects.at(j)->container != sender) {
c->effects.at(j)->container->header_click(false, false);
@@ -182,7 +182,7 @@ void EffectControls::load_effects() {
if (!multiple) {
// load in new clips
for (int i=0;i<selected_clips.size();i++) {
Clip* c = sequence->get_clip(selected_clips.at(i));
Clip* c = sequence->clips.at(selected_clips.at(i));
QVBoxLayout* layout;
if (c->track < 0) {
ui->vcontainer->setVisible(true);
@@ -211,7 +211,7 @@ void EffectControls::delete_effects() {
// load in new clips
EffectDeleteCommand* command = new EffectDeleteCommand();
for (int i=0;i<selected_clips.size();i++) {
Clip* c = sequence->get_clip(selected_clips.at(i));
Clip* c = sequence->clips.at(selected_clips.at(i));
for (int j=0;j<c->effects.size();j++) {
Effect* effect = c->effects.at(j);
if (effect->container->selected) {
@@ -265,7 +265,7 @@ void EffectControls::on_add_audio_transition_button_clicked()
bool EffectControls::is_focused() {
if (this->hasFocus()) return true;
for (int i=0;i<selected_clips.size();i++) {
Clip* c = sequence->get_clip(selected_clips.at(i));
Clip* c = sequence->clips.at(selected_clips.at(i));
if (c != NULL) {
for (int j=0;j<c->effects.size();j++) {
if (c->effects.at(j)->container->is_focused()) {
+43 -39
View File
@@ -92,18 +92,18 @@ void Project::rename_media(QTreeWidgetItem* item, int column) {
void Project::duplicate_selected() {
QList<QTreeWidgetItem*> items = ui->treeWidget->selectedItems();
bool duped = false;
TimelineAction* ta = new TimelineAction();
ComboAction* ca = new ComboAction();
for (int j=0;j<items.size();j++) {
QTreeWidgetItem* i = items.at(j);
if (get_type_from_tree(i) == MEDIA_TYPE_SEQUENCE) {
new_sequence(ta, get_sequence_from_tree(i)->copy(), false, i->parent());
new_sequence(ca, get_sequence_from_tree(i)->copy(), false, i->parent());
duped = true;
}
}
if (duped) {
undo_stack.push(ta);
undo_stack.push(ca);
} else {
delete ta;
delete ca;
}
}
@@ -141,14 +141,14 @@ void Project::replace_clip_media() {
}
}
void Project::new_sequence(TimelineAction *ta, Sequence *s, bool open, QTreeWidgetItem* parent) {
void Project::new_sequence(ComboAction *ca, Sequence *s, bool open, QTreeWidgetItem* parent) {
QTreeWidgetItem* item = new_item();
item->setText(0, s->name);
set_sequence_of_tree(item, s);
if (ta != NULL) {
ta->new_sequence(item, parent);
if (open) ta->change_sequence(s);
if (ca != NULL) {
ca->append(new NewSequenceCommand(item, parent));
if (open) ca->append(new ChangeSequenceAction(s));
} else {
if (parent == NULL) {
ui->treeWidget->addTopLevelItem(item);
@@ -208,7 +208,7 @@ void Project::get_all_media_from_table(QList<QTreeWidgetItem*> items, QList<QTre
}
void Project::delete_selected_media() {
TimelineAction* ta = new TimelineAction();
ComboAction* ca = new ComboAction();
QList<QTreeWidgetItem*> items = ui->treeWidget->selectedItems();
bool remove = true;
bool redraw = false;
@@ -230,8 +230,8 @@ void Project::delete_selected_media() {
bool confirm_delete = false;
for (int j=0;j<sequence_items.size();j++) {
Sequence* s = get_sequence_from_tree(sequence_items.at(j));
for (int k=0;k<s->clip_count();k++) {
Clip* c = s->get_clip(k);
for (int k=0;k<s->clips.size();k++) {
Clip* c = s->clips.at(k);
if (c != NULL && c->media == media) {
if (!confirm_delete) {
// we found a reference, so we know we'll need to ask if the user wants to delete it
@@ -272,18 +272,18 @@ void Project::delete_selected_media() {
}
j = sequence_items.size();
k = s->clip_count();
k = s->clips.size();
} else if (confirm.clickedButton() == abort_button) {
// break out of loop
i = media_items.size();
j = sequence_items.size();
k = s->clip_count();
k = s->clips.size();
remove = false;
}
}
if (confirm_delete) {
ta->delete_clip(s, k);
ca->append(new DeleteClipAction(s, k));
}
}
}
@@ -304,20 +304,24 @@ void Project::delete_selected_media() {
}
for (int i=0;i<items.size();i++) {
// send delete command to the TimelineAction
ca->append(new DeleteMediaCommand(items.at(i)));
if (get_type_from_tree(items.at(i)) == MEDIA_TYPE_SEQUENCE) {
redraw = true;
if (get_sequence_from_tree(items.at(i)) == sequence) {
ca->append(new ChangeSequenceAction(NULL));
}
}
ta->delete_media(items.at(i));
}
undo_stack.push(ta);
undo_stack.push(ca);
// redraw clips
if (redraw) {
panel_timeline->redraw_all_clips(true);
}
} else {
delete ta;
delete ca;
}
}
@@ -329,8 +333,8 @@ void Project::process_file_list(bool recursive, QStringList& files, QTreeWidgetI
QStringList image_sequence_formats = config.img_seq_formats.split("|");
bool create_undo_action = (!recursive && replace == NULL);
TimelineAction* ta;
if (create_undo_action) ta = new TimelineAction();
ComboAction* ca;
if (create_undo_action) ca = new ComboAction();
for (int i=0;i<files.size();i++) {
if (QFileInfo(files.at(i)).isDir()) {
@@ -350,7 +354,7 @@ void Project::process_file_list(bool recursive, QStringList& files, QTreeWidgetI
process_file_list(true, subdir_filenames, folder, NULL);
if (create_undo_action) {
ta->add_media(folder, parent);
ca->append(new AddMediaCommand(folder, parent));
} else {
parent->addChild(folder);
}
@@ -452,7 +456,7 @@ void Project::process_file_list(bool recursive, QStringList& files, QTreeWidgetI
if (replace == NULL) {
if (create_undo_action) {
ta->add_media(item, parent);
ca->append(new AddMediaCommand(item, parent));
} else {
parent->addChild(item);
}
@@ -464,9 +468,9 @@ void Project::process_file_list(bool recursive, QStringList& files, QTreeWidgetI
}
if (create_undo_action) {
if (imported) {
undo_stack.push(ta);
undo_stack.push(ca);
} else {
delete ta;
delete ca;
}
}
}
@@ -544,26 +548,26 @@ void Project::delete_clips_using_selected_media() {
if (sequence == NULL) {
QMessageBox::critical(this, "No active sequence", "No sequence is active, please open the sequence you want to delete clips from.", QMessageBox::Ok);
} else {
TimelineAction* ta = new TimelineAction();
ComboAction* ca = new ComboAction();
bool deleted = false;
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL) {
QList<QTreeWidgetItem*> items = source_table->selectedItems();
for (int j=0;j<items.size();j++) {
Media* m = get_footage_from_tree(items.at(j));
if (c->media == m) {
ta->delete_clip(sequence, i);
ca->append(new DeleteClipAction(sequence, i));
deleted = true;
}
}
}
}
if (deleted) {
undo_stack.push(ta);
undo_stack.push(ca);
panel_timeline->redraw_all_clips(true);
} else {
delete ta;
delete ca;
}
}
}
@@ -878,18 +882,18 @@ bool Project::load_worker(QFile& f, QXmlStreamReader& stream, int type) {
}
}
s->add_clip(c);
s->clips.append(c);
}
}
// correct links and clip IDs
for (int i=0;i<s->clip_count();i++) {
for (int i=0;i<s->clips.size();i++) {
// correct links
Clip* correct_clip = s->get_clip(i);
Clip* correct_clip = s->clips.at(i);
for (int j=0;j<correct_clip->linked.size();j++) {
bool found = false;
for (int k=0;k<s->clip_count();k++) {
if (s->get_clip(k)->load_id == correct_clip->linked.at(j)) {
for (int k=0;k<s->clips.size();k++) {
if (s->clips.at(k)->load_id == correct_clip->linked.at(j)) {
correct_clip->linked[j] = k;
found = true;
break;
@@ -1083,8 +1087,8 @@ void Project::save_folder(QXmlStreamWriter& stream, QTreeWidgetItem* parent, int
stream.writeAttribute("workareaIn", QString::number(s->workarea_in));
stream.writeAttribute("workareaOut", QString::number(s->workarea_out));
}
for (int j=0;j<s->clip_count();j++) {
Clip* c = s->get_clip(j);
for (int j=0;j<s->clips.size();j++) {
Clip* c = s->clips.at(j);
if (c != NULL) {
stream.writeStartElement("clip"); // clip
stream.writeAttribute("id", QString::number(j));
@@ -1280,8 +1284,8 @@ void MediaThrobber::stop(int icon_type, bool replace) {
QVector<Sequence*> sequences = panel_project->list_all_project_sequences();
for (int i=0;i<sequences.size();i++) {
Sequence* s = sequences.at(i);
for (int j=0;j<s->clip_count();j++) {
Clip* c = s->get_clip(j);
for (int j=0;j<s->clips.size();j++) {
Clip* c = s->clips.at(j);
if (c != NULL) {
c->refresh();
}
+2 -3
View File
@@ -15,11 +15,10 @@ class QTreeWidgetItem;
class QXmlStreamWriter;
class QXmlStreamReader;
class QFile;
class ComboAction;
#define LOAD_TYPE_VERSION 69
class TimelineAction;
namespace Ui {
class Project;
}
@@ -47,7 +46,7 @@ public:
~Project();
bool is_focused();
void clear();
void new_sequence(TimelineAction* ta, Sequence* s, bool open, QTreeWidgetItem* parent);
void new_sequence(ComboAction *ca, Sequence* s, bool open, QTreeWidgetItem* parent);
QString get_next_sequence_name();
void delete_media(QTreeWidgetItem* item);
void process_file_list(bool recursive, QStringList& files, QTreeWidgetItem *parent, QTreeWidgetItem* replace);
+96 -97
View File
@@ -111,8 +111,8 @@ void Timeline::next_frame() {
void Timeline::previous_cut() {
if (playhead > 0) {
long p_cut = 0;
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL) {
if (c->timeline_out > p_cut && c->timeline_out < playhead) {
p_cut = c->timeline_out;
@@ -128,8 +128,8 @@ void Timeline::previous_cut() {
void Timeline::next_cut() {
bool seek_enabled = false;
long n_cut = LONG_MAX;
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL) {
if (c->timeline_in < n_cut && c->timeline_in > playhead) {
n_cut = c->timeline_in;
@@ -147,8 +147,8 @@ void Timeline::reset_all_audio() {
// reset all clip audio
audio_ibuffer_frame = playhead;
if (sequence != NULL) {
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL) {
c->reset_audio();
}
@@ -201,27 +201,27 @@ int Timeline::get_track_height_size(bool video) {
}
void Timeline::add_transition() {
TimelineAction* ta = new TimelineAction();
ComboAction* ca = new ComboAction();
bool adding = false;
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL && is_clip_selected(c, true)) {
if (c->opening_transition == NULL) {
ta->add_transition(sequence, i, 0, TA_OPENING_TRANSITION);
ca->append(new AddTransitionCommand(c, 0, TA_OPENING_TRANSITION));
adding = true;
}
if (c->closing_transition == NULL) {
ta->add_transition(sequence, i, 0, TA_CLOSING_TRANSITION);
ca->append(new AddTransitionCommand(c, 0, TA_OPENING_TRANSITION));
adding = true;
}
}
}
if (adding) {
undo_stack.push(ta);
undo_stack.push(ca);
} else {
delete ta;
delete ca;
}
redraw_all_clips(true);
@@ -318,8 +318,8 @@ void Timeline::redraw_all_clips(bool changed) {
void Timeline::select_all() {
if (sequence != NULL) {
selections.clear();
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL) {
Selection s;
s.in = c->timeline_in;
@@ -336,7 +336,7 @@ void Timeline::delete_in_out(bool ripple) {
if (sequence != NULL && sequence->using_workarea) {
QVector<Selection> areas;
int video_tracks = 0, audio_tracks = 0;
sequence->get_track_limits(&video_tracks, &audio_tracks);
sequence->getTrackLimits(&video_tracks, &audio_tracks);
for (int i=video_tracks;i<=audio_tracks;i++) {
Selection s;
s.in = sequence->workarea_in;
@@ -344,11 +344,11 @@ void Timeline::delete_in_out(bool ripple) {
s.track = i;
areas.append(s);
}
TimelineAction* ta = new TimelineAction();
delete_areas_and_relink(ta, areas);
if (ripple) ta->ripple(sequence, sequence->workarea_in, sequence->workarea_in - sequence->workarea_out);
ta->set_in_out(sequence, false, 0, 0);
undo_stack.push(ta);
ComboAction* ca = new ComboAction();
delete_areas_and_relink(ca, areas);
if (ripple) ca->append(new RippleCommand(sequence, sequence->workarea_in, sequence->workarea_in - sequence->workarea_out));
ca->append(new SetTimelineInOutCommand(sequence, false, 0, 0));
undo_stack.push(ca);
redraw_all_clips(true);
}
}
@@ -357,9 +357,9 @@ void Timeline::delete_selection(bool ripple_delete) {
if (selections.size() > 0) {
panel_effect_controls->clear_effects(true);
TimelineAction* ta = new TimelineAction();
ComboAction* ca = new ComboAction();
delete_areas_and_relink(ta, selections);
delete_areas_and_relink(ca, selections);
if (ripple_delete) {
long ripple_point = selections.at(0).in;
@@ -376,8 +376,8 @@ void Timeline::delete_selection(bool ripple_delete) {
ripple_point++;
bool can_ripple = true;
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c->timeline_in < ripple_point && c->timeline_out > ripple_point) {
// conflict detected, but this clip may be getting deleted so let's check
bool deleted = false;
@@ -391,8 +391,8 @@ void Timeline::delete_selection(bool ripple_delete) {
}
}
if (!deleted) {
for (int j=0;j<sequence->clip_count();j++) {
Clip* cc = sequence->get_clip(j);
for (int j=0;j<sequence->clips.size();j++) {
Clip* cc = sequence->clips.at(j);
if (cc->track == c->track
&& cc->timeline_in > c->timeline_out
&& cc->timeline_in < c->timeline_out + ripple_length) {
@@ -402,12 +402,12 @@ void Timeline::delete_selection(bool ripple_delete) {
}
}
}
if (can_ripple) ta->ripple(sequence, ripple_point, -ripple_length);
if (can_ripple) ca->append(new RippleCommand(sequence, ripple_point, -ripple_length));
}
selections.clear();
undo_stack.push(ta);
undo_stack.push(ca);
redraw_all_clips(true);
}
@@ -435,9 +435,9 @@ void Timeline::decheck_tool_buttons(QObject* sender) {
QVector<int> Timeline::get_tracks_of_linked_clips(int i) {
QVector<int> tracks;
Clip* clip = sequence->get_clip(i);
Clip* clip = sequence->clips.at(i);
for (int j=0;j<clip->linked.size();j++) {
tracks.append(sequence->get_clip(clip->linked.at(j))->track);
tracks.append(sequence->clips.at(clip->linked.at(j))->track);
}
return tracks;
}
@@ -467,12 +467,12 @@ void Timeline::on_snappingButton_toggled(bool checked) {
snapping = checked;
}
Clip* Timeline::split_clip(TimelineAction* ta, int p, long frame) {
return split_clip(ta, p, frame, frame);
Clip* Timeline::split_clip(ComboAction* ca, int p, long frame) {
return split_clip(ca, p, frame, frame);
}
Clip* Timeline::split_clip(TimelineAction* ta, int p, long frame, long post_in) {
Clip* pre = sequence->get_clip(p);
Clip* Timeline::split_clip(ComboAction* ca, int p, long frame, long post_in) {
Clip* pre = sequence->clips.at(p);
if (pre != NULL && pre->timeline_in < frame && pre->timeline_out > frame) { // guard against attempts to split at in/out points
Clip* post = pre->copy(sequence);
@@ -481,18 +481,18 @@ Clip* Timeline::split_clip(TimelineAction* ta, int p, long frame, long post_in)
post->timeline_in = post_in;
post->clip_in = pre->clip_in + (post->timeline_in - pre->timeline_in);
ta->set_timeline_out(sequence, p, frame);
ca->append(new MoveClipAction(pre, pre->timeline_in, frame, pre->clip_in, pre->track));
if (pre->opening_transition != NULL) {
if (pre->opening_transition->length > new_clip_length) {
ta->modify_transition(sequence, p, TA_OPENING_TRANSITION, new_clip_length);
ca->append(new ModifyTransitionCommand(pre, TA_OPENING_TRANSITION, new_clip_length));
}
delete post->opening_transition;
post->opening_transition = NULL;
}
if (pre->closing_transition != NULL) {
ta->delete_transition(sequence, p, TA_CLOSING_TRANSITION);
ca->append(new DeleteTransitionCommand(pre, TA_CLOSING_TRANSITION));
post->closing_transition->length = qMin((long) post->closing_transition->length, post->getLength());
}
@@ -511,7 +511,7 @@ bool Timeline::has_clip_been_split(int c) {
return false;
}
bool Timeline::split_clip_and_relink(TimelineAction* ta, int clip, long frame, bool relink) {
bool Timeline::split_clip_and_relink(ComboAction *ca, int clip, long frame, bool relink) {
// see if we split this clip before
if (has_clip_been_split(clip)) {
return false;
@@ -519,12 +519,12 @@ bool Timeline::split_clip_and_relink(TimelineAction* ta, int clip, long frame, b
split_cache.append(clip);
Clip* c = sequence->get_clip(clip);
Clip* c = sequence->clips.at(clip);
if (c != NULL) {
QVector<int> pre_clips;
QVector<Clip*> post_clips;
Clip* post = split_clip(ta, clip, frame);
Clip* post = split_clip(ca, clip, frame);
// if alt is not down, split clips links too
if (post == NULL) {
@@ -540,10 +540,10 @@ bool Timeline::split_clip_and_relink(TimelineAction* ta, int clip, long frame, b
for (int i=0;i<c->linked.size();i++) {
int l = c->linked.at(i);
if (!has_clip_been_split(l)) {
Clip* link = sequence->get_clip(l);
Clip* link = sequence->clips.at(l);
if ((original_clip_is_selected && is_clip_selected(link, true)) || !original_clip_is_selected) {
split_cache.append(l);
Clip* s = split_clip(ta, l, frame);
Clip* s = split_clip(ca, l, frame);
if (s != NULL) {
pre_clips.append(l);
post_clips.append(s);
@@ -554,7 +554,7 @@ bool Timeline::split_clip_and_relink(TimelineAction* ta, int clip, long frame, b
relink_clips_using_ids(pre_clips, post_clips);
}
ta->add_clips(sequence, post_clips);
ca->append(new AddClipCommand(sequence, post_clips));
return true;
}
}
@@ -591,7 +591,7 @@ void Timeline::clean_up_selections(QVector<Selection>& areas) {
}
}
void Timeline::delete_areas_and_relink(TimelineAction* ta, QVector<Selection>& areas) {
void Timeline::delete_areas_and_relink(ComboAction* ca, QVector<Selection>& areas) {
clean_up_selections(areas);
QVector<int> pre_clips;
@@ -599,47 +599,46 @@ void Timeline::delete_areas_and_relink(TimelineAction* ta, QVector<Selection>& a
for (int i=0;i<areas.size();i++) {
const Selection& s = areas.at(i);
for (int j=0;j<sequence->clip_count();j++) {
Clip* c = sequence->get_clip(j);
for (int j=0;j<sequence->clips.size();j++) {
Clip* c = sequence->clips.at(j);
if (c != NULL && c->track == s.track && !c->undeletable) {
if (c->opening_transition != NULL && s.in == c->timeline_in && s.out == c->timeline_in + c->opening_transition->length) {
// delete opening transition
ta->delete_transition(sequence, j, TA_OPENING_TRANSITION);
ca->append(new DeleteTransitionCommand(c, TA_OPENING_TRANSITION));
} else if (c->closing_transition != NULL && s.out == c->timeline_out && s.in == c->timeline_out - c->closing_transition->length) {
// delete closing transition
ta->delete_transition(sequence, j, TA_CLOSING_TRANSITION);
ca->append(new DeleteTransitionCommand(c, TA_CLOSING_TRANSITION));
} else if (c->timeline_in >= s.in && c->timeline_out <= s.out) {
// clips falls entirely within deletion area
ta->delete_clip(sequence, j);
ca->append(new DeleteClipAction(sequence, j));
} else if (c->timeline_in < s.in && c->timeline_out > s.out) {
// middle of clip is within deletion area
// duplicate clip
Clip* post = split_clip(ta, j, s.in, s.out);
Clip* post = split_clip(ca, j, s.in, s.out);
pre_clips.append(j);
post_clips.append(post);
} else if (c->timeline_in < s.in && c->timeline_out > s.in) {
// only out point is in deletion area
ta->set_timeline_out(sequence, j, s.in);
ca->append(new MoveClipAction(c, c->timeline_in, s.in, c->clip_in, c->track));
if (c->closing_transition != NULL) {
if (s.in < c->timeline_out - c->closing_transition->length) {
ta->delete_transition(sequence, j, TA_CLOSING_TRANSITION);
ca->append(new DeleteTransitionCommand(c, TA_CLOSING_TRANSITION));
} else {
ta->modify_transition(sequence, j, TA_CLOSING_TRANSITION, c->closing_transition->length - (c->timeline_out - s.in));
ca->append(new ModifyTransitionCommand(c, TA_CLOSING_TRANSITION, c->closing_transition->length - (c->timeline_out - s.in)));
}
}
} else if (c->timeline_in < s.out && c->timeline_out > s.out) {
// only in point is in deletion area
ta->increase_clip_in(sequence, j, s.out - c->timeline_in);
ta->set_timeline_in(sequence, j, s.out);
ca->append(new MoveClipAction(c, s.out, c->timeline_out, c->clip_in + (s.out - c->timeline_in), c->track));
if (c->opening_transition != NULL) {
if (s.out > c->timeline_in + c->opening_transition->length) {
ta->delete_transition(sequence, j, TA_OPENING_TRANSITION);
ca->append(new DeleteTransitionCommand(c, TA_OPENING_TRANSITION));
} else {
ta->modify_transition(sequence, j, TA_OPENING_TRANSITION, c->opening_transition->length - (s.out - c->timeline_in));
ca->append(new ModifyTransitionCommand(c, TA_OPENING_TRANSITION, c->opening_transition->length - (s.out - c->timeline_in)));
}
}
}
@@ -647,7 +646,7 @@ void Timeline::delete_areas_and_relink(TimelineAction* ta, QVector<Selection>& a
}
}
relink_clips_using_ids(pre_clips, post_clips);
ta->add_clips(sequence, post_clips);
ca->append(new AddClipCommand(sequence, post_clips));
}
void Timeline::copy(bool del) {
@@ -656,8 +655,8 @@ void Timeline::copy(bool del) {
long min_in = 0;
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL) {
for (int j=0;j<selections.size();j++) {
const Selection& s = selections.at(j);
@@ -711,7 +710,7 @@ void Timeline::relink_clips_using_ids(QVector<int>& old_clips, QVector<Clip*>& n
// relink pasted clips
for (int i=0;i<old_clips.size();i++) {
// these indices should correspond
Clip* oc = sequence->get_clip(old_clips.at(i));
Clip* oc = sequence->clips.at(old_clips.at(i));
for (int j=0;j<oc->linked.size();j++) {
for (int k=0;k<old_clips.size();k++) { // find clip with that ID
if (oc->linked.at(j) == old_clips.at(k)) {
@@ -724,7 +723,7 @@ void Timeline::relink_clips_using_ids(QVector<int>& old_clips, QVector<Clip*>& n
void Timeline::paste() {
if (clip_clipboard.size() > 0) {
TimelineAction* ta = new TimelineAction();
ComboAction* ca = new ComboAction();
// create copies and delete areas that we'll be pasting to
QVector<Selection> delete_areas;
@@ -748,7 +747,7 @@ void Timeline::paste() {
s.track = c->track;
delete_areas.append(s);
}
delete_areas_and_relink(ta, delete_areas);
delete_areas_and_relink(ca, delete_areas);
// ADAPT
for (int i=0;i<clip_clipboard.size();i++) {
@@ -765,9 +764,9 @@ void Timeline::paste() {
}
// ADAPT
ta->add_clips(sequence, pasted_clips);
ca->append(new AddClipCommand(sequence, pasted_clips));
undo_stack.push(ta);
undo_stack.push(ca);
redraw_all_clips(true);
@@ -787,8 +786,8 @@ void Timeline::ripple_to_in_point(bool in) {
// find closest in point to playhead
long in_point = in ? 0 : LONG_MAX;
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
track_min = qMin(track_min, c->track);
track_max = qMax(track_max, c->track);
if ((in && c->timeline_in > in_point && c->timeline_in <= playhead)
@@ -823,10 +822,10 @@ void Timeline::ripple_to_in_point(bool in) {
}
// trim and move clips around the in point
TimelineAction* ta = new TimelineAction();
delete_areas_and_relink(ta, areas);
ta->ripple(sequence, in_point, (in) ? (in_point - playhead) : (playhead - in_point));
undo_stack.push(ta);
ComboAction* ca = new ComboAction();
delete_areas_and_relink(ca, areas);
ca->append(new RippleCommand(sequence, in_point, (in) ? (in_point - playhead) : (playhead - in_point)));
undo_stack.push(ca);
redraw_all_clips(true);
@@ -835,7 +834,7 @@ void Timeline::ripple_to_in_point(bool in) {
}
}
bool Timeline::split_selection(TimelineAction* ta) {
bool Timeline::split_selection(ComboAction* ca) {
bool split = false;
// temporary relinking vectors
@@ -844,8 +843,8 @@ bool Timeline::split_selection(TimelineAction* ta) {
QVector<Clip*> secondary_post_splits;
// find clips within selection and split
for (int j=0;j<sequence->clip_count();j++) {
Clip* clip = sequence->get_clip(j);
for (int j=0;j<sequence->clips.size();j++) {
Clip* clip = sequence->clips.at(j);
if (clip != NULL) {
for (int i=0;i<selections.size();i++) {
const Selection& s = selections.at(i);
@@ -872,17 +871,17 @@ bool Timeline::split_selection(TimelineAction* ta) {
}
if (clip->closing_transition != NULL) {
ta->delete_transition(sequence, j, TA_CLOSING_TRANSITION);
ca->append(new DeleteTransitionCommand(clip, TA_CLOSING_TRANSITION));
delete split_A->closing_transition;
split_A->closing_transition = NULL;
}
ta->set_timeline_out(sequence, j, s.in);
ca->append(new MoveClipAction(clip, clip->timeline_in, s.in, clip->clip_in, clip->track));
split = true;
} else {
Clip* post_a = split_clip(ta, j, s.in);
Clip* post_b = split_clip(ta, j, s.out);
Clip* post_a = split_clip(ca, j, s.in);
Clip* post_b = split_clip(ca, j, s.out);
if (post_a != NULL) {
pre_splits.append(j);
post_splits.append(post_a);
@@ -907,8 +906,8 @@ bool Timeline::split_selection(TimelineAction* ta) {
// relink after splitting
relink_clips_using_ids(pre_splits, post_splits);
relink_clips_using_ids(pre_splits, secondary_post_splits);
ta->add_clips(sequence, post_splits);
ta->add_clips(sequence, secondary_post_splits);
ca->append(new AddClipCommand(sequence, post_splits));
ca->append(new AddClipCommand(sequence, secondary_post_splits));
return true;
}
@@ -916,7 +915,7 @@ bool Timeline::split_selection(TimelineAction* ta) {
}
void Timeline::split_at_playhead() {
TimelineAction* ta = new TimelineAction();
ComboAction* ca = new ComboAction();
bool split_selected = false;
split_cache.clear();
@@ -924,10 +923,10 @@ void Timeline::split_at_playhead() {
// see if whole clips are selected
QVector<int> pre_clips;
QVector<Clip*> post_clips;
for (int j=0;j<sequence->clip_count();j++) {
Clip* clip = sequence->get_clip(j);
for (int j=0;j<sequence->clips.size();j++) {
Clip* clip = sequence->clips.at(j);
if (clip != NULL && is_clip_selected(clip, true)) {
Clip* s = split_clip(ta, j, playhead);
Clip* s = split_clip(ca, j, playhead);
if (s != NULL) {
pre_clips.append(j);
post_clips.append(s);
@@ -939,20 +938,20 @@ void Timeline::split_at_playhead() {
if (split_selected) {
// relink clips if we split
relink_clips_using_ids(pre_clips, post_clips);
ta->add_clips(sequence, post_clips);
ca->append(new AddClipCommand(sequence, post_clips));
} else {
// split a selection if not
split_selected = split_selection(ta);
split_selected = split_selection(ca);
}
}
// if nothing was selected or no selections fell within playhead, simply split at playhead
if (!split_selected) {
for (int j=0;j<sequence->clip_count();j++) {
Clip* c = sequence->get_clip(j);
for (int j=0;j<sequence->clips.size();j++) {
Clip* c = sequence->clips.at(j);
if (c != NULL) {
// always relinks
if (split_clip_and_relink(ta, j, playhead, true)) {
if (split_clip_and_relink(ca, j, playhead, true)) {
split_selected = true;
}
}
@@ -960,10 +959,10 @@ void Timeline::split_at_playhead() {
}
if (split_selected) {
undo_stack.push(ta);
undo_stack.push(ca);
redraw_all_clips(true);
} else {
delete ta;
delete ca;
}
}
@@ -1017,8 +1016,8 @@ void Timeline::snap_to_clip(long* l, bool playhead_inclusive) {
playhead_inclusive = false;
}
if (!playhead_inclusive) {
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL) {
if (snap_to_point(c->timeline_in, l)) {
break;
@@ -1037,8 +1036,8 @@ void Timeline::snap_to_clip(long* l, bool playhead_inclusive) {
void Timeline::toggle_links() {
LinkCommand* command = new LinkCommand();
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL && is_clip_selected(c, true)) {
command->clips.append(c);
if (c->linked.size() > 0) {
@@ -1046,7 +1045,7 @@ void Timeline::toggle_links() {
for (int j=0;j<c->linked.size();j++) { // add links to the command
bool found = false;
Clip* link = sequence->get_clip(c->linked.at(j));
Clip* link = sequence->clips.at(c->linked.at(j));
for (int k=0;k<command->clips.size();k++) {
if (command->clips.at(k) == link) {
found = true;
+6 -6
View File
@@ -18,7 +18,7 @@
class QPushButton;
class SourceTable;
class ViewerWidget;
class TimelineAction;
class ComboAction;
class Transition;
struct Sequence;
struct Clip;
@@ -86,14 +86,14 @@ public:
void copy(bool del);
void paste();
void deselect();
Clip* split_clip(TimelineAction* ta, int p, long frame);
Clip* split_clip(TimelineAction* ta, int p, long frame, long post_in);
bool split_selection(TimelineAction* ta);
Clip* split_clip(ComboAction* ca, int p, long frame);
Clip* split_clip(ComboAction* ca, int p, long frame, long post_in);
bool split_selection(ComboAction* ca);
void split_at_playhead();
bool split_clip_and_relink(TimelineAction* ta, int clip, long frame, bool relink);
bool split_clip_and_relink(ComboAction* ca, int clip, long frame, bool relink);
void clean_up_selections(QVector<Selection>& areas);
void deselect_area(long in, long out, int track);
void delete_areas_and_relink(TimelineAction* ta, QVector<Selection>& areas);
void delete_areas_and_relink(ComboAction *ca, QVector<Selection>& areas);
void relink_clips_using_ids(QVector<int>& old_clips, QVector<Clip*>& new_clips);
void update_sequence();
void increase_track_height();
+2 -2
View File
@@ -311,8 +311,8 @@ void set_sequence(Sequence* s) {
void closeActiveClips(Sequence *s, bool wait) {
if (s != NULL) {
for (int i=0;i<s->clip_count();i++) {
Clip* c = s->get_clip(i);
for (int i=0;i<s->clips.size();i++) {
Clip* c = s->clips.at(i);
if (c != NULL) {
if (c->media_type == MEDIA_TYPE_SEQUENCE) {
closeActiveClips(static_cast<Sequence*>(c->media), wait);
+2 -2
View File
@@ -99,8 +99,8 @@ void Clip::reset_audio() {
case MEDIA_TYPE_SEQUENCE:
{
Sequence* nested_sequence = static_cast<Sequence*>(media);
for (int i=0;i<nested_sequence->clip_count();i++) {
Clip* c = nested_sequence->get_clip(i);
for (int i=0;i<nested_sequence->clips.size();i++) {
Clip* c = nested_sequence->clips.at(i);
if (c != NULL) c->reset_audio();
}
}
+1
View File
@@ -0,0 +1 @@
#include "marker.h"
+11
View File
@@ -0,0 +1,11 @@
#ifndef MARKER_H
#define MARKER_H
#include <QString>
struct Marker {
long frame;
QString name;
};
#endif // MARKER_H
+12 -31
View File
@@ -26,38 +26,24 @@ Sequence* Sequence::copy() {
s->frame_rate = frame_rate;
s->audio_frequency = audio_frequency;
s->audio_layout = audio_layout;
for (int i=0;i<clip_count();i++) {
Clip* c = get_clip(i);
if (c != NULL) {
s->clips.resize(clips.size());
for (int i=0;i<clips.size();i++) {
Clip* c = clips.at(i);
if (c == NULL) {
s->clips[i] = NULL;
} else {
Clip* copy = c->copy(s);
copy->linked = c->linked;
s->add_clip(copy);
s->clips[i] = copy;
}
}
return s;
}
int Sequence::add_clip(Clip* c) {
clips.append(c);
return clip_count() - 1;
}
int Sequence::clip_count() {
return clips.size();
}
Clip* Sequence::get_clip(int i) {
return clips.at(i);
}
void Sequence::replace_clip(int i, Clip* c) {
clips[i] = c;
}
long Sequence::getEndFrame() {
long end = 0;
for (int j=0;j<clip_count();j++) {
Clip* c = get_clip(j);
for (int j=0;j<clips.size();j++) {
Clip* c = clips.at(j);
if (c != NULL && c->timeline_out > end) {
end = c->timeline_out;
}
@@ -65,16 +51,11 @@ long Sequence::getEndFrame() {
return end;
}
void Sequence::destroy_clip(int i, bool del) {
if (del) delete clips.at(i);
clips.removeAt(i);
}
void Sequence::get_track_limits(int* video_tracks, int* audio_tracks) {
void Sequence::getTrackLimits(int* video_tracks, int* audio_tracks) {
int vt = 0;
int at = 0;
for (int j=0;j<clip_count();j++) {
Clip* c = get_clip(j);
for (int j=0;j<clips.size();j++) {
Clip* c = clips.at(j);
if (c != NULL) {
if (c->track < 0 && c->track < vt) { // video clip
vt = c->track;
+6 -8
View File
@@ -4,19 +4,15 @@
#include <QVector>
#include "project/clip.h"
#include "project/marker.h"
struct Sequence {
public:
Sequence();
~Sequence();
Sequence* copy();
QString name;
int add_clip(Clip* c);
int clip_count();
Clip* get_clip(int i);
void replace_clip(int i, Clip* c);
void get_track_limits(int* video_tracks, int* audio_tracks);
void destroy_clip(int i, bool del);
QString name;
void getTrackLimits(int* video_tracks, int* audio_tracks);
long getEndFrame();
int width;
int height;
@@ -29,8 +25,10 @@ public:
long workarea_out;
int save_id;
private:
QVector<Marker> markers;
QVector<Clip*> clips;
private:
};
// static variable for the currently active sequence
+366 -13
View File
@@ -20,15 +20,368 @@
QUndoStack undo_stack;
#define TA_IN 0
#define TA_OUT 1
#define TA_CLIP_IN 2
#define TA_TRACK 3
#define TA_DELETE 4
#define TA_ADD_IN 5
#define TA_ADD_OUT 6
#define TA_ADD_CLIP_IN 7
#define TA_ADD_TRACK 8
ComboAction::ComboAction() {}
ComboAction::~ComboAction() {
for (int i=0;i<commands.size();i++) {
delete commands.at(i);
}
}
void ComboAction::undo() {
for (int i=commands.size()-1;i>=0;i--) {
commands.at(i)->undo();
}
}
void ComboAction::redo() {
for (int i=0;i<commands.size();i++) {
commands.at(i)->redo();
}
}
void ComboAction::append(QUndoCommand* u) {
commands.append(u);
}
MoveClipAction::MoveClipAction(Clip *c, long iin, long iout, long iclip_in, int itrack) :
clip(c),
new_in(iin),
new_out(iout),
new_clip_in(iclip_in),
new_track(itrack)
{}
void MoveClipAction::undo() {
clip->timeline_in = old_in;
clip->timeline_out = old_out;
clip->clip_in = old_clip_in;
clip->track = old_track;
}
void MoveClipAction::redo() {
old_in = clip->timeline_in;
old_out = clip->timeline_out;
old_clip_in = clip->clip_in;
old_track = clip->track;
clip->timeline_in = new_in;
clip->timeline_out = new_out;
clip->clip_in = new_clip_in;
clip->track = new_track;
}
DeleteClipAction::DeleteClipAction(Sequence* s, int clip) :
seq(s),
index(clip)
{}
DeleteClipAction::~DeleteClipAction() {
if (ref != NULL) delete ref;
}
void DeleteClipAction::undo() {
seq->clips[index] = ref;
ref = NULL;
}
void DeleteClipAction::redo() {
ref = seq->clips.at(index);
seq->clips[index] = NULL;
}
ChangeSequenceAction::ChangeSequenceAction(Sequence* s) :
new_sequence(s)
{}
void ChangeSequenceAction::undo() {
set_sequence(old_sequence);
}
void ChangeSequenceAction::redo() {
old_sequence = sequence;
set_sequence(new_sequence);
}
SetTimelineInOutCommand::SetTimelineInOutCommand(Sequence *s, bool enabled, long in, long out) :
seq(s),
new_enabled(enabled),
new_in(in),
new_out(out)
{}
void SetTimelineInOutCommand::undo() {
seq->using_workarea = old_enabled;
seq->workarea_in = old_in;
seq->workarea_out = old_out;
}
void SetTimelineInOutCommand::redo() {
old_enabled = seq->using_workarea;
old_in = seq->workarea_in;
old_out = seq->workarea_out;
seq->using_workarea = new_enabled;
seq->workarea_in = new_in;
seq->workarea_out = new_out;
}
AddEffectCommand::AddEffectCommand(Clip* c, int ieffect) :
clip(c),
effect(ieffect),
ref(NULL),
done(false)
{}
AddEffectCommand::~AddEffectCommand() {
if (!done && ref != NULL) delete ref;
}
void AddEffectCommand::undo() {
clip->effects.removeLast();
done = false;
}
void AddEffectCommand::redo() {
if (ref == NULL) {
ref = create_effect(effect, clip);
}
clip->effects.append(ref);
done = true;
}
AddTransitionCommand::AddTransitionCommand(Clip* c, int itransition, int itype) :
clip(c),
transition(itransition),
type(itype)
{}
void AddTransitionCommand::undo() {
if (type == TA_OPENING_TRANSITION) {
delete clip->opening_transition;
clip->opening_transition = NULL;
} else {
delete clip->closing_transition;
clip->closing_transition = NULL;
}
}
void AddTransitionCommand::redo() {
if (type == TA_OPENING_TRANSITION) {
clip->opening_transition = create_transition(transition, clip);
} else {
clip->closing_transition = create_transition(transition, clip);
}
}
ModifyTransitionCommand::ModifyTransitionCommand(Clip* c, int itype, long ilength) :
clip(c),
type(itype),
new_length(ilength)
{}
void ModifyTransitionCommand::undo() {
if (type == TA_OPENING_TRANSITION) {
clip->opening_transition->length = old_length;
} else {
clip->closing_transition->length = old_length;
}
}
void ModifyTransitionCommand::redo() {
if (type == TA_OPENING_TRANSITION) {
old_length = clip->opening_transition->length;
clip->opening_transition->length = new_length;
} else {
old_length = clip->closing_transition->length;
clip->closing_transition->length = new_length;
}
}
DeleteTransitionCommand::DeleteTransitionCommand(Clip* c, int itype) :
clip(c),
type(itype),
transition(NULL)
{}
DeleteTransitionCommand::~DeleteTransitionCommand() {
if (transition != NULL) delete transition;
}
void DeleteTransitionCommand::undo() {
if (type == TA_OPENING_TRANSITION) {
clip->opening_transition = transition;
} else {
clip->closing_transition = transition;
}
transition = NULL;
}
void DeleteTransitionCommand::redo() {
if (type == TA_OPENING_TRANSITION) {
transition = clip->opening_transition;
clip->opening_transition = NULL;
} else {
transition = clip->closing_transition;
clip->closing_transition = NULL;
}
}
NewSequenceCommand::NewSequenceCommand(QTreeWidgetItem *s, QTreeWidgetItem* iparent) :
seq(s),
parent(iparent),
done(false)
{}
NewSequenceCommand::~NewSequenceCommand() {
if (!done) delete seq;
}
void NewSequenceCommand::undo() {
if (parent == NULL) {
panel_project->source_table->takeTopLevelItem(panel_project->source_table->indexOfTopLevelItem(seq));
} else {
parent->removeChild(seq);
}
done = false;
}
void NewSequenceCommand::redo() {
if (parent == NULL) {
panel_project->source_table->addTopLevelItem(seq);
} else {
parent->addChild(seq);
}
done = true;
}
AddMediaCommand::AddMediaCommand(QTreeWidgetItem* iitem, QTreeWidgetItem* iparent) :
item(iitem),
parent(iparent),
done(false)
{}
AddMediaCommand::~AddMediaCommand() {
if (!done) {
panel_project->delete_media(item);
delete item;
}
}
void AddMediaCommand::undo() {
if (parent == NULL) {
panel_project->source_table->takeTopLevelItem(panel_project->source_table->indexOfTopLevelItem(item));
} else {
parent->removeChild(item);
}
done = false;
}
void AddMediaCommand::redo() {
if (parent == NULL) {
panel_project->source_table->addTopLevelItem(item);
} else {
parent->addChild(item);
}
done = true;
}
DeleteMediaCommand::DeleteMediaCommand(QTreeWidgetItem* i) :
item(i)
{}
DeleteMediaCommand::~DeleteMediaCommand() {
panel_project->delete_media(item);
delete item;
}
void DeleteMediaCommand::undo() {
if (parent == NULL) {
panel_project->source_table->addTopLevelItem(item);
} else {
parent->addChild(item);
}
}
void DeleteMediaCommand::redo() {
parent = item->parent();
if (parent == NULL) {
panel_project->source_table->takeTopLevelItem(panel_project->source_table->indexOfTopLevelItem(item));
} else {
parent->removeChild(item);
}
}
RippleCommand::RippleCommand(Sequence *s, long ipoint, long ilength) :
seq(s),
point(ipoint),
length(ilength)
{}
void RippleCommand::undo() {
for (int i=0;i<rippled.size();i++) {
Clip* c = rippled.at(i);
c->timeline_in -= length;
c->timeline_out -= length;
}
}
void RippleCommand::redo() {
rippled.clear();
for (int j=0;j<seq->clips.size();j++) {
Clip* c = seq->clips.at(j);
bool found = false;
for (int i=0;i<ignore.size();i++) {
if (ignore.at(i) == c) {
found = true;
break;
}
}
if (!found) {
if (c != NULL && c->timeline_in >= point) {
c->timeline_in += length;
c->timeline_out += length;
rippled.append(c);
}
}
}
}
AddClipCommand::AddClipCommand(Sequence* s, QVector<Clip*>& add) :
seq(s),
clips(add)
{}
AddClipCommand::~AddClipCommand() {
for (int i=0;i<clips.size();i++) {
delete clips.at(i);
}
}
void AddClipCommand::undo() {
for (int i=0;i<clips.size();i++) {
delete seq->clips.last();
seq->clips.removeLast();
}
}
void AddClipCommand::redo() {
// TODO does this actually need to copy?
int linkOffset = seq->clips.size();
for (int i=0;i<clips.size();i++) {
Clip* original = clips.at(i);
Clip* copy = original->copy(seq);
copy->linked.resize(original->linked.size());
for (int j=0;j<original->linked.size();j++) {
copy->linked[j] = original->linked.at(j) + linkOffset;
}
seq->clips.append(copy);
}
}
/*
#define TA_ADD_EFFECT 9
#define TA_ADD_TRANSITION 10
#define TA_MODIFY_TRANSITION 11
@@ -439,7 +792,7 @@ void TimelineAction::redo() {
break;
case TA_MODIFY_TRANSITION:
{
Clip* c = sequences.at(i)->get_clip(clips.at(i));
Clip* c = sequences.at(i)->get_clip(clips.at(i));
if (transition_types.at(i) == TA_OPENING_TRANSITION) {
old_values[i] = c->opening_transition->length;
c->opening_transition->length = new_values.at(i);
@@ -555,7 +908,7 @@ void TimelineAction::redo() {
project_changed = true;
done = true;
}
}*/
LinkCommand::LinkCommand() : link(true), old_project_changed(project_changed) {}
@@ -620,8 +973,8 @@ void ReplaceMediaCommand::replace(QString& filename) {
QVector<Sequence*> all_sequences = panel_project->list_all_project_sequences();
for (int i=0;i<all_sequences.size();i++) {
Sequence* s = all_sequences.at(i);
for (int j=0;j<s->clip_count();j++) {
Clip* c = s->get_clip(j);
for (int j=0;j<s->clips.size();j++) {
Clip* c = s->clips.at(j);
if (c != NULL && c->media == media && c->open) {
close_clip(c);
if (c->media_type == MEDIA_TYPE_FOOTAGE) c->cacher->wait();
+179 -2
View File
@@ -7,6 +7,7 @@ class LabelSlider;
class Effect;
class SourceTable;
class EffectRow;
class Transition;
struct Clip;
struct Sequence;
struct Media;
@@ -21,7 +22,183 @@ struct Media;
extern QUndoStack undo_stack;
class TimelineAction : public QUndoCommand {
class ComboAction : public QUndoCommand {
public:
ComboAction();
~ComboAction();
void undo();
void redo();
void append(QUndoCommand* u);
private:
QVector<QUndoCommand*> commands;
};
class MoveClipAction : public QUndoCommand {
public:
MoveClipAction(Clip* c, long iin, long iout, long iclip_in, int itrack);
void undo();
void redo();
private:
Clip* clip;
long new_in;
long new_out;
long new_clip_in;
int new_track;
long old_in;
long old_out;
long old_clip_in;
int old_track;
};
class DeleteClipAction : public QUndoCommand {
public:
DeleteClipAction(Sequence* s, int clip);
~DeleteClipAction();
void undo();
void redo();
private:
Sequence* seq;
Clip* ref;
int index;
};
class ChangeSequenceAction : public QUndoCommand {
public:
ChangeSequenceAction(Sequence* s);
void undo();
void redo();
private:
Sequence* old_sequence;
Sequence* new_sequence;
};
class AddEffectCommand : public QUndoCommand {
public:
AddEffectCommand(Clip* c, int ieffect);
~AddEffectCommand();
void undo();
void redo();
private:
Clip* clip;
int effect;
Effect* ref;
bool done;
};
class AddTransitionCommand : public QUndoCommand {
public:
AddTransitionCommand(Clip* c, int itransition, int itype);
void undo();
void redo();
private:
Clip* clip;
int transition;
int type;
};
class ModifyTransitionCommand : public QUndoCommand {
public:
ModifyTransitionCommand(Clip* c, int itype, long ilength);
void undo();
void redo();
private:
Clip* clip;
int type;
long new_length;
long old_length;
};
class DeleteTransitionCommand : public QUndoCommand {
public:
DeleteTransitionCommand(Clip* c, int itype);
~DeleteTransitionCommand();
void undo();
void redo();
private:
Clip* clip;
int type;
Transition* transition;
};
class SetTimelineInOutCommand : public QUndoCommand {
public:
SetTimelineInOutCommand(Sequence* s, bool enabled, long in, long out);
void undo();
void redo();
private:
Sequence* seq;
bool old_enabled;
long old_in;
long old_out;
bool new_enabled;
long new_in;
long new_out;
};
class NewSequenceCommand : public QUndoCommand {
public:
NewSequenceCommand(QTreeWidgetItem *s, QTreeWidgetItem* iparent);
~NewSequenceCommand();
void undo();
void redo();
private:
QTreeWidgetItem* seq;
QTreeWidgetItem* parent;
bool done;
};
class AddMediaCommand : public QUndoCommand {
public:
AddMediaCommand(QTreeWidgetItem* iitem, QTreeWidgetItem* iparent);
~AddMediaCommand();
void undo();
void redo();
private:
QTreeWidgetItem* item;
QTreeWidgetItem* parent;
bool done;
};
class DeleteMediaCommand : public QUndoCommand {
public:
DeleteMediaCommand(QTreeWidgetItem* i);
~DeleteMediaCommand();
void undo();
void redo();
private:
QTreeWidgetItem* item;
QTreeWidgetItem* parent;
};
class RippleCommand : public QUndoCommand {
public:
RippleCommand(Sequence* s, long ipoint, long ilength);
QVector<Clip*> ignore;
void undo();
void redo();
private:
Sequence* seq;
long point;
long length;
QVector<Clip*> rippled;
};
class AddClipCommand : public QUndoCommand {
public:
AddClipCommand(Sequence* s, QVector<Clip*>& add);
~AddClipCommand();
void undo();
void redo();
private:
Sequence* seq;
QVector<Clip*> clips;
};
/*class TimelineAction : public QUndoCommand {
public:
TimelineAction();
~TimelineAction();
@@ -103,7 +280,7 @@ private:
void offset_links(QVector<Clip*>& clips, int offset);
bool old_project_changed;
};
};*/
class LinkCommand : public QUndoCommand {
public:
+1 -1
View File
@@ -40,7 +40,7 @@ void KeyframeView::paintEvent(QPaintEvent*) {
long effects_out = 0;
for (int j=0;j<panel_effect_controls->selected_clips.size();j++) {
Clip* c = sequence->get_clip(panel_effect_controls->selected_clips.at(j));
Clip* c = sequence->clips.at(panel_effect_controls->selected_clips.at(j));
effects_in = qMin(effects_in, c->timeline_in);
effects_out = qMax(effects_out, c->timeline_out);
for (int i=0;i<c->effects.size();i++) {
+1 -3
View File
@@ -121,9 +121,7 @@ void SourceTable::mouseDoubleClickEvent(QMouseEvent* ) {
} else if (selectedItems().count() == 1) {
QTreeWidgetItem* item = selectedItems().at(0);
if (get_type_from_tree(item) == MEDIA_TYPE_SEQUENCE) {
TimelineAction* ta = new TimelineAction();
ta->change_sequence(get_sequence_from_tree(item));
undo_stack.push(ta);
undo_stack.push(new ChangeSequenceAction(get_sequence_from_tree(item)));
}
}
}
+3 -9
View File
@@ -41,9 +41,7 @@ void TimelineHeader::set_in_point(long new_in) {
new_out = sequence->getEndFrame();
}
TimelineAction* ta = new TimelineAction();
ta->set_in_out(sequence, true, new_in, new_out);
undo_stack.push(ta);
undo_stack.push(new SetTimelineInOutCommand(sequence, true, new_in, new_out));
update();
}
@@ -56,9 +54,7 @@ void TimelineHeader::set_out_point(long new_out) {
new_in = 0;
}
TimelineAction* ta = new TimelineAction();
ta->set_in_out(sequence, true, new_in, new_out);
undo_stack.push(ta);
undo_stack.push(new SetTimelineInOutCommand(sequence, true, new_in, new_out));
update();
}
@@ -110,9 +106,7 @@ void TimelineHeader::mouseMoveEvent(QMouseEvent* event) {
void TimelineHeader::mouseReleaseEvent(QMouseEvent*) {
if (resizing_workarea) {
TimelineAction* ta = new TimelineAction();
ta->set_in_out(sequence, true, temp_workarea_in, temp_workarea_out);
undo_stack.push(ta);
undo_stack.push(new SetTimelineInOutCommand(sequence, true, temp_workarea_in, temp_workarea_out));
}
resizing_workarea = false;
+94 -103
View File
@@ -235,7 +235,7 @@ void TimelineWidget::dropEvent(QDropEvent* event) {
if (panel_timeline->importing && panel_timeline->ghosts.size() > 0) {
event->accept();
TimelineAction* ta = new TimelineAction();
ComboAction* ca = new ComboAction();
QVector<Clip*> added_clips;
@@ -253,7 +253,7 @@ void TimelineWidget::dropEvent(QDropEvent* event) {
s->audio_frequency = predicted_audio_freq;
s->audio_layout = predicted_audio_layout;
panel_project->new_sequence(ta, s, true, NULL);
panel_project->new_sequence(ca, s, true, NULL);
} else {
// delete areas before adding
QVector<Selection> delete_areas;
@@ -265,7 +265,7 @@ void TimelineWidget::dropEvent(QDropEvent* event) {
sel.track = g.track;
delete_areas.append(sel);
}
panel_timeline->delete_areas_and_relink(ta, delete_areas);
panel_timeline->delete_areas_and_relink(ca, delete_areas);
}
// add clips
@@ -312,7 +312,7 @@ void TimelineWidget::dropEvent(QDropEvent* event) {
added_clips.append(c);
}
ta->add_clips(s, added_clips);
ca->append(new AddClipCommand(s, added_clips));
// link clips from the same media
for (int i=0;i<added_clips.size();i++) {
@@ -324,14 +324,13 @@ void TimelineWidget::dropEvent(QDropEvent* event) {
}
}
// DUMB HACKY CODE THAT MIGHT NOT WORK TO ADD EFFECTS
if (c->track < 0) {
// add default video effects
ta->add_effect(s, i + s->clip_count(), VIDEO_TRANSFORM_EFFECT);
c->effects.append(create_effect(VIDEO_TRANSFORM_EFFECT, c));
} else {
// add default audio effects
ta->add_effect(s, i + s->clip_count(), AUDIO_VOLUME_EFFECT);
ta->add_effect(s, i + s->clip_count(), AUDIO_PAN_EFFECT);
c->effects.append(create_effect(AUDIO_VOLUME_EFFECT, c));
c->effects.append(create_effect(AUDIO_PAN_EFFECT, c));
}
}
@@ -340,7 +339,7 @@ void TimelineWidget::dropEvent(QDropEvent* event) {
panel_timeline->importing = false;
panel_timeline->snapped = false;
undo_stack.push(ta);
undo_stack.push(ca);
setFocus();
@@ -352,7 +351,7 @@ void TimelineWidget::mouseDoubleClickEvent(QMouseEvent *event) {
if (panel_timeline->tool == TIMELINE_TOOL_EDIT) {
int clip_index = getClipIndexFromCoords(panel_timeline->cursor_frame, panel_timeline->cursor_track);
if (clip_index >= 0) {
Clip* clip = sequence->get_clip(clip_index);
Clip* clip = sequence->clips.at(clip_index);
if (!(event->modifiers() & Qt::ShiftModifier)) panel_timeline->selections.clear();
Selection s;
s.in = clip->timeline_in;
@@ -431,7 +430,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) {
panel_timeline->moving_init = true;
} else {
if (clip_index >= 0) {
Clip* clip = sequence->get_clip(clip_index);
Clip* clip = sequence->clips.at(clip_index);
if (clip != NULL) {
if (panel_timeline->is_clip_selected(clip, true)) {
if (shift) {
@@ -439,7 +438,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) {
if (!alt) {
for (int i=0;i<clip->linked.size();i++) {
Clip* link = sequence->get_clip(clip->linked.at(i));
Clip* link = sequence->clips.at(clip->linked.at(i));
panel_timeline->deselect_area(link->timeline_in, link->timeline_out, link->track);
}
}
@@ -448,7 +447,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) {
panel_timeline->deselect_area(clip->timeline_in, clip->timeline_out, clip->track);
for (int i=0;i<clip->linked.size();i++) {
Clip* link = sequence->get_clip(clip->linked.at(i));
Clip* link = sequence->clips.at(clip->linked.at(i));
panel_timeline->deselect_area(link->timeline_in, link->timeline_out, link->track);
}
@@ -493,7 +492,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) {
// if alt is not down, select links
if (!alt && panel_timeline->transition_select == TA_NO_TRANSITION) {
for (int i=0;i<clip->linked.size();i++) {
Clip* link = sequence->get_clip(clip->linked.at(i));
Clip* link = sequence->clips.at(clip->linked.at(i));
if (!panel_timeline->is_clip_selected(link, true)) {
Selection ss;
ss.in = link->timeline_in;
@@ -549,7 +548,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
const Ghost& g = panel_timeline->ghosts.at(0);
if (g.in != g.out) {
TimelineAction* ta = new TimelineAction();
ComboAction* ca = new ComboAction();
Clip* c = new Clip(sequence);
c->media = NULL;
@@ -563,38 +562,42 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
QVector<Clip*> add;
add.append(c);
ta->add_clips(sequence, add);
ca->append(new AddClipCommand(sequence, add));
int clipIndex = sequence->clip_count();
int clipIndex = sequence->clips.size();
if (c->track < 0) {
// default video effects (before custom effects)
ta->add_effect(sequence, clipIndex, VIDEO_TRANSFORM_EFFECT);
c->effects.append(create_effect(VIDEO_TRANSFORM_EFFECT, c));
c->media_type = MEDIA_TYPE_SOLID;
}
switch (panel_timeline->creatingObject) {
case ADD_OBJ_TITLE:
c->name = "Title";
ta->add_effect(sequence, clipIndex, VIDEO_TEXT_EFFECT);
c->effects.append(create_effect(VIDEO_TEXT_EFFECT, c));
break;
case ADD_OBJ_SOLID:
c->name = "Solid Color";
ta->add_effect(sequence, clipIndex, VIDEO_SOLID_EFFECT);
c->effects.append(create_effect(VIDEO_SOLID_EFFECT, c));
break;
case ADD_OBJ_BARS:
{
c->name = "Bars";
ta->add_effect(sequence, clipIndex, VIDEO_SOLID_EFFECT);
Effect* e = create_effect(VIDEO_SOLID_EFFECT, c);
e->row(0)->field(0)->set_combo_index(1);
c->effects.append(e);
}
break;
case ADD_OBJ_TONE:
c->name = "Tone";
ta->add_effect(sequence, clipIndex, AUDIO_TONE_EFFECT);
c->effects.append(create_effect(VIDEO_TEXT_EFFECT, c));
break;
}
if (c->track >= 0) {
// default audio effects (after custom effects)
ta->add_effect(sequence, clipIndex, AUDIO_VOLUME_EFFECT);
ta->add_effect(sequence, clipIndex, AUDIO_PAN_EFFECT);
c->effects.append(create_effect(AUDIO_VOLUME_EFFECT, c));
c->effects.append(create_effect(AUDIO_PAN_EFFECT, c));
c->media_type = MEDIA_TYPE_TONE;
}
@@ -604,14 +607,9 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
s.track = c->track;
QVector<Selection> areas;
areas.append(s);
panel_timeline->delete_areas_and_relink(ta, areas);
panel_timeline->delete_areas_and_relink(ca, areas);
undo_stack.push(ta);
// pretty hacky (and doesn't survive undo/redo)
if (panel_timeline->creatingObject == ADD_OBJ_BARS) {
sequence->get_clip(clipIndex)->effects.at(1)->row(0)->field(0)->set_combo_index(1);
}
undo_stack.push(ca);
panel_timeline->redraw_all_clips(true);
@@ -625,7 +623,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
if (panel_timeline->ghosts.size() > 0) {
const Ghost& first_ghost = panel_timeline->ghosts.at(0);
TimelineAction* ta = new TimelineAction();
ComboAction* ca = new ComboAction();
// if we were RIPPLING, move all the clips
if (panel_timeline->tool == TIMELINE_TOOL_RIPPLE) {
@@ -641,13 +639,13 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
ripple_length = first_ghost.old_out - panel_timeline->ghosts.at(0).out;
ripple_point = first_ghost.old_out;
}
QVector<int> ignore_clips;
QVector<Clip*> ignore_clips;
for (int i=0;i<panel_timeline->ghosts.size();i++) {
const Ghost& g = panel_timeline->ghosts.at(i);
// push rippled clips forward if necessary
if (panel_timeline->trim_in_point) {
ignore_clips.append(g.clip);
ignore_clips.append(sequence->clips.at(g.clip));
panel_timeline->ghosts[i].in += ripple_length;
panel_timeline->ghosts[i].out += ripple_length;
}
@@ -656,7 +654,9 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
ripple_point = qMin(ripple_point, comp_point);
}
if (!panel_timeline->trim_in_point) ripple_length = -ripple_length;
ta->ripple(sequence, ripple_point, ripple_length, ignore_clips);
RippleCommand* rc = new RippleCommand(sequence, ripple_point, ripple_length);
rc->ignore = ignore_clips;
ca->append(rc);
}
if (panel_timeline->tool == TIMELINE_TOOL_POINTER
@@ -670,7 +670,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
const Ghost& g = panel_timeline->ghosts.at(i);
if (g.old_in != g.in || g.old_out != g.out || g.track != g.old_track || g.clip_in != g.old_clip_in) {
// create copy of clip
Clip* c = sequence->get_clip(g.clip)->copy(sequence);
Clip* c = sequence->clips.at(g.clip)->copy(sequence);
c->timeline_in = g.in;
c->timeline_out = g.out;
@@ -687,12 +687,12 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
}
}
if (new_clips.size() > 0) {
panel_timeline->delete_areas_and_relink(ta, delete_areas);
panel_timeline->delete_areas_and_relink(ca, delete_areas);
// relink duplicated clips
panel_timeline->relink_clips_using_ids(old_clips, new_clips);
ta->add_clips(sequence, new_clips);
ca->append(new AddClipCommand(sequence, new_clips));
}
} else {
// move clips
@@ -702,7 +702,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
// step 1 - set clips that are moving to "undeletable" (to avoid step 2 deleting any part of them)
const Ghost& g = panel_timeline->ghosts.at(i);
sequence->get_clip(g.clip)->undeletable = true;
sequence->clips.at(g.clip)->undeletable = true;
Selection s;
s.in = g.in;
@@ -710,21 +710,18 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
s.track = g.track;
delete_areas.append(s);
}
panel_timeline->delete_areas_and_relink(ta, delete_areas);
panel_timeline->delete_areas_and_relink(ca, delete_areas);
for (int i=0;i<panel_timeline->ghosts.size();i++) {
sequence->get_clip(panel_timeline->ghosts[i].clip)->undeletable = false;
sequence->clips.at(panel_timeline->ghosts[i].clip)->undeletable = false;
}
}
for (int i=0;i<panel_timeline->ghosts.size();i++) {
Ghost& g = panel_timeline->ghosts[i];
// step 3 - move clips
Clip* c = sequence->get_clip(g.clip);
Clip* c = sequence->clips.at(g.clip);
if (g.transition == NULL) {
ta->increase_timeline_in(sequence, g.clip, g.in - g.old_in);
ta->increase_timeline_out(sequence, g.clip, g.out - g.old_out);
ta->increase_track(sequence, g.clip, g.track - g.old_track);
ta->increase_clip_in(sequence, g.clip, g.clip_in - g.old_clip_in);
ca->append(new MoveClipAction(c, c->timeline_in + (g.in - g.old_in), c->timeline_out + (g.out - g.old_out), c->clip_in + (g.clip_in - g.old_clip_in), c->track + (g.track - g.old_track)));
// adjust transitions if we need to
long new_clip_length = (g.out - g.in);
@@ -734,9 +731,9 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
max_open_length -= c->closing_transition->length;
}
if (max_open_length <= 0) {
ta->delete_transition(sequence, g.clip, TA_OPENING_TRANSITION);
ca->append(new DeleteTransitionCommand(c, TA_OPENING_TRANSITION));
} else if (c->opening_transition->length > max_open_length) {
ta->modify_transition(sequence, g.clip, TA_OPENING_TRANSITION, max_open_length);
ca->append(new ModifyTransitionCommand(c, TA_OPENING_TRANSITION, max_open_length));
}
}
if (c->closing_transition != NULL) {
@@ -745,49 +742,43 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
max_open_length -= c->opening_transition->length;
}
if (max_open_length <= 0) {
ta->delete_transition(sequence, g.clip, TA_CLOSING_TRANSITION);
ca->append(new DeleteTransitionCommand(c, TA_CLOSING_TRANSITION));
} else if (c->closing_transition->length > max_open_length) {
ta->modify_transition(sequence, g.clip, TA_CLOSING_TRANSITION, max_open_length);
ca->append(new ModifyTransitionCommand(c, TA_CLOSING_TRANSITION, max_open_length));
}
}
} else {
bool is_opening_transition = (g.transition == c->opening_transition);
long new_transition_length = g.out - g.in;
ta->modify_transition(
sequence,
g.clip,
is_opening_transition ? TA_OPENING_TRANSITION : TA_CLOSING_TRANSITION,
new_transition_length
);
ca->append(new ModifyTransitionCommand(c, is_opening_transition ? TA_OPENING_TRANSITION : TA_CLOSING_TRANSITION, new_transition_length));
long clip_length = c->getLength();
if (is_opening_transition) {
if (g.in != g.old_in) {
// if transition is going to make the clip bigger, make the clip bigger
ta->increase_timeline_in(sequence, g.clip, g.in - g.old_in);
clip_length -= (g.in - g.old_in);
ta->increase_clip_in(sequence, g.clip, g.clip_in - g.old_clip_in);
ca->append(new MoveClipAction(c, c->timeline_in + (g.in - g.old_in), c->timeline_out, c->clip_in + (g.clip_in - g.old_clip_in), c->track));
clip_length -= (g.in - g.old_in);
}
if (c->closing_transition != NULL) {
if (new_transition_length == clip_length) {
ta->delete_transition(sequence, g.clip, TA_CLOSING_TRANSITION);
ca->append(new DeleteTransitionCommand(c, TA_CLOSING_TRANSITION));
} else if (new_transition_length > clip_length - c->closing_transition->length) {
ta->modify_transition(sequence, g.clip, TA_CLOSING_TRANSITION, clip_length - new_transition_length);
ca->append(new ModifyTransitionCommand(c, TA_CLOSING_TRANSITION, clip_length - new_transition_length));
}
}
} else {
if (g.out != g.old_out) {
// if transition is going to make the clip bigger, make the clip bigger
ta->increase_timeline_out(sequence, g.clip, g.out - g.old_out);
ca->append(new MoveClipAction(c, c->timeline_in, c->timeline_out + (g.out - g.old_out), c->clip_in, c->track));
clip_length += (g.out - g.old_out);
}
if (c->opening_transition != NULL) {
if (new_transition_length == clip_length) {
ta->delete_transition(sequence, g.clip, TA_OPENING_TRANSITION);
ca->append(new DeleteTransitionCommand(c, TA_OPENING_TRANSITION));
} else if (new_transition_length > clip_length - c->opening_transition->length) {
ta->modify_transition(sequence, g.clip, TA_OPENING_TRANSITION, clip_length - new_transition_length);
ca->append(new ModifyTransitionCommand(c, TA_OPENING_TRANSITION, clip_length - new_transition_length));
}
}
}
@@ -795,7 +786,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
}
}
undo_stack.push(ta);
undo_stack.push(ca);
panel_timeline->redraw_all_clips(true);
repaint = false;
@@ -803,19 +794,19 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
} else if (panel_timeline->selecting || panel_timeline->rect_select_proc) {
repaint = true;
} else if (panel_timeline->splitting) {
TimelineAction* ta = new TimelineAction();
ComboAction* ca = new ComboAction();
bool split = false;
for (int i=0;i<panel_timeline->split_tracks.size();i++) {
int split_index = getClipIndexFromCoords(panel_timeline->drag_frame_start, panel_timeline->split_tracks.at(i));
if (split_index > -1 && panel_timeline->split_clip_and_relink(ta, split_index, panel_timeline->drag_frame_start, !alt)) {
if (split_index > -1 && panel_timeline->split_clip_and_relink(ca, split_index, panel_timeline->drag_frame_start, !alt)) {
split = true;
}
}
if (split) {
undo_stack.push(ta);
undo_stack.push(ca);
panel_timeline->redraw_all_clips(true);
} else {
delete ta;
delete ca;
}
panel_timeline->split_cache.clear();
}
@@ -848,8 +839,8 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
panel_effect_controls->multiple = false;
int vclip = -1;
int aclip = -1;
for (int i=0;i<sequence->clip_count();i++) {
Clip* clip = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* clip = sequence->clips.at(i);
if (clip != NULL && panel_timeline->is_clip_selected(clip, true)) {
if (clip->track < 0 && vclip == -1) {
vclip = i;
@@ -870,7 +861,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
if (aclip >= 0) selected_clips.append(aclip);
if (vclip >= 0 && aclip >= 0) {
bool found = false;
Clip* vclip_ref = sequence->get_clip(vclip);
Clip* vclip_ref = sequence->clips.at(vclip);
for (int i=0;i<vclip_ref->linked.size();i++) {
if (vclip_ref->linked.at(i) == aclip) {
found = true;
@@ -892,7 +883,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
void TimelineWidget::init_ghosts() {
for (int i=0;i<panel_timeline->ghosts.size();i++) {
Ghost& g = panel_timeline->ghosts[i];
Clip* c = sequence->get_clip(g.clip);
Clip* c = sequence->clips.at(g.clip);
g.track = g.old_track = c->track;
g.clip_in = g.old_clip_in = c->clip_in;
@@ -958,8 +949,8 @@ void validate_snapping(const Ghost& g, long* frame_diff) {
snap_to_clip = !subvalidate_snapping(g, frame_diff, panel_timeline->playhead);
}
if (snap_to_clip) {
for (int j=0;j<sequence->clip_count();j++) {
Clip* c = sequence->get_clip(j);
for (int j=0;j<sequence->clips.size();j++) {
Clip* c = sequence->clips.at(j);
if (c != NULL) {
if (!subvalidate_snapping(g, frame_diff, c->timeline_in)
&& !subvalidate_snapping(g, frame_diff, c->timeline_out)
@@ -996,7 +987,7 @@ void TimelineWidget::update_ghosts(QPoint& mouse_pos) {
for (int i=0;i<panel_timeline->ghosts.size();i++) {
const Ghost& g = panel_timeline->ghosts.at(i);
Clip* c = NULL;
if (g.clip != -1) c = sequence->get_clip(g.clip);
if (g.clip != -1) c = sequence->clips.at(g.clip);
MediaStream* ms = NULL;
if (g.clip != -1 && c->media_type == MEDIA_TYPE_FOOTAGE) {
@@ -1125,7 +1116,7 @@ void TimelineWidget::update_ghosts(QPoint& mouse_pos) {
g.in = g.old_in + frame_diff;
g.out = g.old_out + frame_diff;
if (g.transition != NULL && g.transition == sequence->get_clip(g.clip)->opening_transition) {
if (g.transition != NULL && g.transition == sequence->clips.at(g.clip)->opening_transition) {
g.clip_in = g.old_clip_in + frame_diff;
}
@@ -1205,8 +1196,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
// select linked clips too
if (config.edit_tool_selects_links) {
for (int j=0;j<sequence->clip_count();j++) {
Clip* c = sequence->get_clip(j);
for (int j=0;j<sequence->clips.size();j++) {
Clip* c = sequence->clips.at(j);
for (int k=0;k<panel_timeline->selections.size();k++) {
const Selection& s = panel_timeline->selections.at(k);
if (!(c->timeline_in < s.in && c->timeline_out < s.in) &&
@@ -1260,8 +1251,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
} else {
// set up movement
// create ghosts
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL) {
Ghost g;
g.transition = NULL;
@@ -1303,11 +1294,11 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
int size = panel_timeline->ghosts.size();
if (panel_timeline->tool == TIMELINE_TOOL_ROLLING) {
for (int i=0;i<size;i++) {
Clip* ghost_clip = sequence->get_clip(panel_timeline->ghosts.at(i).clip);
Clip* ghost_clip = sequence->clips.at(panel_timeline->ghosts.at(i).clip);
// see if any ghosts are touching, in which case flip them
for (int k=0;k<size;k++) {
Clip* comp_clip = sequence->get_clip(panel_timeline->ghosts.at(k).clip);
Clip* comp_clip = sequence->clips.at(panel_timeline->ghosts.at(k).clip);
if ((panel_timeline->trim_in_point && comp_clip->timeline_out == ghost_clip->timeline_in) ||
(!panel_timeline->trim_in_point && comp_clip->timeline_in == ghost_clip->timeline_out)) {
panel_timeline->ghosts[k].trim_in = !panel_timeline->trim_in_point;
@@ -1318,9 +1309,9 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
// then look for other clips we're touching
for (int i=0;i<size;i++) {
const Ghost& g = panel_timeline->ghosts.at(i);
Clip* ghost_clip = sequence->get_clip(g.clip);
for (int j=0;j<sequence->clip_count();j++) {
Clip* comp_clip = sequence->get_clip(j);
Clip* ghost_clip = sequence->clips.at(g.clip);
for (int j=0;j<sequence->clips.size();j++) {
Clip* comp_clip = sequence->clips.at(j);
if (comp_clip->track == ghost_clip->track) {
if ((panel_timeline->trim_in_point && comp_clip->timeline_out == ghost_clip->timeline_in) ||
(!panel_timeline->trim_in_point && comp_clip->timeline_in == ghost_clip->timeline_out)) {
@@ -1357,10 +1348,10 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
} else if (panel_timeline->tool == TIMELINE_TOOL_SLIDE) {
for (int i=0;i<size;i++) {
const Ghost& g = panel_timeline->ghosts.at(i);
Clip* ghost_clip = sequence->get_clip(g.clip);
Clip* ghost_clip = sequence->clips.at(g.clip);
panel_timeline->ghosts[i].trimming = false;
for (int j=0;j<sequence->clip_count();j++) {
Clip* c = sequence->get_clip(j);
for (int j=0;j<sequence->clips.size();j++) {
Clip* c = sequence->clips.at(j);
if (c->track == ghost_clip->track) {
bool found = false;
for (int k=0;k<size;k++) {
@@ -1391,7 +1382,7 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
if (panel_timeline->tool == TIMELINE_TOOL_RIPPLE) {
QVector<Clip*> axis_ghosts;
for (int i=0;i<panel_timeline->ghosts.size();i++) {
Clip* c = sequence->get_clip(panel_timeline->ghosts.at(i).clip);
Clip* c = sequence->clips.at(panel_timeline->ghosts.at(i).clip);
bool found = false;
for (int j=0;j<axis_ghosts.size();j++) {
Clip* cc = axis_ghosts.at(j);
@@ -1408,8 +1399,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
}
}
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL && !panel_timeline->is_clip_selected(c, true)) {
for (int j=0;j<axis_ghosts.size();j++) {
Clip* axis = axis_ghosts.at(j);
@@ -1481,8 +1472,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
int track_max = qMax(track_start, track_end);
QVector<Clip*> selected_clips;
for (int i=0;i<sequence->clip_count();i++) {
Clip* clip = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* clip = sequence->clips.at(i);
if (clip != NULL &&
clip->track >= track_min &&
clip->track <= track_max &&
@@ -1493,7 +1484,7 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
if (!alt) {
for (int j=0;j<clip->linked.size();j++) {
session_clips.append(sequence->get_clip(clip->linked.at(j)));
session_clips.append(sequence->clips.at(clip->linked.at(j)));
}
}
@@ -1550,8 +1541,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
bool cursor_contains_clip = false;
int closeness = INT_MAX;
panel_timeline->transition_select = TA_NO_TRANSITION;
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL && c->track == mouse_track) {
if (panel_timeline->cursor_frame >= c->timeline_in &&
panel_timeline->cursor_frame <= c->timeline_out) {
@@ -1664,8 +1655,8 @@ void TimelineWidget::redraw_clips() {
int video_track_limit = 0;
int audio_track_limit = 0;
long end_frame = 0;
for (int i=0;i<sequence->clip_count();i++) {
Clip* clip = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* clip = sequence->clips.at(i);
if (clip != NULL) {
end_frame = qMax(end_frame, clip->timeline_out);
video_track_limit = qMin(video_track_limit, clip->track);
@@ -1700,8 +1691,8 @@ void TimelineWidget::redraw_clips() {
QPainter clip_painter(&clip_pixmap);
QColor transition_color(255, 0, 0, 16);
for (int i=0;i<sequence->clip_count();i++) {
Clip* clip = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* clip = sequence->clips.at(i);
if (clip != NULL && is_track_visible(clip->track)) {
QRect clip_rect(panel_timeline->getTimelineScreenPointFromFrame(clip->timeline_in), getScreenPointFromTrack(clip->track), clip->getLength() * panel_timeline->zoom, panel_timeline->calculate_track_height(clip->track, -1));
clip_painter.fillRect(clip_rect, QColor(clip->color_r, clip->color_g, clip->color_b));
@@ -2014,8 +2005,8 @@ int TimelineWidget::getScreenPointFromTrack(int track) {
}
int TimelineWidget::getClipIndexFromCoords(long frame, int track) {
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
for (int i=0;i<sequence->clips.size();i++) {
Clip* c = sequence->clips.at(i);
if (c != NULL && c->track == track && frame >= c->timeline_in && frame < c->timeline_out) {
return i;
}
+3 -3
View File
@@ -85,7 +85,7 @@ void ViewerWidget::drawTitleSafeArea() {
glLoadIdentity();
glOrtho(-halfWidth, halfWidth, halfHeight, -halfHeight, -1, 1);
glColor3f(0.5, 0.5, 0.5);
glColor4f(0.5, 0.5, 0.5, 1.0);
glBegin(GL_LINES);
// action safe rectangle
@@ -175,8 +175,8 @@ GLuint ViewerWidget::compose_sequence(Clip* nest, bool render_audio) {
QVector<Clip*> current_clips;
for (int i=0;i<s->clip_count();i++) {
Clip* c = s->get_clip(i);
for (int i=0;i<s->clips.size();i++) {
Clip* c = s->clips.at(i);
// if clip starts within one second and/or hasn't finished yet
if (c != NULL && !(nest != NULL && !same_sign(c->track, nest->track))) {