Skip to content

Commit

Permalink
Add full binding between qan::EdgeStyle and qan::EdgeItem for srcShap…
Browse files Browse the repository at this point in the history
…e, dstShape and arrowSize properties.

Bind lineWidth property open arrow, open circle and open rect EdgeTemplate delegates shapes.
Cosmetic fixes.
#65

Signed-off-by: cneben <[email protected]>
  • Loading branch information
cneben committed Sep 19, 2018
1 parent ee6529e commit 30f5d52
Show file tree
Hide file tree
Showing 7 changed files with 160 additions and 66 deletions.
18 changes: 13 additions & 5 deletions samples/edges/curved.qml
Original file line number Diff line number Diff line change
Expand Up @@ -251,11 +251,10 @@ Item {
Label { text:"Src Shape:" }
Item { Layout.fillWidth: true }
ComboBox {
model: ["None", "Arrow", "Open Arrow", "Rect", "Open Rect", "Circle", "Open Circle"]
model: ["None", "Arrow", "Open Arrow", "Circle", "Open Circle", "Rect", "Open Rect"]
currentIndex: defaultEdgeStyle.lineType === Qan.EdgeStyle.Straight ? 0 : 1
onActivated: {
var shape = [Qan.EdgeItem.None, Qan.EdgeItem.Arrow, Qan.EdgeItem.ArrowOpen, Qan.EdgeItem.Circle, Qan.EdgeItem.CircleOpen, Qan.EdgeItem.Rect, Qan.EdgeItem.RectOpen]
console.warn("shape=" + shape[index])
var shape = [Qan.EdgeStyle.None, Qan.EdgeStyle.Arrow, Qan.EdgeStyle.ArrowOpen, Qan.EdgeStyle.Circle, Qan.EdgeStyle.CircleOpen, Qan.EdgeStyle.Rect, Qan.EdgeStyle.RectOpen]
defaultEdgeStyle.srcShape = shape[index]
}
}
Expand All @@ -265,10 +264,10 @@ Item {
Label { text:"Dst shape:" }
Item { Layout.fillWidth: true }
ComboBox {
model: ["None", "Arrow", "Open Arrow", "Rect", "Open Rect", "Circle", "Open Circle"]
model: ["None", "Arrow", "Open Arrow", "Circle", "Open Circle", "Rect", "Open Rect"]
currentIndex: 1
onActivated: {
var shape = [Qan.EdgeItem.None, Qan.EdgeItem.Arrow, Qan.EdgeItem.ArrowOpen, Qan.EdgeItem.Circle, Qan.EdgeItem.CircleOpen, Qan.EdgeItem.Rect, Qan.EdgeItem.RectOpen]
var shape = [Qan.EdgeStyle.None, Qan.EdgeStyle.Arrow, Qan.EdgeStyle.ArrowOpen, Qan.EdgeStyle.Circle, Qan.EdgeStyle.CircleOpen, Qan.EdgeStyle.Rect, Qan.EdgeStyle.RectOpen]
defaultEdgeStyle.dstShape = shape[index]
}
}
Expand Down Expand Up @@ -300,6 +299,15 @@ Item {
onValueModified: defaultEdgeStyle.lineWidth = value
}
} // RowLayout: lineWidth
ColumnLayout {
Layout.margins: 2
Label { text:"Arrow size:" }
SpinBox {
value: defaultEdgeStyle.arrowSize
from: 1; to: 7
onValueModified: defaultEdgeStyle.arrowSize = value
}
} // RowLayout: lineWidth

ColumnLayout {
Layout.margins: 2
Expand Down
21 changes: 11 additions & 10 deletions samples/edges/endings.qml
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,12 @@ Qan.GraphView {
id: graph
connectorEnabled: true
Component.onCompleted: {
edgeItems.push(generateGeom(20, 50, Qan.EdgeItem.Arrow))
edgeItems.push(generateGeom(20, 150, Qan.EdgeItem.ArrowOpen))
edgeItems.push(generateGeom(20, 250, Qan.EdgeItem.Circle))
edgeItems.push(generateGeom(20, 350, Qan.EdgeItem.CircleOpen))
edgeItems.push(generateGeom(20, 450, Qan.EdgeItem.Rect))
edgeItems.push(generateGeom(20, 550, Qan.EdgeItem.RectOpen))
edgeItems.push(generateGeom(20, 50, Qan.EdgeStyle.Arrow))
edgeItems.push(generateGeom(20, 150, Qan.EdgeStyle.ArrowOpen))
edgeItems.push(generateGeom(20, 250, Qan.EdgeStyle.Circle))
edgeItems.push(generateGeom(20, 350, Qan.EdgeStyle.CircleOpen))
edgeItems.push(generateGeom(20, 450, Qan.EdgeStyle.Rect))
edgeItems.push(generateGeom(20, 550, Qan.EdgeStyle.RectOpen))
} // Qan.Graph.Component.onCompleted()

function generateGeom(x, y, endingType) {
Expand All @@ -58,7 +58,8 @@ Qan.GraphView {
var d1 = graph.insertNode()
d1.label = "DST"; d1.item.x = x + 200; d1.item.y = y + 50
var e = graph.insertEdge(s1, d1);
e.item.srcShape = Qan.EdgeItem.None
e.item.style = null // NOTE: Remove binding with default_edge_style
e.item.srcShape = Qan.EdgeStyle.None
e.item.dstShape = endingType
items.push(e.item)

Expand All @@ -67,15 +68,17 @@ Qan.GraphView {
var d2 = graph.insertNode()
d2.label = "DST"; d2.item.x = x + 600; d2.item.y = y + 50
e = graph.insertEdge(s2, d2);
e.item.style = null
e.item.srcShape = endingType
e.item.dstShape = Qan.EdgeItem.None
e.item.dstShape = Qan.EdgeStyle.None
items.push(e.item)

var s3 = graph.insertNode()
s3.label = "SRC"; s3.item.x = x + 800; s3.item.y = y
var d3 = graph.insertNode()
d3.label = "DST"; d3.item.x = x + 1000; d3.item.y = y + 50
e = graph.insertEdge(s3, d3);
e.item.style = null
e.item.srcShape = endingType
e.item.dstShape = endingType
items.push(e.item)
Expand All @@ -88,10 +91,8 @@ Qan.GraphView {
anchors.right: parent.right
value: 4
onValueModified: {
/*
for (var e=0; e < edgeItems.length; e++)
edgeItems[e].arrowSize = value
*/
}
}
} // Qan.GraphView
38 changes: 19 additions & 19 deletions src/EdgeTemplate.qml
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,12 @@ Item {
rotation: edgeItem.dstAngle
x: edgeItem.p2.x
y: edgeItem.p2.y
visible: ((edgeItem.dstShape === Qan.EdgeItem.Arrow) || (edgeItem.dstShape === Qan.EdgeItem.ArrowOpen))
visible: ((edgeItem.dstShape === Qan.EdgeStyle.Arrow) || (edgeItem.dstShape === Qan.EdgeStyle.ArrowOpen))
&& edgeItem.visible && !edgeItem.hidden
ShapePath {
strokeColor: edgeTemplate.color
fillColor: edgeItem.dstShape === Qan.EdgeItem.ArrowOpen ? Qt.rgba(0.,0.,0.,0.) : edgeTemplate.color
strokeWidth: 2
fillColor: edgeItem.dstShape === Qan.EdgeStyle.ArrowOpen ? Qt.rgba(0.,0.,0.,0.) : edgeTemplate.color
strokeWidth: edgeItem.style ? edgeItem.style.lineWidth : 2
startX: edgeItem.dstA1.x; startY: edgeItem.dstA1.y
PathLine { x: edgeItem.dstA3.x; y: edgeItem.dstA3.y }
PathLine { x: edgeItem.dstA2.x; y: edgeItem.dstA2.y }
Expand All @@ -66,12 +66,12 @@ Item {
rotation: edgeItem.dstAngle
x: edgeItem.p2.x
y: edgeItem.p2.y
visible: ((edgeItem.dstShape === Qan.EdgeItem.Circle) || (edgeItem.dstShape === Qan.EdgeItem.CircleOpen))
visible: ((edgeItem.dstShape === Qan.EdgeStyle.Circle) || (edgeItem.dstShape === Qan.EdgeStyle.CircleOpen))
&& edgeItem.visible && !edgeItem.hidden
ShapePath {
strokeColor: edgeTemplate.color
fillColor: edgeItem.dstShape === Qan.EdgeItem.CircleOpen ? Qt.rgba(0.,0.,0.,0.) : edgeTemplate.color
strokeWidth: 2
fillColor: edgeItem.dstShape === Qan.EdgeStyle.CircleOpen ? Qt.rgba(0.,0.,0.,0.) : edgeTemplate.color
strokeWidth: edgeItem.style ? edgeItem.style.lineWidth : 2
startX: 0; startY: 0
PathArc {
relativeX: edgeItem.dstA2.x; relativeY: edgeItem.dstA2.y
Expand All @@ -88,12 +88,12 @@ Item {
rotation: edgeItem.dstAngle
x: edgeItem.p2.x
y: edgeItem.p2.y
visible: ((edgeItem.dstShape === Qan.EdgeItem.Rect) || (edgeItem.dstShape === Qan.EdgeItem.RectOpen))
visible: ((edgeItem.dstShape === Qan.EdgeStyle.Rect) || (edgeItem.dstShape === Qan.EdgeStyle.RectOpen))
&& edgeItem.visible && !edgeItem.hidden
ShapePath {
strokeColor: edgeTemplate.color
fillColor: edgeItem.dstShape === Qan.EdgeItem.RectOpen ? Qt.rgba(0.,0.,0.,0.) : edgeTemplate.color
strokeWidth: 2
fillColor: edgeItem.dstShape === Qan.EdgeStyle.RectOpen ? Qt.rgba(0.,0.,0.,0.) : edgeTemplate.color
strokeWidth: edgeItem.style ? edgeItem.style.lineWidth : 2
startX: edgeItem.dstA1.x; startY: edgeItem.dstA1.y
PathLine { x: 0.; y: 0. }
PathLine { x: edgeItem.dstA3.x; y: edgeItem.dstA3.y }
Expand All @@ -106,12 +106,12 @@ Item {
rotation: edgeItem.srcAngle
x: edgeItem.p1.x
y: edgeItem.p1.y
visible: ((edgeItem.srcShape === Qan.EdgeItem.Arrow) || (edgeItem.srcShape === Qan.EdgeItem.ArrowOpen))
visible: ((edgeItem.srcShape === Qan.EdgeStyle.Arrow) || (edgeItem.srcShape === Qan.EdgeStyle.ArrowOpen))
&& edgeItem.visible && !edgeItem.hidden
ShapePath {
strokeColor: edgeTemplate.color
fillColor: edgeItem.srcShape === Qan.EdgeItem.ArrowOpen ? Qt.rgba(0.,0.,0.,0.) : edgeTemplate.color
strokeWidth: 2
fillColor: edgeItem.srcShape === Qan.EdgeStyle.ArrowOpen ? Qt.rgba(0.,0.,0.,0.) : edgeTemplate.color
strokeWidth: edgeItem.style ? edgeItem.style.lineWidth : 2
startX: edgeItem.srcA1.x; startY: edgeItem.srcA1.y
PathLine { x: edgeItem.srcA3.x; y: edgeItem.srcA3.y }
PathLine { x: edgeItem.srcA2.x; y: edgeItem.srcA2.y }
Expand All @@ -123,12 +123,12 @@ Item {
rotation: edgeItem.srcAngle
x: edgeItem.p1.x
y: edgeItem.p1.y
visible: ((edgeItem.srcShape === Qan.EdgeItem.Circle) || (edgeItem.srcShape === Qan.EdgeItem.CircleOpen))
visible: ((edgeItem.srcShape === Qan.EdgeStyle.Circle) || (edgeItem.srcShape === Qan.EdgeStyle.CircleOpen))
&& edgeItem.visible && !edgeItem.hidden
ShapePath {
strokeColor: edgeTemplate.color
fillColor: edgeItem.srcShape === Qan.EdgeItem.CircleOpen ? Qt.rgba(0.,0.,0.,0.) : edgeTemplate.color
strokeWidth: 2
fillColor: edgeItem.srcShape === Qan.EdgeStyle.CircleOpen ? Qt.rgba(0.,0.,0.,0.) : edgeTemplate.color
strokeWidth: edgeItem.style ? edgeItem.style.lineWidth : 2
startX: 0; startY: 0
PathArc {
relativeX: edgeItem.srcA2.x; relativeY: edgeItem.srcA2.y
Expand All @@ -145,12 +145,12 @@ Item {
rotation: edgeItem.srcAngle
x: edgeItem.p1.x
y: edgeItem.p1.y
visible: ((edgeItem.srcShape === Qan.EdgeItem.Rect) || (edgeItem.srcShape === Qan.EdgeItem.RectOpen))
visible: ((edgeItem.srcShape === Qan.EdgeStyle.Rect) || (edgeItem.srcShape === Qan.EdgeStyle.RectOpen))
&& edgeItem.visible && !edgeItem.hidden
ShapePath {
strokeColor: edgeTemplate.color
fillColor: edgeItem.srcShape === Qan.EdgeItem.RectOpen ? Qt.rgba(0.,0.,0.,0.) : edgeTemplate.color
strokeWidth: 2
fillColor: edgeItem.srcShape === Qan.EdgeStyle.RectOpen ? Qt.rgba(0.,0.,0.,0.) : edgeTemplate.color
strokeWidth: edgeItem.style ? edgeItem.style.lineWidth : 2
startX: edgeItem.srcA1.x; startY: edgeItem.srcA1.y
PathLine { x: 0.; y: 0. }
PathLine { x: edgeItem.srcA3.x; y: edgeItem.srcA3.y }
Expand Down Expand Up @@ -205,7 +205,7 @@ Item {
visible: edgeItem.visible && !edgeItem.hidden
//asynchronous: true // FIXME: Benchmark that
smooth: true
property var lineType : edgeItem.style.lineType
property var lineType : edgeItem.style ? edgeItem.style.lineType : Qan.EdgeStyle.Straight
property var curvedLine : undefined
property var straightLine : undefined
onLineTypeChanged: {
Expand Down
42 changes: 33 additions & 9 deletions src/qanEdgeItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,15 @@ void EdgeItem::setHidden(bool hidden) noexcept
}
}

void EdgeItem::setArrowSize( qreal arrowSize ) noexcept
{
if ( !qFuzzyCompare(1. + arrowSize, 1. + _arrowSize ) ) {
_arrowSize = arrowSize;
emit arrowSizeChanged();
updateItem();
}
}

auto EdgeItem::setSrcShape(ArrowShape srcShape) noexcept -> void
{
if ( _srcShape != srcShape ) {
Expand Down Expand Up @@ -364,7 +373,7 @@ void EdgeItem::generateLineGeometry(GeometryCache& cache) const noexcept
// Update hidden: Edge is hidden if it's size is less than the src/dst shape size sum
{
{
const auto arrowSize = getStyle() != nullptr ? getStyle()->getArrowSize() : 4.0;
const auto arrowSize = getArrowSize();
const auto arrowLength = arrowSize * 3.;
if ( line.length() < 2.0 + arrowLength )
cache.hidden = true;
Expand Down Expand Up @@ -453,11 +462,11 @@ void EdgeItem::generateArrowGeometry(GeometryCache& cache) const noexcept
if ( !cache.isValid() )
return;

const qreal arrowSize = getStyle() != nullptr ? getStyle()->getArrowSize() : 4.0;
const qreal arrowSize = getArrowSize();
const qreal arrowLength = arrowSize * 3.;

// Prepare points and helper variables
QPointF point0 = QPointF{ 0., 0. }; // Point zero
//QPointF point0 = QPointF{ 0., 0. }; // Point zero
QPointF pointA2 = QPointF{ arrowLength, 0. }; // A2 is the same for all shapes

QPointF arrowA1 = QPointF{ 0., -arrowSize };
Expand All @@ -471,7 +480,8 @@ void EdgeItem::generateArrowGeometry(GeometryCache& cache) const noexcept
cache.dstA2 = pointA2;

// Update source arrow cache points
switch (getSrcShape()) {
const auto srcShape = getSrcShape();
switch (srcShape) {
case qan::EdgeItem::ArrowShape::Arrow: // [[fallthrough]]
case qan::EdgeItem::ArrowShape::ArrowOpen:
cache.srcA1 = arrowA1;
Expand All @@ -492,11 +502,12 @@ void EdgeItem::generateArrowGeometry(GeometryCache& cache) const noexcept
generateArrowAngle(cache.p2, cache.p1, cache.srcAngle,
cache.c2, cache.c1,
cache.lineType,
getSrcShape(),
srcShape,
arrowLength);

// Update destination arrow cache points
switch (getDstShape()) {
const auto dstShape = getDstShape();
switch (dstShape) {
case qan::EdgeItem::ArrowShape::Arrow: // [[fallthrough]]
case qan::EdgeItem::ArrowShape::ArrowOpen:
cache.dstA1 = arrowA1;
Expand All @@ -517,7 +528,7 @@ void EdgeItem::generateArrowGeometry(GeometryCache& cache) const noexcept
generateArrowAngle(cache.p1, cache.p2, cache.dstAngle,
cache.c1, cache.c2,
cache.lineType,
getDstShape(),
dstShape,
arrowLength);
}

Expand Down Expand Up @@ -977,9 +988,13 @@ void EdgeItem::setStyle( EdgeStyle* style ) noexcept
// from edge delegate). Since arrowSize affect concrete edge geometry, bind it manually to
// updateItem().
connect( _style, &qan::EdgeStyle::arrowSizeChanged,
this, &EdgeItem::updateItem );
this, &EdgeItem::styleModified );
connect( _style, &qan::EdgeStyle::lineTypeChanged,
this, &EdgeItem::updateItem );
this, &EdgeItem::styleModified );
connect( _style, &qan::EdgeStyle::srcShapeChanged, // FIXME: Add intelligent updating
this, &EdgeItem::styleModified );
connect( _style, &qan::EdgeStyle::dstShapeChanged, // FIXME: Add intelligent updating
this, &EdgeItem::styleModified );
}
emit styleChanged( );
}
Expand All @@ -990,6 +1005,15 @@ void EdgeItem::styleDestroyed( QObject* style )
if ( style != nullptr )
setStyle( nullptr );
}

void EdgeItem::styleModified()
{
if ( getStyle() != nullptr ) {
setArrowSize(getStyle()->getArrowSize());
setSrcShape(getStyle()->getSrcShape());
setDstShape(getStyle()->getDstShape());
}
}
//-----------------------------------------------------------------------------


Expand Down
37 changes: 15 additions & 22 deletions src/qanEdgeItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,28 +132,19 @@ class EdgeItem : public QQuickItem
bool _hidden{false};

public:
//! End type drawing configuration
enum class ArrowShape {
//! Do not draw an end.
None,
//! End shape is an arrow.
Arrow,
//! End shape is an open arrow.
ArrowOpen,
//! End shape is a filled circle.
Circle,
//! End shape is an open circle.
CircleOpen,
//! End shape is a filled rectangle.
Rect,
//! End shape is a open rectangle.
RectOpen
};
Q_ENUM(ArrowShape)
Q_PROPERTY( qreal arrowSize READ getArrowSize WRITE setArrowSize NOTIFY arrowSizeChanged FINAL )
void setArrowSize( qreal arrowSize ) noexcept;
inline qreal getArrowSize() const noexcept { return _arrowSize; }
protected:
qreal _arrowSize = 4.0;
signals:
void arrowSizeChanged();

public:
using ArrowShape = qan::EdgeStyle::ArrowShape;

//! \copydoc Define shape of source arrow, default None.
Q_PROPERTY( ArrowShape srcShape READ getSrcShape WRITE setSrcShape NOTIFY srcShapeChanged FINAL )
Q_PROPERTY( qan::EdgeStyle::ArrowShape srcShape READ getSrcShape WRITE setSrcShape NOTIFY srcShapeChanged FINAL )
//! \copydoc srcShape
inline ArrowShape getSrcShape() const noexcept { return _srcShape; }
//! \copydoc srcShape
Expand All @@ -166,7 +157,8 @@ class EdgeItem : public QQuickItem

public:
//! \copydoc Define shape of destination arrow, default arrow.
Q_PROPERTY( ArrowShape dstShape READ getDstShape WRITE setDstShape NOTIFY dstShapeChanged FINAL )
Q_PROPERTY( qan::EdgeStyle::ArrowShape dstShape READ getDstShape WRITE setDstShape NOTIFY dstShapeChanged FINAL )

//! \copydoc dstShape
inline ArrowShape getDstShape() const noexcept { return _dstShape; }
//! \copydoc dstShape
Expand Down Expand Up @@ -266,7 +258,7 @@ public slots:
inline void generateArrowAngle(QPointF& p1, QPointF& p2, qreal& angle,
const QPointF& c1, const QPointF& c2,
const qan::EdgeStyle::LineType lineType,
const qan::EdgeItem::ArrowShape arrowShape,
const qan::EdgeStyle::ArrowShape arrowShape,
const qreal arrowLength) const noexcept;

//! Generate edge line control points when edge has curved style (GeometryCache::c1 and GeometryCache::c2).
Expand Down Expand Up @@ -446,6 +438,8 @@ public slots:
private slots:
//! Called when the style associed to this edge is destroyed.
void styleDestroyed( QObject* style );

void styleModified();
//@}
//-------------------------------------------------------------------------

Expand Down Expand Up @@ -492,6 +486,5 @@ private slots:
} // ::qan

QML_DECLARE_TYPE( qan::EdgeItem )
Q_DECLARE_METATYPE( qan::EdgeItem::ArrowShape )

#endif // qanEdgeItem_h

0 comments on commit 30f5d52

Please sign in to comment.