ui: Improved vertical layout for override and inheritance edges
This commit is contained in:
@@ -575,7 +575,12 @@ GraphViewStyle::EdgeStyle GraphViewStyle::getStyleForEdgeType(
|
|||||||
style.arrowLength = 20;
|
style.arrowLength = 20;
|
||||||
style.arrowWidth = 14;
|
style.arrowWidth = 14;
|
||||||
style.arrowClosed = true;
|
style.arrowClosed = true;
|
||||||
|
style.originOffset.x = 7;
|
||||||
style.targetOffset.x = 34;
|
style.targetOffset.x = 34;
|
||||||
|
style.originOffset.y = -15;
|
||||||
|
style.targetOffset.y = 15;
|
||||||
|
style.verticalOffset = 0;
|
||||||
|
style.cornerRadius = 7;
|
||||||
style.zValue = isActive ? 2 : -3;
|
style.zValue = isActive ? 2 : -3;
|
||||||
break;
|
break;
|
||||||
case Edge::EDGE_INCLUDE:
|
case Edge::EDGE_INCLUDE:
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public:
|
|||||||
return "MessageScrollSpeedChange";
|
return "MessageScrollSpeedChange";
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void print(std::ostream& os) const
|
virtual void print(std::wostream& os) const
|
||||||
{
|
{
|
||||||
os << scrollSpeed;
|
os << scrollSpeed;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ QtLineItemBase::QtLineItemBase(QGraphicsItem* parent)
|
|||||||
, m_showArrow(true)
|
, m_showArrow(true)
|
||||||
, m_onFront(false)
|
, m_onFront(false)
|
||||||
, m_onBack(false)
|
, m_onBack(false)
|
||||||
, m_horizontalIn(false)
|
, m_earlyBend(false)
|
||||||
, m_route(ROUTE_ANY)
|
, m_route(ROUTE_ANY)
|
||||||
, m_pivot(PIVOT_THIRD)
|
, m_pivot(PIVOT_THIRD)
|
||||||
{
|
{
|
||||||
@@ -64,9 +64,9 @@ void QtLineItemBase::setOnBack(bool back)
|
|||||||
m_onBack = back;
|
m_onBack = back;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtLineItemBase::setHorizontalIn(bool horizontal)
|
void QtLineItemBase::setEarlyBend(bool earlyBend)
|
||||||
{
|
{
|
||||||
m_horizontalIn = horizontal;
|
m_earlyBend = earlyBend;
|
||||||
}
|
}
|
||||||
|
|
||||||
QPolygon QtLineItemBase::getPath() const
|
QPolygon QtLineItemBase::getPath() const
|
||||||
@@ -96,6 +96,7 @@ QPolygon QtLineItemBase::getPath() const
|
|||||||
float dist = -1;
|
float dist = -1;
|
||||||
std::map<int, float> dists;
|
std::map<int, float> dists;
|
||||||
|
|
||||||
|
// find start and end points
|
||||||
if (m_onFront)
|
if (m_onFront)
|
||||||
{
|
{
|
||||||
io = 3;
|
io = 3;
|
||||||
@@ -139,6 +140,7 @@ QPolygon QtLineItemBase::getPath() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// start/end and offsetted start/end points
|
||||||
Vec2f o[4];
|
Vec2f o[4];
|
||||||
getPivotPoints(o, oR, oR, oOff.y, false);
|
getPivotPoints(o, oR, oR, oOff.y, false);
|
||||||
|
|
||||||
@@ -167,11 +169,12 @@ QPolygon QtLineItemBase::getPath() const
|
|||||||
case 3: c.setX(c.x() - oOff.x); break;
|
case 3: c.setX(c.x() - oOff.x); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// move one offsetted point
|
||||||
if (it != io)
|
if (it != io)
|
||||||
{
|
{
|
||||||
if ((it == 1 && b.x() < c.x()) || (io == 1 && b.x() > c.x()))
|
if ((it == 1 && b.x() < c.x()) || (io == 1 && b.x() > c.x()))
|
||||||
{
|
{
|
||||||
if (m_horizontalIn)
|
if (m_earlyBend)
|
||||||
{
|
{
|
||||||
b.setX(c.x());
|
b.setX(c.x());
|
||||||
}
|
}
|
||||||
@@ -182,7 +185,14 @@ QPolygon QtLineItemBase::getPath() const
|
|||||||
}
|
}
|
||||||
else if ((it == 2 && b.y() < c.y()) || (io == 2 && b.y() > c.y()))
|
else if ((it == 2 && b.y() < c.y()) || (io == 2 && b.y() > c.y()))
|
||||||
{
|
{
|
||||||
c.setY(b.y());
|
if (m_earlyBend)
|
||||||
|
{
|
||||||
|
b.setY(c.y());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
c.setY(b.y());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (
|
else if (
|
||||||
(it == 3 && b.x() < c.x()) || (io == 3 && b.x() > c.x()) ||
|
(it == 3 && b.x() < c.x()) || (io == 3 && b.x() > c.x()) ||
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
|
|
||||||
void setOnFront(bool front);
|
void setOnFront(bool front);
|
||||||
void setOnBack(bool back);
|
void setOnBack(bool back);
|
||||||
void setHorizontalIn(bool horizontal);
|
void setEarlyBend(bool earlyBend);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QPolygon getPath() const;
|
QPolygon getPath() const;
|
||||||
@@ -54,7 +54,7 @@ protected:
|
|||||||
|
|
||||||
bool m_onFront;
|
bool m_onFront;
|
||||||
bool m_onBack;
|
bool m_onBack;
|
||||||
bool m_horizontalIn;
|
bool m_earlyBend;
|
||||||
|
|
||||||
Route m_route;
|
Route m_route;
|
||||||
Pivot m_pivot;
|
Pivot m_pivot;
|
||||||
|
|||||||
@@ -37,8 +37,6 @@ QtGraphEdge::QtGraphEdge(
|
|||||||
, m_target(target)
|
, m_target(target)
|
||||||
, m_child(nullptr)
|
, m_child(nullptr)
|
||||||
, m_isActive(isActive)
|
, m_isActive(isActive)
|
||||||
, m_fromActive(false)
|
|
||||||
, m_toActive(false)
|
|
||||||
, m_isFocused(false)
|
, m_isFocused(false)
|
||||||
, m_weight(weight)
|
, m_weight(weight)
|
||||||
, m_direction(direction)
|
, m_direction(direction)
|
||||||
@@ -55,9 +53,6 @@ QtGraphEdge::QtGraphEdge(
|
|||||||
m_target = temp;
|
m_target = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_fromActive = m_owner->getIsActive();
|
|
||||||
m_toActive = m_target->getIsActive();
|
|
||||||
|
|
||||||
s_focusedEdge = nullptr;
|
s_focusedEdge = nullptr;
|
||||||
s_focusedBezierEdge = nullptr;
|
s_focusedBezierEdge = nullptr;
|
||||||
}
|
}
|
||||||
@@ -99,6 +94,12 @@ void QtGraphEdge::updateLine()
|
|||||||
Edge::EdgeType type = (getData() ? getData()->getType() : Edge::EDGE_AGGREGATION);
|
Edge::EdgeType type = (getData() ? getData()->getType() : Edge::EDGE_AGGREGATION);
|
||||||
GraphViewStyle::EdgeStyle style = GraphViewStyle::getStyleForEdgeType(type, m_isActive | m_isFocused, false, m_isTrailEdge);
|
GraphViewStyle::EdgeStyle style = GraphViewStyle::getStyleForEdgeType(type, m_isActive | m_isFocused, false, m_isTrailEdge);
|
||||||
|
|
||||||
|
Vec4i ownerRect = owner->getBoundingRect();
|
||||||
|
Vec4i targetRect = target->getBoundingRect();
|
||||||
|
|
||||||
|
Vec4i ownerParentRect = owner->getParentBoundingRect();
|
||||||
|
Vec4i targetParentRect = target->getParentBoundingRect();
|
||||||
|
|
||||||
if (m_useBezier)
|
if (m_useBezier)
|
||||||
{
|
{
|
||||||
for (QGraphicsItem* item : childItems())
|
for (QGraphicsItem* item : childItems())
|
||||||
@@ -110,9 +111,6 @@ void QtGraphEdge::updateLine()
|
|||||||
style.originOffset.y() = 0;
|
style.originOffset.y() = 0;
|
||||||
style.targetOffset.y() = 0;
|
style.targetOffset.y() = 0;
|
||||||
|
|
||||||
Vec4i ownerRect = owner->getBoundingRect();
|
|
||||||
Vec4i ownerParentRect = owner->getParentBoundingRect();
|
|
||||||
|
|
||||||
QtLineItemBase::Route route =
|
QtLineItemBase::Route route =
|
||||||
m_isHorizontalTrail ? QtLineItemBase::ROUTE_HORIZONTAL : QtLineItemBase::ROUTE_VERTICAL;
|
m_isHorizontalTrail ? QtLineItemBase::ROUTE_HORIZONTAL : QtLineItemBase::ROUTE_VERTICAL;
|
||||||
|
|
||||||
@@ -140,9 +138,7 @@ void QtGraphEdge::updateLine()
|
|||||||
bool showArrow = m_direction != TokenComponentAggregation::DIRECTION_NONE;
|
bool showArrow = m_direction != TokenComponentAggregation::DIRECTION_NONE;
|
||||||
|
|
||||||
QtLineItemBezier* bezier = new QtLineItemBezier(this);
|
QtLineItemBezier* bezier = new QtLineItemBezier(this);
|
||||||
bezier->updateLine(
|
bezier->updateLine(ownerRect, targetRect, ownerParentRect, targetParentRect, style, m_weight, showArrow);
|
||||||
ownerRect, target->getBoundingRect(), ownerParentRect, target->getParentBoundingRect(),
|
|
||||||
style, m_weight, showArrow);
|
|
||||||
bezier->setRoute(route);
|
bezier->setRoute(route);
|
||||||
bezier->setPivot(QtLineItemBase::PIVOT_MIDDLE);
|
bezier->setPivot(QtLineItemBase::PIVOT_MIDDLE);
|
||||||
|
|
||||||
@@ -167,32 +163,49 @@ void QtGraphEdge::updateLine()
|
|||||||
|
|
||||||
QtLineItemAngled* child = dynamic_cast<QtLineItemAngled*>(m_child);
|
QtLineItemAngled* child = dynamic_cast<QtLineItemAngled*>(m_child);
|
||||||
|
|
||||||
if (m_fromActive && owner->getLastParent() == target->getLastParent())
|
if (owner->getIsActive() && owner->getLastParent() == target->getLastParent())
|
||||||
{
|
{
|
||||||
child->setOnBack(true);
|
child->setOnBack(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_toActive)
|
if (target->getIsActive())
|
||||||
{
|
{
|
||||||
child->setHorizontalIn(true);
|
child->setEarlyBend(true);
|
||||||
|
|
||||||
if (owner->getLastParent() == target->getLastParent())
|
if (owner->getLastParent() == target->getLastParent() ||
|
||||||
|
(type == Edge::EDGE_OVERRIDE &&
|
||||||
|
targetParentRect.z() + style.targetOffset.x + style.originOffset.x > ownerParentRect.x()))
|
||||||
{
|
{
|
||||||
child->setOnFront(true);
|
child->setOnFront(true);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
child->setOnFront(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type != Edge::EDGE_INHERITANCE &&
|
if (type == Edge::EDGE_INHERITANCE)
|
||||||
(type != Edge::EDGE_AGGREGATION || owner != owner->getLastParent() || target != target->getLastParent()))
|
{
|
||||||
|
child->setRoute(QtLineItemBase::ROUTE_VERTICAL);
|
||||||
|
|
||||||
|
if (target->hasActiveChild())
|
||||||
|
{
|
||||||
|
child->setEarlyBend(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (type != Edge::EDGE_AGGREGATION || owner != owner->getLastParent() || target != target->getLastParent())
|
||||||
{
|
{
|
||||||
child->setRoute(QtLineItemBase::ROUTE_HORIZONTAL);
|
child->setRoute(QtLineItemBase::ROUTE_HORIZONTAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (type == Edge::EDGE_AGGREGATION || type == Edge::EDGE_INHERITANCE)
|
||||||
|
{
|
||||||
|
child->setPivot(QtLineItemBase::PIVOT_MIDDLE);
|
||||||
|
}
|
||||||
|
|
||||||
bool showArrow = true;
|
bool showArrow = true;
|
||||||
if (type == Edge::EDGE_AGGREGATION)
|
if (type == Edge::EDGE_AGGREGATION)
|
||||||
{
|
{
|
||||||
child->setPivot(QtLineItemBase::PIVOT_MIDDLE);
|
|
||||||
|
|
||||||
showArrow = m_direction != TokenComponentAggregation::DIRECTION_NONE;
|
showArrow = m_direction != TokenComponentAggregation::DIRECTION_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,10 +218,7 @@ void QtGraphEdge::updateLine()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
child->updateLine(
|
child->updateLine(ownerRect, targetRect, ownerParentRect, targetParentRect, style, m_weight, showArrow);
|
||||||
owner->getBoundingRect(), target->getBoundingRect(),
|
|
||||||
owner->getParentBoundingRect(), target->getParentBoundingRect(),
|
|
||||||
style, m_weight, showArrow);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this->setZValue(style.zValue);
|
this->setZValue(style.zValue);
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ public:
|
|||||||
|
|
||||||
bool getIsActive() const;
|
bool getIsActive() const;
|
||||||
void setIsActive(bool isActive);
|
void setIsActive(bool isActive);
|
||||||
void setFromAndToActive(bool fromActive, bool toActive);
|
|
||||||
|
|
||||||
void setIsFocused(bool isFocused);
|
void setIsFocused(bool isFocused);
|
||||||
|
|
||||||
@@ -81,9 +80,6 @@ private:
|
|||||||
QGraphicsItem* m_child;
|
QGraphicsItem* m_child;
|
||||||
|
|
||||||
bool m_isActive;
|
bool m_isActive;
|
||||||
bool m_fromActive;
|
|
||||||
bool m_toActive;
|
|
||||||
|
|
||||||
bool m_isFocused;
|
bool m_isFocused;
|
||||||
|
|
||||||
size_t m_weight;
|
size_t m_weight;
|
||||||
|
|||||||
@@ -182,6 +182,24 @@ void QtGraphNode::setMultipleActive(bool multipleActive)
|
|||||||
m_multipleActive = multipleActive;
|
m_multipleActive = multipleActive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool QtGraphNode::hasActiveChild() const
|
||||||
|
{
|
||||||
|
if (m_isActive)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto subNode : m_subNodes)
|
||||||
|
{
|
||||||
|
if (subNode->hasActiveChild())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
std::wstring QtGraphNode::getName() const
|
std::wstring QtGraphNode::getName() const
|
||||||
{
|
{
|
||||||
return m_text->text().toStdWString();
|
return m_text->text().toStdWString();
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ public:
|
|||||||
bool getIsActive() const;
|
bool getIsActive() const;
|
||||||
void setIsActive(bool isActive);
|
void setIsActive(bool isActive);
|
||||||
void setMultipleActive(bool multipleActive);
|
void setMultipleActive(bool multipleActive);
|
||||||
|
bool hasActiveChild() const;
|
||||||
|
|
||||||
std::wstring getName() const;
|
std::wstring getName() const;
|
||||||
void setName(const std::wstring& name);
|
void setName(const std::wstring& name);
|
||||||
|
|||||||
Reference in New Issue
Block a user