diff --git a/effects/effect.cpp b/effects/effect.cpp index f1ab3cff7..b743b3939 100644 --- a/effects/effect.cpp +++ b/effects/effect.cpp @@ -264,7 +264,6 @@ void Effect::load(QXmlStreamReader& stream) { qDebug() << "[ERROR] Too many fields for effect" << id << "row" << row_count << ". Project might be corrupt. (Got" << field_count << ", expected <" << row->fieldCount()-1 << ")"; } field_count++; - break; } } diff --git a/icons/add-button-disabled.png b/icons/add-button-disabled.png new file mode 100644 index 000000000..c44add8f8 Binary files /dev/null and b/icons/add-button-disabled.png differ diff --git a/icons/add-button.png b/icons/add-button.png new file mode 100644 index 000000000..728bd7be3 Binary files /dev/null and b/icons/add-button.png differ diff --git a/icons/icons.qrc b/icons/icons.qrc index 4e55ea1b1..eb6635a81 100644 --- a/icons/icons.qrc +++ b/icons/icons.qrc @@ -39,5 +39,7 @@ add-transition.png add-effect.png olive-splash.png + add-button.png + add-button-disabled.png diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index bad91b69a..bb86a7b92 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -177,16 +177,18 @@ void EffectControls::load_effects() { // load in new clips for (int i=0;iget_clip(selected_clips.at(i)); + QVBoxLayout* layout; + if (c->track < 0) { + ui->vcontainer->setVisible(true); + layout = static_cast(ui->video_effect_area->layout()); + } else { + ui->acontainer->setVisible(true); + layout = static_cast(ui->audio_effect_area->layout()); + } for (int j=0;jeffects.size();j++) { Effect* e = c->effects.at(j); CollapsibleWidget* container = e->container; - if (c->track < 0) { - static_cast(ui->video_effect_area->layout())->addWidget(container); - ui->vcontainer->setVisible(true); - } else { - static_cast(ui->audio_effect_area->layout())->addWidget(container); - ui->acontainer->setVisible(true); - } + layout->addWidget(container); connect(container, SIGNAL(deselect_others(QWidget*)), this, SLOT(deselect_all_effects(QWidget*))); } } diff --git a/panels/project.cpp b/panels/project.cpp index 64928d8b1..997e9bde5 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -778,6 +778,8 @@ bool Project::load_worker(QFile& f, QXmlStreamReader& stream, int type) { // int media_id, stream_id; Clip* c = new Clip(s); + c->media_type = MEDIA_TYPE_SOLID; + c->media = NULL; for (int j=0;jmedia_type) { + switch (c->media_type) { case MEDIA_TYPE_FOOTAGE: - - - break; - }*/ - if (c->media_type == MEDIA_TYPE_FOOTAGE) { - if (media_id == 0) { - c->media = NULL; - } else { - for (int j=0;jsave_id == media_id) { - c->media = m; - c->media_stream = stream_id; - break; - } - } - } - } + if (media_id == 0) { + c->media = NULL; + } else { + for (int j=0;jsave_id == media_id) { + c->media = m; + c->media_stream = stream_id; + break; + } + } + } + break; + } // load links and effects while (!(stream.name() == "clip" && stream.isEndElement()) && !stream.atEnd()) { diff --git a/panels/timeline.cpp b/panels/timeline.cpp index d157124a7..87469b685 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -23,6 +23,7 @@ #include #include #include +#include long refactor_frame_number(long framenumber, double source_frame_rate, double target_frame_rate) { if (source_frame_rate == target_frame_rate) return framenumber; @@ -56,7 +57,8 @@ Timeline::Timeline(QWidget *parent) : importing(false), zoomChanged(false), ui(new Ui::Timeline), - last_frame(0) + last_frame(0), + creating(false) { default_track_height = (QGuiApplication::primaryScreen()->logicalDotsPerInch() / 96) * TRACK_DEFAULT_HEIGHT; @@ -253,6 +255,7 @@ void Timeline::update_sequence() { ui->snappingButton->setEnabled(!null_sequence); ui->pushButton_4->setEnabled(!null_sequence); ui->pushButton_5->setEnabled(!null_sequence); + ui->addButton->setEnabled(!null_sequence); ui->headers->setEnabled(!null_sequence); if (null_sequence) { @@ -1155,3 +1158,42 @@ void Timeline::on_toolSlideButton_clicked() ui->timeline_area->setCursor(Qt::ArrowCursor); tool = TIMELINE_TOOL_SLIDE; } + +void Timeline::on_addButton_clicked() { + QMenu add_menu(this); + + QAction* titleMenuItem = new QAction(&add_menu); + titleMenuItem->setText("Title..."); + titleMenuItem->setData(ADD_OBJ_TITLE); + add_menu.addAction(titleMenuItem); + + QAction* solidMenuItem = new QAction(&add_menu); + solidMenuItem->setText("Solid Color..."); + solidMenuItem->setData(ADD_OBJ_SOLID); + add_menu.addAction(solidMenuItem); + + QAction* barsMenuItem = new QAction(&add_menu); + barsMenuItem->setText("Bars and Tone..."); + barsMenuItem->setData(ADD_OBJ_BARS); + add_menu.addAction(barsMenuItem); + + connect(&add_menu, SIGNAL(triggered(QAction*)), this, SLOT(addMenuItem(QAction*))); + + add_menu.exec(QCursor::pos()); +} + +void Timeline::addMenuItem(QAction* action) { + creating = true; + creatingObject = action->data().toInt(); + /*switch (action->data()) { + case ADD_OBJ_TITLE: + + break; + case ADD_OBJ_SOLID: + + break; + case ADD_OBJ_BARS: + + break; + }*/ +} diff --git a/panels/timeline.h b/panels/timeline.h index 7fba7b32d..a9a5a0daa 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -10,6 +10,10 @@ #define TRACK_DEFAULT_HEIGHT 40 +#define ADD_OBJ_TITLE 0 +#define ADD_OBJ_SOLID 1 +#define ADD_OBJ_BARS 2 + class QPushButton; class SourceTable; class ViewerWidget; @@ -183,6 +187,10 @@ public: // zoom variables bool zoomChanged; + // creating variables + bool creating; + int creatingObject; + Ui::Timeline *ui; public slots: void repaint_timeline(); @@ -209,6 +217,10 @@ private slots: void on_toolSlipButton_clicked(); + void on_addButton_clicked(); + + void addMenuItem(QAction*); + private: QVector tool_buttons; void decheck_tool_buttons(QObject* sender); diff --git a/panels/timeline.ui b/panels/timeline.ui index da4020351..534c009c3 100644 --- a/panels/timeline.ui +++ b/panels/timeline.ui @@ -245,6 +245,22 @@ + + + + Add title, solid, bars, etc. + + + + + + + :/icons/add-button.png + :/icons/add-button-disabled.png + + + + diff --git a/playback/playback.cpp b/playback/playback.cpp index 88b9df808..2d484f392 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -27,7 +27,8 @@ extern "C" { bool texture_failed = false; void open_clip(Clip* clip, bool multithreaded) { - if (clip->media_type == MEDIA_TYPE_FOOTAGE) { + switch (clip->media_type) { + case MEDIA_TYPE_FOOTAGE: clip->multithreaded = multithreaded; if (multithreaded) { if (clip->open_lock.tryLock()) { @@ -47,8 +48,11 @@ void open_clip(Clip* clip, bool multithreaded) { open_clip_worker(clip); } - } else if (clip->media_type == MEDIA_TYPE_SEQUENCE) { + break; + case MEDIA_TYPE_SEQUENCE: + case MEDIA_TYPE_SOLID: clip->open = true; + break; } } @@ -70,16 +74,20 @@ void close_clip(Clip* clip) { clip->fbo = NULL; } - if (clip->media_type == MEDIA_TYPE_FOOTAGE) { + switch (clip->media_type) { + case MEDIA_TYPE_FOOTAGE: if (clip->multithreaded) { clip->cacher->caching = false; clip->can_cache.wakeAll(); } else { close_clip_worker(clip); } - } else if (clip->media_type == MEDIA_TYPE_SEQUENCE) { + break; + case MEDIA_TYPE_SEQUENCE: closeActiveClips(static_cast(clip->media), false); + case MEDIA_TYPE_SOLID: clip->open = false; + break; } } diff --git a/project/clip.cpp b/project/clip.cpp index 0813909da..4ec7ccb3c 100644 --- a/project/clip.cpp +++ b/project/clip.cpp @@ -181,7 +181,10 @@ long Clip::getMediaLength(double framerate) { return refactor_frame_number(s->getEndFrame(), s->frame_rate, framerate); } break; - } + case MEDIA_TYPE_SOLID: + return timeline_out - timeline_in; + break; + } return 0; } diff --git a/project/undo.cpp b/project/undo.cpp index 0ad7763df..081deeccb 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -808,17 +808,17 @@ KeyframeDelete::KeyframeDelete() : old_project_changed(project_changed), disable void KeyframeDelete::undo() { if (disable_keyframes_on_row != NULL) disable_keyframes_on_row->setKeyframing(true); - int data_index = 0; - for (int i=0;i=0;i--) { EffectRow* row = rows.at(i); int keyframe_index = keyframes.at(i); row->keyframe_times.insert(keyframe_index, deleted_keyframe_times.at(i)); row->keyframe_types.insert(keyframe_index, deleted_keyframe_types.at(i)); - for (int j=0;jfieldCount();j++) { + for (int j=row->fieldCount()-1;j>=0;j--) { row->field(j)->keyframe_data.insert(keyframe_index, deleted_keyframe_data.at(data_index)); - data_index++; + data_index--; } } @@ -827,45 +827,41 @@ void KeyframeDelete::undo() { void KeyframeDelete::redo() { if (!sorted) { - for (int i=0;i keyframes.at(j)) { - int temp = keyframes.at(i); - EffectRow* temp_row = rows.at(i); - - keyframes[i] = keyframes.at(j); - rows[i] = rows.at(j); - - keyframes[j] = temp; - rows[j] = temp_row; - } - } - } - sorted = true; + deleted_keyframe_times.resize(rows.size()); + deleted_keyframe_types.resize(rows.size()); + deleted_keyframe_data.clear(); } - deleted_keyframe_times.resize(rows.size()); - deleted_keyframe_types.resize(rows.size()); - deleted_keyframe_data.clear(); - - for (int i=0;ikeyframe_times.at(keyframe_index)); - deleted_keyframe_types[i] = (row->keyframe_types.at(keyframe_index)); + if (!sorted) { + deleted_keyframe_times[i] = (row->keyframe_times.at(keyframe_index)); + deleted_keyframe_types[i] = (row->keyframe_types.at(keyframe_index)); + } row->keyframe_times.removeAt(keyframe_index); row->keyframe_types.removeAt(keyframe_index); for (int j=0;jfieldCount();j++) { - deleted_keyframe_data.append(row->field(j)->keyframe_data.at(keyframe_index)); + if (!sorted) deleted_keyframe_data.append(row->field(j)->keyframe_data.at(keyframe_index)); row->field(j)->keyframe_data.removeAt(keyframe_index); } + + // correct following indices + if (!sorted) { + for (int j=i+1;j keyframe_index) { + keyframes[j]--; + } + } + } } if (disable_keyframes_on_row != NULL) disable_keyframes_on_row->setKeyframing(false); project_changed = true; + sorted = true; } KeyframeSet::KeyframeSet(EffectRow* r, int i, long t, bool justMadeKeyframe) : diff --git a/ui/keyframeview.cpp b/ui/keyframeview.cpp index 807ef34de..c6ddef421 100644 --- a/ui/keyframeview.cpp +++ b/ui/keyframeview.cpp @@ -101,7 +101,7 @@ bool KeyframeView::keyframeIsSelected(EffectRow *row, int keyframe) { void KeyframeView::delete_selected_keyframes() { KeyframeDelete* kd = new KeyframeDelete(); bool del = false; - for (int i=0;idelete_keyframe(kd, selected_keyframes.at(i)); del = true; } diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index 9b9a8389a..3933a7a90 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -18,7 +18,7 @@ TimelineHeader::TimelineHeader(QWidget *parent) : QWidget(parent), dragging(fals } void TimelineHeader::set_playhead(int mouse_x) { - long frame = getFrameFromScreenPoint(zoom, mouse_x); + long frame = getFrameFromScreenPoint(zoom, mouse_x) + in_visible; if (snapping) panel_timeline->snap_to_clip(&frame, false); panel_timeline->seek(frame); } @@ -62,7 +62,7 @@ void TimelineHeader::mousePressEvent(QMouseEvent* event) { if (resizing_workarea) { sequence_end = sequence->getEndFrame(); } else { - set_playhead(event->pos().x()); + set_playhead(event->pos().x()); } dragging = true; } @@ -79,7 +79,7 @@ void TimelineHeader::mouseMoveEvent(QMouseEvent* event) { } panel_timeline->repaint_timeline(); } else { - set_playhead(event->pos().x()); + set_playhead(event->pos().x()); } } else { resizing_workarea = false; diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index b40f68d3a..4f74b23d5 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -14,6 +14,7 @@ #include "effects/effect.h" #include "effects/transition.h" +#include "effects/video/solideffect.h" #include #include @@ -362,14 +363,18 @@ void TimelineWidget::mouseDoubleClickEvent(QMouseEvent *event) { } } +bool isLiveEditing() { + return (panel_timeline->tool == TIMELINE_TOOL_EDIT || panel_timeline->tool == TIMELINE_TOOL_RAZOR || panel_timeline->creating); +} + void TimelineWidget::mousePressEvent(QMouseEvent *event) { if (sequence != NULL) { if (event->button() == Qt::LeftButton) { - if (panel_timeline->tool == TIMELINE_TOOL_EDIT || panel_timeline->tool == TIMELINE_TOOL_RAZOR) { + QPoint pos = event->pos(); + if (isLiveEditing()) { panel_timeline->drag_frame_start = panel_timeline->cursor_frame; panel_timeline->drag_track_start = panel_timeline->cursor_track; - } else { - QPoint pos = event->pos(); + } else { panel_timeline->drag_frame_start = panel_timeline->getTimelineFrameFromScreenPoint(pos.x()); panel_timeline->drag_track_start = getTrackFromScreenPoint(pos.y()); } @@ -386,118 +391,130 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) { panel_timeline->selection_offset = 0; } - switch (panel_timeline->tool) { - case TIMELINE_TOOL_POINTER: - case TIMELINE_TOOL_RIPPLE: - case TIMELINE_TOOL_SLIP: - case TIMELINE_TOOL_ROLLING: - case TIMELINE_TOOL_SLIDE: - { - if (track_resizing) { - track_resize_mouse_cache = event->pos().y(); - panel_timeline->moving_init = true; - } else { - if (clip_index >= 0) { - Clip* clip = sequence->get_clip(clip_index); - if (clip != NULL) { - if (panel_timeline->is_clip_selected(clip, true)) { - if (shift) { - panel_timeline->deselect_area(clip->timeline_in, clip->timeline_out, clip->track); + if (panel_timeline->creating) { + Ghost g; + g.in = g.old_in = g.out = g.old_out = panel_timeline->drag_frame_start; + g.track = g.old_track = panel_timeline->drag_track_start; + g.transition = NULL; + g.clip = -1; + panel_timeline->ghosts.append(g); - if (!alt) { - for (int i=0;ilinked.size();i++) { - Clip* link = sequence->get_clip(clip->linked.at(i)); - panel_timeline->deselect_area(link->timeline_in, link->timeline_out, link->track); + panel_timeline->moving_init = true; + panel_timeline->moving_proc = true; + } else { + switch (panel_timeline->tool) { + case TIMELINE_TOOL_POINTER: + case TIMELINE_TOOL_RIPPLE: + case TIMELINE_TOOL_SLIP: + case TIMELINE_TOOL_ROLLING: + case TIMELINE_TOOL_SLIDE: + { + if (track_resizing) { + track_resize_mouse_cache = event->pos().y(); + panel_timeline->moving_init = true; + } else { + if (clip_index >= 0) { + Clip* clip = sequence->get_clip(clip_index); + if (clip != NULL) { + if (panel_timeline->is_clip_selected(clip, true)) { + if (shift) { + panel_timeline->deselect_area(clip->timeline_in, clip->timeline_out, clip->track); + + if (!alt) { + for (int i=0;ilinked.size();i++) { + Clip* link = sequence->get_clip(clip->linked.at(i)); + panel_timeline->deselect_area(link->timeline_in, link->timeline_out, link->track); + } + } + } else { + if (panel_timeline->transition_select != TA_NO_TRANSITION) { + panel_timeline->deselect_area(clip->timeline_in, clip->timeline_out, clip->track); + + for (int i=0;ilinked.size();i++) { + Clip* link = sequence->get_clip(clip->linked.at(i)); + panel_timeline->deselect_area(link->timeline_in, link->timeline_out, link->track); + } + + Selection s; + s.track = clip->track; + if (panel_timeline->transition_select == TA_OPENING_TRANSITION && clip->opening_transition != NULL) { + s.in = clip->timeline_in; + s.out = clip->timeline_in + clip->opening_transition->length; + } else if (panel_timeline->transition_select == TA_CLOSING_TRANSITION && clip->closing_transition != NULL) { + s.in = clip->timeline_out - clip->closing_transition->length; + s.out = clip->timeline_out; + } + panel_timeline->selections.append(s); } } } else { - if (panel_timeline->transition_select != TA_NO_TRANSITION) { - panel_timeline->deselect_area(clip->timeline_in, clip->timeline_out, clip->track); + // if "shift" is not down + if (!shift) { + panel_timeline->selections.clear(); + } + Selection s; + + s.in = clip->timeline_in; + s.out = clip->timeline_out; + + if (panel_timeline->transition_select == TA_OPENING_TRANSITION) { + s.out = clip->timeline_in + clip->opening_transition->length; + } + + if (panel_timeline->transition_select == TA_CLOSING_TRANSITION) { + s.in = clip->timeline_out - clip->closing_transition->length; + } + + s.track = clip->track; + panel_timeline->selections.append(s); + + if (config.select_also_seeks) { + panel_timeline->seek(clip->timeline_in); + } + + // if alt is not down, select links + if (!alt && panel_timeline->transition_select == TA_NO_TRANSITION) { for (int i=0;ilinked.size();i++) { Clip* link = sequence->get_clip(clip->linked.at(i)); - panel_timeline->deselect_area(link->timeline_in, link->timeline_out, link->track); + if (!panel_timeline->is_clip_selected(link, true)) { + Selection ss; + ss.in = link->timeline_in; + ss.out = link->timeline_out; + ss.track = link->track; + panel_timeline->selections.append(ss); + } } - - Selection s; - s.track = clip->track; - if (panel_timeline->transition_select == TA_OPENING_TRANSITION && clip->opening_transition != NULL) { - s.in = clip->timeline_in; - s.out = clip->timeline_in + clip->opening_transition->length; - } else if (panel_timeline->transition_select == TA_CLOSING_TRANSITION && clip->closing_transition != NULL) { - s.in = clip->timeline_out - clip->closing_transition->length; - s.out = clip->timeline_out; - } - panel_timeline->selections.append(s); } } - } else { - // if "shift" is not down - if (!shift) { - panel_timeline->selections.clear(); - } + } - Selection s; + panel_timeline->moving_init = true; + } else { + // if "shift" is not down + if (!shift) { + panel_timeline->selections.clear(); + } - s.in = clip->timeline_in; - s.out = clip->timeline_out; - - if (panel_timeline->transition_select == TA_OPENING_TRANSITION) { - s.out = clip->timeline_in + clip->opening_transition->length; - } - - if (panel_timeline->transition_select == TA_CLOSING_TRANSITION) { - s.in = clip->timeline_out - clip->closing_transition->length; - } - - s.track = clip->track; - panel_timeline->selections.append(s); - - if (config.select_also_seeks) { - panel_timeline->seek(clip->timeline_in); - } - - // if alt is not down, select links - if (!alt && panel_timeline->transition_select == TA_NO_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)) { - Selection ss; - ss.in = link->timeline_in; - ss.out = link->timeline_out; - ss.track = link->track; - panel_timeline->selections.append(ss); - } - } - } - } - } - - panel_timeline->moving_init = true; - } else { - // if "shift" is not down - if (!shift) { - panel_timeline->selections.clear(); - } - - panel_timeline->rect_select_init = true; - } - panel_timeline->repaint_timeline(); - } - } - break; - case TIMELINE_TOOL_EDIT: - if (config.edit_tool_also_seeks) panel_timeline->seek(panel_timeline->drag_frame_start); - panel_timeline->selecting = true; - break; - case TIMELINE_TOOL_RAZOR: - { - panel_timeline->splitting = true; - panel_timeline->split_tracks.append(panel_timeline->drag_track_start); - panel_timeline->repaint_timeline(); - } - break; - } + panel_timeline->rect_select_init = true; + } + panel_timeline->repaint_timeline(); + } + } + break; + case TIMELINE_TOOL_EDIT: + if (config.edit_tool_also_seeks) panel_timeline->seek(panel_timeline->drag_frame_start); + panel_timeline->selecting = true; + break; + case TIMELINE_TOOL_RAZOR: + { + panel_timeline->splitting = true; + panel_timeline->split_tracks.append(panel_timeline->drag_track_start); + panel_timeline->repaint_timeline(); + } + break; + } + } } } } @@ -509,7 +526,46 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { bool repaint = false; - if (panel_timeline->moving_proc) { + if (panel_timeline->creating) { + const Ghost& g = panel_timeline->ghosts.at(0); + + TimelineAction* ta = new TimelineAction(); + + Clip* c = new Clip(sequence); + c->media = NULL; + c->media_type = MEDIA_TYPE_SOLID; + c->timeline_in = qMin(g.in, g.out); + c->timeline_out = qMax(g.in, g.out); + c->clip_in = 0; + c->color_r = 192; + c->color_g = 192; + c->color_b = 64; + c->track = g.track; + + QVector add; + add.append(c); + ta->add_clips(sequence, add); + + ta->add_effect(sequence, sequence->clip_count(), VIDEO_TRANSFORM_EFFECT); + switch (panel_timeline->creatingObject) { + case ADD_OBJ_TITLE: + c->name = "Title"; + ta->add_effect(sequence, sequence->clip_count(), VIDEO_TEXT_EFFECT); + break; + case ADD_OBJ_SOLID: + c->name = "Solid Color"; + ta->add_effect(sequence, sequence->clip_count(), VIDEO_SOLID_EFFECT); + break; + case ADD_OBJ_BARS: + c->name = "Bars and Tone"; + ta->add_effect(sequence, sequence->clip_count(), VIDEO_SOLID_EFFECT); + break; + } + + undo_stack.push(ta); + + panel_timeline->redraw_all_clips(true); + } else if (panel_timeline->moving_proc) { repaint = true; if (panel_timeline->ghosts.size() > 0) { const Ghost& first_ghost = panel_timeline->ghosts.at(0); @@ -718,6 +774,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { // clear split tracks panel_timeline->split_tracks.clear(); + panel_timeline->creating = false; panel_timeline->selecting = false; panel_timeline->moving_proc = false; panel_timeline->moving_init = false; @@ -896,7 +953,9 @@ void TimelineWidget::update_ghosts(QPoint& mouse_pos) { } // validate ghosts for trimming - if (panel_timeline->tool == TIMELINE_TOOL_SLIP) { + if (panel_timeline->creating) { + + } else if (panel_timeline->tool == TIMELINE_TOOL_SLIP) { if (c->media_type == MEDIA_TYPE_SEQUENCE || (c->media_type == MEDIA_TYPE_FOOTAGE && !static_cast(c->media)->get_stream_from_file_index(c->track < 0, c->media_stream)->infinite_length)) { // prevent slip moving a clip below 0 clip_in @@ -1075,7 +1134,7 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { panel_timeline->cursor_frame = panel_timeline->getTimelineFrameFromScreenPoint(event->pos().x()); panel_timeline->cursor_track = getTrackFromScreenPoint(event->pos().y()); - if (panel_timeline->tool == TIMELINE_TOOL_EDIT || panel_timeline->tool == TIMELINE_TOOL_RAZOR) { + if (isLiveEditing()) { panel_timeline->snap_to_clip(&panel_timeline->cursor_frame, !config.edit_tool_also_seeks || !panel_timeline->selecting); } if (panel_timeline->selecting) { @@ -1422,6 +1481,9 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { panel_timeline->rect_select_h = 0; panel_timeline->rect_select_proc = true; } + } else if (isLiveEditing()) { + // redraw because we have a cursor + panel_timeline->repaint_timeline(); } else if (panel_timeline->tool == TIMELINE_TOOL_POINTER || panel_timeline->tool == TIMELINE_TOOL_RIPPLE || panel_timeline->tool == TIMELINE_TOOL_ROLLING) { @@ -1529,10 +1591,7 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { } else { unsetCursor(); } - } - } else if (panel_timeline->tool == TIMELINE_TOOL_EDIT || panel_timeline->tool == TIMELINE_TOOL_RAZOR) { - // redraw because we have a cursor - panel_timeline->repaint_timeline(); + } } else if (panel_timeline->tool == TIMELINE_TOOL_SLIP) { if (getClipIndexFromCoords(panel_timeline->cursor_frame, panel_timeline->cursor_track) > -1) { setCursor(Qt::SizeHorCursor); @@ -1820,7 +1879,7 @@ void TimelineWidget::paintEvent(QPaintEvent*) { int cursor_x = panel_timeline->getTimelineScreenPointFromFrame(panel_timeline->drag_frame_start); int cursor_y = getScreenPointFromTrack(panel_timeline->split_tracks.at(i)); - p.setPen(QColor(64, 64, 64)); + p.setPen(QColor(64, 64, 64)); p.drawLine(cursor_x, cursor_y, cursor_x, cursor_y + panel_timeline->calculate_track_height(panel_timeline->split_tracks.at(i), -1)); } } @@ -1844,7 +1903,7 @@ void TimelineWidget::paintEvent(QPaintEvent*) { } // Draw edit cursor - if (panel_timeline->tool == TIMELINE_TOOL_EDIT || panel_timeline->tool == TIMELINE_TOOL_RAZOR) { + if (isLiveEditing()) { if (is_track_visible(panel_timeline->cursor_track)) { int cursor_x = panel_timeline->getTimelineScreenPointFromFrame(panel_timeline->cursor_frame); int cursor_y = getScreenPointFromTrack(panel_timeline->cursor_track); diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index e2c75d405..84f6af0fe 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -135,6 +135,7 @@ GLuint ViewerWidget::compose_sequence(Clip* nest, bool render_audio) { } break; case MEDIA_TYPE_SEQUENCE: + case MEDIA_TYPE_SOLID: if (is_clip_active(c, playhead)) { if (!c->open) open_clip(c, !rendering); clip_is_active = true; @@ -170,30 +171,27 @@ GLuint ViewerWidget::compose_sequence(Clip* nest, bool render_audio) { glOrtho(-half_width, half_width, half_height, -half_height, -1, 1); for (int i=0;imedia_type == MEDIA_TYPE_FOOTAGE && !c->finished_opening) { qDebug() << "[WARNING] Tried to display clip" << i << "but it's closed"; texture_failed = true; } else { if (c->track < 0) { + glPushMatrix(); + GLuint textureID = 0; - int video_width, video_height; + int video_width = c->getWidth(); + int video_height = c->getHeight(); if (c->media_type == MEDIA_TYPE_FOOTAGE) { get_clip_frame(c, playhead); - MediaStream* ms = static_cast(c->media)->get_stream_from_file_index(c->track < 0, c->media_stream); - video_width = ms->video_width; - video_height = ms->video_height; if (c->texture != NULL) textureID = c->texture->textureId(); } else if (c->media_type == MEDIA_TYPE_SEQUENCE) { - Sequence* cs = static_cast(c->media); - video_width = cs->width; - video_height = cs->height; textureID = -1; } - if (textureID == 0) { + if (textureID == 0 && c->media_type != MEDIA_TYPE_SOLID) { qDebug() << "[WARNING] Texture hasn't been created yet"; texture_failed = true; } else if (playhead >= c->timeline_in) { @@ -213,11 +211,17 @@ GLuint ViewerWidget::compose_sequence(Clip* nest, bool render_audio) { c->fbo[1]->release(); // for nested sequences - if (textureID == -1) textureID = compose_sequence(c, render_audio); + if (c->media_type == MEDIA_TYPE_SEQUENCE) textureID = compose_sequence(c, render_audio); glViewport(0, 0, video_width, video_height); - GLuint composite_texture = draw_clip(c->fbo[0], textureID); + GLuint composite_texture; + if (c->media_type == MEDIA_TYPE_SOLID) { + composite_texture = c->fbo[0]->texture(); + } else { + composite_texture = draw_clip(c->fbo[0], textureID); + } + bool fbo_switcher = true; GLTextureCoords coords; @@ -302,6 +306,8 @@ GLuint ViewerWidget::compose_sequence(Clip* nest, bool render_audio) { if (default_fbo != NULL) default_fbo->bind(); } } + + glPopMatrix(); } else { if (c->media_type == MEDIA_TYPE_FOOTAGE && render_audio