diff --git a/panels/panels.cpp b/panels/panels.cpp index c597121b1..ca2a411f6 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -1,7 +1,70 @@ #include "panels.h" +#include "timeline.h" +#include "effectcontrols.h" +#include "viewer.h" + Project* panel_project = 0; EffectControls* panel_effect_controls = 0; Viewer* panel_sequence_viewer = 0; Viewer* panel_footage_viewer = 0; Timeline* panel_timeline = 0; + +void Timeline::update_effect_controls() { + // SEND CLIPS TO EFFECT CONTROLS + // find out how many clips are selected + // limits to one video clip and one audio clip and only if they're linked + // one of these days it might be nice to have multiple clips in the effects panel + panel_effect_controls->multiple = false; + int vclip = -1; + int aclip = -1; + QVector selected_clips; + if (sequence != NULL) { + for (int i=0;iclips.size();i++) { + Clip* clip = sequence->clips.at(i); + if (clip != NULL && panel_timeline->is_clip_selected(clip, true)) { + if (clip->track < 0 && vclip == -1) { + vclip = i; + } else if (clip->track >= 0 && aclip == -1) { + aclip = i; + } else { + vclip = -2; + aclip = -2; + panel_effect_controls->multiple = true; + break; + } + } + } + // check if aclip is linked to vclip + if (!panel_effect_controls->multiple) { + if (vclip >= 0) selected_clips.append(vclip); + if (aclip >= 0) selected_clips.append(aclip); + if (vclip >= 0 && aclip >= 0) { + bool found = false; + Clip* vclip_ref = sequence->clips.at(vclip); + for (int i=0;ilinked.size();i++) { + if (vclip_ref->linked.at(i) == aclip) { + found = true; + break; + } + } + if (!found) { + // only display multiple clips if they're linked + selected_clips.clear(); + panel_effect_controls->multiple = true; + } + } + } + } + panel_effect_controls->set_clips(selected_clips); +} + +void update_ui(bool modified) { + if (modified) { + panel_sequence_viewer->reset_all_audio(); + update_effect_controls(); + } + panel_effect_controls->update_keyframes(); + panel_timeline->repaint_timeline(); + panel_sequence_viewer->update_viewer(); +} diff --git a/panels/timeline.cpp b/panels/timeline.cpp index b3723e0bf..93aa6a273 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -220,17 +220,10 @@ bool Timeline::focused() { return (sequence != NULL && (ui->headers->hasFocus() || ui->video_area->hasFocus() || ui->audio_area->hasFocus())); } -void Timeline::repaint_timeline(bool changed) { - if (changed) { - panel_sequence_viewer->reset_all_audio(); - update_effect_controls(); - if (!panel_sequence_viewer->playing) panel_sequence_viewer->viewer_widget->update(); - } - +void Timeline::repaint_timeline() { ui->headers->update(); ui->video_area->update(); ui->audio_area->update(); - panel_effect_controls->update_keyframes(); if (sequence != NULL) { long sequenceEndFrame = sequence->getEndFrame(); @@ -238,15 +231,8 @@ void Timeline::repaint_timeline(bool changed) { panel_timeline->ui->horizontalScrollBar->setMaximum(qMax(0, getScreenPointFromFrame(panel_timeline->zoom, sequenceEndFrame) + 100 - ui->editAreas->width())); if (last_frame != sequence->playhead) { - panel_sequence_viewer->viewer_widget->update(); ui->audio_monitor->update(); last_frame = sequence->playhead; - } - - if (sequenceEndFrame > 0) { - panel_sequence_viewer->ui->headers->update_zoom((double) panel_sequence_viewer->ui->headers->width() / (double) sequenceEndFrame); - } else { - panel_sequence_viewer->ui->headers->update_zoom(1); } } } @@ -268,55 +254,6 @@ void Timeline::select_all() { } } -void Timeline::update_effect_controls() { - // SEND CLIPS TO EFFECT CONTROLS - // find out how many clips are selected - // limits to one video clip and one audio clip and only if they're linked - // one of these days it might be nice to have multiple clips in the effects panel - panel_effect_controls->multiple = false; - int vclip = -1; - int aclip = -1; - QVector selected_clips; - if (sequence != NULL) { - for (int i=0;iclips.size();i++) { - Clip* clip = sequence->clips.at(i); - if (clip != NULL && panel_timeline->is_clip_selected(clip, true)) { - if (clip->track < 0 && vclip == -1) { - vclip = i; - } else if (clip->track >= 0 && aclip == -1) { - aclip = i; - } else { - vclip = -2; - aclip = -2; - panel_effect_controls->multiple = true; - break; - } - } - } - // check if aclip is linked to vclip - if (!panel_effect_controls->multiple) { - if (vclip >= 0) selected_clips.append(vclip); - if (aclip >= 0) selected_clips.append(aclip); - if (vclip >= 0 && aclip >= 0) { - bool found = false; - Clip* vclip_ref = sequence->clips.at(vclip); - for (int i=0;ilinked.size();i++) { - if (vclip_ref->linked.at(i) == aclip) { - found = true; - break; - } - } - if (!found) { - // only display multiple clips if they're linked - selected_clips.clear(); - panel_effect_controls->multiple = true; - } - } - } - } - panel_effect_controls->set_clips(selected_clips); -} - void Timeline::delete_in_out(bool ripple) { if (sequence != NULL && sequence->using_workarea) { QVector areas; diff --git a/panels/timeline.h b/panels/timeline.h index 0126d5e8d..dd731fb6a 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -166,7 +166,7 @@ public: Ui::Timeline *ui; public slots: - void repaint_timeline(bool changed = false); + void repaint_timeline(); private slots: diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 7195cc658..9f0730b37 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -32,6 +32,7 @@ Viewer::Viewer(QWidget *parent) : { ui->setupUi(this); ui->headers->viewer = this; + ui->headers->snapping = false; ui->headers->show_text(false); ui->glViewerPane->child = ui->openGLWidget; viewer_widget = ui->openGLWidget; @@ -178,13 +179,13 @@ void Viewer::play() { start_msecs = QDateTime::currentMSecsSinceEpoch(); playback_updater.start(); playing = true; - panel_sequence_viewer->set_playpause_icon(false); + set_playpause_icon(false); audio_thread->notifyReceiver(); } void Viewer::pause() { playing = false; - panel_sequence_viewer->set_playpause_icon(true); + set_playpause_icon(true); playback_updater.stop(); } @@ -197,10 +198,28 @@ void Viewer::update_playhead_timecode(long p) { } void Viewer::update_end_timecode() { - ui->endTimecode->setText((seq == NULL) ? frame_to_timecode(0, config.timecode_view, 30) : frame_to_timecode(seq->getEndFrame(), config.timecode_view, seq->frame_rate)); + ui->endTimecode->setText((seq == NULL) ? frame_to_timecode(0, config.timecode_view, 30) : frame_to_timecode(seq->getEndFrame(), config.timecode_view, seq->frame_rate)); +} + +void Viewer::update_header_zoom() { + if (seq != NULL) { + long sequenceEndFrame = seq->getEndFrame(); + if (sequenceEndFrame > 0) { + ui->headers->update_zoom((double) ui->headers->width() / (double) sequenceEndFrame); + } else { + ui->headers->update_zoom(1); + } + } +} + +void Viewer::update_viewer() { + viewer_widget->update(); + update_header_zoom(); + update_playhead_timecode(seq->playhead); } void Viewer::set_media(int type, void* media) { + main_sequence = false; clean_created_seq(); switch (type) { case MEDIA_TYPE_FOOTAGE: @@ -209,6 +228,7 @@ void Viewer::set_media(int type, void* media) { seq = new Sequence(); created_sequence = true; + seq->name = footage->name; if (footage->video_tracks.size() > 0) { MediaStream* video_stream = footage->video_tracks.at(0); @@ -219,12 +239,13 @@ void Viewer::set_media(int type, void* media) { Clip* c = new Clip(seq); c->media = footage; c->media_type = type; - c->media_stream = footage->video_tracks.at(0)->file_index; + c->media_stream = video_stream->file_index; c->timeline_in = 0; c->timeline_out = footage->get_length_in_frames(seq->frame_rate); c->track = -1; c->clip_in = 0; c->recalculateMaxLength(); + seq->clips.append(c); } else { seq->width = 1920; seq->height = 1080; @@ -234,6 +255,17 @@ void Viewer::set_media(int type, void* media) { if (footage->audio_tracks.size() > 0) { MediaStream* audio_stream = footage->audio_tracks.at(0); seq->audio_frequency = audio_stream->audio_frequency; + + Clip* c = new Clip(seq); + c->media = footage; + c->media_type = type; + c->media_stream = footage->video_tracks.at(0)->file_index; + c->timeline_in = 0; + c->timeline_out = footage->get_length_in_frames(seq->frame_rate); + c->track = -1; + c->clip_in = 0; + c->recalculateMaxLength(); + seq->clips.append(c); } else { seq->audio_frequency = 48000; } @@ -274,9 +306,11 @@ void Viewer::update_playhead() { } void Viewer::timer_update() { - update_playhead_timecode(seq->playhead); seq->playhead = round(playhead_start + ((QDateTime::currentMSecsSinceEpoch()-start_msecs) * 0.001 * seq->frame_rate)); - if (main_sequence) panel_timeline->repaint_timeline(false); + update_viewer(); + if (main_sequence) { + panel_timeline->repaint_timeline(false); + } } void Viewer::clean_created_seq() { @@ -297,6 +331,7 @@ void Viewer::set_sequence(bool main, Sequence *s) { bool null_sequence = (seq == NULL); ui->headers->setEnabled(!null_sequence); + qDebug() << "headers enabled:" << ui->headers->isEnabled(); ui->currentTimecode->setEnabled(!null_sequence); ui->openGLWidget->setEnabled(!null_sequence); ui->openGLWidget->setVisible(!null_sequence); @@ -311,8 +346,6 @@ void Viewer::set_sequence(bool main, Sequence *s) { if (!null_sequence) { playback_updater.setInterval(qFloor(1000 / seq->frame_rate)); - config.timecode_view = (frame_rate_is_droppable(seq->frame_rate)) ? TIMECODE_DROP : TIMECODE_NONDROP; - update_playhead_timecode(seq->playhead); update_end_timecode(); @@ -327,6 +360,8 @@ void Viewer::set_sequence(bool main, Sequence *s) { setWindowTitle(panel_name + "(none)"); } + update_header_zoom(); + viewer_widget->update(); update(); diff --git a/panels/viewer.h b/panels/viewer.h index c42dde9d1..0142abe7a 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -29,6 +29,8 @@ public: void set_playpause_icon(bool play); void update_playhead_timecode(long p); void update_end_timecode(); + void update_header_zoom(); + void update_viewer(); // playback functions void go_to_start(); @@ -48,6 +50,8 @@ public: ViewerWidget* viewer_widget; + Sequence* seq; + Ui::Viewer *ui; public slots: @@ -64,7 +68,6 @@ private: void set_sequence(bool main, Sequence* s); bool main_sequence; bool created_sequence; - Sequence* seq; bool queue_audio_reset; }; diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index 55f2eca33..d92cf4362 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -53,7 +53,7 @@ int TimelineHeader::getHeaderScreenPointFromFrame(long frame) { void TimelineHeader::set_playhead(int mouse_x) { long frame = getHeaderFrameFromScreenPoint(mouse_x); if (snapping) panel_timeline->snap_to_timeline(&frame, false, true, true); - if (frame != sequence->playhead) { + if (frame != viewer->seq->playhead) { viewer->seek(frame); } } @@ -64,25 +64,25 @@ void TimelineHeader::set_visible_in(long i) { } void TimelineHeader::set_in_point(long new_in) { - long new_out = sequence->workarea_out; + long new_out = viewer->seq->workarea_out; if (new_out == new_in) { new_in--; } else if (new_out < new_in) { - new_out = sequence->getEndFrame(); + new_out = viewer->seq->getEndFrame(); } - undo_stack.push(new SetTimelineInOutCommand(sequence, true, new_in, new_out)); + undo_stack.push(new SetTimelineInOutCommand(viewer->seq, true, new_in, new_out)); panel_timeline->repaint_timeline(false); } void TimelineHeader::set_out_point(long new_out) { - long new_in = sequence->workarea_in; + long new_in = viewer->seq->workarea_in; if (new_out == new_in) { new_out++; } else if (new_in > new_out) { new_in = 0; } - undo_stack.push(new SetTimelineInOutCommand(sequence, true, new_in, new_out)); + undo_stack.push(new SetTimelineInOutCommand(viewer->seq, true, new_in, new_out)); panel_timeline->repaint_timeline(false); } @@ -97,14 +97,14 @@ void TimelineHeader::show_text(bool enable) { } void TimelineHeader::mousePressEvent(QMouseEvent* event) { - if (sequence != NULL) { + if (viewer->seq != NULL) { if (resizing_workarea) { - sequence_end = sequence->getEndFrame(); + sequence_end = viewer->seq->getEndFrame(); } else { bool shift = (event->modifiers() & Qt::ShiftModifier); bool clicked_on_marker = false; - for (int i=0;imarkers.size();i++) { - int marker_pos = getHeaderScreenPointFromFrame(sequence->markers.at(i).frame); + for (int i=0;iseq->markers.size();i++) { + int marker_pos = getHeaderScreenPointFromFrame(viewer->seq->markers.at(i).frame); if (event->pos().x() > marker_pos - MARKER_SIZE && event->pos().x() < marker_pos + MARKER_SIZE) { bool found = false; for (int j=0;jmarkers.at(selected_markers.at(i)).frame; + selected_marker_original_times[i] = viewer->seq->markers.at(selected_markers.at(i)).frame; } drag_start = event->pos().x(); dragging_markers = true; @@ -147,7 +147,7 @@ void TimelineHeader::mousePressEvent(QMouseEvent* event) { } void TimelineHeader::mouseMoveEvent(QMouseEvent* event) { - if (sequence != NULL) { + if (viewer->seq != NULL) { if (dragging) { if (resizing_workarea) { long frame = getHeaderFrameFromScreenPoint(event->pos().x()); @@ -183,7 +183,7 @@ void TimelineHeader::mouseMoveEvent(QMouseEvent* event) { // move markers for (int i=0;imarkers[selected_markers.at(i)].frame = selected_marker_original_times.at(i) + frame_movement; + viewer->seq->markers[selected_markers.at(i)].frame = selected_marker_original_times.at(i) + frame_movement; } panel_timeline->repaint_timeline(false); @@ -193,19 +193,19 @@ void TimelineHeader::mouseMoveEvent(QMouseEvent* event) { } else { resizing_workarea = false; unsetCursor(); - if (sequence != NULL && sequence->using_workarea) { + if (viewer->seq != NULL && viewer->seq->using_workarea) { long min_frame = getHeaderFrameFromScreenPoint(event->pos().x() - CLICK_RANGE) - 1; long max_frame = getHeaderFrameFromScreenPoint(event->pos().x() + CLICK_RANGE) + 1; - if (sequence->workarea_in > min_frame && sequence->workarea_in < max_frame) { + if (viewer->seq->workarea_in > min_frame && viewer->seq->workarea_in < max_frame) { resizing_workarea = true; resizing_workarea_in = true; - } else if (sequence->workarea_out > min_frame && sequence->workarea_out < max_frame) { + } else if (viewer->seq->workarea_out > min_frame && viewer->seq->workarea_out < max_frame) { resizing_workarea = true; resizing_workarea_in = false; } if (resizing_workarea) { - temp_workarea_in = sequence->workarea_in; - temp_workarea_out = sequence->workarea_out; + temp_workarea_in = viewer->seq->workarea_in; + temp_workarea_out = viewer->seq->workarea_out; setCursor(Qt::SizeHorCursor); } } @@ -214,15 +214,15 @@ void TimelineHeader::mouseMoveEvent(QMouseEvent* event) { } void TimelineHeader::mouseReleaseEvent(QMouseEvent*) { - if (sequence != NULL) { + if (viewer->seq != NULL) { dragging = false; if (resizing_workarea) { - undo_stack.push(new SetTimelineInOutCommand(sequence, true, temp_workarea_in, temp_workarea_out)); + undo_stack.push(new SetTimelineInOutCommand(viewer->seq, true, temp_workarea_in, temp_workarea_out)); } else if (dragging_markers && selected_markers.size() > 0) { bool moved = false; ComboAction* ca = new ComboAction(); for (int i=0;imarkers[selected_markers.at(i)]; + Marker* m = &viewer->seq->markers[selected_markers.at(i)]; if (selected_marker_original_times.at(i) != m->frame) { ca->append(new MoveMarkerAction(m, selected_marker_original_times.at(i), m->frame)); moved = true; @@ -255,7 +255,7 @@ void TimelineHeader::update_zoom(double z) { void TimelineHeader::delete_markers() { if (selected_markers.size() > 0) { - DeleteMarkerAction* dma = new DeleteMarkerAction(sequence); + DeleteMarkerAction* dma = new DeleteMarkerAction(viewer->seq); for (int i=0;imarkers.append(selected_markers.at(i)); } @@ -265,11 +265,11 @@ void TimelineHeader::delete_markers() { } void TimelineHeader::paintEvent(QPaintEvent*) { - if (sequence != NULL && zoom > 0) { + if (viewer->seq != NULL && zoom > 0) { QPainter p(this); int yoff = (text_enabled) ? height()/2 : 0; - double interval = sequence->frame_rate; + double interval = viewer->seq->frame_rate; int textWidth = 0; int lastTextBoundary = INT_MIN; @@ -297,7 +297,7 @@ void TimelineHeader::paintEvent(QPaintEvent*) { // draw text if (text_enabled && lineX-textWidth > lastTextBoundary) { p.setPen(Qt::white); - QString timecode = frame_to_timecode(frame + in_visible, config.timecode_view, sequence->frame_rate); + QString timecode = frame_to_timecode(frame + in_visible, config.timecode_view, viewer->seq->frame_rate); int fullTextWidth = fm.width(timecode); textWidth = fullTextWidth>>1; int text_x = lineX-textWidth; @@ -324,9 +324,9 @@ void TimelineHeader::paintEvent(QPaintEvent*) { // draw in/out selection int in_x; - if (sequence->using_workarea) { - in_x = getHeaderScreenPointFromFrame((resizing_workarea ? temp_workarea_in : sequence->workarea_in)); - int out_x = getHeaderScreenPointFromFrame((resizing_workarea ? temp_workarea_out : sequence->workarea_out)); + if (viewer->seq->using_workarea) { + in_x = getHeaderScreenPointFromFrame((resizing_workarea ? temp_workarea_in : viewer->seq->workarea_in)); + int out_x = getHeaderScreenPointFromFrame((resizing_workarea ? temp_workarea_out : viewer->seq->workarea_out)); p.fillRect(QRect(in_x, 0, out_x-in_x, height()), QColor(0, 192, 255, 128)); p.setPen(Qt::white); p.drawLine(in_x, 0, in_x, height()); @@ -334,8 +334,8 @@ void TimelineHeader::paintEvent(QPaintEvent*) { } // draw markers - for (int i=0;imarkers.size();i++) { - const Marker& m = sequence->markers.at(i); + for (int i=0;iseq->markers.size();i++) { + const Marker& m = viewer->seq->markers.at(i); int marker_x = getHeaderScreenPointFromFrame(m.frame); const QPoint points[5] = { QPoint(marker_x, height()-1), @@ -361,7 +361,7 @@ void TimelineHeader::paintEvent(QPaintEvent*) { } // draw playhead triangle - in_x = getHeaderScreenPointFromFrame(sequence->playhead); + in_x = getHeaderScreenPointFromFrame(viewer->seq->playhead); QPoint start(in_x, height()+2); QPainterPath path; path.moveTo(start);