[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