From c37632d3aadf5b36df73437d132d648a30cddd03 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 19 Oct 2018 01:36:11 +1100 Subject: [PATCH] almost finished setting in-out points in footage viewer --- mainwindow.cpp | 16 ++++---- panels/project.cpp | 4 ++ panels/viewer.cpp | 23 +++++++++-- panels/viewer.h | 1 + project/sequence.cpp.autosave | 75 +++++++++++++++++++++++++++++++++++ project/sequence.h | 2 + project/undo.cpp | 16 ++++++++ ui/timelinewidget.cpp | 15 +++++-- 8 files changed, 136 insertions(+), 16 deletions(-) create mode 100644 project/sequence.cpp.autosave diff --git a/mainwindow.cpp b/mainwindow.cpp index 1da5e9eb7..a627a5d13 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -687,13 +687,11 @@ void MainWindow::on_actionRipple_To_In_Point_triggered() if (panel_timeline->focused()) panel_timeline->ripple_to_in_point(true); } -void MainWindow::on_actionRipple_to_Out_Point_triggered() -{ +void MainWindow::on_actionRipple_to_Out_Point_triggered() { if (panel_timeline->focused()) panel_timeline->ripple_to_in_point(false); } -void MainWindow::on_actionSet_In_Point_triggered() -{ +void MainWindow::on_actionSet_In_Point_triggered() { if (panel_timeline->focused() || panel_sequence_viewer->is_focused()) { panel_sequence_viewer->set_in_point(); } else if (panel_footage_viewer->is_focused()) { @@ -701,8 +699,7 @@ void MainWindow::on_actionSet_In_Point_triggered() } } -void MainWindow::on_actionSet_Out_Point_triggered() -{ +void MainWindow::on_actionSet_Out_Point_triggered() { if (panel_timeline->focused() || panel_sequence_viewer->is_focused()) { panel_sequence_viewer->set_out_point(); } else if (panel_footage_viewer->is_focused()) { @@ -711,9 +708,10 @@ void MainWindow::on_actionSet_Out_Point_triggered() } void MainWindow::on_actionClear_In_Out_triggered() { - if ((panel_timeline->focused() || panel_sequence_viewer->is_focused()) && sequence->using_workarea) { - undo_stack.push(new SetTimelineInOutCommand(sequence, false, 0, 0)); - update_ui(false); + if (panel_timeline->focused() || panel_sequence_viewer->is_focused()) { + panel_sequence_viewer->clear_inout_point(); + } else if (panel_footage_viewer->is_focused()) { + panel_footage_viewer->clear_inout_point(); } } diff --git a/panels/project.cpp b/panels/project.cpp index c5d4cc9d4..f46a729c2 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -484,6 +484,7 @@ void Project::process_file_list(bool recursive, QStringList& files, QTreeWidgetI m = new Media(); } + m->using_inout = false; m->url = file; m->name = get_file_name_from_path(files.at(i)); @@ -729,6 +730,9 @@ bool Project::load_worker(QFile& f, QXmlStreamReader& stream, int type) { QTreeWidgetItem* item = new_item(); Media* m = new Media(); + // TODO make save/load-able + m->using_inout = false; + for (int j=0;jupdate(); update_header_zoom(); if (seq != NULL) update_playhead_timecode(seq->playhead); - update_end_timecode(); + update_end_timecode(); +} + +void Viewer::clear_inout_point() { + if (seq->using_workarea) { + undo_stack.push(new SetTimelineInOutCommand(seq, false, 0, 0)); + update_parents(); + } } void Viewer::set_in_point() { - qDebug() << "in h"; ui->headers->set_in_point(seq->playhead); } void Viewer::set_out_point() { - qDebug() << "out h"; ui->headers->set_out_point(seq->playhead); } @@ -253,14 +259,18 @@ void Viewer::set_media(int type, void* media) { seq = new Sequence(); created_sequence = true; + seq->wrapper_sequence = true; seq->name = footage->name; + seq->using_workarea = footage->using_inout; + seq->workarea_in = footage->in; + seq->workarea_out = footage->out; + if (footage->video_tracks.size() > 0) { MediaStream* video_stream = footage->video_tracks.at(0); seq->width = video_stream->video_width; seq->height = video_stream->video_height; if (video_stream->video_frame_rate > 0) seq->frame_rate = video_stream->video_frame_rate; - qDebug() << seq->frame_rate << video_stream->video_frame_rate; Clip* c = new Clip(seq); c->media = footage; @@ -338,6 +348,11 @@ void Viewer::timer_update() { void Viewer::clean_created_seq() { if (created_sequence) { + // TODO delete undo commands referencing this sequence to avoid crashes + /*for (int i=0;i + +Sequence::Sequence() : + playhead(0), + using_workarea(false), + workarea_in(0), + workarea_out(0), + wrapper_sequence(false) +{ +} + +Sequence::~Sequence() { + // dealloc all clips + for (int i=0;iname = name + " (copy)"; + s->width = width; + s->height = height; + s->frame_rate = frame_rate; + s->audio_frequency = audio_frequency; + s->audio_layout = audio_layout; + s->clips.resize(clips.size()); + for (int i=0;iclips[i] = NULL; + } else { + Clip* copy = c->copy(s); + copy->linked = c->linked; + s->clips[i] = copy; + } + } + return s; +} + +long Sequence::getEndFrame() { + long end = 0; + for (int j=0;jtimeline_out > end) { + end = c->timeline_out; + } + } + return end; +} + +void Sequence::getTrackLimits(int* video_tracks, int* audio_tracks) { + int vt = 0; + int at = 0; + for (int j=0;jtrack < 0 && c->track < vt) { // video clip + vt = c->track; + } else if (c->track > at) { + at = c->track; + } + } + } + if (video_tracks != NULL) *video_tracks = vt; + if (audio_tracks != NULL) *audio_tracks = at; +} + +// static variable for the currently active sequence +Sequence* sequence = NULL; diff --git a/project/sequence.h b/project/sequence.h index 85a57bdc9..e7caadaab 100644 --- a/project/sequence.h +++ b/project/sequence.h @@ -27,6 +27,8 @@ struct Sequence { long workarea_in; long workarea_out; + bool wrapper_sequence; + int save_id; QVector markers; diff --git a/project/undo.cpp b/project/undo.cpp index bd3e21c98..435635166 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -163,6 +163,14 @@ void SetTimelineInOutCommand::undo() { seq->workarea_in = old_in; seq->workarea_out = old_out; + // footage viewer functions + if (seq->wrapper_sequence) { + Media* m = static_cast(seq->clips.at(0)->media); + m->using_inout = old_enabled; + m->in = old_in; + m->out = old_out; + } + mainWindow->setWindowModified(old_project_changed); } @@ -175,6 +183,14 @@ void SetTimelineInOutCommand::redo() { seq->workarea_in = new_in; seq->workarea_out = new_out; + // footage viewer functions + if (seq->wrapper_sequence) { + Media* m = static_cast(seq->clips.at(0)->media); + m->using_inout = new_enabled; + m->in = new_in; + m->out = new_out; + } + mainWindow->setWindowModified(true); } diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 2540a7cd0..ab1c50e8a 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -272,12 +272,18 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { Sequence* s = NULL; void* media = NULL; long sequence_length; + long default_clip_in = 0; switch (item_type) { case MEDIA_TYPE_FOOTAGE: m = get_footage_from_tree(item); media = m; can_import = m->ready; + if (m->using_inout) { + double source_fr = 30; + if (m->video_tracks.size() > 0) source_fr = m->video_tracks.at(0)->video_frame_rate; + default_clip_in = refactor_frame_number(m->in, source_fr, predicted_new_frame_rate); + } break; case MEDIA_TYPE_SEQUENCE: s = get_sequence_from_tree(item); @@ -285,6 +291,9 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { if (sequence != NULL) sequence_length = refactor_frame_number(sequence_length, s->frame_rate, sequence->frame_rate); media = s; can_import = (s != sequence && sequence_length != 0); + if (s->using_workarea) { + default_clip_in = refactor_frame_number(s->workarea_in, s->frame_rate, predicted_new_frame_rate); + } break; default: can_import = false; @@ -295,18 +304,18 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { g.clip = -1; g.media_type = item_type; g.trimming = false; - g.old_clip_in = g.clip_in = 0; + g.old_clip_in = g.clip_in = default_clip_in; g.media = media; g.in = entry_point; g.transition = NULL; - // is video source a still image? switch (item_type) { case MEDIA_TYPE_FOOTAGE: + // is video source a still image? if (m->video_tracks.size() > 0 && m->video_tracks[0]->infinite_length && m->audio_tracks.size() == 0) { g.out = g.in + 100; } else { - g.out = entry_point + m->get_length_in_frames(predicted_new_frame_rate); + g.out = entry_point + m->get_length_in_frames(predicted_new_frame_rate) - default_clip_in; } for (int j=0;jaudio_tracks.size();j++) {