14.5: one View › Snap for all snapping

This commit is contained in:
ZacharyZhang-NY committed 2026-10-11 04:24:36 -04:00
1 parent dea7346a7c
commit 1289a6c790
14 files changed
+33 -43

No files matched your search

+2 -2
View File
@@ -29,7 +29,7 @@ void CompositorMenusTests::everyEntryHasSwiftsShortcutWithCtrlForCommand()
{"newCanvas", "Ctrl+N"}, {"openProject", "Ctrl+O"}, {"importImages", ""}, {"save", "Ctrl+S"}, {"saveAs", "Ctrl+Shift+S"},
{"exportPNG", "Ctrl+Shift+E"}, {"exportJPEG", "Ctrl+Alt+Shift+S"},
{"closeProject", "Ctrl+W"}, {"undo", "Ctrl+Z"}, {"redo", "Ctrl+Shift+Z"}, {"fit", "Ctrl+0"}, {"actualPixels", "Ctrl+1"},
{"zoomIn", "Ctrl+="}, {"zoomOut", "Ctrl+-"}, {"pixelGrid", ""}, {"snap", ""}, {"showGrid", "Ctrl+'"}, {"showGuides", "Ctrl+;"}, {"gridSettings", ""}, {"showRulers", "Ctrl+R"}, {"snapEnabled", "Ctrl+Shift+;"}, {"snapToGuides", ""}, {"snapToGrid", ""}, {"snapToLayers", ""}, {"snapToDocumentBounds", ""}, {"lockGuides", "Ctrl+Alt+;"}, {"clearGuides", ""}, {"transformControls", "Ctrl+H"}, {"transformLayer", "Ctrl+T"},
{"zoomIn", "Ctrl+="}, {"zoomOut", "Ctrl+-"}, {"pixelGrid", ""}, {"showGrid", "Ctrl+'"}, {"showGuides", "Ctrl+;"}, {"gridSettings", ""}, {"showRulers", "Ctrl+R"}, {"snapEnabled", "Ctrl+Shift+;"}, {"snapToGuides", ""}, {"snapToGrid", ""}, {"snapToLayers", ""}, {"snapToDocumentBounds", ""}, {"lockGuides", "Ctrl+Alt+;"}, {"clearGuides", ""}, {"transformControls", "Ctrl+H"}, {"transformLayer", "Ctrl+T"},
{"layerViaCopy", "Ctrl+J"}, {"cut", "Ctrl+X"}, {"copy", "Ctrl+C"}, {"copyMerged", "Ctrl+Shift+C"}, {"paste", "Ctrl+V"}, {"keyboardShortcuts", ""}, {"fillForeground", "Alt+Backspace"}, {"fillBackground", "Ctrl+Backspace"}, {"clearSelectionPixels", ""}, {"contentAwareFill", "Shift+Backspace"}, {"clippingMask", "Ctrl+Alt+G"}, {"groupLayers", "Ctrl+G"},
{"ungroupLayers", "Ctrl+Shift+G"}, {"moveOutOfFolder", ""}, {"newBlankLayer", "Ctrl+Shift+N"}, {"renameLayer", ""}, {"layerVisibility", ""}, {"moveLayerUp", "Ctrl+]"}, {"moveLayerDown", "Ctrl+["},
{"mergeLayers", "Ctrl+E"}, {"flipHorizontal", ""}, {"flipVertical", ""}, {"deleteLayer", ""},
@@ -51,7 +51,7 @@ void CompositorMenusTests::everyEntryHasSwiftsShortcutWithCtrlForCommand()
QCOMPARE(titles, (QStringList{"&File", "&Edit", "&View", "&Select", "&Image", "Fil&ter", "&Layer"}));
QCOMPARE(menus[0]->actions().size(), 12);
QCOMPARE(menus[1]->actions().size(), 13);
QCOMPARE(menus[2]->actions().size(), 17);
QCOMPARE(menus[2]->actions().size(), 16);
QCOMPARE(menus[3]->actions().size(), 11);
// Swift 1.3.4's Color Range… follows Subject.
const QList<QAction *> select = menus[3]->actions();
+1 -1
View File
@@ -200,7 +200,7 @@ void CropCanvasTests::snappingReachesEightViewPoints()
shown.drag(from, to);
QCOMPARE(shown.frame(), std::optional(QRectF(100, 50, 300, 120)));
// Snap off: the edges stay where the pointer puts them.
shown.session.setSnappingEnabled(false);
shown.session.setSnapEnabled(false);
shown.session.setCropRect(std::nullopt);
shown.drag(from, to);
QCOMPARE(shown.frame(), std::optional(QRectF(100, 50, 290, 120)));
+2 -2
View File
@@ -451,11 +451,11 @@ void GuideTests::drawnPointsSnapToTheSnapToTargets()
// The canvas's middle is no target for a drawn point.
QCOMPARE(session->snappedPoint(QPointF(62, 149), 2), QPointF(64, 149));
QVERIFY(session->snapGuides.ys.empty());
session->setSnappingEnabled(false);
session->setSnapEnabled(false);
session->snapGuides = {{1}, {2}};
QCOMPARE(session->snappedPoint(QPointF(62, 20), 3), QPointF(62, 20));
QVERIFY(session->snapGuides.xs.empty() && session->snapGuides.ys.empty());
session->setSnappingEnabled(true);
session->setSnapEnabled(true);
session->setSnapEnabled(false);
QCOMPARE(session->snappedPoint(QPointF(62, 20), 3), QPointF(62, 20));
QVERIFY(session->snapGuides.xs.empty() && session->snapGuides.ys.empty());
+2 -2
View File
@@ -25,13 +25,13 @@ void ResizeSnapCanvasTests::resizedEdgesSnapUnlessCtrl()
QCOMPARE(layerWith(session, shown.red).transform.size, QSizeF(246, 100));
// Snapping off, nothing snaps.
session.undo();
session.setSnappingEnabled(false);
session.setSnapEnabled(false);
shown.drag(QPointF(250, 150), QPointF(396, 150));
QCOMPARE(layerWith(session, shown.red).transform.size, QSizeF(246, 100));
QCOMPARE(session.snapGuides, SnapGuides{});
// Locked, Shift frees the lock: a corner snaps both edges.
session.undo();
session.setSnappingEnabled(true);
session.setSnapEnabled(true);
session.setLocksTransformRatio(true);
shown.press(QPointF(250, 200));
shown.move(QPointF(396, 296), Qt::ShiftModifier);
+2 -2
View File
@@ -171,10 +171,10 @@ void ResizeSnapTests::aTieTakesTheLowEdge()
void ResizeSnapTests::snappingOffOrAnotherDragLeavesThePoint()
{
Resized resized;
resized.session.setSnappingEnabled(false);
resized.session.setSnapEnabled(false);
const LayerTransform result = resized.resize(3, QPointF(110, 60), QPointF(147, 60), false);
QCOMPARE(result.origin.x() + result.size.width(), 147.0);
resized.session.setSnappingEnabled(true);
resized.session.setSnapEnabled(true);
const TransformDrag move{layerWith(resized.session, resized.layer).transform, QPointF(110, 60), {TransformDrag::Kind::move, 3}, std::nullopt};
QCOMPARE(resized.session.snappedResizePoint(QPointF(147, 60), move, false, {resized.layer}, 5, [&](QPointF to) { return move.updated(to, false, false); }),
QPointF(147, 60));
+2 -2
View File
@@ -17,7 +17,7 @@ namespace {
struct Snapping : Canvas {
Snapping()
{
session.setSnappingEnabled(true);
session.setSnapEnabled(true);
session.setSnapEnabled(true);
session.setSnapToDocumentBounds(true);
session.setSnapToLayers(false);
@@ -151,7 +151,7 @@ void SnapDrawingCanvasTests::aMovedSelectionSnapsItsEdges()
QVERIFY(session->beginSelectionMove());
const double whole = std::round(2 - left);
QCOMPARE(session->snappedSelectionOffset(QSizeF(whole, 0), 3), QSizeF(whole - (left + whole), 0));
session->setSnappingEnabled(false);
session->setSnapEnabled(false);
QCOMPARE(session->snappedSelectionOffset(QSizeF(-8.6, 0), 3), QSizeF(-8.6, 0));
QVERIFY(session->snapGuides.xs.empty());
}
+2 -2
View File
@@ -77,13 +77,13 @@ void TransformSnapTests::snappedMoveNudgesWithinToleranceAndKeepsTheGuides()
const LayerTransform snapped = session.snappedMove(draft, {a}, 5);
QVERIFY(snapped != draft && !session.snapGuides.xs.empty());
QSignalSpy changes(&session, &EditorSession::changed);
session.setSnappingEnabled(false);
session.setSnapEnabled(false);
QVERIFY(!session.snappingEnabled() && changes.count() == 1);
QCOMPARE(session.snapGuides, SnapGuides{});
session.snapGuides = SnapGuides{{1}, {2}};
QCOMPARE(session.snappedMove(draft, {a}, 5), draft);
QCOMPARE(session.snapGuides, SnapGuides{});
session.setSnappingEnabled(true);
session.setSnapEnabled(true);
QCOMPARE(session.snappedMove(draft, {a}, 5), snapped);
}
+10 -9
View File
@@ -71,15 +71,16 @@ void ViewMenuTests::thePixelGridEntryTogglesTheSession()
QVERIFY(!grid.isChecked());
bar.workspace.newCanvas();
QVERIFY(grid.isChecked() && grid.isEnabled());
// Snap, beneath it, follows the session the same way.
QAction &snap = bar.action("snap");
QVERIFY(snap.isCheckable() && snap.isChecked() && snap.isEnabled() && snap.text() == "Snap");
snap.trigger();
QVERIFY(!bar.session().snappingEnabled() && !snap.isChecked());
snap.trigger();
QVERIFY(bar.session().snappingEnabled() && snap.isChecked());
bar.session().setSnappingEnabled(false);
QVERIFY(!snap.isChecked());
// One Snap for all snapping (Swift 1.4.6).
QVERIFY(!bar.window.findChild<QAction *>("snap"));
QStringList titles;
for (const QAction *entry : bar.window.findChildren<QAction *>())
titles << entry->text();
QCOMPARE(titles.count("Snap"), qsizetype(1));
bar.session().setSnapEnabled(false);
QVERIFY(!bar.session().snappingEnabled() && !bar.action("snapEnabled").isChecked());
bar.session().setSnapEnabled(true);
QVERIFY(bar.session().snappingEnabled() && bar.action("snapEnabled").isChecked());
}
void ViewMenuTests::guideEntriesFollowTheSession()