QmlDesigner: Add transition item label

* Add label to transition item
* Change signature of drawArrow()

Task-number: QDS-2085
Change-Id: Ia719958ead404ea083a15fdee440a8e6a306ee62
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Henning Gruendl
2020-05-12 18:36:54 +02:00
committed by Thomas Hartmann
parent c9b5671754
commit d1728fbb6b
3 changed files with 86 additions and 7 deletions

View File

@@ -26,6 +26,7 @@
#include "formeditoritem.h"
#include "formeditorscene.h"
#include <variantproperty.h>
#include <bindingproperty.h>
#include <modelnode.h>
@@ -814,8 +815,46 @@ static bool horizontalOverlap(const QRectF &from, const QRectF &to)
return false;
}
static void drawLabel(QPainter *painter,
const QPainterPath &path,
const QString &text,
const qreal percent,
const qreal offset,
bool flipSide)
{
if (text.isEmpty())
return;
const int flags = Qt::AlignHCenter | Qt::AlignVCenter | Qt::TextDontClip;
QPointF pos = path.pointAtPercent(percent);
qreal angle = path.angleAtPercent(percent);
QLineF tmp(pos, QPointF(10, 10));
tmp.setLength(offset);
tmp.setAngle(angle + (flipSide ? 270 : 90));
QRectF textRect(0, 0, 100, 50);
textRect.moveCenter(tmp.p2());
auto normalizeAngle = [](int angle) {
int newAngle = angle;
while (newAngle <= -90) newAngle += 180;
while (newAngle > 90) newAngle -= 180;
return newAngle;
};
painter->save();
painter->translate(textRect.center());
painter->rotate(-normalizeAngle(angle));
painter->translate(-textRect.center());
painter->drawText(textRect, flags, text);
painter->restore();
}
static void drawArrow(QPainter *painter,
const QLineF &line,
const QPointF &point,
const qreal &angle,
int arrowLength,
int arrowWidth)
{
@@ -825,8 +864,8 @@ static void drawArrow(QPainter *painter,
painter->save();
painter->translate(line.p2());
painter->rotate(-line.angle());
painter->translate(point);
painter->rotate(-angle);
painter->drawLine(leftP, peakP);
painter->drawLine(rightP, peakP);
@@ -1029,7 +1068,8 @@ static QPainterPath sShapedConnection(const QPointF &start,
static void paintConnection(QPainter *painter,
const QRectF &from,
const QRectF &to,
const ConnectionStyle &style)
const ConnectionStyle &style,
const QString &label)
{
painter->save();
painter->setRenderHint(QPainter::Antialiasing);
@@ -1126,11 +1166,18 @@ static void paintConnection(QPainter *painter,
pen.setStyle(Qt::SolidLine);
painter->setPen(pen);
drawArrow(painter, QLineF(path.pointAtPercent(0.9), endP), arrowLength, arrowWidth);
qreal anglePercent = 1.0;
if (extraLine && style.bezier < 80)
anglePercent = 1.0 - qMin(1.0, (80 - style.bezier) / 10.0) * 0.05;
drawArrow(painter, endP, path.angleAtPercent(anglePercent), arrowLength, arrowWidth);
painter->setBrush(Qt::white);
painter->drawEllipse(startP, arrowLength / 3, arrowLength / 3);
drawLabel(painter, path, label, style.labelPosition / 100.0, style.labelOffset, style.labelFlipSide);
painter->restore();
}
@@ -1260,10 +1307,35 @@ void FormEditorTransitionItem::paint(QPainter *painter, const QStyleOptionGraphi
if (qmlItemNode().modelNode().hasAuxiliaryData("type"))
style.type = static_cast<ConnectionType>(qmlItemNode().modelNode().auxiliaryData("type").toInt());
QFont font = painter->font();
font.setPixelSize(16 / scaleFactor);
painter->setFont(font);
QString label;
if (qmlItemNode().modelNode().hasBindingProperty("condition"))
label = qmlItemNode().modelNode().bindingProperty("condition").expression();
if (qmlItemNode().modelNode().hasVariantProperty("question"))
label = qmlItemNode().modelNode().variantProperty("question").value().toString();
style.labelOffset = 14 / scaleFactor;
style.labelPosition = 50.0;
if (qmlItemNode().modelNode().hasAuxiliaryData("labelPosition"))
style.labelPosition = qmlItemNode().modelNode().auxiliaryData("labelPosition").toReal();
style.labelFlipSide = false;
if (qmlItemNode().modelNode().hasAuxiliaryData("labelFlipSide"))
style.labelFlipSide = qmlItemNode().modelNode().auxiliaryData("labelFlipSide").toBool();
if (resolved.isStartLine)
fromRect.translate(0, style.outOffset);
paintConnection(painter, fromRect, toRect, style);
paintConnection(painter, fromRect, toRect, style, label);
if (resolved.isStartLine) {

View File

@@ -66,6 +66,9 @@ public:
int radius;
int bezier;
ConnectionType type;
qreal labelOffset;
qreal labelPosition;
bool labelFlipSide;
};
class QMLDESIGNERCORE_EXPORT FormEditorItem : public QGraphicsItem

View File

@@ -179,6 +179,10 @@ QVariant properDefaultAuxiliaryProperties(const QmlObjectNode &qmlObjectNode,
return 50;
else if (propertyName == "bezier")
return 50;
else if (propertyName == "labelPosition")
return 50.0;
else if (propertyName == "labelFlipSide")
return false;
else if (propertyName == "customId")
return QString();
else if (propertyName == "joinConnection")
@@ -248,7 +252,7 @@ void PropertyEditorQmlBackend::setupAuxiliaryProperties(const QmlObjectNode &qml
propertyNames.append("customId");
if (itemNode.isFlowTransition()) {
propertyNames.append({"color", "width", "inOffset", "outOffset", "dash", "breakPoint", "type", "radius", "bezier"});
propertyNames.append({"color", "width", "inOffset", "outOffset", "dash", "breakPoint", "type", "radius", "bezier", "labelPosition", "labelFlipSide"});
} else if (itemNode.isFlowItem()) {
propertyNames.append({"color", "width", "inOffset", "outOffset", "joinConnection"});
} else if (itemNode.isFlowActionArea()) {