diff --git a/effects/effect.cpp b/effects/effect.cpp index f92ba6f63..051201866 100644 --- a/effects/effect.cpp +++ b/effects/effect.cpp @@ -453,12 +453,38 @@ EffectRow::EffectRow(Effect *parent, QGridLayout *uilayout, const QString &n, in label = new QLabel(name); ui->addWidget(label, row, 0); + QSize button_size(20, 20); + QSize icon_size(12, 12); + + QHBoxLayout* key_controls = new QHBoxLayout(); + key_controls->setSpacing(0); + key_controls->setMargin(0); + keyframe_enable = new QPushButton(QIcon(":/icons/clock.png"), ""); keyframe_enable->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); + keyframe_enable->setMaximumSize(button_size); + keyframe_enable->setIconSize(icon_size); keyframe_enable->setCheckable(true); keyframe_enable->setToolTip("Enable Keyframes"); connect(keyframe_enable, SIGNAL(clicked(bool)), this, SLOT(set_keyframe_enabled(bool))); - ui->addWidget(keyframe_enable, row, 6); + key_controls->addWidget(keyframe_enable); + + QPushButton* left_key_nav = new QPushButton("<"); + left_key_nav->setMaximumSize(button_size); + key_controls->addWidget(left_key_nav); + connect(left_key_nav, SIGNAL(clicked(bool)), this, SLOT(goto_previous_key())); + + QPushButton* key_addremove = new QPushButton("."); + key_addremove->setMaximumSize(button_size); + key_controls->addWidget(key_addremove); + connect(key_addremove, SIGNAL(clicked(bool)), this, SLOT(toggle_key())); + + QPushButton* right_key_nav = new QPushButton(">"); + right_key_nav->setMaximumSize(button_size); + key_controls->addWidget(right_key_nav); + connect(right_key_nav, SIGNAL(clicked(bool)), this, SLOT(goto_next_key())); + + ui->addLayout(key_controls, row, 6); } bool EffectRow::isKeyframing() { @@ -489,6 +515,52 @@ void EffectRow::set_keyframe_enabled(bool enabled) { } } +void EffectRow::goto_previous_key() { + long key = LONG_MIN; + Clip* c = parent_effect->parent_clip; + for (int i=0;iclip_in + c->timeline_in; + if (comp < sequence->playhead) { + key = qMax(comp, key); + } + } + if (key != LONG_MIN) panel_timeline->seek(key); +} + +void EffectRow::toggle_key() { + int index = -1; + Clip* c = parent_effect->parent_clip; + for (int i=0;itimeline_in - c->clip_in + keyframe_times.at(i); + if (comp == sequence->playhead) { + index = i; + break; + } + } + if (index < 0) { + // keyframe doesn't exist, set one + set_keyframe_now(true); + } else { + KeyframeDelete* kd = new KeyframeDelete(); + delete_keyframe(kd, index); + undo_stack.push(kd); + panel_effect_controls->update_keyframes(); + panel_viewer->viewer_widget->update(); + } +} + +void EffectRow::goto_next_key() { + long key = LONG_MAX; + Clip* c = parent_effect->parent_clip; + for (int i=0;itimeline_in - c->clip_in + keyframe_times.at(i); + if (comp > sequence->playhead) { + key = qMin(comp, key); + } + } + if (key != LONG_MAX) panel_timeline->seek(key); +} + EffectField* EffectRow::add_field(int type, int colspan) { EffectField* field = new EffectField(this, type); fields.append(field); diff --git a/effects/effect.h b/effects/effect.h index 479f03b9b..20f19ae71 100644 --- a/effects/effect.h +++ b/effects/effect.h @@ -161,6 +161,9 @@ public: QVector keyframe_types; private slots: void set_keyframe_enabled(bool); + void goto_previous_key(); + void toggle_key(); + void goto_next_key(); private: bool keyframing; QGridLayout* ui; diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 9813bd84d..33b8e4a8e 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -36,13 +36,18 @@ EffectControls::EffectControls(QWidget *parent) : ui->effects_area->keyframe_area = ui->keyframeView; ui->effects_area->header = ui->headers; - ui->keyframeHeaderScroller->setMaximumHeight(ui->headers->minimumHeight()); ui->keyframeView->header = ui->headers; ui->label_2->setVisible(false); - connect(ui->keyframeScroller->verticalScrollBar(), SIGNAL(valueChanged(int)), ui->scrollArea->verticalScrollBar(), SLOT(setValue(int))); - connect(ui->keyframeScroller->horizontalScrollBar(), SIGNAL(valueChanged(int)), ui->keyframeHeaderScroller->horizontalScrollBar(), SLOT(setValue(int))); + connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), ui->headers, SLOT(set_scroll(int))); + connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), ui->keyframeView, SLOT(set_x_scroll(int))); + connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), ui->keyframeView, SLOT(set_y_scroll(int))); + connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), ui->scrollArea->verticalScrollBar(), SLOT(setValue(int))); + connect(ui->scrollArea->verticalScrollBar(), SIGNAL(valueChanged(int)), ui->verticalScrollBar, SLOT(setValue(int))); + + /*connect(ui->keyframeScroller->verticalScrollBar(), SIGNAL(valueChanged(int)), ui->scrollArea->verticalScrollBar(), SLOT(setValue(int))); + connect(ui->keyframeScroller->horizontalScrollBar(), SIGNAL(valueChanged(int)), ui->headers, SLOT(set_scroll(int)));*/ } EffectControls::~EffectControls() { @@ -201,7 +206,7 @@ void EffectControls::load_effects() { } } if (selected_clips.size() > 0) { - ui->keyframeView->setMinimumHeight(ui->effects_area->height()); + ui->verticalScrollBar->setMaximum(qMax(0, ui->effects_area->height() - ui->keyframeView->height() - ui->headers->height())); ui->keyframeView->setEnabled(true); ui->headers->setVisible(true); ui->keyframeView->update(); @@ -264,6 +269,10 @@ void EffectControls::on_add_audio_transition_button_clicked() show_effect_menu(false, true); } +void EffectControls::resizeEvent(QResizeEvent *event) { + ui->verticalScrollBar->setMaximum(qMax(0, ui->effects_area->height() - ui->keyframeView->height() - ui->headers->height())); +} + bool EffectControls::is_focused() { if (this->hasFocus()) return true; for (int i=0;isetMinimumWidth(sizeHint().width()); - keyframe_area->setMinimumHeight(height() - header->height()); } diff --git a/panels/effectcontrols.h b/panels/effectcontrols.h index 4e92f87af..d1eb8bdd3 100644 --- a/panels/effectcontrols.h +++ b/panels/effectcontrols.h @@ -44,6 +44,8 @@ public: QVector selected_clips; double zoom; + + Ui::EffectControls *ui; public slots: void update_keyframes(); private slots: @@ -55,9 +57,9 @@ private slots: void on_add_video_transition_button_clicked(); void on_add_audio_transition_button_clicked(); - +protected: + void resizeEvent(QResizeEvent *event); private: - Ui::EffectControls *ui; void show_effect_menu(bool video, bool transitions); void load_effects(); void load_keyframes(); diff --git a/panels/effectcontrols.ui b/panels/effectcontrols.ui index 83f8b1eeb..8c450c815 100644 --- a/panels/effectcontrols.ui +++ b/panels/effectcontrols.ui @@ -435,7 +435,7 @@ 0 - + 0 @@ -452,117 +452,69 @@ 0 - + - + 0 0 - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - true - - - - - 0 - 0 - 390 - 68 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - Qt::ClickFocus - - - - - - - - - 1 - 0 - - - - QFrame::NoFrame - - - QFrame::Plain - - - Qt::ScrollBarAlwaysOn - - - Qt::ScrollBarAlwaysOn - - - true - - - - - 0 - 0 - 378 - 407 - + + + + 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + 0 + + + 20 + + + 1826 + + + Qt::Vertical + + + + + + + + + + 0 + + + 20 + + + 1826 + + + Qt::Horizontal + diff --git a/panels/timeline.cpp b/panels/timeline.cpp index d282e15bf..3c2ca84e3 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -91,9 +91,7 @@ Timeline::Timeline(QWidget *parent) : ui->toolArrowButton->click(); - ui->headerScrollArea->setMaximumHeight(ui->headers->minimumHeight()); connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(setScroll(int))); - connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), ui->headers, SLOT(set_scroll(int))); connect(ui->videoScrollbar, SIGNAL(valueChanged(int)), ui->video_area, SLOT(setScroll(int))); connect(ui->audioScrollbar, SIGNAL(valueChanged(int)), ui->audio_area, SLOT(setScroll(int))); @@ -1294,5 +1292,6 @@ void Timeline::addMenuItem(QAction* action) { void Timeline::setScroll(int s) { scroll = s; + ui->headers->set_scroll(s); repaint_timeline(false); } diff --git a/panels/timeline.ui b/panels/timeline.ui index 9cc1a8a01..af2bf631e 100644 --- a/panels/timeline.ui +++ b/panels/timeline.ui @@ -285,7 +285,7 @@ 0 - + 0 @@ -302,77 +302,13 @@ 0 - + - + 0 0 - - QFrame::NoFrame - - - QFrame::Plain - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - QAbstractScrollArea::AdjustToContents - - - true - - - - - 0 - 0 - 821 - 16 - - - - - 0 - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - Qt::ClickFocus - - - - - diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 21286f370..f11a58403 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -117,6 +117,10 @@ void Viewer::update_end_timecode() { } } +/*void Viewer::update_media(int type) { + +}*/ + void Viewer::update_sequence() { bool null_sequence = (sequence == NULL); diff --git a/ui/keyframeview.cpp b/ui/keyframeview.cpp index b08f85b32..6b6a52499 100644 --- a/ui/keyframeview.cpp +++ b/ui/keyframeview.cpp @@ -11,9 +11,11 @@ #include "panels/viewer.h" #include "ui/viewerwidget.h" #include "project/sequence.h" +#include "ui_effectcontrols.h" #include #include +#include #define KEYFRAME_SIZE 6 #define KEYFRAME_POINT_COUNT 4 @@ -22,7 +24,17 @@ long KeyframeView::adjust_row_keyframe(EffectRow* row, long time) { return time-row->parent_effect->parent_clip->clip_in+(row->parent_effect->parent_clip->timeline_in-visible_in); } -KeyframeView::KeyframeView(QWidget *parent) : QWidget(parent), mousedown(false), dragging(false), keys_selected(false), select_rect(false), visible_in(0), visible_out(0) { +KeyframeView::KeyframeView(QWidget *parent) : + QWidget(parent), + mousedown(false), + dragging(false), + keys_selected(false), + select_rect(false), + visible_in(0), + visible_out(0), + x_scroll(0), + y_scroll(0) +{ setFocusPolicy(Qt::ClickFocus); setMouseTracking(true); } @@ -50,12 +62,12 @@ void KeyframeView::paintEvent(QPaintEvent*) { QLabel* label = row->label; QWidget* contents = e->container->contents; - int keyframe_y = label->y() + (label->height()>>1) + mapFrom(panel_effect_controls, contents->mapTo(panel_effect_controls, contents->pos())).y() - e->container->title_bar->height(); + int keyframe_y = label->y() + (label->height()>>1) + mapFrom(panel_effect_controls, contents->mapTo(panel_effect_controls, contents->pos())).y() - e->container->title_bar->height()/* - y_scroll*/; for (int k=0;kkeyframe_times.size();k++) { bool keyframe_selected = keyframeIsSelected(row, k); long keyframe_frame = adjust_row_keyframe(row, row->keyframe_times.at(k)); if (dragging && keyframe_selected) keyframe_frame += frame_diff; - draw_keyframe(p, getScreenPointFromFrame(panel_effect_controls->zoom, keyframe_frame), keyframe_y, keyframe_selected); + draw_keyframe(p, getScreenPointFromFrame(panel_effect_controls->zoom, keyframe_frame) - x_scroll, keyframe_y, keyframe_selected); } rows.append(row); @@ -68,12 +80,11 @@ void KeyframeView::paintEvent(QPaintEvent*) { visible_in = effects_in; visible_out = effects_out; - int width = getScreenPointFromFrame(panel_effect_controls->zoom, visible_out - visible_in); - setMinimumWidth(width); - header->setMinimumWidth(width); + int max_width = getScreenPointFromFrame(panel_effect_controls->zoom, visible_out - visible_in); + panel_effect_controls->ui->horizontalScrollBar->setMaximum(qMax(max_width - width(), 0)); header->set_visible_in(effects_in); - int playhead_x = getScreenPointFromFrame(panel_effect_controls->zoom, sequence->playhead-visible_in); + int playhead_x = getScreenPointFromFrame(panel_effect_controls->zoom, sequence->playhead-visible_in) - x_scroll; p.setPen(Qt::red); p.drawLine(playhead_x, 0, playhead_x, height()); } @@ -115,6 +126,16 @@ void KeyframeView::delete_selected_keyframes() { } } +void KeyframeView::set_x_scroll(int s) { + x_scroll = s; + update(); +} + +void KeyframeView::set_y_scroll(int s) { + y_scroll = s; + update(); +} + void KeyframeView::draw_keyframe(QPainter &p, int x, int y, bool darker) { QPoint points[KEYFRAME_POINT_COUNT] = {QPoint(x-KEYFRAME_SIZE, y), QPoint(x, y-KEYFRAME_SIZE), QPoint(x+KEYFRAME_SIZE, y), QPoint(x, y+KEYFRAME_SIZE)}; int color = (darker) ? 100 : 160; diff --git a/ui/keyframeview.h b/ui/keyframeview.h index bc08512e6..ec22b503e 100644 --- a/ui/keyframeview.h +++ b/ui/keyframeview.h @@ -20,6 +20,9 @@ public: long visible_in; long visible_out; +public slots: + void set_x_scroll(int); + void set_y_scroll(int); private: long adjust_row_keyframe(EffectRow* row, long time); QVector selected_rows; @@ -45,6 +48,9 @@ private: int rect_select_y; int rect_select_w; int rect_select_h; + + int x_scroll; + int y_scroll; }; #endif // KEYFRAMEVIEW_H diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index 25f64bdf5..64a7b3bef 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -32,7 +32,8 @@ TimelineHeader::TimelineHeader(QWidget *parent) : { setCursor(Qt::ArrowCursor); setMouseTracking(true); - setMinimumHeight(fm.height()*2); + setFixedHeight(fm.height()*2); + setFocusPolicy(Qt::ClickFocus); } void TimelineHeader::set_scroll(int s) { @@ -51,7 +52,9 @@ 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); - panel_timeline->seek(frame); + if (frame != sequence->playhead) { + panel_timeline->seek(frame); + } } void TimelineHeader::set_visible_in(long i) { @@ -83,6 +86,7 @@ void TimelineHeader::set_out_point(long new_out) { } void TimelineHeader::mousePressEvent(QMouseEvent* event) { + qDebug() << "press???!?!?!??!"; if (resizing_workarea) { sequence_end = sequence->getEndFrame(); } else { @@ -127,11 +131,15 @@ void TimelineHeader::mousePressEvent(QMouseEvent* event) { set_playhead(event->pos().x()); } } + qDebug() << "3"; dragging = true; + qDebug() << "5" << dragging; + event->accept(); } void TimelineHeader::mouseMoveEvent(QMouseEvent* event) { - if (dragging) { + qDebug() << "move"; + if (dragging) { if (resizing_workarea) { long frame = getHeaderFrameFromScreenPoint(event->pos().x()); panel_timeline->snap_to_timeline(&frame, true, true, false); @@ -193,9 +201,11 @@ void TimelineHeader::mouseMoveEvent(QMouseEvent* event) { } } } + event->accept(); } -void TimelineHeader::mouseReleaseEvent(QMouseEvent*) { +void TimelineHeader::mouseReleaseEvent(QMouseEvent* event) { + qDebug() << "release???!?!?!??!"; if (resizing_workarea) { undo_stack.push(new SetTimelineInOutCommand(sequence, true, temp_workarea_in, temp_workarea_out)); } else if (dragging_markers && selected_markers.size() > 0) { @@ -220,6 +230,7 @@ void TimelineHeader::mouseReleaseEvent(QMouseEvent*) { dragging_markers = false; panel_timeline->snapped = false; panel_timeline->repaint_timeline(false); + event->accept(); } void TimelineHeader::focusOutEvent(QFocusEvent*) { diff --git a/ui/timelineheader.h b/ui/timelineheader.h index 978630d3c..ad3b733b2 100644 --- a/ui/timelineheader.h +++ b/ui/timelineheader.h @@ -24,11 +24,11 @@ public slots: void set_visible_in(long i); protected: - void paintEvent(QPaintEvent*); - void mousePressEvent(QMouseEvent*); - void mouseMoveEvent(QMouseEvent*); - void mouseReleaseEvent(QMouseEvent*); - void focusOutEvent(QFocusEvent *event); + void paintEvent(QPaintEvent*); + void mousePressEvent(QMouseEvent*); + void mouseMoveEvent(QMouseEvent*); + void mouseReleaseEvent(QMouseEvent*); + void focusOutEvent(QFocusEvent*); private: bool dragging; diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index f66e3cc78..b0bc773bb 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -367,14 +367,20 @@ void TimelineWidget::dragMoveEvent(QDragMoveEvent *event) { } void TimelineWidget::wheelEvent(QWheelEvent *event) { - if (config.scroll_zooms) { - if (event->angleDelta().y() != 0) panel_timeline->set_zoom(event->angleDelta().y() > 0); - } else { - QScrollBar* bar = (event->modifiers() & Qt::ShiftModifier) ? scrollBar : panel_timeline->ui->horizontalScrollBar; + bool alt = (event->modifiers() & Qt::AltModifier); + int scroll_amount = alt ? (event->angleDelta().x()) : (event->angleDelta().y()); + if (scroll_amount != 0) { + bool shift = (event->modifiers() & Qt::ShiftModifier); + bool in = (scroll_amount > 0); + if (config.scroll_zooms != shift) { + panel_timeline->set_zoom(in); + } else { + QScrollBar* bar = alt ? scrollBar : panel_timeline->ui->horizontalScrollBar; - int step = bar->singleStep(); - if (event->angleDelta().y() > 0) step = -step; - bar->setValue(bar->value() + step); + int step = bar->singleStep(); + if (in) step = -step; + bar->setValue(bar->value() + step); + } } }