#include "ScrubFixtures.h" #include "UI/BrushControls.h" #include "UI/GradientControls.h" #include "UI/LassoControls.h" #include "UI/ShapeControls.h" #include "UI/TypeControls.h" #include // Swift's scrubbable labels and units in the tool bars. class ScrubbableLabelsTests : public QObject { Q_OBJECT private slots: void theBrushsLabelsScrubItsTip(); void theGradientsOpacityScrubs(); void theSelectionBarsLabelsAndUnitsScrubWholeNumbers(); void theAmountSheetsTitleScrubsItsInput(); void theShapesWidthAndRadiusScrub(); void theTypeBarScrubsWholeSizesTrackingAndLeading(); void aScrubShowsItsValueInAFocusedField(); void featherScrubsWithoutASelection(); }; void ScrubbableLabelsTests::theBrushsLabelsScrubItsTip() { EditorSession session; session.createDocument(100, 100, true); session.selectTool(NavigationTool::brush); BrushControls bar(session); bar.show(); drag(scrubbed(bar, "Size"), 25); QCOMPARE(session.brushSettings().diameter, 65.0); QCOMPARE(find(bar, "brushSize").text(), QString("65")); drag(scrubbed(bar, "Size"), -5000); QCOMPARE(session.brushSettings().diameter, 1.0); drag(scrubbed(bar, "Size"), 5000); QCOMPARE(session.brushSettings().diameter, 2000.0); // Unstepped, a fraction of a point counts. drag(scrubbed(bar, "Size"), -1.5); QCOMPARE(session.brushSettings().diameter, 1998.5); drag(scrubbed(bar, "Hardness"), -30); QVERIFY(qAbs(session.brushSettings().hardness - 0.7) < 1e-12); drag(scrubbed(bar, "Hardness"), 90); QCOMPARE(session.brushSettings().hardness, 1.0); drag(scrubbed(bar, "Hardness"), -900); QCOMPARE(session.brushSettings().hardness, 0.0); drag(scrubbed(bar, "Opacity"), -50); QVERIFY(qAbs(session.brushSettings().opacity - 0.5) < 1e-12); drag(scrubbed(bar, "Opacity"), -500); QCOMPARE(session.brushSettings().opacity, 0.01); drag(scrubbed(bar, "Opacity"), 500); QCOMPARE(session.brushSettings().opacity, 1.0); drag(scrubbed(bar, "Smoothing"), 30); QCOMPARE(session.brushSettings().smoothing, 30.0); drag(scrubbed(bar, "Smoothing"), 300); QCOMPARE(session.brushSettings().smoothing, 100.0); drag(scrubbed(bar, "Smoothing"), -300); QCOMPARE(session.brushSettings().smoothing, 0.0); // The Smear's Strength is the same label, retitled. session.selectTool(NavigationTool::blur); const double strength = session.brushSettings().opacity; drag(scrubbed(bar, "Strength"), -10); QVERIFY(qAbs(session.brushSettings().opacity - (strength - 0.1)) < 1e-12); } void ScrubbableLabelsTests::theGradientsOpacityScrubs() { EditorSession session; session.createDocument(100, 100, true); session.selectTool(NavigationTool::gradient); GradientControls bar(session); bar.show(); // Unstepped: a point and a half is 1.5%. drag(scrubbed(bar, "Opacity"), -1.5); QVERIFY(qAbs(session.gradientSettings().opacity - 0.985) < 1e-12); drag(scrubbed(bar, "Opacity"), 1.5); drag(scrubbed(bar, "Opacity"), -40); QVERIFY(qAbs(session.gradientSettings().opacity - 0.6) < 1e-12); drag(scrubbed(bar, "Opacity"), -400); QCOMPARE(session.gradientSettings().opacity, 0.01); drag(scrubbed(bar, "Opacity"), 400); QCOMPARE(session.gradientSettings().opacity, 1.0); } void ScrubbableLabelsTests::theSelectionBarsLabelsAndUnitsScrubWholeNumbers() { std::unique_ptr session = selectionSession(); LassoControls bar(*session); bar.resize(1600, bar.height()); bar.show(); // Without a selection the amounts rest, units and all. QLabel &expand = scrubbed(bar, "px", 0); QVERIFY(!expand.isEnabled()); QVERIFY(!scrubbed(bar, "px", 1).isEnabled()); drag(scrubbed(bar, "px", 1), 9); QCOMPARE(session->selectionContractAmount(), 1); lasso(*session, square(10, 10, 20)); QVERIFY(expand.isEnabled()); drag(expand, 7); QCOMPARE(session->selectionExpandAmount(), 8); drag(expand, 900); QCOMPARE(session->selectionExpandAmount(), 500); drag(expand, -900); QCOMPARE(session->selectionExpandAmount(), 1); drag(scrubbed(bar, "px", 1), 4); QCOMPARE(session->selectionContractAmount(), 5); drag(scrubbed(bar, "px", 1), 900); QCOMPARE(session->selectionContractAmount(), 500); drag(scrubbed(bar, "px", 1), -900); QCOMPARE(session->selectionContractAmount(), 1); drag(scrubbed(bar, "px", 2), 3); QCOMPARE(session->selectionFeatherAmount(), 5); drag(scrubbed(bar, "px", 2), 900); QCOMPARE(session->selectionFeatherAmount(), 250); drag(scrubbed(bar, "px", 2), -900); QCOMPARE(session->selectionFeatherAmount(), 1); QCOMPARE(find(bar, "selectionFeatherAmount").text(), QString("1")); session->selectTool(NavigationTool::wand); // Whole numbers round, where the setter would truncate. drag(scrubbed(bar, "Tolerance"), 1.6); QCOMPARE(session->wandSettings().tolerance, 34); drag(scrubbed(bar, "Tolerance"), 8); QCOMPARE(session->wandSettings().tolerance, 42); drag(scrubbed(bar, "Tolerance"), 400); QCOMPARE(session->wandSettings().tolerance, 255); drag(scrubbed(bar, "Tolerance"), -400); QCOMPARE(session->wandSettings().tolerance, 0); session->setWandMode(WandMode::object); drag(scrubbed(bar, "Edge"), -1.5); QCOMPARE(session->objectSelectionSettings().edgeOffset, -2); drag(scrubbed(bar, "Edge"), -2); QCOMPARE(session->objectSelectionSettings().edgeOffset, -4); drag(scrubbed(bar, "Edge"), 50); QCOMPARE(session->objectSelectionSettings().edgeOffset, 10); drag(scrubbed(bar, "Edge"), -50); QCOMPARE(session->objectSelectionSettings().edgeOffset, -10); } void ScrubbableLabelsTests::theAmountSheetsTitleScrubsItsInput() { std::unique_ptr session = selectionSession(); SelectionAmountSheet sheet(*session, SelectionAmountOperation::feather); sheet.show(); QLineEdit &input = find(sheet, "amountField"); // Rounded to whole pixels, not truncated. drag(scrubbed(sheet, "Amount"), 1.6); QCOMPARE(input.text(), QString("4")); input.setText(QStringLiteral("2")); drag(scrubbed(sheet, "Amount"), 10); QCOMPARE(input.text(), QString("12")); drag(scrubbed(sheet, "Amount"), 900); QCOMPARE(input.text(), QString("250")); // Unreadable input starts the drag from one. input.setText(QStringLiteral("abc")); drag(scrubbed(sheet, "Amount"), 4); QCOMPARE(input.text(), QString("5")); drag(scrubbed(sheet, "Amount"), -40); QCOMPARE(input.text(), QString("1")); SelectionAmountSheet expand(*session, SelectionAmountOperation::expand); drag(scrubbed(expand, "Amount"), 900); QCOMPARE(find(expand, "amountField").text(), QString("500")); } void ScrubbableLabelsTests::theShapesWidthAndRadiusScrub() { EditorSession session; session.createDocument(100, 100, true); session.selectTool(NavigationTool::shape); session.setShapeKind(ShapeKind::line); ShapeControls bar(session); bar.show(); drag(scrubbed(bar, "Width"), 6.5); QCOMPARE(session.shapeLineWidth(), 10.5); drag(scrubbed(bar, "Width"), 9000); QCOMPARE(session.shapeLineWidth(), 5000.0); drag(scrubbed(bar, "Width"), -9000); QCOMPARE(session.shapeLineWidth(), 1.0); session.setShapeKind(ShapeKind::rectangle); drag(scrubbed(bar, "Radius"), 12.25); QCOMPARE(session.shapeCornerRadius(), 12.25); drag(scrubbed(bar, "Radius"), 9000); QCOMPARE(session.shapeCornerRadius(), 5000.0); drag(scrubbed(bar, "Radius"), -9000); QCOMPARE(session.shapeCornerRadius(), 0.0); } void ScrubbableLabelsTests::theTypeBarScrubsWholeSizesTrackingAndLeading() { EditorSession session; session.createDocument(400, 300, true); session.selectTool(NavigationTool::type); TypeControls bar(session); bar.show(); session.changeTextStyle([](LayerTextStyle &style) { style.fontSize = 24.4; }); // Dragged sizes land on whole numbers, Swift's step of one. drag(scrubbed(bar, "px"), 3); QCOMPARE(session.currentTextStyle().fontSize, 27.0); drag(scrubbed(bar, "px"), 5000); QCOMPARE(session.currentTextStyle().fontSize, 2000.0); drag(scrubbed(bar, "px"), -5000); QCOMPARE(session.currentTextStyle().fontSize, 1.0); session.changeTextStyle([](LayerTextStyle &style) { style.tracking = 2.6; }); drag(scrubbed(bar, "Tracking"), -5); QCOMPARE(session.currentTextStyle().tracking, -2.0); drag(scrubbed(bar, "Tracking"), -500); QCOMPARE(session.currentTextStyle().tracking, -100.0); drag(scrubbed(bar, "Tracking"), 5000); QCOMPARE(session.currentTextStyle().tracking, 1000.0); // Auto is zero, so a drag starts there. drag(scrubbed(bar, "Leading"), 12); QCOMPARE(session.currentTextStyle().leading, 12.0); drag(scrubbed(bar, "Leading"), -50); QCOMPARE(session.currentTextStyle().leading, 0.0); drag(scrubbed(bar, "Leading"), 9000); QCOMPARE(session.currentTextStyle().leading, 5000.0); } void ScrubbableLabelsTests::aScrubShowsItsValueInAFocusedField() { EditorSession session; session.createDocument(100, 100, true); session.selectTool(NavigationTool::brush); { BrushControls bar(session); showActive(bar); QCOMPARE(scrubOverTyping(find(bar, "brushSize"), scrubbed(bar, "Size"), 25), QString("32")); QCOMPARE(scrubOverTyping(find(bar, "brushHardness"), scrubbed(bar, "Hardness"), 30), QString("37")); QCOMPARE(scrubOverTyping(find(bar, "brushOpacity"), scrubbed(bar, "Opacity"), 40), QString("47")); QCOMPARE(scrubOverTyping(find(bar, "brushSmoothing"), scrubbed(bar, "Smoothing"), 12), QString("19")); } session.selectTool(NavigationTool::gradient); { GradientControls bar(session); showActive(bar); QCOMPARE(scrubOverTyping(find(bar, "gradientOpacity"), scrubbed(bar, "Opacity"), 25), QString("32")); } session.selectTool(NavigationTool::shape); session.setShapeKind(ShapeKind::line); { ShapeControls bar(session); showActive(bar); QCOMPARE(scrubOverTyping(find(bar, "shapeWidth"), scrubbed(bar, "Width"), 6), QString("13")); } session.selectTool(NavigationTool::wand); { LassoControls bar(session); bar.resize(1600, bar.height()); showActive(bar); QCOMPARE(scrubOverTyping(find(bar, "wandTolerance"), scrubbed(bar, "Tolerance"), 10), QString("17")); QCOMPARE(scrubOverTyping(find(bar, "selectionFeatherAmount"), scrubbed(bar, "px", 2), 3), QString("10")); } session.selectTool(NavigationTool::type); { TypeControls bar(session); showActive(bar); QCOMPARE(scrubOverTyping(find(bar, "typeTracking"), scrubbed(bar, "Tracking"), 4), QString("11")); QCOMPARE(scrubOverTyping(find(bar, "typeLeading"), scrubbed(bar, "Leading"), 30), QString("37")); QCOMPARE(scrubOverTyping(find(bar, "typeSize"), scrubbed(bar, "px"), -2), QString("5")); } } void ScrubbableLabelsTests::featherScrubsWithoutASelection() { std::unique_ptr session = selectionSession(); LassoControls bar(*session); bar.resize(1600, bar.height()); bar.show(); // Swift rests Feather's button alone; its amount stays. drag(scrubbed(bar, "px", 2), 7); QCOMPARE(session->selectionFeatherAmount(), 9); QVERIFY(find(bar, "selectionFeatherAmount").isEnabled()); QVERIFY(!find(bar, "selectionExpandAmount").isEnabled()); QVERIFY(!find(bar, "selectionContractAmount").isEnabled()); for (QPushButton *button : bar.findChildren()) if (button->text() == "Expand" || button->text() == "Contract" || button->text() == "Feather") QVERIFY(!button->isEnabled()); drag(scrubbed(bar, "px", 0), 7); QCOMPARE(session->selectionExpandAmount(), 1); } QTEST_MAIN(ScrubbableLabelsTests) #include "ScrubbableLabelsTests.moc"