diff options
Diffstat (limited to 'src/line.cpp')
-rw-r--r-- | src/line.cpp | 197 |
1 files changed, 196 insertions, 1 deletions
diff --git a/src/line.cpp b/src/line.cpp index 133c02f..527fab3 100644 --- a/src/line.cpp +++ b/src/line.cpp @@ -14,6 +14,7 @@ // with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +#include <QPainter> #include "line.h" #include "hub.h" #include "diagramdocument.h" @@ -21,7 +22,7 @@ #include "connector.h" Line::Line(DiagramItem *parent) - : DiagramItem(parent) + : DiagramItem(parent), m_fillStartArrow(false), m_fillEndArrow(false), m_dirty(false) { m_connectors[0] = new Connector(this); m_connectors[1] = new Connector(this); @@ -97,3 +98,197 @@ Line::saveToXml(QDomDocument doc, QDomElement element) } } } + +QPolygonF +Line::linePoints() const +{ + return m_linePoints; +} + +void +Line::setLinePoints(const QPolygonF& points) +{ + if (m_linePoints != points) { + prepareGeometryChange(); + m_linePoints = points; + m_dirty = true; + } +} + +Qt::PenStyle +Line::lineStyle() const +{ + return m_lineStyle; +} + +void +Line::setLineStyle(Qt::PenStyle style) +{ + if (m_lineStyle != style) { + // prepareGeometryChange(); + m_lineStyle = style; + // m_dirty = true; + } +} + +QPainterPath +Line::startArrow() const +{ + return m_startArrow; +} + +void +Line::setStartArrow(const QPainterPath& path) +{ + if (m_startArrow != path) { + prepareGeometryChange(); + m_startArrow = path; + m_dirty = true; + } +} + +bool +Line::fillStartArrow() const +{ + return m_fillStartArrow; +} + +void +Line::setFillStartArrow(bool fill) +{ + if (m_fillStartArrow != fill) { + m_fillStartArrow = fill; + m_dirty = true; + } +} + +QPainterPath +Line::endArrow() const +{ + return m_endArrow; +} + +void +Line::setEndArrow(const QPainterPath& path) +{ + if (m_endArrow != path) { + prepareGeometryChange(); + m_endArrow = path; + m_dirty = true; + } +} + +bool +Line::fillEndArrow() const +{ + return m_fillEndArrow; +} + +void +Line::setFillEndArrow(bool fill) +{ + if (m_fillEndArrow != fill) { + m_fillEndArrow = fill; + m_dirty = true; + } +} + +void +Line::updateCache() +{ + m_dirty = false; + + QPainterPath path; + if (m_linePoints.isEmpty()) { + // Nothing to process + m_shape = path; + return; + } + + if (!m_startArrow.isEmpty()) { + QLineF firstSegment(m_linePoints.at(0), m_linePoints.at(1)); + QMatrix matrix; + matrix.translate(firstSegment.p1().x(), firstSegment.p1().y()); + matrix.rotate(360 - firstSegment.angle() + 90 + 180); + m_transformedStartArrow = matrix.map(m_startArrow); + } + else { + m_transformedStartArrow = QPainterPath(); + } + + if (!m_endArrow.isEmpty()) { + int size = m_linePoints.size(); + QLineF lastSegment(m_linePoints.at(size-2), m_linePoints.at(size-1)); + QMatrix matrix; + matrix.translate(lastSegment.p2().x(), lastSegment.p2().y()); + matrix.rotate(-lastSegment.angle() + 90); + m_transformedEndArrow = matrix.map(m_endArrow); + } + else { + m_transformedEndArrow = QPainterPath(); + } + + // Add the main line + path.moveTo(m_linePoints.at(0)); + for (int i = 1; i < m_linePoints.size(); i++) + path.lineTo(m_linePoints.at(i)); + + path.addPath(m_transformedStartArrow); + path.addPath(m_transformedEndArrow); + + // Add an outline around the path + QPainterPathStroker ps; + ps.setWidth(4.33); + ps.setJoinStyle(Qt::MiterJoin); + m_shape = ps.createStroke(path); +} + +QRectF +Line::boundingRect() const +{ + return shape().controlPointRect(); +} + +QPainterPath +Line::shape() const +{ + if (m_dirty) + const_cast<Line *>(this)->updateCache(); + + return m_shape; +} + +void +Line::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ + if (m_dirty) + updateCache(); + + QPen pen(QPen(QColor(0, 0, 0), 1.33)); + pen.setJoinStyle(Qt::MiterJoin); + pen.setStyle(m_lineStyle); + if (!document()->isPrinting() && isSelected()) { + pen.setColor(QColor(0, 96, 255)); + } + + painter->setPen(pen); + painter->drawPolyline(m_linePoints); + + pen.setStyle(Qt::SolidLine); + painter->setPen(pen); + if (m_fillStartArrow) { + painter->setBrush(pen.color()); + } + painter->drawPath(m_transformedStartArrow); + if (m_fillEndArrow) { + if (!m_fillStartArrow) { + painter->setBrush(pen.color()); + } + } + else { + if (m_fillStartArrow) { + painter->setBrush(QBrush()); + } + } + painter->drawPath(m_transformedEndArrow); +} |