@@ -116,7 +116,7 @@ QGVNode *QGVScene::addNode(const QString &label)
116116 QGVNode *item = new QGVNode (new QGVNodePrivate (node, _graph->graph ()), this );
117117 item->setLabel (label);
118118 addItem (item);
119- _nodes .append (item);
119+ mNodes .append (item);
120120 return item;
121121}
122122
@@ -132,7 +132,7 @@ QGVEdge *QGVScene::addEdge(QGVNode *source, QGVNode *target, const QString &labe
132132 QGVEdge *item = new QGVEdge (new QGVEdgePrivate (edge), this );
133133 item->setLabel (label);
134134 addItem (item);
135- _edges .append (item);
135+ mEdges .append (item);
136136 return item;
137137}
138138
@@ -158,27 +158,36 @@ QGVSubGraph *QGVScene::addSubGraph(const QString &name, bool cluster)
158158
159159void QGVScene::deleteNode (QGVNode* node)
160160{
161- QList<QGVNode *>::iterator it = std::find (_nodes .begin (), _nodes .end (), node);
162- if (it == _nodes .end ())
161+ QList<QGVNode *>::iterator it = std::find (mNodes .begin (), mNodes .end (), node);
162+ if (it == mNodes .end ())
163163 {
164164 std::cout << " Error, node not part of Scene" << std::endl;
165165 return ;
166166 }
167167 std::cout << " delNode ret " << agdelnode (node->_node ->graph (), node->_node ->node ()) << std::endl;;
168- _nodes.erase (it);
168+ auto jt = mAttachedEdges .lowerBound (node);
169+ while (jt != mAttachedEdges .upperBound (node))
170+ jt = mAttachedEdges .erase (jt);
171+ mNodes .erase (it);
169172 delete node;
170173}
171174
172175void QGVScene::deleteEdge (QGVEdge* edge)
173176{
174177 std::cout << " delEdge ret " << agdeledge (_graph->graph (), edge->_edge ->edge ()) << std::endl;
175- QList<QGVEdge *>::iterator it = std::find (_edges .begin (), _edges .end (), edge);
176- if (it == _edges .end ())
178+ QList<QGVEdge *>::iterator it = std::find (mEdges .begin (), mEdges .end (), edge);
179+ if (it == mEdges .end ())
177180 {
178181 std::cout << " Error, QGVEdge not part of Scene" << std::endl;
179182 return ;
180183 }
181- _edges.erase (it);
184+ auto jt = mAttachedEdges .begin ();
185+ while (jt != mAttachedEdges .end ())
186+ if (jt.value () == edge)
187+ jt = mAttachedEdges .erase (jt);
188+ else
189+ ++jt;
190+ mEdges .erase (it);
182191 delete edge;
183192}
184193
@@ -199,7 +208,7 @@ void QGVScene::deleteSubGraph(QGVSubGraph *subgraph)
199208
200209void QGVScene::setRootNode (QGVNode *node)
201210{
202- Q_ASSERT (_nodes .contains (node));
211+ Q_ASSERT (mNodes .contains (node));
203212 char root[] = " root" ;
204213 agset (_graph->graph (), root, node->label ().toLocal8Bit ().data ());
205214}
@@ -225,8 +234,10 @@ void QGVScene::loadLayout(const QString &text, QGVInteraction *interact)
225234 // Debug output
226235 // gvRenderFilename(_context->context(), _graph->graph(), "png", "debug.png");
227236
237+ mAttachedEdges .clear ();
238+ mNodes .clear ();
239+ mEdges .clear ();
228240 QHash<void *, QGVNode*> nodeHash;
229- QList<QGVEdge*> edgeList;
230241
231242 // Read nodes and edges
232243 for (Agnode_t* node = agfstnode (_graph->graph ()); node != NULL ; node = agnxtnode (_graph->graph (), node))
@@ -236,18 +247,19 @@ void QGVScene::loadLayout(const QString &text, QGVInteraction *interact)
236247 inode->updateLayout ();
237248 addItem (inode);
238249 nodeHash[node] = inode;
250+ mNodes .append (inode);
239251 for (Agedge_t* edge = agfstout (_graph->graph (), node); edge != NULL ; edge = agnxtout (_graph->graph (), edge))
240252 {
241253 QGVEdge *iedge = new QGVEdge (new QGVEdgePrivate (edge), this );
242254 if (interact) interact->registerEdge (iedge);
243255 iedge->updateLayout ();
244256 addItem (iedge);
245- edgeList .append (iedge);
257+ mEdges .append (iedge);
246258 }
247259 }
248260
249- for (QGVEdge* iedge : edgeList )
250- iedge->setEndpoints (nodeHash);
261+ for (QGVEdge* iedge : mEdges )
262+ iedge->setEndpoints (nodeHash, mAttachedEdges );
251263
252264 update ();
253265/*
@@ -277,10 +289,10 @@ void QGVScene::applyLayout()
277289 // gvRenderFilename(_context->context(), _graph->graph(), "png", "debug.png");
278290
279291 // Update items layout
280- foreach (QGVNode* node, _nodes )
292+ foreach (QGVNode* node, mNodes )
281293 node->updateLayout ();
282294
283- foreach (QGVEdge* edge, _edges )
295+ foreach (QGVEdge* edge, mEdges )
284296 edge->updateLayout ();
285297
286298 foreach (QGVSubGraph* sgraph, _subGraphs)
@@ -299,11 +311,24 @@ void QGVScene::applyLayout()
299311 update ();
300312}
301313
314+ void QGVScene::hoverEnterEdges (QGVNode* node)
315+ {
316+ for (auto it = mAttachedEdges .lowerBound (node); it != mAttachedEdges .upperBound (node); ++it)
317+ it.value ()->setHover (true );
318+ }
319+
320+ void QGVScene::hoverLeaveEdges ()
321+ {
322+ for (QGVEdge* edge : mEdges )
323+ edge->setHover (false );
324+ }
325+
326+
302327void QGVScene::clear ()
303328{
304329 gvFreeLayout (_context->context (), _graph->graph ());
305- _nodes .clear ();
306- _edges .clear ();
330+ mNodes .clear ();
331+ mEdges .clear ();
307332 _subGraphs.clear ();
308333 QGraphicsScene::clear ();
309334}
@@ -417,17 +442,20 @@ void QGVStyle::changeHalStyle(StyleType type)
417442 }
418443}
419444
420- QColor QGVStyle::penColor (bool selected, const QColor& graphvizColor) const
445+ QColor QGVStyle::penColor (bool selected, bool hovered, const QColor& graphvizColor) const
421446{
422447 switch (mStyleType [EdgeStyle]) {
423448 case Dark:
424449 if (selected) return QColor (Qt::cyan);
450+ if (hovered) return QColor::fromRgb (255 ,200 ,200 );
425451 return QColor::fromRgb (200 ,200 ,200 );
426452 case Light:
427453 if (selected) return QColor (Qt::blue);
454+ if (hovered) return QColor (Qt::darkRed);
428455 return QColor (Qt::black);
429456 case Graphviz:
430457 if (selected) return graphvizColor.darker (120 );
458+ if (hovered) return graphvizColor.darker (110 );
431459 return graphvizColor;
432460 }
433461 return QColor ();
@@ -460,17 +488,20 @@ QColor QGVStyle::gridColor() const
460488}
461489
462490
463- QBrush QGVStyle::nodeBrush (bool selected, const QBrush& graphvizBrush) const
491+ QBrush QGVStyle::nodeBrush (bool selected, bool hovered, const QBrush& graphvizBrush) const
464492{
465493 switch (mStyleType [NodeStyle]) {
466494 case Dark:
467495 if (selected) return QBrush (Qt::white);
496+ if (hovered) return QBrush (QColor::fromRgb (255 ,200 ,200 ));
468497 return QBrush (QColor::fromRgb (160 ,161 ,164 ));
469498 case Light:
470499 if (selected) return QBrush (QColor::fromRgb (220 ,221 ,223 ));
500+ if (hovered) return QBrush (QColor::fromRgb (220 ,221 ,255 ));
471501 return QBrush (Qt::white);
472502 case Graphviz:
473503 if (selected) return QBrush (graphvizBrush.color ().darker (120 ));
504+ if (hovered) return QBrush (graphvizBrush.color ().darker (110 ));
474505 return graphvizBrush;
475506 }
476507 return QBrush ();
0 commit comments