#include #include #include "stfreader.h" #include "stfgraphicsitem.h" class StfToGraphicsPathItems : public StfReader::StrokeHandler { QGraphicsItem *parent; QPainterPath path; QRectF bound; public: StfToGraphicsPathItems(QGraphicsItem* parent) : parent(parent), path(), bound(0.0, 0.0, 1.0, 1.0) { } ~StfToGraphicsPathItems() { } bool startStroke(const QPoint& p, int force, quint64 time) { Q_UNUSED(force); Q_UNUSED(time); path = QPainterPath(QPointF(p)); return true; } bool strokePoint(const QPoint& p, int force, quint64 time) { Q_UNUSED(force); Q_UNUSED(time); path.lineTo(QPointF(p)); return true; } bool endStroke() { bound |= path.boundingRect(); new QGraphicsPathItem(path, parent); /* Parent will take the child down with him when deleted. */ return true; } const QRectF& boundingRect() { return bound; } }; StfGraphicsItem::StfGraphicsItem(QIODevice *dev, QGraphicsItem *parent) : QGraphicsItem(parent) { setFlags(ItemHasNoContents); StfToGraphicsPathItems h(this); StfReader r; r.setStrokeHandler(&h); if (r.parse(dev)) { bbox = h.boundingRect(); } } QRectF StfGraphicsItem::boundingRect() const { return bbox; } void StfGraphicsItem::paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) { /* Intentionally empty; ItemHasNoContents; children will do the painting. */ } int StfGraphicsItem::type() const { return Type; }