From caee50a9433c46e01b780a0cf8aae1efd90434ad Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 11 Oct 2018 23:32:28 +1100 Subject: [PATCH] various improvements --- dialogs/exportdialog.cpp | 8 ++-- dialogs/speeddialog.cpp | 14 +++++++ effects/effect.cpp | 4 +- io/exportthread.cpp | 16 ++++---- mainwindow.cpp | 48 +++++++++++----------- panels/effectcontrols.cpp | 4 +- panels/panels.cpp | 2 +- panels/panels.h | 2 +- panels/timeline.cpp | 10 ++--- panels/viewer.cpp | 61 ++++++++++++++++------------ panels/viewer.h | 2 +- playback/playback.cpp | 2 +- project/undo.cpp | 40 +++++++++++------- project/undo.h | 85 +-------------------------------------- ui/keyframeview.cpp | 44 +++++++++++--------- 15 files changed, 151 insertions(+), 191 deletions(-) diff --git a/dialogs/exportdialog.cpp b/dialogs/exportdialog.cpp index 8f8c96e42..25bd62aaf 100644 --- a/dialogs/exportdialog.cpp +++ b/dialogs/exportdialog.cpp @@ -318,8 +318,8 @@ void ExportDialog::render_thread_finished() { QMessageBox::critical(this, "Export Failed", "Export failed - " + export_error, QMessageBox::Ok); } prep_ui_for_render(false); - panel_viewer->viewer_widget->makeCurrent(); - panel_viewer->viewer_widget->initializeGL(); + panel_sequence_viewer->viewer_widget->makeCurrent(); + panel_sequence_viewer->viewer_widget->initializeGL(); } void ExportDialog::prep_ui_for_render(bool rendering) { @@ -471,8 +471,8 @@ void ExportDialog::on_pushButton_clicked() { closeActiveClips(sequence, true); - panel_viewer->viewer_widget->context()->doneCurrent(); - panel_viewer->viewer_widget->context()->moveToThread(et); + panel_sequence_viewer->viewer_widget->context()->doneCurrent(); + panel_sequence_viewer->viewer_widget->context()->moveToThread(et); prep_ui_for_render(true); diff --git a/dialogs/speeddialog.cpp b/dialogs/speeddialog.cpp index 3c99e4208..1d4d49a3c 100644 --- a/dialogs/speeddialog.cpp +++ b/dialogs/speeddialog.cpp @@ -296,6 +296,8 @@ void SpeedDialog::frame_rate_update() { } void set_speed(ComboAction* ca, Clip* c, double speed, bool ripple, long& ep, long& lr) { + panel_timeline->deselect_area(c->timeline_in, c->timeline_out, c->track); + long proposed_out = c->timeline_out; double multiplier = (c->speed / speed); proposed_out = c->timeline_in + (c->getLength() * multiplier); @@ -327,11 +329,20 @@ void set_speed(ComboAction* ca, Clip* c, double speed, bool ripple, long& ep, lo } } } + + Selection sel; + sel.in = c->timeline_in; + sel.out = proposed_out; + sel.track = c->track; + sequence->selections.append(sel); } void SpeedDialog::accept() { ComboAction* ca = new ComboAction(); + SetSelectionsCommand* sel_command = new SetSelectionsCommand(sequence); + sel_command->old_data = sequence->selections; + long earliest_point = LONG_MAX; long longest_ripple = LONG_MIN; @@ -403,6 +414,9 @@ void SpeedDialog::accept() { ca->append(new RippleCommand(clips.at(0)->sequence, earliest_point, longest_ripple)); } + sel_command->new_data = sequence->selections; + ca->append(sel_command); + undo_stack.push(ca); panel_timeline->repaint_timeline(true); diff --git a/effects/effect.cpp b/effects/effect.cpp index c5ed89d85..6dde575f6 100644 --- a/effects/effect.cpp +++ b/effects/effect.cpp @@ -161,7 +161,7 @@ int Effect::row_count() { void Effect::refresh() {} void Effect::field_changed() { - panel_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); } bool Effect::is_enabled() { @@ -556,7 +556,7 @@ void EffectRow::toggle_key() { delete_keyframe(kd, index); undo_stack.push(kd); panel_effect_controls->update_keyframes(); - panel_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); } } diff --git a/io/exportthread.cpp b/io/exportthread.cpp index 93a6a8bc8..2f1ff9aa6 100644 --- a/io/exportthread.cpp +++ b/io/exportthread.cpp @@ -309,7 +309,7 @@ bool ExportThread::setupContainer() { void ExportThread::run() { panel_timeline->pause(); - if (!panel_viewer->viewer_widget->context()->makeCurrent(&surface)) { + if (!panel_sequence_viewer->viewer_widget->context()->makeCurrent(&surface)) { qDebug() << "[ERROR] Make current failed"; ed->export_error = "could not make OpenGL context current"; return; @@ -341,13 +341,13 @@ void ExportThread::run() { QOpenGLFramebufferObject fbo(sequence->width, sequence->height, QOpenGLFramebufferObject::CombinedDepthStencil, GL_TEXTURE_RECTANGLE); fbo.bind(); - panel_viewer->viewer_widget->rendering = true; - panel_viewer->viewer_widget->default_fbo = &fbo; + panel_sequence_viewer->viewer_widget->rendering = true; + panel_sequence_viewer->viewer_widget->default_fbo = &fbo; long file_audio_samples = 0; while (sequence->playhead < end_frame && continueEncode) { - panel_viewer->viewer_widget->paintGL(); + panel_sequence_viewer->viewer_widget->paintGL(); double timecode_secs = (double) (sequence->playhead-start_frame) / sequence->frame_rate; if (video_enabled) { @@ -392,8 +392,8 @@ void ExportThread::run() { sequence->playhead++; } - panel_viewer->viewer_widget->default_fbo = NULL; - panel_viewer->viewer_widget->rendering = false; + panel_sequence_viewer->viewer_widget->default_fbo = NULL; + panel_sequence_viewer->viewer_widget->rendering = false; fbo.release(); @@ -456,6 +456,6 @@ void ExportThread::run() { delete [] c_filename; - panel_viewer->viewer_widget->context()->doneCurrent(); - panel_viewer->viewer_widget->context()->moveToThread(qApp->thread()); + panel_sequence_viewer->viewer_widget->context()->doneCurrent(); + panel_sequence_viewer->viewer_widget->context()->moveToThread(qApp->thread()); } diff --git a/mainwindow.cpp b/mainwindow.cpp index 2f9397ef2..fcee3bfc8 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -51,12 +51,12 @@ bool demoNoticeShown = false; void MainWindow::setup_layout() { panel_project->show(); panel_effect_controls->show(); - panel_viewer->show(); + panel_sequence_viewer->show(); panel_timeline->show(); addDockWidget(Qt::TopDockWidgetArea, panel_project); addDockWidget(Qt::TopDockWidgetArea, panel_effect_controls); - addDockWidget(Qt::TopDockWidgetArea, panel_viewer); + addDockWidget(Qt::TopDockWidgetArea, panel_sequence_viewer); addDockWidget(Qt::BottomDockWidgetArea, panel_timeline); resizeDocks({panel_project}, {40}, Qt::Horizontal); @@ -102,7 +102,7 @@ MainWindow::MainWindow(QWidget *parent) : // TODO maybe replace these with non-pointers later on? panel_project = new Project(this); panel_effect_controls = new EffectControls(this); - panel_viewer = new Viewer(this); + panel_sequence_viewer = new Viewer(this); panel_timeline = new Timeline(this); setup_layout(); @@ -174,7 +174,7 @@ MainWindow::~MainWindow() { delete panel_project; delete panel_effect_controls; - delete panel_viewer; + delete panel_sequence_viewer; delete panel_timeline; } @@ -263,7 +263,7 @@ void MainWindow::on_actionEffect_Controls_toggled(bool arg1) void MainWindow::on_actionViewer_toggled(bool arg1) { - panel_viewer->setVisible(arg1); + panel_sequence_viewer->setVisible(arg1); } void MainWindow::on_actionTimeline_toggled(bool arg1) @@ -451,35 +451,35 @@ void MainWindow::on_actionReset_to_default_layout_triggered() void MainWindow::on_actionGo_to_start_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { panel_timeline->go_to_start(); } } void MainWindow::on_actionPrevious_Frame_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { panel_timeline->previous_frame(); } } void MainWindow::on_actionNext_Frame_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { panel_timeline->next_frame(); } } void MainWindow::on_actionGo_to_End_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { panel_timeline->go_to_end(); } } void MainWindow::on_actionPlay_Pause_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { panel_timeline->toggle_play(); } } @@ -521,14 +521,14 @@ void MainWindow::on_actionSlip_Tool_triggered() void MainWindow::on_actionGo_to_Previous_Cut_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_viewer->hasFocus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus())) { panel_timeline->previous_cut(); } } void MainWindow::on_actionGo_to_Next_Cut_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_viewer->hasFocus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus())) { panel_timeline->next_cut(); } } @@ -554,7 +554,7 @@ void MainWindow::windowMenu_About_To_Be_Shown() { ui->actionProject_2->setChecked(panel_project->isVisible()); ui->actionEffect_Controls->setChecked(panel_effect_controls->isVisible()); ui->actionTimeline->setChecked(panel_timeline->isVisible()); - ui->actionViewer->setChecked(panel_viewer->isVisible()); + ui->actionViewer->setChecked(panel_sequence_viewer->isVisible()); } void MainWindow::viewMenu_About_To_Be_Shown() { @@ -574,8 +574,8 @@ void MainWindow::on_actionFrames_triggered() { config.timecode_view = TIMECODE_FRAMES; if (sequence != NULL) { - panel_viewer->update_playhead_timecode(sequence->playhead); - panel_viewer->update_end_timecode(); + panel_sequence_viewer->update_playhead_timecode(sequence->playhead); + panel_sequence_viewer->update_end_timecode(); } } @@ -583,8 +583,8 @@ void MainWindow::on_actionDrop_Frame_triggered() { config.timecode_view = TIMECODE_DROP; if (sequence != NULL) { - panel_viewer->update_playhead_timecode(sequence->playhead); - panel_viewer->update_end_timecode(); + panel_sequence_viewer->update_playhead_timecode(sequence->playhead); + panel_sequence_viewer->update_end_timecode(); } } @@ -592,8 +592,8 @@ void MainWindow::on_actionNon_Drop_Frame_triggered() { config.timecode_view = TIMECODE_NONDROP; if (sequence != NULL) { - panel_viewer->update_playhead_timecode(sequence->playhead); - panel_viewer->update_end_timecode(); + panel_sequence_viewer->update_playhead_timecode(sequence->playhead); + panel_sequence_viewer->update_end_timecode(); } } @@ -742,26 +742,26 @@ void MainWindow::on_actionRectified_Waveforms_triggered() void MainWindow::on_actionDefault_triggered() { config.show_title_safe_area = true; config.use_custom_title_safe_ratio = false; - panel_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); } void MainWindow::on_actionOff_triggered() { config.show_title_safe_area = false; - panel_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); } void MainWindow::on_action4_3_triggered() { config.show_title_safe_area = true; config.use_custom_title_safe_ratio = true; config.custom_title_safe_ratio = 4.0/3.0; - panel_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); } void MainWindow::on_action16_9_triggered() { config.show_title_safe_area = true; config.use_custom_title_safe_ratio = true; config.custom_title_safe_ratio = 16.0/9.0; - panel_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); } void MainWindow::on_actionCustom_triggered() { @@ -784,7 +784,7 @@ void MainWindow::on_actionCustom_triggered() { config.show_title_safe_area = true; config.use_custom_title_safe_ratio = true; config.custom_title_safe_ratio = inputList.at(0).toDouble()/inputList.at(1).toDouble(); - panel_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); } } diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 33b8e4a8e..dbee21d26 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -89,7 +89,7 @@ void EffectControls::menu_select(QAction* q) { panel_timeline->repaint_timeline(true); } else { reload_clips(); - panel_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); } } @@ -229,7 +229,7 @@ void EffectControls::delete_effects() { } if (command->clips.size() > 0) { undo_stack.push(command); - panel_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); } else { delete command; } diff --git a/panels/panels.cpp b/panels/panels.cpp index f6bc97d14..5c96d840e 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -2,5 +2,5 @@ Project* panel_project = 0; EffectControls* panel_effect_controls = 0; -Viewer* panel_viewer = 0; +Viewer* panel_sequence_viewer = 0; Timeline* panel_timeline = 0; diff --git a/panels/panels.h b/panels/panels.h index 9800d8f6c..020a39217 100644 --- a/panels/panels.h +++ b/panels/panels.h @@ -8,7 +8,7 @@ class Timeline; extern Project* panel_project; extern EffectControls* panel_effect_controls; -extern Viewer* panel_viewer; +extern Viewer* panel_sequence_viewer; extern Timeline* panel_timeline; #endif // PANELS_H diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 0389ebec7..376815764 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -193,13 +193,13 @@ void Timeline::play() { start_msecs = QDateTime::currentMSecsSinceEpoch(); playback_updater.start(); playing = true; - panel_viewer->set_playpause_icon(false); + panel_sequence_viewer->set_playpause_icon(false); audio_thread->notifyReceiver(); } void Timeline::pause() { playing = false; - panel_viewer->set_playpause_icon(true); + panel_sequence_viewer->set_playpause_icon(true); playback_updater.stop(); } @@ -296,7 +296,7 @@ void Timeline::repaint_timeline(bool changed) { if (changed) { reset_all_audio(); update_effect_controls(); - if (!playing) panel_viewer->viewer_widget->update(); + if (!playing) panel_sequence_viewer->viewer_widget->update(); } else if (playing) { sequence->playhead = round(playhead_start + ((QDateTime::currentMSecsSinceEpoch()-start_msecs) * 0.001 * sequence->frame_rate)); } @@ -310,7 +310,7 @@ void Timeline::repaint_timeline(bool changed) { panel_timeline->ui->horizontalScrollBar->setMaximum(qMax(0, getScreenPointFromFrame(panel_timeline->zoom, sequence->getEndFrame()) + 100 - ui->editAreas->width())); if (last_frame != sequence->playhead) { - panel_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); ui->audio_monitor->update(); last_frame = sequence->playhead; } @@ -323,7 +323,7 @@ void Timeline::repaint_timeline(bool changed) { ui->horizontalScrollBar->setValue(target_scroll); } - panel_viewer->update_playhead_timecode(sequence->playhead); + panel_sequence_viewer->update_playhead_timecode(sequence->playhead); } } diff --git a/panels/viewer.cpp b/panels/viewer.cpp index f11a58403..f4acb535c 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -6,6 +6,7 @@ #include "project/sequence.h" #include "panels/panels.h" #include "io/config.h" +#include "io/media.h" #define FRAMES_IN_ONE_MINUTE 1798 // 1800 - 2 #define FRAMES_IN_TEN_MINUTES 17978 // (FRAMES_IN_ONE_MINUTE * 10) - 2 @@ -23,7 +24,7 @@ Viewer::Viewer(QWidget *parent) : ui->setupUi(this); ui->glViewerPane->child = ui->openGLWidget; viewer_widget = ui->openGLWidget; - update_sequence(); + update_media(MEDIA_TYPE_SEQUENCE, NULL); ui->currentTimecode->set_default_value(qSNaN()); ui->currentTimecode->set_value(0, false); @@ -117,39 +118,47 @@ void Viewer::update_end_timecode() { } } -/*void Viewer::update_media(int type) { +void Viewer::update_media(int type, void* media) { + switch (type) { + case MEDIA_TYPE_FOOTAGE: + { + } + break; + case MEDIA_TYPE_SEQUENCE: + { + Sequence* s = static_cast(media); -}*/ + bool null_sequence = (s == NULL); -void Viewer::update_sequence() { - bool null_sequence = (sequence == NULL); + ui->openGLWidget->setEnabled(!null_sequence); + ui->openGLWidget->setVisible(!null_sequence); + ui->pushButton->setEnabled(!null_sequence); + ui->pushButton_2->setEnabled(!null_sequence); + ui->pushButton_3->setEnabled(!null_sequence); + ui->pushButton_4->setEnabled(!null_sequence); + ui->pushButton_5->setEnabled(!null_sequence); - ui->openGLWidget->setEnabled(!null_sequence); - ui->openGLWidget->setVisible(!null_sequence); - ui->pushButton->setEnabled(!null_sequence); - ui->pushButton_2->setEnabled(!null_sequence); - ui->pushButton_3->setEnabled(!null_sequence); - ui->pushButton_4->setEnabled(!null_sequence); - ui->pushButton_5->setEnabled(!null_sequence); + init_audio(); - init_audio(); + if (!null_sequence) { + config.timecode_view = (frame_rate_is_droppable(s->frame_rate)) ? TIMECODE_DROP : TIMECODE_NONDROP; - if (!null_sequence) { - config.timecode_view = (frame_rate_is_droppable(sequence->frame_rate)) ? TIMECODE_DROP : TIMECODE_NONDROP; + update_playhead_timecode(s->playhead); + update_end_timecode(); - update_playhead_timecode(sequence->playhead); - update_end_timecode(); + ui->glViewerPane->aspect_ratio = (float) s->width / (float) s->height; + ui->glViewerPane->adjust(); + } else { + update_playhead_timecode(0); + update_end_timecode(); + } - ui->glViewerPane->aspect_ratio = (float) sequence->width / (float) sequence->height; - ui->glViewerPane->adjust(); - } else { - update_playhead_timecode(0); - update_end_timecode(); - } + viewer_widget->update(); - viewer_widget->update(); - - update(); + update(); + } + break; + } } void Viewer::on_pushButton_clicked() diff --git a/panels/viewer.h b/panels/viewer.h index 5335a1a57..90197f80f 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -21,7 +21,7 @@ class Viewer : public QDockWidget public: explicit Viewer(QWidget *parent = 0); ~Viewer(); - void update_sequence(); + void update_media(int type, void* media); void compose(); void set_playpause_icon(bool play); void update_playhead_timecode(long p); diff --git a/playback/playback.cpp b/playback/playback.cpp index 22425eb10..4e874674d 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -302,7 +302,7 @@ void set_sequence(Sequence* s) { closeActiveClips(sequence, true); sequence = s; panel_timeline->update_sequence(); - panel_viewer->update_sequence(); + panel_sequence_viewer->update_media(MEDIA_TYPE_SEQUENCE, sequence); panel_timeline->setFocus(); } diff --git a/project/undo.cpp b/project/undo.cpp index ea582da01..742526408 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -11,6 +11,7 @@ #include "panels/project.h" #include "panels/effectcontrols.h" #include "panels/viewer.h" +#include "panels/timeline.h" #include "playback/playback.h" #include "ui/sourcetable.h" #include "effects/effect.h" @@ -426,28 +427,39 @@ AddClipCommand::~AddClipCommand() { for (int i=0;iclips.last(); + Clip* c = seq->clips.last(); + panel_timeline->deselect_area(c->timeline_in, c->timeline_out, c->track); + undone_clips.prepend(c); seq->clips.removeLast(); } mainWindow->setWindowModified(old_project_changed); } 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); - } + if (undone_clips.size() > 0) { + for (int i=0;iclips.append(undone_clips.at(i)); + } + undone_clips.clear(); + } else { + 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); + } + } mainWindow->setWindowModified(true); } @@ -1370,14 +1382,14 @@ void SetAutoscaleAction::undo() { for (int i=0;iautoscale = !clips.at(i)->autoscale; } - panel_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); } void SetAutoscaleAction::redo() { for (int i=0;iautoscale = !clips.at(i)->autoscale; } - panel_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); } AddMarkerAction::AddMarkerAction(Sequence* s, long t, QString n) : diff --git a/project/undo.h b/project/undo.h index 409914e1a..6a4ae18c1 100644 --- a/project/undo.h +++ b/project/undo.h @@ -218,93 +218,10 @@ public: private: Sequence* seq; QVector clips; + QVector undone_clips; bool old_project_changed; }; -/*class TimelineAction : public QUndoCommand { -public: - TimelineAction(); - ~TimelineAction(); - void change_sequence(Sequence* s); - void new_sequence(QTreeWidgetItem* s, QTreeWidgetItem* parent); - void add_clips(Sequence* s, QVector& add); - void set_timeline_in(Sequence* s, int clip, long value); - void increase_timeline_in(Sequence* s, int clip, long value); - void set_timeline_out(Sequence* s, int clip, long value); - void increase_timeline_out(Sequence* s, int clip, long value); - void set_clip_in(Sequence* s, int clip, long value); - void increase_clip_in(Sequence* s, int clip, long value); - void set_track(Sequence* s, int clip, int value); - void increase_track(Sequence* s, int clip, int value); - void delete_clip(Sequence* s, int clip); - void add_media(QTreeWidgetItem* item, QTreeWidgetItem* parent); - void delete_media(QTreeWidgetItem* item); - void ripple(Sequence* s, long point, long length); - void ripple(Sequence* s, long point, long length, QVector &ignore); - void set_in_out(Sequence* s, bool enabled, long in, long out); - void add_effect(Sequence* s, int clip, int effect); - void add_transition(Sequence* s, int clip, int transition, int type); - void modify_transition(Sequence* s, int clip, int type, long length); - void delete_transition(Sequence* s, int clip, int type); - void undo(); - void redo(); -private: - bool done; - - bool change_seq; - Sequence* old_seq; - Sequence* new_seq; - - QVector new_sequence_items; - QVector new_sequence_parents; - - QVector sequences; - QVector actions; - QVector clips; - QVector transition_types; - QVector old_values; - QVector new_values; - - QVector deleted_clips; - QVector deleted_clips_indices; - QVector deleted_clip_sequences; - - QVector sequence_to_add_clips_to; - QVector clips_to_add; - QVector added_indexes; - - QVector removed_link_from_sequence; - QVector removed_link_from; - QVector removed_link_to; - - QVector deleted_media; - QVector deleted_media_parents; - - QVector media_to_add; - QVector media_to_add_parents; - - Sequence* ripple_sequence; - bool ripple_enabled; - long ripple_point; - long ripple_length; - QVector rippled_clips; - QVector ripple_ignores; - - bool change_in_out; - Sequence* change_in_out_sequence; - bool old_in_out_enabled; - bool new_in_out_enabled; - long old_sequence_in; - long new_sequence_in; - long old_sequence_out; - long new_sequence_out; - - void new_action(Sequence* s, int action, int clip, int transition_type, long old_val, long new_val); - void offset_links(QVector& clips, int offset); - - bool old_project_changed; -};*/ - class LinkCommand : public QUndoCommand { public: LinkCommand(); diff --git a/ui/keyframeview.cpp b/ui/keyframeview.cpp index 6b6a52499..4243a0097 100644 --- a/ui/keyframeview.cpp +++ b/ui/keyframeview.cpp @@ -85,7 +85,11 @@ void KeyframeView::paintEvent(QPaintEvent*) { header->set_visible_in(effects_in); int playhead_x = getScreenPointFromFrame(panel_effect_controls->zoom, sequence->playhead-visible_in) - x_scroll; - p.setPen(Qt::red); + if (dragging && panel_timeline->snapped) { + p.setPen(Qt::white); + } else { + p.setPen(Qt::red); + } p.drawLine(playhead_x, 0, playhead_x, height()); } @@ -120,7 +124,7 @@ void KeyframeView::delete_selected_keyframes() { selected_keyframes.clear(); selected_rows.clear(); update(); - panel_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); } else { delete kd; } @@ -194,26 +198,26 @@ void KeyframeView::mousePressEvent(QMouseEvent *event) { } void KeyframeView::mouseMoveEvent(QMouseEvent* event) { - /*unsetCursor(); - bool new_mo = false; - for (int i=0;iy() > rowY.at(i)-KEYFRAME_SIZE-KEYFRAME_SIZE && event->y() < rowY.at(i)+KEYFRAME_SIZE+KEYFRAME_SIZE) { - setCursor(Qt::CrossCursor); - mouseover_frame = getFrameFromScreenPoint(panel_effect_controls->zoom, event->x()) + visible_in; - mouseover_row = i; - new_mo = true; - break; - } - } - if (new_mo || (new_mo != mouseover)) { - update(); - } - mouseover = new_mo;*/ if (mousedown) { if (keys_selected) { + // move keyframes frame_diff = getFrameFromScreenPoint(panel_effect_controls->zoom, event->x()) - drag_frame_start; - // validate frame_diff + // snapping to playhead + if (panel_timeline->snapping) { + for (int i=0;iparent_effect->parent_clip; + long key_time = row->keyframe_times.at(selected_keyframes.at(i)) + frame_diff - c->clip_in + c->timeline_in; + long key_eval = key_time; + if (panel_timeline->snap_to_timeline(&key_eval, true, true, true)) { + frame_diff += (key_eval - key_time); + break; + } + } + } + + // validate frame_diff (make sure no keyframes overlap each other) for (int i=0;ikeyframe_times.at(selected_keyframes.at(i)); @@ -221,8 +225,10 @@ void KeyframeView::mouseMoveEvent(QMouseEvent* event) { while (!keyframeIsSelected(row, j) && row->keyframe_times.at(j) == eval_key + frame_diff) { if (last_frame_diff > frame_diff) { frame_diff++; + panel_timeline->snapped = false; } else { frame_diff--; + panel_timeline->snapped = false; } } } @@ -232,6 +238,7 @@ void KeyframeView::mouseMoveEvent(QMouseEvent* event) { dragging = true; } else { + // do a rect select rect_select_w = event->x() - rect_select_x; rect_select_h = event->y() - rect_select_y; @@ -274,5 +281,6 @@ void KeyframeView::mouseReleaseEvent(QMouseEvent*) { select_rect = false; dragging = false; mousedown = false; + panel_timeline->snapped = false; update(); }