revamped undo system in preparation for marker support
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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();
|
||||
|
||||
@@ -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
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#include "marker.h"
|
||||
@@ -0,0 +1,11 @@
|
||||
#ifndef MARKER_H
|
||||
#define MARKER_H
|
||||
|
||||
#include <QString>
|
||||
|
||||
struct Marker {
|
||||
long frame;
|
||||
QString name;
|
||||
};
|
||||
|
||||
#endif // MARKER_H
|
||||
+12
-31
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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))) {
|
||||
|
||||
Reference in New Issue
Block a user