[kgraphviewer-devel] [KGraphViewer/libkgraphviz] fe97977: Fix re-layouting of graph edges

Kevin Funk krf at electrostorm.net
Tue Jan 11 17:45:47 CET 2011


commit fe97977dc33b34e9e0df688b9bb5ea1ab6940db7
branch libkgraphviz
Author: Kevin Funk <krf at electrostorm.net>
Date:   Mon Jan 10 15:35:46 2011 +0100

    Fix re-layouting of graph edges
    
    * Fix misplaced prepareGeometryChange() call which caused out-of-date
      bounding rects
    * Fix edge id
      No need for Quuid here, id from Agedge_t is a unique identifier for an
      edge. With Quuid it is not possible to compare edges loaded from a
      file to existing ones for equalness by id (as the uuid is not and
      cannot be saved in the file).

diff --git a/src/kgraphviz/CMakeLists.txt b/src/kgraphviz/CMakeLists.txt
index e06ee76..490dd31 100644
--- a/src/kgraphviz/CMakeLists.txt
+++ b/src/kgraphviz/CMakeLists.txt
@@ -2,6 +2,10 @@
 add_definitions(-DQT_USE_FAST_CONCATENATION)
 add_definitions(-DQT_USE_FAST_OPERATOR_PLUS)
 
+if(KGRAPHVIZ_GRAPHICSVIEW_DEBUG)
+  add_definitions(-DKGRAPHVIZ_GRAPHICSVIEW_DEBUG)
+endif()
+
 include_directories(
   ${CMAKE_CURRENT_SOURCE_DIR}
 
diff --git a/src/kgraphviz/canvasedge.cpp b/src/kgraphviz/canvasedge.cpp
index 2f52ea0..67109c4 100644
--- a/src/kgraphviz/canvasedge.cpp
+++ b/src/kgraphviz/canvasedge.cpp
@@ -438,6 +438,13 @@ void CanvasEdge::paint(QPainter* p, const QStyleOptionGraphicsItem* option,
       p->restore();
     }
   }
+
+#ifdef KGRAPHVIZ_GRAPHICSVIEW_DEBUG
+  p->save();
+  p->setPen(Qt::green);
+  p->drawRect(boundingRect());
+  p->restore();
+#endif
 }
 
 void CanvasEdge::computeBoundingRect()
diff --git a/src/kgraphviz/canvaselement.cpp b/src/kgraphviz/canvaselement.cpp
index 04f33c5..610fcde 100644
--- a/src/kgraphviz/canvaselement.cpp
+++ b/src/kgraphviz/canvaselement.cpp
@@ -182,6 +182,10 @@ void CanvasElement::setFont(const QFont& font)
 void CanvasElement::setBoundingRect(const QRectF& rect)
 {
   Q_D(CanvasElement);
+  if (d->m_boundingRect == rect)
+    return;
+
+  prepareGeometryChange();
   d->m_boundingRect = rect;
 }
 
@@ -191,7 +195,6 @@ void CanvasElement::modelChanged()
   kDebug() ;//<< id();
   d->m_pen = QPen(Dot2QtConsts::componentData().qtColor(d->m_element->fontColor()));
   d->m_font = *FontsCache::changeable().fromName(d->m_element->fontName());
-  prepareGeometryChange();
   computeBoundingRect();
 }
 
@@ -214,7 +217,7 @@ void CanvasElement::initialize(qreal scaleX, qreal scaleY,
   computeBoundingRect();
 }
 
-QRectF CanvasElement::boundingRect () const
+QRectF CanvasElement::boundingRect() const
 {
   Q_D(const CanvasElement);
   return d->m_boundingRect;
@@ -572,6 +575,13 @@ QWidget *widget)
     p->drawRect(QRectF(d->m_boundingRect.bottomRight()-QPointF(6,6),QSizeF(6,6)));
     p->restore();
   }
+
+#ifdef KGRAPHVIZ_GRAPHICSVIEW_DEBUG
+  p->save();
+  p->setPen(Qt::red);
+  p->drawRect(boundingRect());
+  p->restore();
+#endif
 }
 
 void CanvasElement::mousePressEvent(QGraphicsSceneMouseEvent* event)
