Skip to content

Commit

Permalink
Improve rotation handle
Browse files Browse the repository at this point in the history
  • Loading branch information
mbasaglia committed Sep 16, 2023
1 parent 34f26da commit dbe36f6
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 10 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
## 0.5.5

* Editing:
* The rotation handle now preserves rotation direction and multiple full rotations
* Misc:
* Switched to an even/odd version numbering scheme.

Expand Down
20 changes: 10 additions & 10 deletions src/gui/graphics/transform_graphics_item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,6 @@ void graphics::TransformGraphicsItem::drag_a(const QPointF& p, Qt::KeyboardModif
QPointF anchor = p;
QPointF anchor_old = d->transform->anchor_point.get();


QPointF p1 = d->transform_matrix.map(QPointF(0, 0));
d->transform->anchor_point.set(anchor);
QPointF p2 = d->transform_matrix.map(QPointF(0, 0));
Expand All @@ -427,20 +426,21 @@ void graphics::TransformGraphicsItem::drag_a(const QPointF& p, Qt::KeyboardModif

void graphics::TransformGraphicsItem::drag_rot(const QPointF& p, Qt::KeyboardModifiers modifiers)
{
QPointF diff_old = d->get_rot() - d->transform->anchor_point.get();
QVector2D scale = d->transform->scale.get();
qreal angle_to_rot_handle = std::atan2(diff_old.y() * scale.y(), diff_old.x() * scale.x());

QPointF p_new = d->transform_matrix.map(p);
QPointF ap = d->transform_matrix.map(d->transform->anchor_point.get());
QPointF diff_new = p_new - ap;
qreal angle_new = std::atan2(diff_new.y(), diff_new.x());
qreal angle = qRadiansToDegrees(angle_new - angle_to_rot_handle);
QPointF anchor = d->transform_matrix.map(d->transform->anchor_point.get());
QPointF diff = anchor - p_new;
qreal angle_rad = -std::atan2(diff.x(), diff.y());
// angle in [-180, 180]
qreal angle = qRadiansToDegrees(angle_rad);

if ( modifiers & Qt::ControlModifier )
angle = qRound(angle/15) * 15;

d->push_command(d->transform->rotation, angle, false);
// Ensure continuous rotations
qreal old_angle = d->transform->rotation.get();
qreal delta = math::fmod((angle - old_angle) + 180, 360.) - 180;

d->push_command(d->transform->rotation, old_angle + delta, false);
}

void graphics::TransformGraphicsItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* opt, QWidget*)
Expand Down

0 comments on commit dbe36f6

Please sign in to comment.