[kgraphviewer-devel] extragear/graphics/kgraphviewer/src/part

Gaël de Chalendar kleag at free.fr
Sun Apr 25 22:37:06 CEST 2010


SVN commit 1118760 by kleag:

Now loading graphs using the graphviz library in a background thread

 M  +1 -1      CMakeLists.txt  
 M  +0 -32     dotgraph.cpp  
 M  +0 -1      dotgraph.h  
 M  +32 -31    dotgraphview.cpp  
 M  +12 -2     dotgraphview.h  
 AM            layoutagraphthread.cpp   [License: GPL (v3+)]
 AM            layoutagraphthread.h   [License: GPL (v3+)]
 AM            loadagraphthread.cpp   [License: GPL (v3+)]
 AM            loadagraphthread.h   [License: GPL (v3+)]


--- trunk/extragear/graphics/kgraphviewer/src/part/CMakeLists.txt #1118759:1118760
@@ -3,7 +3,7 @@
 
 ########### next target ###############
 
-set( kgraphviewerpart_PART_SRCS kgraphviewer_part.cpp graphelement.cpp graphsubgraph.cpp graphnode.cpp graphedge.cpp graphexporter.cpp pannerview.cpp canvassubgraph.cpp canvasnode.cpp canvasedge.cpp canvaselement.cpp dotgraph.cpp dotgraphview.cpp dot2qtconsts.cpp dotgrammar.cpp DotGraphParsingHelper.cpp FontsCache.cpp simpleprintingsettings.cpp simpleprintingengine.cpp simpleprintingcommand.cpp simpleprintingpagesetup.cpp simpleprintpreviewwindow_p.cpp simpleprintpreviewwindow.cpp KgvGlobal.cpp KgvUnit.cpp KgvUnitWidgets.cpp KgvPageLayoutColumns.cpp KgvPageLayoutDia.cpp KgvPageLayout.cpp KgvPageLayoutHeader.cpp KgvPageLayoutSize.cpp )
+set( kgraphviewerpart_PART_SRCS kgraphviewer_part.cpp  loadagraphthread.cpp layoutagraphthread.cpp graphelement.cpp graphsubgraph.cpp graphnode.cpp graphedge.cpp graphexporter.cpp pannerview.cpp canvassubgraph.cpp canvasnode.cpp canvasedge.cpp canvaselement.cpp dotgraph.cpp dotgraphview.cpp dot2qtconsts.cpp dotgrammar.cpp DotGraphParsingHelper.cpp FontsCache.cpp simpleprintingsettings.cpp simpleprintingengine.cpp simpleprintingcommand.cpp simpleprintingpagesetup.cpp simpleprintpreviewwindow_p.cpp simpleprintpreviewwindow.cpp KgvGlobal.cpp KgvUnit.cpp KgvUnitWidgets.cpp KgvPageLayoutColumns.cpp KgvPageLayoutDia.cpp KgvPageLayout.cpp KgvPageLayoutHeader.cpp KgvPageLayoutSize.cpp)
 
 kde4_add_kcfg_files( kgraphviewerpart_PART_SRCS kgraphviewer_partsettings.kcfgc )
 
--- trunk/extragear/graphics/kgraphviewer/src/part/dotgraph.cpp #1118759:1118760
@@ -159,38 +159,6 @@
  return true;
 }
 