diff --git a/src/kgraphviz/dotgraph.cpp b/src/kgraphviz/dotgraph.cpp
index f39d585..9e8d352 100644
--- a/src/kgraphviz/dotgraph.cpp
+++ b/src/kgraphviz/dotgraph.cpp
@@ -439,6 +439,7 @@ void DotGraph::saveTo(const QString& fileName)
 void DotGraph::updateWithGraph(graph_t* newGraph)
 {
   Q_D(DotGraph);
+  
   kDebug();
 
   // copy global graph render operations and attributes
@@ -522,8 +523,8 @@ void DotGraph::updateWithGraph(graph_t* newGraph)
     edge_t* nge = agfstout(newGraph, ngn);
     while (nge != NULL)
     {
-      kDebug() << "edge " << nge->id;
-      const QString edgeName = QLatin1String(nge->head->name) + QLatin1String(nge->tail->name);
+      kDebug() << "edge" << nge->id << edges();
+      const QString edgeName = QString::number(nge->id);
       if (edges().contains(edgeName))
       {
         kDebug() << "edge known" << nge->id;
@@ -1015,7 +1016,7 @@ void DotGraph::addNewEdge(QString src, QString tgt, QMap<QString,QString> attrib
   }
   else
   {
-    newEdge->setId(src+tgt+QUuid::createUuid().toString().remove('{').remove('}').remove('-'));
+    newEdge->setId(QString::number(edges().size()+1));
   }
   newEdge->setFromNode(srcElement);
   newEdge->setToNode(tgtElement);
diff --git a/src/kgraphviz/dotgraphview.cpp b/src/kgraphviz/dotgraphview.cpp
index a01aac1..c16fab3 100644
--- a/src/kgraphviz/dotgraphview.cpp
+++ b/src/kgraphviz/dotgraphview.cpp
@@ -63,7 +63,6 @@
 #include <QMenu>
 #include <QGraphicsSimpleTextItem>
 #include <QScrollBar>
-#include <QUuid>
 
 #include <kactioncollection.h>
 #include <kdebug.h>
@@ -731,7 +730,9 @@ bool DotGraphView::displayGraph()
       cnode->setZValue(zvalue+1);
       cnode->show();
     }
-    gnode->canvasElement()->computeBoundingRect();
+
+    CanvasElement* element = gnode->canvasElement();
+    element->computeBoundingRect();
   }
 
   kDebug() << "Creating" << d->m_graph->edges().size() << "edges from" << d->m_graph;
@@ -759,9 +760,10 @@ bool DotGraphView::displayGraph()
       cedge->show();
       d->m_canvas->addItem(cedge);
     }
-    if (gedge->canvasElement() != 0)
-      gedge->canvasElement()->computeBoundingRect();
+    CanvasElement* element = gedge->canvasElement();
+    element->computeBoundingRect();
   }
+
   kDebug() << "Adding graph render operations: " << d->m_graph->renderOperations().size();
   foreach (const DotRenderOp& dro, d->m_graph->renderOperations())
   {
diff --git a/src/kgraphviz/support/dotgraphparsinghelper.cpp b/src/kgraphviz/support/dotgraphparsinghelper.cpp
index 36854ce..2cd0cf2 100644
--- a/src/kgraphviz/support/dotgraphparsinghelper.cpp
+++ b/src/kgraphviz/support/dotgraphparsinghelper.cpp
@@ -29,8 +29,6 @@
 
 #include <kdebug.h>
 
-#include <QUuid>
-
 #define KGV_MAX_ITEMS_TO_LOAD std::numeric_limits<int>::max()
 
 extern KGraphViz::DotGraphParsingHelper* phelper;
@@ -297,7 +295,7 @@ void DotGraphParsingHelper::createedges()
 //     kDebug() << ge->id();
     if (ge->id().isEmpty())
     {
-      ge->setId(QString::fromStdString(node1Name)+QString::fromStdString(node2Name)+QUuid::createUuid().toString().remove('{').remove('}').remove('-'));
+      ge->setId(QString::number(graph->edges().size()+1));
     }
 //     kDebug() << ge->id();
 //     kDebug() << "num before=" << graph->edges().size();


More information about the kgraphviewer-devel mailing list