From ca792a7a12f3449833eb1a01be4889de34a251da Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 22 Mar 2019 13:24:51 +1100 Subject: [PATCH] added buttons to drag just video or just audio --- olive.pro | 6 ++- panels/panels.cpp | 1 + panels/project.cpp | 4 +- panels/project.h | 3 +- panels/timeline.cpp | 57 +++++++++++++------- panels/timeline.h | 3 +- panels/viewer.cpp | 102 ++++++++++++++++++++++++++++++----- panels/viewer.h | 14 +++++ project/sourcescommon.cpp | 2 +- timeline/mediaimportdata.cpp | 17 ++++++ timeline/mediaimportdata.h | 29 ++++++++++ ui/timelinewidget.cpp | 9 ++-- ui/viewerwidget.cpp | 6 +-- 13 files changed, 204 insertions(+), 49 deletions(-) create mode 100644 timeline/mediaimportdata.cpp create mode 100644 timeline/mediaimportdata.h diff --git a/olive.pro b/olive.pro index 3fe5ca515..e86586c3f 100644 --- a/olive.pro +++ b/olive.pro @@ -174,7 +174,8 @@ SOURCES += \ undo/undostack.cpp \ effects/internal/richtexteffect.cpp \ ui/blur.cpp \ - ui/menu.cpp + ui/menu.cpp \ + timeline/mediaimportdata.cpp HEADERS += \ ui/mainwindow.h \ @@ -302,7 +303,8 @@ HEADERS += \ undo/undostack.h \ effects/internal/richtexteffect.h \ ui/blur.h \ - ui/menu.h + ui/menu.h \ + timeline/mediaimportdata.h FORMS += diff --git a/panels/panels.cpp b/panels/panels.cpp index 30af5c7f2..dbb22481a 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -87,6 +87,7 @@ void alloc_panels(QWidget* parent) { panel_sequence_viewer->setObjectName("seq_viewer"); panel_footage_viewer = new Viewer(parent); panel_footage_viewer->setObjectName("footage_viewer"); + panel_footage_viewer->show_videoaudio_buttons(true); panel_project = new Project(parent); panel_project->setObjectName("proj_root"); panel_effect_controls = new EffectControls(parent); diff --git a/panels/project.cpp b/panels/project.cpp index 47620459f..3c762ff94 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -245,7 +245,7 @@ QString Project::get_next_sequence_name(QString start) { return name; } -SequencePtr create_sequence_from_media(QVector& media_list) { +SequencePtr create_sequence_from_media(QVector& media_list) { SequencePtr s(new Sequence()); s->name = panel_project->get_next_sequence_name(); @@ -260,7 +260,7 @@ SequencePtr create_sequence_from_media(QVector& media_list) { bool got_video_values = false; bool got_audio_values = false; for (int i=0;iget_type()) { case MEDIA_TYPE_FOOTAGE: { diff --git a/panels/project.h b/panels/project.h index ace9e4404..d2984b7d1 100644 --- a/panels/project.h +++ b/panels/project.h @@ -35,6 +35,7 @@ #include "project/sourcescommon.h" #include "ui/panel.h" #include "ui/sourceiconview.h" +#include "timeline/mediaimportdata.h" #include "undo/undo.h" #include "ui/sourcetable.h" @@ -45,7 +46,7 @@ extern QString autorecovery_filename; extern QStringList recent_projects; -SequencePtr create_sequence_from_media(QVector &media_list); +SequencePtr create_sequence_from_media(QVector &media_list); QString get_channel_layout_name(int channels, uint64_t layout); QString get_interlacing_name(int interlacing); diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 37c276d9b..75caf3148 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -192,14 +192,15 @@ void Timeline::toggle_show_all() { } } -void Timeline::create_ghosts_from_media(Sequence* seq, long entry_point, QVector& media_list) { +void Timeline::create_ghosts_from_media(Sequence* seq, long entry_point, QVector& media_list) { video_ghosts = false; audio_ghosts = false; for (int i=0;iready; if (m->using_inout) { double source_fr = 30; - if (m->video_tracks.size() > 0 && !qIsNull(m->video_tracks.at(0).video_frame_rate)) source_fr = m->video_tracks.at(0).video_frame_rate * m->speed; + if (m->video_tracks.size() > 0 && !qIsNull(m->video_tracks.at(0).video_frame_rate)) { + source_fr = m->video_tracks.at(0).video_frame_rate * m->speed; + } default_clip_in = rescale_frame_number(m->in, source_fr, seq->frame_rate); default_clip_out = rescale_frame_number(m->out, source_fr, seq->frame_rate); } @@ -253,20 +256,27 @@ void Timeline::create_ghosts_from_media(Sequence* seq, long entry_point, QVector } } - for (int j=0;jaudio_tracks.size();j++) { - if (m->audio_tracks.at(j).enabled) { - g.track = j; - g.media_stream = m->audio_tracks.at(j).file_index; - ghosts.append(g); - audio_ghosts = true; + if (import_data.type() == olive::timeline::kImportAudioOnly + || import_data.type() == olive::timeline::kImportBoth) { + for (int j=0;jaudio_tracks.size();j++) { + if (m->audio_tracks.at(j).enabled) { + g.track = j; + g.media_stream = m->audio_tracks.at(j).file_index; + ghosts.append(g); + audio_ghosts = true; + } } } - for (int j=0;jvideo_tracks.size();j++) { - if (m->video_tracks.at(j).enabled) { - g.track = -1-j; - g.media_stream = m->video_tracks.at(j).file_index; - ghosts.append(g); - video_ghosts = true; + + if (import_data.type() == olive::timeline::kImportVideoOnly + || import_data.type() == olive::timeline::kImportBoth) { + for (int j=0;jvideo_tracks.size();j++) { + if (m->video_tracks.at(j).enabled) { + g.track = -1-j; + g.media_stream = m->video_tracks.at(j).file_index; + ghosts.append(g); + video_ghosts = true; + } } } break; @@ -277,10 +287,17 @@ void Timeline::create_ghosts_from_media(Sequence* seq, long entry_point, QVector g.out -= (sequence_length - default_clip_out); } - g.track = -1; - ghosts.append(g); - g.track = 0; - ghosts.append(g); + if (import_data.type() == olive::timeline::kImportVideoOnly + || import_data.type() == olive::timeline::kImportBoth) { + g.track = -1; + ghosts.append(g); + } + + if (import_data.type() == olive::timeline::kImportAudioOnly + || import_data.type() == olive::timeline::kImportBoth) { + g.track = 0; + ghosts.append(g); + } video_ghosts = true; audio_ghosts = true; @@ -446,7 +463,7 @@ void Timeline::nest() { MediaPtr m = panel_project->create_sequence_internal(ca, s, false, nullptr); // add nested sequence to active sequence - QVector media_list; + QVector media_list; media_list.append(m.get()); create_ghosts_from_media(olive::ActiveSequence.get(), earliest_point, media_list); add_clips_from_ghosts(ca, olive::ActiveSequence.get()); diff --git a/panels/timeline.h b/panels/timeline.h index 028c8977f..e1b103e6c 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -29,6 +29,7 @@ #include "ui/timelinetools.h" #include "timeline/selection.h" #include "timeline/clip.h" +#include "timeline/mediaimportdata.h" #include "undo/undo.h" #include "ui/timelineheader.h" #include "ui/resizablescrollbar.h" @@ -125,7 +126,7 @@ public: void edit_to_point_internal(bool in, bool ripple); void delete_in_out_internal(bool ripple); - void create_ghosts_from_media(Sequence *seq, long entry_point, QVector &media_list); + void create_ghosts_from_media(Sequence *seq, long entry_point, QVector &media_list); void add_clips_from_ghosts(ComboAction *ca, Sequence *s); int getTimelineScreenPointFromFrame(long frame); diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 911df3376..3a45fcd3c 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -20,6 +20,21 @@ #include "viewer.h" +extern "C" { +#include +#include +} + +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include "rendering/audio.h" #include "timeline.h" #include "panels/project.h" @@ -45,19 +60,6 @@ #define FRAMES_IN_ONE_MINUTE 1798 // 1800 - 2 #define FRAMES_IN_TEN_MINUTES 17978 // (FRAMES_IN_ONE_MINUTE * 10) - 2 -extern "C" { -#include -#include -} - -#include -#include -#include -#include -#include -#include -#include - Viewer::Viewer(QWidget *parent) : Panel(parent), playing(false), @@ -538,6 +540,17 @@ void Viewer::update_viewer() { update_end_timecode(); } +void Viewer::initiate_drag(olive::timeline::MediaImportType drag_type) +{ + // FIXME: This should contain actual metadata rather than fake metadata + + QDrag* drag = new QDrag(this); + QMimeData* mimeData = new QMimeData; + mimeData->setText(QString::number(drag_type)); + drag->setMimeData(mimeData); + drag->exec(); +} + void Viewer::clear_in() { if (seq != nullptr && seq->using_workarea) { @@ -585,6 +598,12 @@ void Viewer::set_panel_name(const QString &n) { update_window_title(); } +void Viewer::show_videoaudio_buttons(bool s) +{ + video_only_button->setVisible(s); + audio_only_button->setVisible(s); +} + void Viewer::update_window_title() { QString name; if (seq == nullptr) { @@ -658,8 +677,12 @@ void Viewer::setup_ui() { QHBoxLayout* lower_control_layout = new QHBoxLayout(lower_controls); lower_control_layout->setMargin(0); - // current time code + QSizePolicy timecode_container_policy(QSizePolicy::Minimum, QSizePolicy::Maximum); + QSizePolicy lower_control_policy(QSizePolicy::Expanding, QSizePolicy::Maximum); + + // Current time code container QWidget* current_timecode_container = new QWidget(); + current_timecode_container->setSizePolicy(timecode_container_policy); QHBoxLayout* current_timecode_container_layout = new QHBoxLayout(current_timecode_container); current_timecode_container_layout->setSpacing(0); current_timecode_container_layout->setMargin(0); @@ -667,11 +690,19 @@ void Viewer::setup_ui() { current_timecode_container_layout->addWidget(current_timecode_slider); lower_control_layout->addWidget(current_timecode_container); + // Left controls container + QWidget* left_controls = new QWidget(); + left_controls->setSizePolicy(lower_control_policy); + lower_control_layout->addWidget(left_controls); + + // Playback controls container QWidget* playback_controls = new QWidget(); + playback_controls->setSizePolicy(lower_control_policy); QHBoxLayout* playback_control_layout = new QHBoxLayout(playback_controls); playback_control_layout->setSpacing(0); playback_control_layout->setMargin(0); + playback_control_layout->addStretch(); go_to_start_button = new QPushButton(); go_to_start_button->setIcon(olive::icon::ViewerGoToStart); @@ -698,9 +729,40 @@ void Viewer::setup_ui() { connect(go_to_end_frame, SIGNAL(clicked(bool)), this, SLOT(go_to_out())); playback_control_layout->addWidget(go_to_end_frame); + playback_control_layout->addStretch(); + lower_control_layout->addWidget(playback_controls); + // Right controls container + QWidget* right_controls = new QWidget(); + right_controls->setSizePolicy(lower_control_policy); + + QHBoxLayout* right_control_layout = new QHBoxLayout(right_controls); + right_control_layout->setSpacing(0); + right_control_layout->setMargin(0); + right_control_layout->addStretch(); + + video_only_button = new QPushButton(); + video_only_button->setToolTip(tr("Drag video only")); + video_only_button->setIcon(olive::icon::MediaVideo); + video_only_button->setVisible(false); + right_control_layout->addWidget(video_only_button); + connect(video_only_button, SIGNAL(pressed()), this, SLOT(drag_video_only())); + + audio_only_button = new QPushButton(); + audio_only_button->setToolTip(tr("Drag audio only")); + audio_only_button->setIcon(olive::icon::MediaAudio); + audio_only_button->setVisible(false); + right_control_layout->addWidget(audio_only_button); + connect(audio_only_button, SIGNAL(pressed()), this, SLOT(drag_audio_only())); + + right_control_layout->addStretch(); + + lower_control_layout->addWidget(right_controls); + + // End time code container QWidget* end_timecode_container = new QWidget(); + end_timecode_container->setSizePolicy(timecode_container_policy); QHBoxLayout* end_timecode_layout = new QHBoxLayout(end_timecode_container); end_timecode_layout->setSpacing(0); @@ -851,6 +913,16 @@ void Viewer::resize_move(double d) { set_zoom_value(headers->get_zoom()*d); } +void Viewer::drag_video_only() +{ + initiate_drag(olive::timeline::kImportVideoOnly); +} + +void Viewer::drag_audio_only() +{ + initiate_drag(olive::timeline::kImportAudioOnly); +} + void Viewer::clean_created_seq() { viewer_widget->waveform = false; @@ -902,6 +974,8 @@ void Viewer::set_sequence(bool main, SequencePtr s) { play_button->setEnabled(!null_sequence); next_frame_button->setEnabled(!null_sequence); go_to_end_frame->setEnabled(!null_sequence); + video_only_button->setEnabled(!null_sequence); + audio_only_button->setEnabled(!null_sequence); if (!null_sequence) { current_timecode_slider->SetFrameRate(seq->frame_rate); diff --git a/panels/viewer.h b/panels/viewer.h index 8376fee6d..a96b2a5b6 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -27,6 +27,7 @@ #include #include "timeline/marker.h" +#include "timeline/mediaimportdata.h" #include "project/media.h" #include "ui/panel.h" @@ -64,6 +65,7 @@ public: void set_out_point(); void set_zoom(bool in); void set_panel_name(const QString& n); + void show_videoaudio_buttons(bool s); // playback functions void seek(long p); @@ -98,6 +100,10 @@ public: TimelineHeader* headers; + + + void initiate_drag(olive::timeline::MediaImportType drag_type); + virtual void Retranslate() override; protected: virtual void resizeEvent(QResizeEvent *event) override; @@ -116,12 +122,17 @@ public slots: void close_media(); void update_viewer(); + + private slots: void update_playhead(); void timer_update(); void recording_flasher_update(); void resize_move(double d); + void drag_video_only(); + void drag_audio_only(); + private: void update_window_title(); @@ -155,6 +166,9 @@ private: QPushButton* next_frame_button; QPushButton* go_to_end_frame; + QPushButton* video_only_button; + QPushButton* audio_only_button; + bool cue_recording_internal; QTimer recording_flasher; diff --git a/project/sourcescommon.cpp b/project/sourcescommon.cpp index 1833271ca..d91850b3c 100644 --- a/project/sourcescommon.cpp +++ b/project/sourcescommon.cpp @@ -57,7 +57,7 @@ SourcesCommon::SourcesCommon(Project* parent) : void SourcesCommon::create_seq_from_selected() { if (!selected_items.isEmpty()) { - QVector media_list; + QVector media_list; for (int i=0;iitem_to_media(selected_items.at(i))); } diff --git a/timeline/mediaimportdata.cpp b/timeline/mediaimportdata.cpp new file mode 100644 index 000000000..1358576e7 --- /dev/null +++ b/timeline/mediaimportdata.cpp @@ -0,0 +1,17 @@ +#include "mediaimportdata.h" + +olive::timeline::MediaImportData::MediaImportData(Media *media, olive::timeline::MediaImportType import_type) : + media_(media), + import_type_(import_type) +{ +} + +Media *olive::timeline::MediaImportData::media() const +{ + return media_; +} + +olive::timeline::MediaImportType olive::timeline::MediaImportData::type() const +{ + return import_type_; +} diff --git a/timeline/mediaimportdata.h b/timeline/mediaimportdata.h new file mode 100644 index 000000000..866ea37dd --- /dev/null +++ b/timeline/mediaimportdata.h @@ -0,0 +1,29 @@ +#ifndef MEDIAIMPORTDATA_H +#define MEDIAIMPORTDATA_H + +#include "project/media.h" + +namespace olive { +namespace timeline { + +enum MediaImportType { + kImportVideoOnly, + kImportAudioOnly, + kImportBoth +}; + +class MediaImportData { +public: + MediaImportData(Media* media = nullptr, MediaImportType import_type = kImportBoth); + Media* media() const; + MediaImportType type() const; +private: + Media* media_; + MediaImportType import_type_; +}; + +} +} + + +#endif // MEDIAIMPORTDATA_H diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index dd2eb82da..684f93f47 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -237,7 +237,7 @@ bool same_sign(int a, int b) { void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { bool import_init = false; - QVector media_list; + QVector media_list; panel_timeline->importing_files = false; if (event->source() == panel_project->tree_view || event->source() == panel_project->icon_view) { @@ -249,10 +249,13 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { import_init = true; } - if (event->source() == panel_footage_viewer->viewer_widget) { + if (event->source() == panel_footage_viewer) { if (panel_footage_viewer->seq != olive::ActiveSequence) { // don't allow nesting the same sequence - media_list.append(panel_footage_viewer->media); + + media_list.append(olive::timeline::MediaImportData(panel_footage_viewer->media, + static_cast(event->mimeData()->text().toInt()))); import_init = true; + } } diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index 6fcdf8d74..5847eaa32 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -339,11 +339,7 @@ void ViewerWidget::mouseMoveEvent(QMouseEvent* event) { container->dragScrollMove(event->pos()*container->zoom); } else if (event->buttons() & Qt::LeftButton) { if (gizmos == nullptr) { - QDrag* drag = new QDrag(this); - QMimeData* mimeData = new QMimeData; - mimeData->setText("h"); // QMimeData will fail without some kind of data - drag->setMimeData(mimeData); - drag->exec(); + viewer->initiate_drag(olive::timeline::kImportBoth); dragging = false; } else { move_gizmos(event, false);