diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 9e8c4b648..e879ea824 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -124,6 +124,7 @@ void Timeline::reset_all_audio() { c->reset_audio = true; c->frame_sample_index = 0; c->audio_buffer_write = 0; + c->reached_end = false; } } } diff --git a/panels/timeline.h b/panels/timeline.h index eadce092e..8702669d1 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -151,6 +151,8 @@ public: bool moving_init; bool moving_proc; QVector ghosts; + bool video_ghosts; + bool audio_ghosts; // trimming int trim_target; diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 0b695554c..3bb8a68f4 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -56,6 +56,8 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->source() == panel_project->source_table) { event->accept(); + panel_timeline->video_ghosts = false; + panel_timeline->audio_ghosts = false; QPoint pos = event->pos(); QList items = panel_project->source_table->selectedItems(); long entry_point; @@ -130,11 +132,13 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { g.track = j; g.media_stream = m->audio_tracks.at(j)->file_index; panel_timeline->ghosts.append(g); + panel_timeline->audio_ghosts = true; } for (int j=0;jvideo_tracks.size();j++) { g.track = -1-j; g.media_stream = m->video_tracks.at(j)->file_index; panel_timeline->ghosts.append(g); + panel_timeline->video_ghosts = true; } } } @@ -329,10 +333,27 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) { panel_timeline->selections.clear(); } + bool selected_transition = false; Selection s; - s.in = clip->timeline_in; s.out = clip->timeline_out; + if (clip->opening_transition != NULL) { + long open_transition_limit = clip->timeline_in + clip->opening_transition->length; + if (panel_timeline->drag_frame_start < open_transition_limit) { + s.out = open_transition_limit; + selected_transition = true; + } + } + + s.in = clip->timeline_in; + if (clip->closing_transition != NULL) { + long close_transition_limit = clip->timeline_out - clip->closing_transition->length; + if (panel_timeline->drag_frame_start > close_transition_limit) { + s.in = close_transition_limit; + selected_transition = true; + } + } + s.track = clip->track; panel_timeline->selections.append(s); @@ -341,7 +362,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) { } // if alt is not down, select links - if (!(event->modifiers() & Qt::AltModifier)) { + if (!(event->modifiers() & Qt::AltModifier) && !selected_transition) { for (int i=0;ilinked.size();i++) { Clip* link = sequence->get_clip(clip->linked.at(i)); if (!panel_timeline->is_clip_selected(link, true)) { @@ -776,11 +797,14 @@ void TimelineWidget::update_ghosts(QPoint& mouse_pos) { g.out = g.old_out + frame_diff; if (panel_timeline->importing) { - int abs_track_diff = abs(track_diff); - if (g.old_track < 0) { // clip is video - g.track -= abs_track_diff; - } else { // clip is audio - g.track += abs_track_diff; + if ((panel_timeline->video_ghosts && mouse_track < 0) + || (panel_timeline->audio_ghosts && mouse_track >= 0)) { + int abs_track_diff = abs(track_diff); + if (g.old_track < 0) { // clip is video + g.track -= abs_track_diff; + } else { // clip is audio + g.track += abs_track_diff; + } } } else if (same_sign(g.old_track, panel_timeline->drag_track_start)) { g.track += track_diff;