fixed #501
This commit is contained in:
+65
-44
@@ -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;i<lim;i++) {
|
||||
int scroll_offs = vert ? height() - i + scroll : i + scroll;
|
||||
int this_line = qFloor(scroll_offs/(GRAPH_SIZE*zoom));
|
||||
int this_line = qFloor(scroll_offs/(GRAPH_SIZE*(vert ? y_zoom : x_zoom)));
|
||||
if (vert) this_line++;
|
||||
if (this_line != last_line) {
|
||||
if (vert) {
|
||||
@@ -278,20 +280,20 @@ void GraphView::paintEvent(QPaintEvent *) {
|
||||
if (last_key.type == EFFECT_KEYFRAME_BEZIER && key.type == EFFECT_KEYFRAME_BEZIER) {
|
||||
// cubic bezier
|
||||
bezier_path.cubicTo(
|
||||
QPointF(last_key_x+last_post_handle*zoom, last_key_y-last_key.post_handle_y*zoom),
|
||||
QPointF(key_x+pre_handle*zoom, key_y-key.pre_handle_y*zoom),
|
||||
QPointF(last_key_x+last_post_handle*x_zoom, last_key_y-last_key.post_handle_y*y_zoom),
|
||||
QPointF(key_x+pre_handle*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_post_handle*zoom, last_key_y-last_key.post_handle_y*zoom),
|
||||
QPointF(last_key_x+last_post_handle*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+pre_handle*zoom, key_y-key.pre_handle_y*zoom),
|
||||
QPointF(key_x+pre_handle*x_zoom, key_y-key.pre_handle_y*y_zoom),
|
||||
QPointF(key_x, key_y)
|
||||
);
|
||||
}
|
||||
@@ -317,12 +319,12 @@ void GraphView::paintEvent(QPaintEvent *) {
|
||||
p.setPen(Qt::gray);
|
||||
|
||||
// pre handle line
|
||||
QPointF pre_point(key_x + key.pre_handle_x*zoom, key_y - key.pre_handle_y*zoom);
|
||||
QPointF pre_point(key_x + key.pre_handle_x*x_zoom, key_y - key.pre_handle_y*y_zoom);
|
||||
p.drawLine(pre_point, QPointF(key_x, key_y));
|
||||
p.drawEllipse(pre_point, BEZIER_HANDLE_SIZE, BEZIER_HANDLE_SIZE);
|
||||
|
||||
// post handle line
|
||||
QPointF post_point(key_x + key.post_handle_x*zoom, key_y - key.post_handle_y*zoom);
|
||||
QPointF post_point(key_x + key.post_handle_x*x_zoom, key_y - key.post_handle_y*y_zoom);
|
||||
p.drawLine(post_point, QPointF(key_x, key_y));
|
||||
p.drawEllipse(post_point, BEZIER_HANDLE_SIZE, BEZIER_HANDLE_SIZE);
|
||||
}
|
||||
@@ -343,7 +345,7 @@ void GraphView::paintEvent(QPaintEvent *) {
|
||||
|
||||
// draw playhead
|
||||
p.setPen(Qt::red);
|
||||
int playhead_x = qRound((double(panel_sequence_viewer->seq->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;i<selected_keys.size();i++) {
|
||||
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)/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() {
|
||||
|
||||
+5
-3
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user