The Marquee, shapes and a moved selection snap to View › Snap To; Ctrl draws freely (13.5a)

This commit is contained in:
ZacharyZhang-NY committed 2026-10-01 09:55:24 -04:00
1 parent 64ebd1cdf9
commit 3992bc913d
11 files changed
+271 -11

No files matched your search

+23 -4
View File
@@ -67,7 +67,7 @@ void CanvasView::lassoMouseDown(QPointF point, Qt::KeyboardModifiers modifiers)
m_session.magicWand(pixel, mode);
return;
}
m_session.beginLasso(pixel, mode);
m_session.beginLasso(m_session.tool() == NavigationTool::marquee ? snappedCorner(pixel, modifiers) : pixel, mode);
synchronizeDisplay();
return;
}
@@ -218,22 +218,41 @@ void CanvasView::dragSelection(QPointF point, Qt::KeyboardModifiers modifiers)
return;
const QPointF pixel = m_session.viewport.documentPoint(point, m_session.document()->size());
QSizeF offset(pixel.x() - m_selectionDragStart->x(), pixel.y() - m_selectionDragStart->y());
bool horizontal = true, vertical = true;
if (modifiers.testFlag(Qt::ShiftModifier)) {
if (std::abs(offset.width()) >= std::abs(offset.height()))
if (std::abs(offset.width()) >= std::abs(offset.height())) {
offset.setHeight(0);
else
vertical = false;
} else {
offset.setWidth(0);
horizontal = false;
}
}
// Snaps as a drawn Marquee does, unless Ctrl is held.
if (modifiers.testFlag(Qt::ControlModifier))
m_session.snapGuides = {};
else
offset = m_session.snappedSelectionOffset(offset, TransformSnap::distance / std::max(m_session.viewport.pointsPerPixel(), 0.0001), horizontal,
vertical);
m_session.moveSelection(offset);
}
QPointF CanvasView::snappedCorner(QPointF pixel, Qt::KeyboardModifiers modifiers)
{
if (modifiers.testFlag(Qt::ControlModifier)) {
m_session.snapGuides = {};
return pixel;
}
return m_session.snappedPoint(pixel, TransformSnap::distance / std::max(m_session.viewport.pointsPerPixel(), 0.0001));
}
// Alt subtracts, never from the centre; Shift squares once armed.
void CanvasView::dragMarqueeDraft(QPointF pixel, Qt::KeyboardModifiers modifiers)
{
if (!modifiers.testFlag(Qt::ShiftModifier))
m_marqueeConstrainArmed = true;
m_marqueeDragPixel = pixel;
m_session.dragMarquee(pixel, m_marqueeConstrainArmed && modifiers.testFlag(Qt::ShiftModifier), false);
m_session.dragMarquee(snappedCorner(pixel, modifiers), m_marqueeConstrainArmed && modifiers.testFlag(Qt::ShiftModifier), false);
}
// A frame's pan toward a pointer at the edge.