diff --git a/mainwindow.cpp b/mainwindow.cpp index cfc01e372..6d90ca898 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -890,7 +890,6 @@ void MainWindow::on_actionEdit_to_Out_Point_triggered() { } void MainWindow::on_actionNest_triggered() { - /* if (sequence != NULL) { QVector selected_clips; long earliest_point = LONG_MAX; @@ -906,7 +905,7 @@ void MainWindow::on_actionNest_triggered() { if (!selected_clips.isEmpty()) { Sequence* s = new Sequence(); - s->name = "NEST"; + s->name = panel_project->get_next_sequence_name("Nested Sequence"); s->width = sequence->width; s->height = sequence->height; s->frame_rate = sequence->frame_rate; @@ -923,5 +922,4 @@ void MainWindow::on_actionNest_triggered() { undo_stack.push(ca); } } - */ } diff --git a/panels/project.cpp b/panels/project.cpp index c720d73dc..959cfe522 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -59,13 +59,15 @@ Project::~Project() { delete ui; } -QString Project::get_next_sequence_name() { +QString Project::get_next_sequence_name(QString start) { + if (start.isEmpty()) start = "Sequence"; + int n = 1; bool found = true; QString name; while (found) { found = false; - name = "Sequence "; + name = start + " "; if (n < 10) { name += "0"; } @@ -81,6 +83,73 @@ QString Project::get_next_sequence_name() { return name; } +Sequence* create_sequence_from_media(QVector& media_list, QVector& type_list) { + Sequence* s = new Sequence(); + + s->name = panel_project->get_next_sequence_name(); + + // shitty hardcoded default values + s->width = 1920; + s->height = 1080; + s->frame_rate = 29.97; + s->audio_frequency = 48000; + s->audio_layout = 3; + + bool got_video_values = false; + bool got_audio_values = false; + for (int i=0;i(media_list.at(i)); + if (m->ready) { + if (!got_video_values) { + for (int j=0;jvideo_tracks.size();j++) { + MediaStream* ms = m->video_tracks.at(j); + s->width = ms->video_width; + s->height = ms->video_height; + if (ms->video_frame_rate != 0) { + s->frame_rate = ms->video_frame_rate; + + if (ms->video_interlacing != VIDEO_PROGRESSIVE) s->frame_rate *= 2; + + // only break with a decent frame rate, otherwise there may be a better candidate + got_video_values = true; + break; + } + } + } + if (!got_audio_values) { + for (int j=0;jaudio_tracks.size();j++) { + MediaStream* ms = m->audio_tracks.at(j); + s->audio_frequency = ms->audio_frequency; + got_audio_values = true; + break; + } + } + } + } + break; + case MEDIA_TYPE_SEQUENCE: + { + Sequence* seq = static_cast(media_list.at(i)); + s->width = seq->width; + s->height = seq->height; + s->frame_rate = seq->frame_rate; + s->audio_frequency = seq->audio_frequency; + s->audio_layout = seq->audio_layout; + + got_video_values = true; + got_audio_values = true; + } + break; + } + if (got_video_values && got_audio_values) break; + } + + return s; +} + void Project::rename_media(QTreeWidgetItem* item, int column) { int type = get_type_from_tree(item); QString n = item->text(column); diff --git a/panels/project.h b/panels/project.h index 03da87be4..38baeb91a 100644 --- a/panels/project.h +++ b/panels/project.h @@ -37,6 +37,8 @@ void set_sequence_of_tree(QTreeWidgetItem* item, Sequence* sequence); void set_item_to_folder(QTreeWidgetItem* item); void update_footage_tooltip(QTreeWidgetItem* item, Media* media, QString error = 0); +Sequence* create_sequence_from_media(QVector& media_list, QVector& type_list); + QString get_channel_layout_name(int channels, int layout); QString get_interlacing_name(int interlacing); @@ -50,7 +52,7 @@ public: bool is_focused(); void clear(); void new_sequence(ComboAction *ca, Sequence* s, bool open, QTreeWidgetItem* parent); - QString get_next_sequence_name(); + QString get_next_sequence_name(QString start = 0); void delete_media(QTreeWidgetItem* item); void process_file_list(bool recursive, QStringList& files, QTreeWidgetItem *parent, QTreeWidgetItem* replace); void replace_media(QTreeWidgetItem* item, QString filename); diff --git a/ui/sourcetable.cpp b/ui/sourcetable.cpp index 08f856375..b2324bbcd 100644 --- a/ui/sourcetable.cpp +++ b/ui/sourcetable.cpp @@ -64,6 +64,10 @@ void SourceTable::show_context_menu() { } } + // create sequence from + QAction* create_seq_from = menu.addAction("Create Sequence With This Media"); + connect(create_seq_from, SIGNAL(triggered(bool)), this, SLOT(create_seq_from_selected())); + // ONLY sequences are selected if (all_sequences) { // ONLY sequences are selected @@ -90,6 +94,26 @@ void SourceTable::show_context_menu() { menu.exec(QCursor::pos()); } +void SourceTable::create_seq_from_selected() { + if (!selectedItems().isEmpty()) { + QVector media_list; + QVector type_list; + for (int i=0;inew_sequence(ca, s, true, NULL); + undo_stack.push(ca); + } +} + void SourceTable::item_renamed(QTreeWidgetItem* item) { if (editing_item == item) { MediaRename* mr = new MediaRename(); diff --git a/ui/sourcetable.h b/ui/sourcetable.h index 4236e77fc..13b55e109 100644 --- a/ui/sourcetable.h +++ b/ui/sourcetable.h @@ -28,6 +28,7 @@ private slots: void stop_rename_timer(); void item_renamed(QTreeWidgetItem *item); void show_context_menu(); + void create_seq_from_selected(); }; #endif // SOURCETABLE_H diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 918917ce9..7c6e012e4 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -40,6 +40,7 @@ TimelineWidget::TimelineWidget(QWidget *parent) : QWidget(parent) { selection_command = NULL; + self_created_sequence = NULL; scroll = 0; bottom_align = false; @@ -292,73 +293,20 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { panel_timeline->audio_ghosts = false; QPoint pos = event->pos(); long entry_point; + + double using_fr; + if (sequence == NULL) { // if no sequence, we're going to create a new one using the clips as a reference entry_point = 0; - // shitty hardcoded default values - predicted_video_width = 1920; - predicted_video_height = 1080; - predicted_new_frame_rate = 29.97; - predicted_audio_freq = 48000; - predicted_audio_layout = 3; - - bool got_video_values = false; - bool got_audio_values = false; - for (int i=0;i(media_list.at(i)); - if (m->ready) { - if (!got_video_values) { - for (int j=0;jvideo_tracks.size();j++) { - MediaStream* ms = m->video_tracks.at(j); - predicted_video_width = ms->video_width; - predicted_video_height = ms->video_height; - if (ms->video_frame_rate != 0) { - predicted_new_frame_rate = ms->video_frame_rate; - - if (ms->video_interlacing != VIDEO_PROGRESSIVE) predicted_new_frame_rate *= 2; - - // only break with a decent frame rate, otherwise there may be a better candidate - got_video_values = true; - break; - } - } - } - if (!got_audio_values) { - for (int j=0;jaudio_tracks.size();j++) { - MediaStream* ms = m->audio_tracks.at(j); - predicted_audio_freq = ms->audio_frequency; - got_audio_values = true; - break; - } - } - } - } - break; - case MEDIA_TYPE_SEQUENCE: - { - Sequence* s = static_cast(media_list.at(i)); - predicted_video_width = s->width; - predicted_video_height = s->height; - predicted_new_frame_rate = s->frame_rate; - predicted_audio_freq = s->audio_frequency; - predicted_audio_layout = s->audio_layout; - - got_video_values = true; - got_audio_values = true; - } - break; - } - if (got_video_values && got_audio_values) break; - } + self_created_sequence = create_sequence_from_media(media_list, type_list); + using_fr = self_created_sequence->frame_rate; } else { entry_point = panel_timeline->getTimelineFrameFromScreenPoint(pos.x()); panel_timeline->drag_frame_start = entry_point + getFrameFromScreenPoint(panel_timeline->zoom, 50); panel_timeline->drag_track_start = (bottom_align) ? -1 : 0; - predicted_new_frame_rate = sequence->frame_rate; + using_fr = sequence->frame_rate; } for (int i=0;iusing_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); - default_clip_out = refactor_frame_number(m->out, source_fr, predicted_new_frame_rate); + default_clip_in = refactor_frame_number(m->in, source_fr, using_fr); + default_clip_out = refactor_frame_number(m->out, source_fr, using_fr); } break; case MEDIA_TYPE_SEQUENCE: s = static_cast(media_list.at(i)); sequence_length = s->getEndFrame(); - if (sequence != NULL) sequence_length = refactor_frame_number(sequence_length, s->frame_rate, predicted_new_frame_rate); + if (sequence != NULL) sequence_length = refactor_frame_number(sequence_length, s->frame_rate, using_fr); 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); - default_clip_out = refactor_frame_number(s->workarea_out, s->frame_rate, predicted_new_frame_rate); + default_clip_in = refactor_frame_number(s->workarea_in, s->frame_rate, using_fr); + default_clip_out = refactor_frame_number(s->workarea_out, s->frame_rate, using_fr); } break; default: @@ -413,7 +361,7 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { if (m->video_tracks.size() > 0 && m->video_tracks[0]->infinite_length && m->audio_tracks.size() == 0) { g.out = g.in + 100; } else { - long length = m->get_length_in_frames(predicted_new_frame_rate); + long length = m->get_length_in_frames(using_fr); g.out = entry_point + length - default_clip_in; if (m->using_inout) { g.out -= (length - default_clip_out); @@ -499,6 +447,9 @@ void TimelineWidget::dragLeaveEvent(QDragLeaveEvent*) { panel_timeline->importing_files = false; update_ui(false); } + if (self_created_sequence != NULL) { + delete self_created_sequence; + } } void delete_area_under_ghosts(ComboAction* ca) { @@ -597,17 +548,9 @@ void TimelineWidget::dropEvent(QDropEvent* event) { // if we're dropping into nothing, create a new sequences based on the clip being dragged if (s == NULL) { - s = new Sequence(); - - // dumb hardcoded default values, should be settable somewhere - s->name = panel_project->get_next_sequence_name(); - s->width = predicted_video_width; - s->height = predicted_video_height; - s->frame_rate = predicted_new_frame_rate; - s->audio_frequency = predicted_audio_freq; - s->audio_layout = predicted_audio_layout; - - panel_project->new_sequence(ca, s, true, NULL); + s = self_created_sequence; + panel_project->new_sequence(ca, self_created_sequence, true, NULL); + self_created_sequence = NULL; } else if (event->keyboardModifiers() & Qt::ControlModifier) { insert_clips(ca); } else { diff --git a/ui/timelinewidget.h b/ui/timelinewidget.h index b995555f4..29db1b980 100644 --- a/ui/timelinewidget.h +++ b/ui/timelinewidget.h @@ -60,11 +60,7 @@ private: QVector pre_clips; QVector post_clips; - int predicted_video_width; - int predicted_video_height; - double predicted_new_frame_rate; - int predicted_audio_freq; - int predicted_audio_layout; + Sequence* self_created_sequence; // used for "right click ripple" long rc_ripple_min;