void TestShapePainting::testPaintHiddenShape() { MockShape shape; MockContainer fourth; MockContainer thirth; MockContainer second; MockContainer top; top.addShape(&second); second.addShape(&thirth); thirth.addShape(&fourth); fourth.addShape(&shape); second.setVisible(false); MockCanvas canvas; KShapeManager manager(&canvas); manager.addShape(&top); QCOMPARE(manager.shapes().count(), 5); QImage image(100, 100, QImage::Format_Mono); QPainter painter(&image); KViewConverter vc; manager.paint(painter, vc, false); QCOMPARE(top.paintedCount, 1); QCOMPARE(second.paintedCount, 0); QCOMPARE(thirth.paintedCount, 0); QCOMPARE(fourth.paintedCount, 0); QCOMPARE(shape.paintedCount, 0); }
void TestShapePainting::testPaintHiddenShape() { MockShape *shape = new MockShape(); MockContainer *fourth = new MockContainer(); MockContainer *thirth = new MockContainer(); MockContainer *second = new MockContainer(); MockContainer *top = new MockContainer(); top->addShape(second); second->addShape(thirth); thirth->addShape(fourth); fourth->addShape(shape); second->setVisible(false); MockCanvas canvas; KoShapeManager manager(&canvas); manager.addShape(top); QCOMPARE(manager.shapes().count(), 5); QImage image(100, 100, QImage::Format_Mono); QPainter painter(&image); KoViewConverter vc; manager.paint(painter, vc, false); QCOMPARE(top->paintedCount, 1); QCOMPARE(second->paintedCount, 0); QCOMPARE(thirth->paintedCount, 0); QCOMPARE(fourth->paintedCount, 0); QCOMPARE(shape->paintedCount, 0); delete top; }
void TestShapePainting::testPaintShape() { MockShape *shape1 = new MockShape(); MockShape *shape2 = new MockShape(); MockContainer *container = new MockContainer(); container->addShape(shape1); container->addShape(shape2); QCOMPARE(shape1->parent(), container); QCOMPARE(shape2->parent(), container); container->setClipped(shape1, false); container->setClipped(shape2, false); QCOMPARE(container->isClipped(shape1), false); QCOMPARE(container->isClipped(shape2), false); MockCanvas canvas; KoShapeManager manager(&canvas); manager.addShape(container); QCOMPARE(manager.shapes().count(), 3); QImage image(100, 100, QImage::Format_Mono); QPainter painter(&image); KoViewConverter vc; manager.paint(painter, vc, false); // with the shape not being clipped, the shapeManager will paint it for us. QCOMPARE(shape1->paintedCount, 1); QCOMPARE(shape2->paintedCount, 1); QCOMPARE(container->paintedCount, 1); // the container should thus not paint the shape shape1->paintedCount = 0; shape2->paintedCount = 0; container->paintedCount = 0; KoShapePaintingContext paintContext; container->paint(painter, vc, paintContext); QCOMPARE(shape1->paintedCount, 0); QCOMPARE(shape2->paintedCount, 0); QCOMPARE(container->paintedCount, 1); container->setClipped(shape1, false); container->setClipped(shape2, true); QCOMPARE(container->isClipped(shape1), false); QCOMPARE(container->isClipped(shape2), true); shape1->paintedCount = 0; shape2->paintedCount = 0; container->paintedCount = 0; manager.paint(painter, vc, false); // with this shape not being clipped, the shapeManager will paint the container and this shape QCOMPARE(shape1->paintedCount, 1); // with this shape being clipped, the container will paint it for us. QCOMPARE(shape2->paintedCount, 1); QCOMPARE(container->paintedCount, 1); delete container; }
void TestShapePainting::testPaintShape() { MockShape shape1; MockShape shape2; MockContainer container; KComponentData componentData("TestShapePainting"); // we need an instance for that canvas container.addShape(&shape1); container.addShape(&shape2); QCOMPARE(shape1.parent(), &container); QCOMPARE(shape2.parent(), &container); container.setClipped(&shape1, false); container.setClipped(&shape2, false); QCOMPARE(container.isClipped(&shape1), false); QCOMPARE(container.isClipped(&shape2), false); MockCanvas canvas; KShapeManager manager(&canvas); manager.addShape(&container); QCOMPARE(manager.shapes().count(), 3); QImage image(100, 100, QImage::Format_Mono); QPainter painter(&image); KViewConverter vc; manager.paint(painter, vc, false); // with the shape not being clipped, the shapeManager will paint it for us. QCOMPARE(shape1.paintedCount, 1); QCOMPARE(shape2.paintedCount, 1); QCOMPARE(container.paintedCount, 1); // the container should thus not paint the shape shape1.paintedCount = 0; shape2.paintedCount = 0; container.paintedCount = 0; container.paint(painter, vc); QCOMPARE(shape1.paintedCount, 0); QCOMPARE(shape2.paintedCount, 0); QCOMPARE(container.paintedCount, 1); container.setClipped(&shape1, false); container.setClipped(&shape2, true); QCOMPARE(container.isClipped(&shape1), false); QCOMPARE(container.isClipped(&shape2), true); shape1.paintedCount = 0; shape2.paintedCount = 0; container.paintedCount = 0; manager.paint(painter, vc, false); // with this shape not being clipped, the shapeManager will paint the container and this shape QCOMPARE(shape1.paintedCount, 1); // with this shape being clipped, the container will paint it for us. QCOMPARE(shape2.paintedCount, 1); QCOMPARE(container.paintedCount, 1); }
void TestShapeReorderCommand::testSendToBackChildren() { MockShape shape1, shape2, shape3; shape1.setSize(QSizeF(100, 100)); shape1.setZIndex(1); shape2.setSize(QSizeF(100, 100)); shape2.setZIndex(2); shape3.setSize(QSizeF(100, 100)); shape3.setZIndex(3); MockContainer container; container.addShape(&shape1); container.addShape(&shape2); container.addShape(&shape3); QList<KShape*> shapes; shapes.append(&shape1); shapes.append(&shape2); shapes.append(&shape3); shapes.append(&container); MockCanvas canvas; KShapeManager manager(&canvas, shapes); qSort(shapes.begin(), shapes.end(), KShape::compareShapeZIndex); QCOMPARE(shapes.indexOf(&container), 0); // atm the parent is always lower than its children QCOMPARE(shapes.indexOf(&shape1), 1); QCOMPARE(shapes.indexOf(&shape2), 2); QCOMPARE(shapes.indexOf(&shape3), 3); QList<KShape*> selectedShapes; selectedShapes.append(&shape3); QUndoCommand * cmd = KShapeReorderCommand::createCommand(selectedShapes, &manager, KShapeReorderCommand::SendToBack); cmd->redo(); delete cmd; qSort(shapes.begin(), shapes.end(), KShape::compareShapeZIndex); QCOMPARE(shapes.indexOf(&container), 0); // atm the parent is always lower than its children QCOMPARE(shapes.indexOf(&shape3), 1); QVERIFY(shape3.zIndex() < shape1.zIndex()); QCOMPARE(shapes.indexOf(&shape1), 2); QVERIFY(shape1.zIndex() < shape2.zIndex()); QCOMPARE(shapes.indexOf(&shape2), 3); selectedShapes.clear(); selectedShapes.append(&shape2); cmd = KShapeReorderCommand::createCommand(selectedShapes, &manager, KShapeReorderCommand::SendToBack); cmd->redo(); delete cmd; qSort(shapes.begin(), shapes.end(), KShape::compareShapeZIndex); QCOMPARE(shapes.indexOf(&container), 0); // atm the parent is always lower than its children QCOMPARE(shapes.indexOf(&shape2), 1); QVERIFY(shape2.zIndex() < shape3.zIndex()); QCOMPARE(shapes.indexOf(&shape3), 2); QVERIFY(shape3.zIndex() < shape1.zIndex()); QCOMPARE(shapes.indexOf(&shape1), 3); selectedShapes.clear(); selectedShapes.append(&shape1); cmd = KShapeReorderCommand::createCommand(selectedShapes, &manager, KShapeReorderCommand::SendToBack); cmd->redo(); delete cmd; qSort(shapes.begin(), shapes.end(), KShape::compareShapeZIndex); QCOMPARE(shapes.indexOf(&container), 0); // atm the parent is always lower than its children QCOMPARE(shapes.indexOf(&shape1), 1); QVERIFY(shape1.zIndex() < shape2.zIndex()); QCOMPARE(shapes.indexOf(&shape2), 2); QVERIFY(shape2.zIndex() < shape3.zIndex()); QCOMPARE(shapes.indexOf(&shape3), 3); }
void TestSelection::testSelectedShapes() { KoSelection selection; MockShape *shape1 = new MockShape(); MockShape *shape2 = new MockShape(); MockShape *shape3 = new MockShape(); QCOMPARE(selection.count(), 0); QCOMPARE(selection.selectedShapes().count(), 0); selection.select(shape1); QCOMPARE(selection.count(), 1); QCOMPARE(selection.selectedShapes(KoFlake::FullSelection).count(), 1); QCOMPARE(selection.selectedShapes(KoFlake::StrippedSelection).count(), 1); QCOMPARE(selection.selectedShapes(KoFlake::TopLevelSelection).count(), 1); selection.select(shape1); // same one. QCOMPARE(selection.count(), 1); QCOMPARE(selection.selectedShapes(KoFlake::FullSelection).count(), 1); QCOMPARE(selection.selectedShapes(KoFlake::StrippedSelection).count(), 1); QCOMPARE(selection.selectedShapes(KoFlake::TopLevelSelection).count(), 1); selection.select(shape2); selection.select(shape3); QCOMPARE(selection.count(), 3); QCOMPARE(selection.selectedShapes(KoFlake::FullSelection).count(), 3); QCOMPARE(selection.selectedShapes(KoFlake::StrippedSelection).count(), 3); QCOMPARE(selection.selectedShapes(KoFlake::TopLevelSelection).count(), 3); MockGroup *group1 = new MockGroup(); group1->addShape(shape1); group1->addShape(shape2); selection.select(group1); QCOMPARE(selection.count(), 3); // don't return the grouping shape. // Stripped returns no groups, so simply all 3 shapes QCOMPARE(selection.selectedShapes(KoFlake::FullSelection).count(), 3); // stripped returns no groups; so simply all shapes. QCOMPARE(selection.selectedShapes(KoFlake::StrippedSelection).count(), 3); // toplevel returns shape3 and group1 QCOMPARE(selection.selectedShapes(KoFlake::TopLevelSelection).count(), 2); MockGroup *group2 = new MockGroup(); group2->addShape(shape3); group2->addShape(group1); selection.select(group2); QCOMPARE(selection.count(), 3); // thats 5 minus 2 grouping shapes. // Stripped returns no groups, so simply all 3 shapes QCOMPARE(selection.selectedShapes(KoFlake::FullSelection).count(), 3); // Stripped returns no groups, so simply all 3 shapes QCOMPARE(selection.selectedShapes(KoFlake::StrippedSelection).count(), 3); // toplevel returns only group2 QCOMPARE(selection.selectedShapes(KoFlake::TopLevelSelection).count(), 1); group1->removeShape(shape1); group1->removeShape(shape2); MockContainer *container = new MockContainer(); container->addShape(shape1); container->addShape(shape2); selection.select(container); QCOMPARE(selection.count(), 4); // thats 6 minus 2 grouping shapes. // Stripped returns no groups, so simply all 3 shapes + container QCOMPARE(selection.selectedShapes(KoFlake::FullSelection).count(), 4); // Stripped returns no groups, and no children of a container. So; container + shape3 QCOMPARE(selection.selectedShapes(KoFlake::StrippedSelection).count(), 2); // toplevel returns only group2 + container QCOMPARE(selection.selectedShapes(KoFlake::TopLevelSelection).count(), 2); delete group2; delete container; }
void TestShapePainting::testPaintOrder() { // the stacking order determines the painting order so things on top // get their paint called last. // Each shape has a zIndex and within the children a container has // it determines the stacking order. Its important to realize that // the zIndex is thus local to a container, if you have layer1 and layer2 // with both various child shapes the stacking order of the layer shapes // is most important, then within this the child shape index is used. class OrderedMockShape : public MockShape { public: OrderedMockShape(QList<MockShape*> &list) : order(list) {} void paint(QPainter &painter, const KViewConverter &converter) { order.append(this); MockShape::paint(painter, converter); } QList<MockShape*> ℴ }; QList<MockShape*> order; MockContainer top; top.setZIndex(2); OrderedMockShape shape1(order); shape1.setZIndex(5); OrderedMockShape shape2(order); shape2.setZIndex(0); top.addShape(&shape1); top.addShape(&shape2); MockContainer bottom; bottom.setZIndex(1); OrderedMockShape shape3(order); shape3.setZIndex(-1); OrderedMockShape shape4(order); shape4.setZIndex(9); bottom.addShape(&shape3); bottom.addShape(&shape4); MockCanvas canvas; KShapeManager manager(&canvas); manager.addShape(&top); manager.addShape(&bottom); QCOMPARE(manager.shapes().count(), 6); QImage image(100, 100, QImage::Format_Mono); QPainter painter(&image); KViewConverter vc; manager.paint(painter, vc, false); QCOMPARE(top.paintedCount, 1); QCOMPARE(bottom.paintedCount, 1); QCOMPARE(shape1.paintedCount, 1); QCOMPARE(shape2.paintedCount, 1); QCOMPARE(shape3.paintedCount, 1); QCOMPARE(shape4.paintedCount, 1); QCOMPARE(order.count(), 4); QVERIFY(order[0] == &shape3); // lowest first QVERIFY(order[1] == &shape4); QVERIFY(order[2] == &shape2); QVERIFY(order[3] == &shape1); // again, with clipping. order.clear(); painter.setClipRect(0, 0, 100, 100); manager.paint(painter, vc, false); QCOMPARE(top.paintedCount, 2); QCOMPARE(bottom.paintedCount, 2); QCOMPARE(shape1.paintedCount, 2); QCOMPARE(shape2.paintedCount, 2); QCOMPARE(shape3.paintedCount, 2); QCOMPARE(shape4.paintedCount, 2); QCOMPARE(order.count(), 4); QVERIFY(order[0] == &shape3); // lowest first QVERIFY(order[1] == &shape4); QVERIFY(order[2] == &shape2); QVERIFY(order[3] == &shape1); order.clear(); MockContainer root; root.setZIndex(0); MockContainer branch1; branch1.setZIndex(1); OrderedMockShape child1_1(order); child1_1.setZIndex(1); OrderedMockShape child1_2(order); child1_2.setZIndex(2); branch1.addShape(&child1_1); branch1.addShape(&child1_2); MockContainer branch2; branch2.setZIndex(2); OrderedMockShape child2_1(order); child2_1.setZIndex(1); OrderedMockShape child2_2(order); child2_2.setZIndex(2); branch2.addShape(&child2_1); branch2.addShape(&child2_2); root.addShape(&branch1); root.addShape(&branch2); QList<KShape*> sortedShapes; sortedShapes.append(&root); sortedShapes.append(&branch1); sortedShapes.append(&branch2); sortedShapes.append(branch1.shapes()); sortedShapes.append(branch2.shapes()); qSort(sortedShapes.begin(), sortedShapes.end(), KShape::compareShapeZIndex); QCOMPARE(sortedShapes.count(), 7); QVERIFY(sortedShapes[0] == &root); QVERIFY(sortedShapes[1] == &branch1); QVERIFY(sortedShapes[2] == &child1_1); QVERIFY(sortedShapes[3] == &child1_2); QVERIFY(sortedShapes[4] == &branch2); QVERIFY(sortedShapes[5] == &child2_1); QVERIFY(sortedShapes[6] == &child2_2); }
void TestShapePainting::testPaintOrder() { // the stacking order determines the painting order so things on top // get their paint called last. // Each shape has a zIndex and within the children a container has // it determines the stacking order. Its important to realize that // the zIndex is thus local to a container, if you have layer1 and layer2 // with both various child shapes the stacking order of the layer shapes // is most important, then within this the child shape index is used. class OrderedMockShape : public MockShape { public: OrderedMockShape(QList<MockShape*> &list) : order(list) {} void paint(QPainter &painter, const KoViewConverter &converter, KoShapePaintingContext &paintcontext) override { order.append(this); MockShape::paint(painter, converter, paintcontext); } QList<MockShape*> ℴ }; QList<MockShape*> order; MockContainer *top = new MockContainer(); top->setZIndex(2); OrderedMockShape *shape1 = new OrderedMockShape(order); shape1->setZIndex(5); OrderedMockShape *shape2 = new OrderedMockShape(order); shape2->setZIndex(0); top->addShape(shape1); top->addShape(shape2); MockContainer *bottom = new MockContainer(); bottom->setZIndex(1); OrderedMockShape *shape3 = new OrderedMockShape(order); shape3->setZIndex(-1); OrderedMockShape *shape4 = new OrderedMockShape(order); shape4->setZIndex(9); bottom->addShape(shape3); bottom->addShape(shape4); MockCanvas canvas; KoShapeManager manager(&canvas); manager.addShape(top); manager.addShape(bottom); QCOMPARE(manager.shapes().count(), 6); QImage image(100, 100, QImage::Format_Mono); QPainter painter(&image); KoViewConverter vc; manager.paint(painter, vc, false); QCOMPARE(top->paintedCount, 1); QCOMPARE(bottom->paintedCount, 1); QCOMPARE(shape1->paintedCount, 1); QCOMPARE(shape2->paintedCount, 1); QCOMPARE(shape3->paintedCount, 1); QCOMPARE(shape4->paintedCount, 1); QCOMPARE(order.count(), 4); QVERIFY(order[0] == shape3); // lowest first QVERIFY(order[1] == shape4); QVERIFY(order[2] == shape2); QVERIFY(order[3] == shape1); // again, with clipping. order.clear(); painter.setClipRect(0, 0, 100, 100); manager.paint(painter, vc, false); QCOMPARE(top->paintedCount, 2); QCOMPARE(bottom->paintedCount, 2); QCOMPARE(shape1->paintedCount, 2); QCOMPARE(shape2->paintedCount, 2); QCOMPARE(shape3->paintedCount, 2); QCOMPARE(shape4->paintedCount, 2); QCOMPARE(order.count(), 4); QVERIFY(order[0] == shape3); // lowest first QVERIFY(order[1] == shape4); QVERIFY(order[2] == shape2); QVERIFY(order[3] == shape1); order.clear(); MockContainer *root = new MockContainer(); root->setZIndex(0); MockContainer *branch1 = new MockContainer(); branch1->setZIndex(1); OrderedMockShape *child1_1 = new OrderedMockShape(order); child1_1->setZIndex(1); OrderedMockShape *child1_2 = new OrderedMockShape(order); child1_2->setZIndex(2); branch1->addShape(child1_1); branch1->addShape(child1_2); MockContainer *branch2 = new MockContainer(); branch2->setZIndex(2); OrderedMockShape *child2_1 = new OrderedMockShape(order); child2_1->setZIndex(1); OrderedMockShape *child2_2 = new OrderedMockShape(order); child2_2->setZIndex(2); branch2->addShape(child2_1); branch2->addShape(child2_2); root->addShape(branch1); root->addShape(branch2); QList<KoShape*> sortedShapes; sortedShapes.append(root); sortedShapes.append(branch1); sortedShapes.append(branch2); sortedShapes.append(branch1->shapes()); sortedShapes.append(branch2->shapes()); qSort(sortedShapes.begin(), sortedShapes.end(), KoShape::compareShapeZIndex); QCOMPARE(sortedShapes.count(), 7); QVERIFY(sortedShapes[0] == root); QVERIFY(sortedShapes[1] == branch1); QVERIFY(sortedShapes[2] == child1_1); QVERIFY(sortedShapes[3] == child1_2); QVERIFY(sortedShapes[4] == branch2); QVERIFY(sortedShapes[5] == child2_1); QVERIFY(sortedShapes[6] == child2_2); delete top; delete bottom; delete root; }