Files
OmaPhoto/tests/LayersLookEditableTests.cpp
T

123 lines
6.7 KiB
C++

#include "UI/LayersPanel.h"
#include "UI/NativeLayerList.h"
#include <QtTest>
// Swift 1.4.8: the panel grays for what lasts, not moments.
namespace {
std::unique_ptr<EditorSession> withLayer()
{
auto session = std::make_unique<EditorSession>();
session->createDocument(20, 20);
QImage pixels(20, 20, QImage::Format_RGBA8888_Premultiplied);
pixels.fill(Qt::white);
session->insert(ImportedImage(pixels, pixels, QStringLiteral("White")));
return session;
}
using Steps = std::pair<std::function<void(EditorSession &)>, std::function<void(EditorSession &)>>;
}
class LayersLookEditableTests : public QObject {
Q_OBJECT
private slots:
void aMomentLooksEditableWhileTheGateStaysShut();
void whatLastsGraysThePanel();
void theFooterAndListFollowTheLook();
};
void LayersLookEditableTests::aMomentLooksEditableWhileTheGateStaysShut()
{
const std::vector<std::pair<const char *, Steps>> moments{
{"stroke", {[](EditorSession &s) { s.selectTool(NavigationTool::brush); s.beginBrush(QPointF(5, 5)); }, [](EditorSession &s) { s.cancelBrush(); }}},
{"warp", {[](EditorSession &s) { s.selectTool(NavigationTool::blur); s.setBlurMode(BlurToolMode::liquify); s.beginBrush(QPointF(5, 5)); },
[](EditorSession &s) { s.cancelBrush(); }}},
{"drag", {[](EditorSession &s) { s.selectTool(NavigationTool::move); s.beginTransform(false); }, [](EditorSession &s) { s.cancelTransform(); }}},
{"pixels", {[](EditorSession &s) { s.selectAll(); s.beginPixelMove(); }, [](EditorSession &s) { s.cancelPixelMove(); s.deselect(); }}},
{"busy", {[](EditorSession &s) { s.setIsProjectBusy(true); }, [](EditorSession &s) { s.setIsProjectBusy(false); }}}};
const auto session = withLayer();
QVERIFY(session->layersLookEditable() && session->canEditLayers());
for (const auto &[name, steps] : moments) {
steps.first(*session);
QVERIFY2(session->layersLookEditable() && !session->canEditLayers(), name);
steps.second(*session);
QVERIFY2(session->layersLookEditable() && session->canEditLayers(), name);
}
// Busy long enough to show it: then it grays.
session->setIsProjectBusy(true);
QTRY_VERIFY(session->showsBusy());
QVERIFY(!session->layersLookEditable());
session->setIsProjectBusy(false);
QVERIFY(session->layersLookEditable());
}
void LayersLookEditableTests::whatLastsGraysThePanel()
{
QVERIFY(!EditorSession().layersLookEditable());
const std::vector<std::pair<const char *, Steps>> lasting{
{"amount", {[](EditorSession &s) { s.setSelectionAmountOperation(SelectionAmountOperation::feather); },
[](EditorSession &s) { s.setSelectionAmountOperation(std::nullopt); }}},
{"range", {[](EditorSession &s) { s.beginColorRange(); }, [](EditorSession &s) { s.cancelColorRange(); }}},
{"text", {[](EditorSession &s) { s.selectTool(NavigationTool::type); s.beginText(QPointF(5, 5), true); }, [](EditorSession &s) { s.cancelText(); }}},
{"importing", {[](EditorSession &s) { s.setIsImporting(true); }, [](EditorSession &s) { s.setIsImporting(false); }}},
{"sheet", {[](EditorSession &s) { s.setShowsNewDocument(true); }, [](EditorSession &s) { s.setShowsNewDocument(false); }}},
{"importer", {[](EditorSession &s) { s.setShowsImporter(true); }, [](EditorSession &s) { s.setShowsImporter(false); }}},
{"rename", {[](EditorSession &s) { s.setRenamingLayerID(s.activeLayerID()); }, [](EditorSession &s) { s.setRenamingLayerID(std::nullopt); }}},
{"transform", {[](EditorSession &s) { s.selectTool(NavigationTool::move); s.beginTransform(); }, [](EditorSession &s) { s.cancelTransform(); }}},
{"crop", {[](EditorSession &s) { s.selectTool(NavigationTool::crop); }, [](EditorSession &s) { s.cancelCrop(); }}},
{"gradient", {[](EditorSession &s) { s.selectTool(NavigationTool::gradient); s.beginGradient(QPointF(2, 2)); s.moveGradient(std::nullopt, QPointF(12, 2)); },
[](EditorSession &s) { s.cancelGradient(); }}},
{"hue", {[](EditorSession &s) { s.beginHueSaturation(); }, [](EditorSession &s) { s.cancelHueSaturation(); }}},
{"levels", {[](EditorSession &s) { s.beginLevels(); }, [](EditorSession &s) { s.cancelLevels(); }}},
{"filter", {[](EditorSession &s) { s.beginFilter(FilterKind::gaussianBlur); }, [](EditorSession &s) { s.cancelFilter(); }}},
{"adjustment", {[](EditorSession &s) { s.setAdjustmentEditingID(s.activeLayerID()); }, [](EditorSession &s) { s.setAdjustmentEditingID(std::nullopt); }}}};
const auto session = withLayer();
for (const auto &[name, steps] : lasting) {
steps.first(*session);
QVERIFY2(!session->layersLookEditable(), name);
steps.second(*session);
QVERIFY2(session->layersLookEditable(), name);
}
}
void LayersLookEditableTests::theFooterAndListFollowTheLook()
{
const auto session = withLayer();
LayersPanel panel(*session);
panel.show();
QVERIFY(QTest::qWaitForWindowExposed(&panel));
auto *add = panel.findChild<QToolButton *>("addBlankLayer");
auto *effects = panel.findChild<QToolButton *>("layerEffects");
auto *mask = panel.findChild<QToolButton *>("addLayerMask");
auto *eye = panel.list().cells().at(0)->findChild<QToolButton *>("layerEye");
// Mid-stroke nothing flashes, and a click changes nothing.
session->selectTool(NavigationTool::brush);
session->beginBrush(QPointF(5, 5));
QVERIFY(add->isEnabled() && effects->isEnabled() && mask->isEnabled() && eye->isEnabled());
QTest::mouseClick(add, Qt::LeftButton);
QCOMPARE(session->document().value().layers.size(), size_t(1));
session->cancelBrush();
// A pending transform grays them.
session->selectTool(NavigationTool::move);
session->beginTransform();
QVERIFY(!add->isEnabled() && !effects->isEnabled() && !mask->isEnabled() && !eye->isEnabled());
session->cancelTransform();
// Effects want pixels: no folder, no adjustment, no layer.
session->addGroup();
QVERIFY(add->isEnabled() && !effects->isEnabled());
session->addAdjustment(AdjustmentKind::invert);
QVERIFY(!effects->isEnabled());
session->selectLayer(std::nullopt);
QVERIFY(!effects->isEnabled() && !mask->isEnabled() && !panel.findChild<QToolButton *>("deleteLayer")->isEnabled());
// The mask button takes one layer, without a mask.
const QUuid white = session->document().value().layers.front().id;
session->selectLayers({white, session->document().value().layers.back().id}, white);
QVERIFY(!mask->isEnabled());
session->selectLayer(white);
QVERIFY(mask->isEnabled() && effects->isEnabled());
session->addMask();
QVERIFY(!mask->isEnabled());
}
QTEST_MAIN(LayersLookEditableTests)
#include "LayersLookEditableTests.moc"