From c810f27c474441ad56319dda01fcb7626ee05eaf Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 15 Feb 2019 23:24:23 -0800 Subject: [PATCH] fixed #501 --- ui/graphview.cpp | 109 ++++++++++++++++++++++++++++------------------- ui/graphview.h | 8 ++-- 2 files changed, 70 insertions(+), 47 deletions(-) diff --git a/ui/graphview.cpp b/ui/graphview.cpp index b8f8d48a9..b42eb9bf2 100644 --- a/ui/graphview.cpp +++ b/ui/graphview.cpp @@ -61,7 +61,8 @@ GraphView::GraphView(QWidget* parent) : x_scroll(0), y_scroll(0), mousedown(false), - zoom(1.0), + x_zoom(1.0), + y_zoom(1.0), row(nullptr), moved_keys(false), current_handle(BEZIER_HANDLE_NONE), @@ -105,10 +106,11 @@ void GraphView::show_context_menu(const QPoint& pos) { } void GraphView::reset_view() { - zoom = 1.0; + x_zoom = 1.0; + y_zoom = 1.0; set_scroll_x(0); set_scroll_y(0); - emit zoom_changed(zoom); + emit zoom_changed(x_zoom, y_zoom); update(); } @@ -166,10 +168,10 @@ void GraphView::set_view_to_rect(int x1, double y1, int x2, double y2) { double y_diff = (y2 - y1); double x_diff_padded = (x_diff+10)*padding; double y_diff_padded = (y_diff+10)*padding; - set_zoom(qMin(double(width()) / x_diff_padded, double(height()) / y_diff_padded)); + set_zoom(double(width()) / x_diff_padded, double(height()) / y_diff_padded); - set_scroll_x(qRound((double(x1) - ((x_diff_padded-x_diff)/2))*zoom)); - set_scroll_y(qRound((double(y1) - ((y_diff_padded-y_diff)/2))*zoom)); + set_scroll_x(qRound((double(x1) - ((x_diff_padded-x_diff)/2))*x_zoom)); + set_scroll_y(qRound((double(y1) - ((y_diff_padded-y_diff)/2))*y_zoom)); } void GraphView::draw_line_text(QPainter &p, bool vert, int line_no, int line_pos, int next_line_pos) { @@ -189,7 +191,7 @@ void GraphView::draw_lines(QPainter& p, bool vert) { int scroll = vert ? y_scroll : x_scroll; for (int i=0;iseq->playhead - visible_in)*zoom) - x_scroll); + int playhead_x = qRound((double(panel_sequence_viewer->seq->playhead - visible_in)*x_zoom) - x_scroll); p.drawLine(playhead_x, 0, playhead_x, height()); if (rect_select) { @@ -400,8 +402,8 @@ void GraphView::mousePressEvent(QMouseEvent *event) { break; } else { // selecting a handle - QPointF pre_point(key_x + key.pre_handle_x*zoom, key_y - key.pre_handle_y*zoom); - QPointF post_point(key_x + key.post_handle_x*zoom, key_y - key.post_handle_y*zoom); + QPointF pre_point(key_x + key.pre_handle_x*x_zoom, key_y - key.pre_handle_y*y_zoom); + QPointF post_point(key_x + key.post_handle_x*x_zoom, key_y - key.post_handle_y*y_zoom); if (event->pos().x() > pre_point.x()-BEZIER_HANDLE_SIZE && event->pos().x() < pre_point.x()+BEZIER_HANDLE_SIZE && event->pos().y() > pre_point.y()-BEZIER_HANDLE_SIZE @@ -513,11 +515,11 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) { switch (current_handle) { case BEZIER_HANDLE_NONE: for (int i=0;ifield(selected_keys_fields.at(i))->keyframes[selected_keys.at(i)].time = qRound(selected_keys_old_vals.at(i) + (double(event->pos().x() - start_x)/zoom)); + row->field(selected_keys_fields.at(i))->keyframes[selected_keys.at(i)].time = qRound(selected_keys_old_vals.at(i) + (double(event->pos().x() - start_x)/x_zoom)); if (event->modifiers() & Qt::ShiftModifier) { row->field(selected_keys_fields.at(i))->keyframes[selected_keys.at(i)].data = selected_keys_old_doubles.at(i); } else { - row->field(selected_keys_fields.at(i))->keyframes[selected_keys.at(i)].data = qRound(selected_keys_old_doubles.at(i) + (double(start_y - event->pos().y())/zoom)); + row->field(selected_keys_fields.at(i))->keyframes[selected_keys.at(i)].data = qRound(selected_keys_old_doubles.at(i) + (double(start_y - event->pos().y())/y_zoom)); } } moved_keys = true; @@ -531,8 +533,8 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) { double new_post_handle_x = old_post_handle_x; double new_post_handle_y = old_post_handle_y; - double x_diff = double(event->pos().x() - start_x)/zoom; - double y_diff = double(start_y - event->pos().y())/zoom; + double x_diff = double(event->pos().x() - start_x)/x_zoom; + double y_diff = double(start_y - event->pos().y())/y_zoom; if (current_handle == BEZIER_HANDLE_PRE) { new_pre_handle_x += x_diff; @@ -580,14 +582,14 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) { KEYFRAME_SIZE+KEYFRAME_SIZE ); QRect pre_rect( - qRound(key_x + key.pre_handle_x*zoom - BEZIER_HANDLE_SIZE), - qRound(key_y + key.pre_handle_y*zoom - BEZIER_HANDLE_SIZE), + qRound(key_x + key.pre_handle_x*x_zoom - BEZIER_HANDLE_SIZE), + qRound(key_y + key.pre_handle_y*y_zoom - BEZIER_HANDLE_SIZE), BEZIER_HANDLE_SIZE+BEZIER_HANDLE_SIZE, BEZIER_HANDLE_SIZE+BEZIER_HANDLE_SIZE ); QRect post_rect( - qRound(key_x + key.post_handle_x*zoom - BEZIER_HANDLE_SIZE), - qRound(key_y + key.post_handle_y*zoom - BEZIER_HANDLE_SIZE), + qRound(key_x + key.post_handle_x*x_zoom - BEZIER_HANDLE_SIZE), + qRound(key_y + key.post_handle_y*y_zoom - BEZIER_HANDLE_SIZE), BEZIER_HANDLE_SIZE+BEZIER_HANDLE_SIZE, BEZIER_HANDLE_SIZE+BEZIER_HANDLE_SIZE ); @@ -652,20 +654,20 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) { if (last_key.type == EFFECT_KEYFRAME_BEZIER && key.type == EFFECT_KEYFRAME_BEZIER) { // cubic bezier bezier_path.cubicTo( - QPointF(last_key_x+last_key.post_handle_x*zoom, last_key_y-last_key.post_handle_y*zoom), - QPointF(key_x+key.pre_handle_x*zoom, key_y-key.pre_handle_y*zoom), + QPointF(last_key_x+last_key.post_handle_x*x_zoom, last_key_y-last_key.post_handle_y*y_zoom), + QPointF(key_x+key.pre_handle_x*x_zoom, key_y-key.pre_handle_y*y_zoom), QPointF(key_x, key_y) ); } else if (key.type == EFFECT_KEYFRAME_LINEAR) { // quadratic bezier // last keyframe is the bezier one bezier_path.quadTo( - QPointF(last_key_x+last_key.post_handle_x*zoom, last_key_y-last_key.post_handle_y*zoom), + QPointF(last_key_x+last_key.post_handle_x*x_zoom, last_key_y-last_key.post_handle_y*y_zoom), QPointF(key_x, key_y) ); } else { // this keyframe is the bezier one bezier_path.quadTo( - QPointF(key_x+key.pre_handle_x*zoom, key_y-key.pre_handle_y*zoom), + QPointF(key_x+key.pre_handle_x*x_zoom, key_y-key.pre_handle_y*y_zoom), QPointF(key_x, key_y) ); } @@ -745,18 +747,36 @@ void GraphView::wheelEvent(QWheelEvent *event) { redraw = true; } else { // set zoom - if (event->angleDelta().y() != 0) { - double zoom_diff = (GRAPH_ZOOM_SPEED*zoom); - double new_zoom = (event->angleDelta().y() < 0) ? zoom - zoom_diff : zoom + zoom_diff; + double new_x_zoom = x_zoom; + double new_y_zoom = y_zoom; - // center zoom on screen - set_scroll_x(qRound((double(x_scroll)/zoom*new_zoom) + double(event->pos().x())*new_zoom - double(event->pos().x())*zoom)); - set_scroll_y(qRound((double(y_scroll)/zoom*new_zoom) + double(height()-event->pos().y())*new_zoom - double(height()-event->pos().y())*zoom)); + int y_delta = event->angleDelta().y(); - set_zoom(new_zoom); + // holding CONTROL will zoom horizontal and vertical axes separately + int x_delta = (event->modifiers() & Qt::ControlModifier) ? event->angleDelta().x() : y_delta; - redraw = true; - } + if (y_delta != 0) { + double zoom_diff = (GRAPH_ZOOM_SPEED*y_zoom); + new_y_zoom = (y_delta < 0) ? y_zoom - zoom_diff : y_zoom + zoom_diff; + + // center zoom on screen + set_scroll_y(qRound((double(y_scroll)/y_zoom*new_y_zoom) + double(height()-event->pos().y())*new_y_zoom - double(height()-event->pos().y())*y_zoom)); + + redraw = true; + } + + if (x_delta != 0) { + double zoom_diff = (GRAPH_ZOOM_SPEED*x_zoom); + new_x_zoom = (x_delta < 0) ? x_zoom - zoom_diff : x_zoom + zoom_diff; + + set_scroll_x(qRound((double(x_scroll)/x_zoom*new_x_zoom) + double(event->pos().x())*new_x_zoom - double(event->pos().x())*x_zoom)); + + redraw = true; + } + + if (redraw) { + set_zoom(new_x_zoom, new_y_zoom); + } } if (redraw) { @@ -837,24 +857,25 @@ void GraphView::set_scroll_y(int s) { emit y_scroll_changed(y_scroll); } -void GraphView::set_zoom(double z) { - zoom = z; - emit zoom_changed(zoom); +void GraphView::set_zoom(double xz, double yz) { + x_zoom = xz; + y_zoom = yz; + emit zoom_changed(x_zoom, y_zoom); } int GraphView::get_screen_x(double d) { if (row != nullptr) { d -= row->parent_effect->parent_clip->clip_in; } - return qRound((d*zoom) - x_scroll); + return qRound((d*x_zoom) - x_scroll); } int GraphView::get_screen_y(double d) { - return qRound(height() + y_scroll - d*zoom); + return qRound(height() + y_scroll - d*y_zoom); } long GraphView::get_value_x(int i) { - long frame = qRound((i + x_scroll)/zoom); + long frame = qRound((i + x_scroll)/x_zoom); if (row != nullptr) { frame += row->parent_effect->parent_clip->clip_in; } @@ -862,7 +883,7 @@ long GraphView::get_value_x(int i) { } double GraphView::get_value_y(int i) { - return double(height() + y_scroll - i)/zoom; + return double(height() + y_scroll - i)/y_zoom; } void GraphView::selection_update() { diff --git a/ui/graphview.h b/ui/graphview.h index 02dc27216..19247a2a1 100644 --- a/ui/graphview.h +++ b/ui/graphview.h @@ -50,7 +50,7 @@ public: signals: void x_scroll_changed(int); void y_scroll_changed(int); - void zoom_changed(double); + void zoom_changed(double, double); void selection_changed(bool, int); private: int x_scroll; @@ -58,11 +58,13 @@ private: bool mousedown; int start_x; int start_y; - double zoom; + + double x_zoom; + double y_zoom; void set_scroll_x(int s); void set_scroll_y(int s); - void set_zoom(double z); + void set_zoom(double xz, double yz); int get_screen_x(double); int get_screen_y(double);