-bool DotGraph::parseLibrary(const QString& str)
-{
-  kDebug() << str;
-  m_useLibrary = true;
-  if (m_layoutCommand.isEmpty())
-  {
-    m_layoutCommand = chooseLayoutProgramForFile(str);
-    if (m_layoutCommand.isEmpty())
-    {
-      m_layoutCommand = chooseLayoutProgramForFile(str);
-      return false;
-    }
-  }
-  
-  kDebug() << "Running " << m_layoutCommand  << str;
-  GVC_t *gvc;
-  graph_t *g;
-  FILE* fp;
-  gvc = gvContext();
-  fp = fopen(str.toUtf8().data(), "r");
-  g = agread(fp);
-  gvLayout(gvc, g, m_layoutCommand.toUtf8().data());
-  gvRender (gvc, g, "xdot", NULL);
-  
-  updateWithGraph(g);
-  
-  gvFreeLayout(gvc, g);
-  agclose(g);
-  bool result = (gvFreeContext(gvc) == 0);
-  return result;
-}
-
 bool DotGraph::update()
 {
   GraphExporter exporter;
--- trunk/extragear/graphics/kgraphviewer/src/part/dotgraph.h #1118759:1118760
@@ -53,7 +53,6 @@
   
   QString chooseLayoutProgramForFile(const QString& str);
   bool parseDot(const QString& str);
-  bool parseLibrary(const QString& str);
   
   /** Constant accessor to the nodes of this graph */
   inline const GraphNodeMap& nodes() const {return m_nodesMap;}
--- trunk/extragear/graphics/kgraphviewer/src/part/dotgraphview.cpp #1118759:1118760
@@ -101,7 +101,9 @@
     m_newEdgeDraft(0),
     m_readWrite(false),
     m_leavedTimer(std::numeric_limits<int>::max()),
-    m_highlighting(false)
+    m_highlighting(false),
+    m_loadThread(),
+    m_layoutThread()
 {
   kDebug() << "New node pic=" << KGlobal::dirs()->findResource("data","kgraphviewerpart/pics/kgraphviewer-newnode.png");
   m_canvas = 0;
@@ -164,6 +166,8 @@
   connect(this, SIGNAL(removeEdge(const QString&)), m_graph, SLOT(removeEdge(const QString&)));
   connect(this, SIGNAL(removeNodeNamed(const QString&)), m_graph, SLOT(removeNodeNamed(const QString&)));
   connect(this, SIGNAL(removeElement(const QString&)), m_graph, SLOT(removeElement(const QString&)));
+  connect(&m_loadThread, SIGNAL(finished()), this, SLOT(slotAGraphReadFinished()));
+  connect(&m_layoutThread, SIGNAL(finished()), this, SLOT(slotAGraphLayoutFinished()));
 }
 
 DotGraphView::~DotGraphView()
@@ -294,33 +298,14 @@
 {
   kDebug() << "'" << dotFileName << "'";
   
+  m_canvas->clear();
   QGraphicsSimpleTextItem* loadingLabel = m_canvas->addSimpleText(i18n("graph %1 is getting loaded...", dotFileName));
   loadingLabel->setZValue(100);
   centerOn(loadingLabel);
 
-  QString layoutCommand = (m_graph!=0?m_graph->layoutCommand():"");
-  if (layoutCommand.isEmpty())
-  {
-    if (!dotFileName.isEmpty())
-      layoutCommand = m_graph->chooseLayoutProgramForFile(dotFileName);
-    else
-      layoutCommand = "dot";
-  }
-  GVC_t *gvc;
-  graph_t *g;
-  FILE* fp;
-  gvc = gvContext();
-  fp = fopen(dotFileName.toUtf8().data(), "r");
-  g = agread(fp);
+  m_loadThread.loadFile(dotFileName);
   
-  bool result = loadLibrary(g, layoutCommand);
-  if (result)
-    m_graph->dotFileName(dotFileName);
-  
-  agclose(g);
-  bool freeresult = (gvFreeContext(gvc) == 0);
-  
-  return result && freeresult;
+  return true;
 }
 
 bool DotGraphView::loadLibrary(graph_t* graph, const QString& layoutCommand)
@@ -356,26 +341,18 @@
   
   QGraphicsScene* newCanvas = new QGraphicsScene();
   kDebug() << "Created canvas " << newCanvas;
-  QGraphicsSimpleTextItem* loadingLabel = newCanvas->addSimpleText(i18n("graph is getting loaded..."));
-  loadingLabel->setZValue(100);
   
   m_birdEyeView->setScene(newCanvas);
   setScene(newCanvas);
-  centerOn(loadingLabel);
   connect(newCanvas,SIGNAL(selectionChanged ()),this,SLOT(slotSelectionChanged()));
   m_canvas = newCanvas;
   
   m_cvZoom = 0;
 
-  GVC_t* gvc = gvContext();
-  gvLayout(gvc, graph, layoutCommand.toUtf8().data());
-  gvRender (gvc, graph, "xdot", NULL);
              
                                       
   m_graph->updateWithGraph(graph);
 
-  gvFreeLayout(gvc, graph);
-  gvFreeContext(gvc);
   return true;
 }
 
@@ -1979,5 +1956,29 @@
   }
 }
 
+void DotGraphView::slotAGraphReadFinished()
+{
+  QString layoutCommand = (m_graph!=0?m_graph->layoutCommand():"");
+  if (layoutCommand.isEmpty())
+  {
+    if (!m_loadThread.dotFileName().isEmpty())
+      layoutCommand = m_graph->chooseLayoutProgramForFile(m_loadThread.dotFileName());
+    else
+      layoutCommand = "dot";
+  }
+  m_layoutThread.layoutGraph(m_loadThread.g(), layoutCommand);
+}
+
+void DotGraphView::slotAGraphLayoutFinished()
+{
+  bool result = loadLibrary(m_layoutThread.g(), m_layoutThread.layoutCommand());
+  if (result)
+    m_graph->dotFileName(m_loadThread.dotFileName());
+
+  gvFreeLayout(m_layoutThread.gvc(), m_layoutThread.g());
+  agclose(m_layoutThread.g());
+  bool freeresult = (gvFreeContext(m_layoutThread.gvc()) == 0);
+}
+
 #include "dotgraphview.moc"
 
--- trunk/extragear/graphics/kgraphviewer/src/part/dotgraphview.h #1118759:1118760
@@ -39,10 +39,10 @@
 #include <QGraphicsView>
 #include <QSet>
 
-#include <graphviz/gvc.h>
-
 #include "graphexporter.h"
 #include "kgraphviewer_interface.h"
+#include "loadagraphthread.h"
+#include "layoutagraphthread.h"
 
 class GraphElement;
 class GraphSubgraph;
@@ -215,6 +215,10 @@
   void slotElementHoverEnter(CanvasEdge*);
   void slotElementHoverLeave(CanvasEdge*);
   
+private Q_SLOTS:
+  void slotAGraphReadFinished();
+  void slotAGraphLayoutFinished();
+  
 protected:
   void scrollContentsBy(int dx, int dy);
   void resizeEvent(QResizeEvent*);
@@ -291,6 +295,12 @@
 
   /// true if elements should be highlighted on hover; false otherwise
   bool m_highlighting;
+
+  /// A thread to load graphviz agraph files
+  LoadAGraphThread m_loadThread;
+  
+  /// A thread to layout graphviz agraph files
+  LayoutAGraphThread m_layoutThread;
 };
 
 #endif // DOTGRAPHVIEW_H


More information about the kgraphviewer-devel mailing list