diff --git a/dialogs/newsequencedialog.cpp b/dialogs/newsequencedialog.cpp index aaf619119..3d581f866 100644 --- a/dialogs/newsequencedialog.cpp +++ b/dialogs/newsequencedialog.cpp @@ -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) diff --git a/dialogs/replaceclipmediadialog.cpp b/dialogs/replaceclipmediadialog.cpp index 8a3321d52..1b95c7593 100644 --- a/dialogs/replaceclipmediadialog.cpp +++ b/dialogs/replaceclipmediadialog.cpp @@ -83,8 +83,8 @@ void ReplaceClipMediaDialog::replace() { use_same_media_in_points->isChecked() ); - for (int i=0;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); if (c != NULL && c->media == old_media) { rcmc->clips.append(c); } diff --git a/mainwindow.cpp b/mainwindow.cpp index 87efd78f3..d79c0cb42 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -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(); } } diff --git a/olive.pro b/olive.pro index bc8154e64..a4d9e7786 100644 --- a/olive.pro +++ b/olive.pro @@ -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 \ diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 1a856aec9..5482db8e1 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -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;iget_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;iget_clip(selected_clips.at(i)); + Clip* c = sequence->clips.at(selected_clips.at(i)); for (int j=0;jeffects.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;iget_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;iget_clip(selected_clips.at(i)); + Clip* c = sequence->clips.at(selected_clips.at(i)); for (int j=0;jeffects.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;iget_clip(selected_clips.at(i)); + Clip* c = sequence->clips.at(selected_clips.at(i)); if (c != NULL) { for (int j=0;jeffects.size();j++) { if (c->effects.at(j)->container->is_focused()) { diff --git a/panels/project.cpp b/panels/project.cpp index 770dcf437..26fc61c59 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -92,18 +92,18 @@ void Project::rename_media(QTreeWidgetItem* item, int column) { void Project::duplicate_selected() { QList items = ui->treeWidget->selectedItems(); bool duped = false; - TimelineAction* ta = new TimelineAction(); + ComboAction* ca = new ComboAction(); for (int j=0;jcopy(), 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 items, QList 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;jclip_count();k++) { - Clip* c = s->get_clip(k); + for (int k=0;kclips.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;iappend(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;iadd_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;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); if (c != NULL) { QList items = source_table->selectedItems(); for (int j=0;jmedia == 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;iclip_count();i++) { + for (int i=0;iclips.size();i++) { // correct links - Clip* correct_clip = s->get_clip(i); + Clip* correct_clip = s->clips.at(i); for (int j=0;jlinked.size();j++) { bool found = false; - for (int k=0;kclip_count();k++) { - if (s->get_clip(k)->load_id == correct_clip->linked.at(j)) { + for (int k=0;kclips.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;jclip_count();j++) { - Clip* c = s->get_clip(j); + for (int j=0;jclips.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 sequences = panel_project->list_all_project_sequences(); for (int i=0;iclip_count();j++) { - Clip* c = s->get_clip(j); + for (int j=0;jclips.size();j++) { + Clip* c = s->clips.at(j); if (c != NULL) { c->refresh(); } diff --git a/panels/project.h b/panels/project.h index 500322810..6c7a32d9f 100644 --- a/panels/project.h +++ b/panels/project.h @@ -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); diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 7b3841430..598dadfc3 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -111,8 +111,8 @@ void Timeline::next_frame() { void Timeline::previous_cut() { if (playhead > 0) { long p_cut = 0; - for (int i=0;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.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;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.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;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.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;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.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;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.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 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;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.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;jclip_count();j++) { - Clip* cc = sequence->get_clip(j); + for (int j=0;jclips.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 Timeline::get_tracks_of_linked_clips(int i) { QVector tracks; - Clip* clip = sequence->get_clip(i); + Clip* clip = sequence->clips.at(i); for (int j=0;jlinked.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 pre_clips; QVector 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;ilinked.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& areas) { } } -void Timeline::delete_areas_and_relink(TimelineAction* ta, QVector& areas) { +void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& areas) { clean_up_selections(areas); QVector pre_clips; @@ -599,47 +599,46 @@ void Timeline::delete_areas_and_relink(TimelineAction* ta, QVector& a for (int i=0;iclip_count();j++) { - Clip* c = sequence->get_clip(j); + for (int j=0;jclips.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& 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;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); if (c != NULL) { for (int j=0;j& old_clips, QVector& n // relink pasted clips for (int i=0;iget_clip(old_clips.at(i)); + Clip* oc = sequence->clips.at(old_clips.at(i)); for (int j=0;jlinked.size();j++) { for (int k=0;klinked.at(j) == old_clips.at(k)) { @@ -724,7 +723,7 @@ void Timeline::relink_clips_using_ids(QVector& old_clips, QVector& 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 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;iadd_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;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.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 secondary_post_splits; // find clips within selection and split - for (int j=0;jclip_count();j++) { - Clip* clip = sequence->get_clip(j); + for (int j=0;jclips.size();j++) { + Clip* clip = sequence->clips.at(j); if (clip != NULL) { for (int i=0;iclosing_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 pre_clips; QVector post_clips; - for (int j=0;jclip_count();j++) { - Clip* clip = sequence->get_clip(j); + for (int j=0;jclips.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;jclip_count();j++) { - Clip* c = sequence->get_clip(j); + for (int j=0;jclips.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;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.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;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.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;jlinked.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;kclips.size();k++) { if (command->clips.at(k) == link) { found = true; diff --git a/panels/timeline.h b/panels/timeline.h index 54e0eb983..6cd93675b 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -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& areas); void deselect_area(long in, long out, int track); - void delete_areas_and_relink(TimelineAction* ta, QVector& areas); + void delete_areas_and_relink(ComboAction *ca, QVector& areas); void relink_clips_using_ids(QVector& old_clips, QVector& new_clips); void update_sequence(); void increase_track_height(); diff --git a/playback/playback.cpp b/playback/playback.cpp index 6e9a79914..f17ef213e 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -311,8 +311,8 @@ void set_sequence(Sequence* s) { void closeActiveClips(Sequence *s, bool wait) { if (s != NULL) { - for (int i=0;iclip_count();i++) { - Clip* c = s->get_clip(i); + for (int i=0;iclips.size();i++) { + Clip* c = s->clips.at(i); if (c != NULL) { if (c->media_type == MEDIA_TYPE_SEQUENCE) { closeActiveClips(static_cast(c->media), wait); diff --git a/project/clip.cpp b/project/clip.cpp index dcc08a25c..c6e42d215 100644 --- a/project/clip.cpp +++ b/project/clip.cpp @@ -99,8 +99,8 @@ void Clip::reset_audio() { case MEDIA_TYPE_SEQUENCE: { Sequence* nested_sequence = static_cast(media); - for (int i=0;iclip_count();i++) { - Clip* c = nested_sequence->get_clip(i); + for (int i=0;iclips.size();i++) { + Clip* c = nested_sequence->clips.at(i); if (c != NULL) c->reset_audio(); } } diff --git a/project/marker.cpp b/project/marker.cpp new file mode 100644 index 000000000..1b5311b31 --- /dev/null +++ b/project/marker.cpp @@ -0,0 +1 @@ +#include "marker.h" diff --git a/project/marker.h b/project/marker.h new file mode 100644 index 000000000..a58f85e48 --- /dev/null +++ b/project/marker.h @@ -0,0 +1,11 @@ +#ifndef MARKER_H +#define MARKER_H + +#include + +struct Marker { + long frame; + QString name; +}; + +#endif // MARKER_H diff --git a/project/sequence.cpp b/project/sequence.cpp index eefeb643d..8c997ce07 100644 --- a/project/sequence.cpp +++ b/project/sequence.cpp @@ -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;iclips.resize(clips.size()); + for (int i=0;iclips[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;jtimeline_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;jtrack < 0 && c->track < vt) { // video clip vt = c->track; diff --git a/project/sequence.h b/project/sequence.h index b8cb3d8f1..20f5dcbdb 100644 --- a/project/sequence.h +++ b/project/sequence.h @@ -4,19 +4,15 @@ #include #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 markers; QVector clips; +private: }; // static variable for the currently active sequence diff --git a/project/undo.cpp b/project/undo.cpp index 510a101e6..dc488d5ca 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -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=0;i--) { + commands.at(i)->undo(); + } +} + +void ComboAction::redo() { + for (int i=0;iredo(); + } +} + +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;itimeline_in -= length; + c->timeline_out -= length; + } +} + +void RippleCommand::redo() { + rippled.clear(); + for (int j=0;jclips.size();j++) { + Clip* c = seq->clips.at(j); + bool found = false; + for (int i=0;itimeline_in >= point) { + c->timeline_in += length; + c->timeline_out += length; + rippled.append(c); + } + } + } +} + +AddClipCommand::AddClipCommand(Sequence* s, QVector& add) : + seq(s), + clips(add) +{} + +AddClipCommand::~AddClipCommand() { + for (int i=0;iclips.last(); + seq->clips.removeLast(); + } +} + +void AddClipCommand::redo() { + // TODO does this actually need to copy? + int linkOffset = seq->clips.size(); + for (int i=0;icopy(seq); + copy->linked.resize(original->linked.size()); + for (int j=0;jlinked.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 all_sequences = panel_project->list_all_project_sequences(); for (int i=0;iclip_count();j++) { - Clip* c = s->get_clip(j); + for (int j=0;jclips.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(); diff --git a/project/undo.h b/project/undo.h index ed6e5fee8..da882def9 100644 --- a/project/undo.h +++ b/project/undo.h @@ -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 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 ignore; + void undo(); + void redo(); +private: + Sequence* seq; + long point; + long length; + QVector rippled; +}; + +class AddClipCommand : public QUndoCommand { +public: + AddClipCommand(Sequence* s, QVector& add); + ~AddClipCommand(); + void undo(); + void redo(); +private: + Sequence* seq; + QVector clips; +}; + +/*class TimelineAction : public QUndoCommand { public: TimelineAction(); ~TimelineAction(); @@ -103,7 +280,7 @@ private: void offset_links(QVector& clips, int offset); bool old_project_changed; -}; +};*/ class LinkCommand : public QUndoCommand { public: diff --git a/ui/keyframeview.cpp b/ui/keyframeview.cpp index c6ddef421..209b03e73 100644 --- a/ui/keyframeview.cpp +++ b/ui/keyframeview.cpp @@ -40,7 +40,7 @@ void KeyframeView::paintEvent(QPaintEvent*) { long effects_out = 0; for (int j=0;jselected_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;ieffects.size();i++) { diff --git a/ui/sourcetable.cpp b/ui/sourcetable.cpp index 54f8e354f..b32288eb6 100644 --- a/ui/sourcetable.cpp +++ b/ui/sourcetable.cpp @@ -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))); } } } diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index e58766981..977bddeb8 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -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; diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 77a6041a4..cb84da3ec 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -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 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 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;itrack < 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;ilinked.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;ilinked.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;ilinked.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 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 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 ignore_clips; + QVector ignore_clips; for (int i=0;ighosts.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;ighosts.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;ighosts.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;isplit_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;iclip_count();i++) { - Clip* clip = sequence->get_clip(i); + for (int i=0;iclips.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;ilinked.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;ighosts.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;jclip_count();j++) { - Clip* c = sequence->get_clip(j); + for (int j=0;jclips.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;ighosts.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;jclip_count();j++) { - Clip* c = sequence->get_clip(j); + for (int j=0;jclips.size();j++) { + Clip* c = sequence->clips.at(j); for (int k=0;kselections.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;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.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;iget_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;kget_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;ighosts.at(i); - Clip* ghost_clip = sequence->get_clip(g.clip); - for (int j=0;jclip_count();j++) { - Clip* comp_clip = sequence->get_clip(j); + Clip* ghost_clip = sequence->clips.at(g.clip); + for (int j=0;jclips.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;ighosts.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;jclip_count();j++) { - Clip* c = sequence->get_clip(j); + for (int j=0;jclips.size();j++) { + Clip* c = sequence->clips.at(j); if (c->track == ghost_clip->track) { bool found = false; for (int k=0;ktool == TIMELINE_TOOL_RIPPLE) { QVector axis_ghosts; for (int i=0;ighosts.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;jclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); if (c != NULL && !panel_timeline->is_clip_selected(c, true)) { for (int j=0;j selected_clips; - for (int i=0;iclip_count();i++) { - Clip* clip = sequence->get_clip(i); + for (int i=0;iclips.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;jlinked.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;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.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;iclip_count();i++) { - Clip* clip = sequence->get_clip(i); + for (int i=0;iclips.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;iclip_count();i++) { - Clip* clip = sequence->get_clip(i); + for (int i=0;iclips.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;iclip_count();i++) { - Clip* c = sequence->get_clip(i); + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); if (c != NULL && c->track == track && frame >= c->timeline_in && frame < c->timeline_out) { return i; } diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index fa42d3b4c..1746d036e 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -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 current_clips; - for (int i=0;iclip_count();i++) { - Clip* c = s->get_clip(i); + for (int i=0;iclips.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))) {