forked from qt-creator/qt-creator
QmlDesigner: Fix start transition bounding rect
Change-Id: I17e9a13ae1c93584ee52727ba6f938c20e30e202 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
committed by
Thomas Hartmann
parent
cf441e8198
commit
03e44b4f53
@@ -55,6 +55,7 @@ namespace QmlDesigner {
|
|||||||
const int flowBlockSize = 200;
|
const int flowBlockSize = 200;
|
||||||
const int blockRadius = 18;
|
const int blockRadius = 18;
|
||||||
const int blockAdjust = 40;
|
const int blockAdjust = 40;
|
||||||
|
const int startItemOffset = 96;
|
||||||
|
|
||||||
void drawIcon(QPainter *painter,
|
void drawIcon(QPainter *painter,
|
||||||
int x,
|
int x,
|
||||||
@@ -732,7 +733,7 @@ void FormEditorTransitionItem::setDataModelPositionInBaseState(const QPointF &)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isValid(const QList<QmlFlowTargetNode> &list)
|
static bool isValid(const QList<QmlItemNode> &list)
|
||||||
{
|
{
|
||||||
for (const auto &item : list)
|
for (const auto &item : list)
|
||||||
if (!item.isValid())
|
if (!item.isValid())
|
||||||
@@ -741,7 +742,7 @@ static bool isValid(const QList<QmlFlowTargetNode> &list)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isModelNodeValid(const QList<QmlFlowTargetNode> &list)
|
static bool isModelNodeValid(const QList<QmlItemNode> &list)
|
||||||
{
|
{
|
||||||
for (const auto &item : list)
|
for (const auto &item : list)
|
||||||
if (!item.modelNode().isValid())
|
if (!item.modelNode().isValid())
|
||||||
@@ -762,20 +763,20 @@ public:
|
|||||||
if (node.modelNode().bindingProperty("from").isList())
|
if (node.modelNode().bindingProperty("from").isList())
|
||||||
from = Utils::transform<QList>(node.modelNode().bindingProperty("from").resolveToModelNodeList(),
|
from = Utils::transform<QList>(node.modelNode().bindingProperty("from").resolveToModelNodeList(),
|
||||||
[](const ModelNode &node) {
|
[](const ModelNode &node) {
|
||||||
return QmlFlowTargetNode(node);
|
return QmlItemNode(node);
|
||||||
});
|
});
|
||||||
else
|
else
|
||||||
from = QList<QmlFlowTargetNode>({node.modelNode().bindingProperty("from").resolveToModelNode()});
|
from = QList<QmlItemNode>({node.modelNode().bindingProperty("from").resolveToModelNode()});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node.modelNode().hasBindingProperty("to")) {
|
if (node.modelNode().hasBindingProperty("to")) {
|
||||||
if (node.modelNode().bindingProperty("to").isList())
|
if (node.modelNode().bindingProperty("to").isList())
|
||||||
to = Utils::transform<QList>(node.modelNode().bindingProperty("to").resolveToModelNodeList(),
|
to = Utils::transform<QList>(node.modelNode().bindingProperty("to").resolveToModelNodeList(),
|
||||||
[](const ModelNode &node) {
|
[](const ModelNode &node) {
|
||||||
return QmlFlowTargetNode(node);
|
return QmlItemNode(node);
|
||||||
});
|
});
|
||||||
else
|
else
|
||||||
to = QList<QmlFlowTargetNode>({node.modelNode().bindingProperty("to").resolveToModelNode()});
|
to = QList<QmlItemNode>({node.modelNode().bindingProperty("to").resolveToModelNode()});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (from.empty()) {
|
if (from.empty()) {
|
||||||
@@ -790,7 +791,7 @@ public:
|
|||||||
|
|
||||||
// Only assign area node if there is exactly one from (QmlFlowItemNode)
|
// Only assign area node if there is exactly one from (QmlFlowItemNode)
|
||||||
if (from.size() == 1) {
|
if (from.size() == 1) {
|
||||||
const QmlFlowTargetNode tmp = from.back();
|
const QmlItemNode tmp = from.back();
|
||||||
const QmlFlowItemNode f(tmp.modelNode());
|
const QmlFlowItemNode f(tmp.modelNode());
|
||||||
|
|
||||||
if (f.isValid()) {
|
if (f.isValid()) {
|
||||||
@@ -810,17 +811,8 @@ public:
|
|||||||
if (f.modelNode().hasAuxiliaryData("joinConnection"))
|
if (f.modelNode().hasAuxiliaryData("joinConnection"))
|
||||||
joinConnection = f.modelNode().auxiliaryData("joinConnection").toBool();
|
joinConnection = f.modelNode().auxiliaryData("joinConnection").toBool();
|
||||||
} else {
|
} else {
|
||||||
if (f == node.rootModelNode()) {
|
if (f == node.rootModelNode())
|
||||||
isStartLine = true;
|
isStartLine = true;
|
||||||
} /*else {
|
|
||||||
for (const ModelNode wildcard : QmlFlowViewNode(node.rootModelNode()).wildcards()) {
|
|
||||||
if (wildcard.bindingProperty("target").resolveToModelNode() == node.modelNode()) {
|
|
||||||
from.clear();
|
|
||||||
from.append(wildcard);
|
|
||||||
isWildcardLine = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -829,8 +821,8 @@ public:
|
|||||||
bool isStartLine = false;
|
bool isStartLine = false;
|
||||||
bool isWildcardLine = false;
|
bool isWildcardLine = false;
|
||||||
|
|
||||||
QList<QmlFlowTargetNode> from;
|
QList<QmlItemNode> from;
|
||||||
QList<QmlFlowTargetNode> to;
|
QList<QmlItemNode> to;
|
||||||
QmlFlowActionAreaNode areaNode;
|
QmlFlowActionAreaNode areaNode;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1165,35 +1157,34 @@ class Connection
|
|||||||
public:
|
public:
|
||||||
Connection(const ResolveConnection &resolveConnection,
|
Connection(const ResolveConnection &resolveConnection,
|
||||||
const QPointF &position,
|
const QPointF &position,
|
||||||
const QmlFlowTargetNode &from,
|
const QmlItemNode &from,
|
||||||
const QmlFlowTargetNode &to,
|
const QmlItemNode &to,
|
||||||
const ConnectionConfiguration &connectionConfig)
|
const ConnectionConfiguration &connectionConfig)
|
||||||
: config(connectionConfig)
|
: config(connectionConfig)
|
||||||
{
|
{
|
||||||
fromRect = QmlItemNode(from).instanceBoundingRect();
|
if (from.isFlowDecision() || from.isFlowWildcard() || from.isFlowView())
|
||||||
if (QmlItemNode(from).isFlowDecision())
|
|
||||||
fromRect = QRectF(0, 0, flowBlockSize, flowBlockSize);
|
fromRect = QRectF(0, 0, flowBlockSize, flowBlockSize);
|
||||||
|
else
|
||||||
|
fromRect = from.instanceBoundingRect();
|
||||||
|
|
||||||
if (QmlItemNode(from).isFlowWildcard())
|
fromRect.translate(from.flowPosition());
|
||||||
fromRect = QRectF(0, 0, flowBlockSize, flowBlockSize);
|
|
||||||
|
|
||||||
fromRect.translate(QmlItemNode(from).flowPosition());
|
|
||||||
|
|
||||||
if (!resolveConnection.joinConnection && resolveConnection.areaNode.isValid()) {
|
if (!resolveConnection.joinConnection && resolveConnection.areaNode.isValid()) {
|
||||||
fromRect = QmlItemNode(resolveConnection.areaNode).instanceBoundingRect();
|
fromRect = QmlItemNode(resolveConnection.areaNode).instanceBoundingRect();
|
||||||
fromRect.translate(QmlItemNode(from).flowPosition());
|
fromRect.translate(from.flowPosition());
|
||||||
fromRect.translate(resolveConnection.areaNode.instancePosition());
|
fromRect.translate(resolveConnection.areaNode.instancePosition());
|
||||||
}
|
}
|
||||||
|
|
||||||
toRect = QmlItemNode(to).instanceBoundingRect();
|
if (to.isFlowDecision())
|
||||||
if (QmlItemNode(to).isFlowDecision())
|
|
||||||
toRect = QRectF(0, 0, flowBlockSize,flowBlockSize);
|
toRect = QRectF(0, 0, flowBlockSize,flowBlockSize);
|
||||||
|
else
|
||||||
|
toRect = to.instanceBoundingRect();
|
||||||
|
|
||||||
toRect.translate(QmlItemNode(to).flowPosition());
|
toRect.translate(to.flowPosition());
|
||||||
|
|
||||||
if (resolveConnection.isStartLine) {
|
if (resolveConnection.isStartLine) {
|
||||||
fromRect = QRectF(0, 0, 96, 96);
|
fromRect = QRectF(0, 0, 96, 96);
|
||||||
fromRect.translate(QmlItemNode(to).flowPosition() + QPoint(-180, toRect.height() / 2 - 96 / 2));
|
fromRect.translate(to.flowPosition() + QPoint(-180, toRect.height() / 2 - 96 / 2));
|
||||||
fromRect.translate(0, config.outOffset);
|
fromRect.translate(0, config.outOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1300,7 +1291,7 @@ void FormEditorTransitionItem::updateGeometry()
|
|||||||
QPointF min(std::numeric_limits<qreal>::max(), std::numeric_limits<qreal>::max());
|
QPointF min(std::numeric_limits<qreal>::max(), std::numeric_limits<qreal>::max());
|
||||||
QPointF max(std::numeric_limits<qreal>::min(), std::numeric_limits<qreal>::min());
|
QPointF max(std::numeric_limits<qreal>::min(), std::numeric_limits<qreal>::min());
|
||||||
|
|
||||||
auto minMaxHelper = [&](const QList<QmlFlowTargetNode> &items) {
|
auto minMaxHelper = [&](const QList<QmlItemNode> &items) {
|
||||||
QRectF boundingRect;
|
QRectF boundingRect;
|
||||||
for (const auto &i : items) {
|
for (const auto &i : items) {
|
||||||
const QPointF p = QmlItemNode(i).flowPosition();
|
const QPointF p = QmlItemNode(i).flowPosition();
|
||||||
@@ -1323,8 +1314,10 @@ void FormEditorTransitionItem::updateGeometry()
|
|||||||
return boundingRect;
|
return boundingRect;
|
||||||
};
|
};
|
||||||
|
|
||||||
const QRectF fromBoundingRect = minMaxHelper(resolved.from);
|
|
||||||
const QRectF toBoundingRect = minMaxHelper(resolved.to);
|
const QRectF toBoundingRect = minMaxHelper(resolved.to);
|
||||||
|
// Special treatment for start line bounding rect calculation
|
||||||
|
const QRectF fromBoundingRect = !resolved.isStartLine ? minMaxHelper(resolved.from)
|
||||||
|
: toBoundingRect + QMarginsF(startItemOffset, 0, 0, 0);
|
||||||
|
|
||||||
QRectF overallBoundingRect(min, max);
|
QRectF overallBoundingRect(min, max);
|
||||||
overallBoundingRect = overallBoundingRect.united(fromBoundingRect);
|
overallBoundingRect = overallBoundingRect.united(fromBoundingRect);
|
||||||
@@ -1352,7 +1345,6 @@ void FormEditorTransitionItem::updateGeometry()
|
|||||||
// Just add the configured transition width to the bounding box to make sure the BB is not cutting
|
// Just add the configured transition width to the bounding box to make sure the BB is not cutting
|
||||||
// off half of the transition resulting in a bad selection experience.
|
// off half of the transition resulting in a bad selection experience.
|
||||||
QRectF pathBoundingRect = connection.path.boundingRect() + QMarginsF(config.width, config.width, config.width, config.width);
|
QRectF pathBoundingRect = connection.path.boundingRect() + QMarginsF(config.width, config.width, config.width, config.width);
|
||||||
|
|
||||||
overallBoundingRect = overallBoundingRect.united(connection.fromRect);
|
overallBoundingRect = overallBoundingRect.united(connection.fromRect);
|
||||||
overallBoundingRect = overallBoundingRect.united(connection.toRect);
|
overallBoundingRect = overallBoundingRect.united(connection.toRect);
|
||||||
overallBoundingRect = overallBoundingRect.united(pathBoundingRect);
|
overallBoundingRect = overallBoundingRect.united(pathBoundingRect);
|
||||||
@@ -1528,14 +1520,6 @@ void FormEditorTransitionItem::paint(QPainter *painter, const QStyleOptionGraphi
|
|||||||
font.setPixelSize(config.fontSize);
|
font.setPixelSize(config.fontSize);
|
||||||
painter->setFont(font);
|
painter->setFont(font);
|
||||||
|
|
||||||
/*
|
|
||||||
// In case of one-to-many many-to-one connection change the style
|
|
||||||
if ((resolved.from.size() > 1 || resolved.to.size() > 1) && !qmlItemNode().modelNode().isSelected()) {
|
|
||||||
config.penStyle = Qt::DotLine;
|
|
||||||
config.width = 1;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (const auto &f : resolved.from) {
|
for (const auto &f : resolved.from) {
|
||||||
for (const auto &t : resolved.to) {
|
for (const auto &t : resolved.to) {
|
||||||
Connection connection(resolved, pos(), f, t, config);
|
Connection connection(resolved, pos(), f, t, config);
|
||||||
@@ -1552,7 +1536,6 @@ void FormEditorTransitionItem::paint(QPainter *painter, const QStyleOptionGraphi
|
|||||||
// many-to-one
|
// many-to-one
|
||||||
else if (resolved.from.size() > 1 && resolved.to.size() == 1) {
|
else if (resolved.from.size() > 1 && resolved.to.size() == 1) {
|
||||||
connection.config.joinEnd = true;
|
connection.config.joinEnd = true;
|
||||||
//connection.config.type = ConnectionType::Bezier;
|
|
||||||
|
|
||||||
if (qmlItemNode().modelNode().isSelected()) {
|
if (qmlItemNode().modelNode().isSelected()) {
|
||||||
connection.config.dashPattern << 2 << 3;
|
connection.config.dashPattern << 2 << 3;
|
||||||
@@ -1572,7 +1555,6 @@ void FormEditorTransitionItem::paint(QPainter *painter, const QStyleOptionGraphi
|
|||||||
}
|
}
|
||||||
// one-to-many
|
// one-to-many
|
||||||
else if (resolved.from.size() == 1 && resolved.to.size() > 1) {
|
else if (resolved.from.size() == 1 && resolved.to.size() > 1) {
|
||||||
//connection.config.type = ConnectionType::Bezier;
|
|
||||||
|
|
||||||
if (qmlItemNode().modelNode().isSelected()) {
|
if (qmlItemNode().modelNode().isSelected()) {
|
||||||
connection.config.dashPattern << 2 << 3;
|
connection.config.dashPattern << 2 << 3;
|
||||||
@@ -1605,10 +1587,9 @@ void FormEditorTransitionItem::paint(QPainter *painter, const QStyleOptionGraphi
|
|||||||
painter->setPen(pen);
|
painter->setPen(pen);
|
||||||
|
|
||||||
const int iconAdjust = 48;
|
const int iconAdjust = 48;
|
||||||
const int offset = 96;
|
|
||||||
const int size = connection.fromRect.width();
|
const int size = connection.fromRect.width();
|
||||||
const int iconSize = size - iconAdjust;
|
const int iconSize = size - iconAdjust;
|
||||||
const int x = connection.fromRect.topRight().x() - offset;
|
const int x = connection.fromRect.topRight().x() - startItemOffset;
|
||||||
const int y = connection.fromRect.topRight().y();
|
const int y = connection.fromRect.topRight().y();
|
||||||
painter->drawRoundedRect(x, y , size - 10, size, size / 2, iconSize / 2);
|
painter->drawRoundedRect(x, y , size - 10, size, size / 2, iconSize / 2);
|
||||||
drawIcon(painter, x + iconAdjust / 2, y + iconAdjust / 2, icon, iconSize, iconSize, config.color);
|
drawIcon(painter, x + iconAdjust / 2, y + iconAdjust / 2, icon, iconSize, iconSize, config.color);
|
||||||
|
Reference in New Issue
Block a user