[kgraphviewer-devel] [KGraphViewer/libkgraphviz] 3b23ff3: Fix loading dot files with external program
Kevin Funk
krf at electrostorm.net
Tue Dec 21 16:40:27 CET 2010
commit 3b23ff3a07b44de5539d9ca074f31164fdd2f04a
branch libkgraphviz
Author: Kevin Funk <krf at electrostorm.net>
Date: Tue Dec 21 16:39:00 2010 +0100
Fix loading dot files with external program
* Add some TODOs in GraphIO
* Also fix graph re-layouting
diff --git a/src/kgraphviz/dotgraph.cpp b/src/kgraphviz/dotgraph.cpp
index 2e6b522..5e61dd3 100644
--- a/src/kgraphviz/dotgraph.cpp
+++ b/src/kgraphviz/dotgraph.cpp
@@ -72,13 +72,29 @@ DotGraphPrivate::DotGraphPrivate(DotGraph* parent) :
AGINIT();
Q_Q(DotGraph);
- q->connect(&m_graphIO, SIGNAL(finished()), q, SIGNAL(readyToDisplay()));
+ q->connect(&m_graphIO, SIGNAL(finished()), SLOT(graphIOFinished()));
+ q->connect(&m_graphIO, SIGNAL(error(QString)), SLOT(graphIOError(QString)));
}
DotGraphPrivate::~DotGraphPrivate()
{
}
+void DotGraphPrivate::graphIOFinished()
+{
+ kDebug();
+
+ Q_Q(DotGraph);
+ DotGraph* updatedGraph = m_graphIO.readData();
+ q->updateWithGraph(*updatedGraph);
+}
+
+void DotGraphPrivate::graphIOError(const QString& error)
+{
+ // TODO: add error handling here
+ kDebug() << "Error message from graph IO:" << error;
+}
+
DotGraph::DotGraph() :
d_ptr(new DotGraphPrivate(this))
{
@@ -282,7 +298,7 @@ bool DotGraph::parseDot(const QString& fileName)
kDebug() << fileName;
Q_D(DotGraph);
- d->m_graphIO.loadFromDotFile(fileName);
+ d->m_graphIO.loadFromDotFile(fileName, layoutCommand());
return true;
}
@@ -631,6 +647,7 @@ void DotGraph::updateWithGraph(const DotGraph& newGraph)
}
}
kDebug() << "Done";
+ emit readyToDisplay();
d->computeCells();
}
diff --git a/src/kgraphviz/dotgraph.h b/src/kgraphviz/dotgraph.h
index 0b139d5..990f846 100644
--- a/src/kgraphviz/dotgraph.h
+++ b/src/kgraphviz/dotgraph.h
@@ -131,11 +131,11 @@ protected:
private:
Q_DECLARE_PRIVATE(DotGraph);
+
+ Q_PRIVATE_SLOT(d_func(), void graphIOFinished());
+ Q_PRIVATE_SLOT(d_func(), void graphIOError(QString));
};
}
#endif
-
-
-
diff --git a/src/kgraphviz/dotgraph_p.h b/src/kgraphviz/dotgraph_p.h
index c46fcb3..2258e7e 100644
--- a/src/kgraphviz/dotgraph_p.h
+++ b/src/kgraphviz/dotgraph_p.h
@@ -59,6 +59,10 @@ public:
bool m_useLibrary;
bool m_readWrite;
+
+private:
+ void graphIOFinished();
+ void graphIOError(const QString& error);
};
}
diff --git a/src/kgraphviz/graphio.cpp b/src/kgraphviz/graphio.cpp
index 7733ea9..9223799 100644
--- a/src/kgraphviz/graphio.cpp
+++ b/src/kgraphviz/graphio.cpp
@@ -34,6 +34,7 @@
#include <boost/spirit/include/classic_assign_actor.hpp>
#include <boost/spirit/include/classic_confix.hpp>
#include <boost/spirit/include/classic_distinct.hpp>
+#include <kurl.h>
using namespace boost;
using namespace boost::spirit::classic;
@@ -51,6 +52,9 @@ GraphIOPrivate::GraphIOPrivate(QObject* parent)
connect(&m_process,
SIGNAL(finished(int, QProcess::ExitStatus)),
SLOT(processFinished(int, QProcess::ExitStatus)));
+ connect(&m_process,
+ SIGNAL(error(QProcess::ProcessError)),
+ SLOT(processError(QProcess::ProcessError)));
}
GraphIOPrivate::~GraphIOPrivate()
@@ -65,18 +69,37 @@ void GraphIOPrivate::reset()
}
}
+QString GraphIOPrivate::toString(QProcess::ProcessError error)
+{
+ switch (error)
+ {
+ case QProcess::FailedToStart:
+ return i18n("Unable to start process.");
+ case QProcess::Crashed:
+ return i18n("Process crashed.");
+ case QProcess::Timedout:
+ return i18n("Process timed out.");
+ case QProcess::WriteError:
+ return i18n("Was not able to write data to the process.");
+ case QProcess::ReadError:
+ return i18n("Was not able to read data from the process.");
+ default:
+ return i18n("Unknown error running the process.");
+ }
+}
+
void GraphIOPrivate::processFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
- qDebug() << "Exit status:" << exitStatus;
+ kDebug() << "Error message:" << toString(m_process.error()) << m_process.errorString();
+ // TODO: Better error handling here
+ QByteArray result = m_process.readAll();
if (exitCode != 0) {
- emit error(i18n("Failed to load from dot file"));
+ emit error(i18n("Failed to load from dot file: %1", result.data()));
return;
}
- QByteArray result = m_process.readAll();
result.replace("\\\n", "");
-
kDebug() << "String size is:" << result.size();
kDebug() << "String content is:" << result;
const std::string content = result.data();
@@ -111,6 +134,12 @@ void GraphIOPrivate::processFinished(int exitCode, QProcess::ExitStatus exitStat
}
}
+void GraphIOPrivate::processError(QProcess::ProcessError error)
+{
+ kDebug();
+ emit(toString(error));
+}
+
GraphIO::GraphIO(QObject* parent)
: QObject(parent)
, d_ptr(new GraphIOPrivate)
@@ -138,16 +167,21 @@ void GraphIO::loadFromDotFile(const QString& fileName, const QString& layoutComm
{
Q_D(GraphIO);
+ // TODO: Better file handling here
+ KUrl url(fileName);
+ QString localFile = url.toLocalFile();
+
const QString layoutCommandForFile = (layoutCommand.isEmpty()
? internalLayoutCommandForFile(fileName)
: layoutCommand);
QStringList args;
- args << fileName;
+ args << "-Txdot";
+ args << localFile;
- kDebug() << "Loading from" << fileName << "with" << layoutCommandForFile << "executable.";
+ kDebug() << "Running:" << qPrintable(layoutCommandForFile) << qPrintable(localFile);
d->m_process.start(layoutCommandForFile, args, QIODevice::ReadOnly);
- //kDebug() << "Started:" << d->m_process.waitForStarted(3000) << d->m_process.error();
+ kDebug() << "Started:" << d->m_process.waitForStarted(3000) << d->m_process.error();
}
void GraphIO::saveToDotFile(const DotGraph* dotGraph, const QString& fileName)
@@ -232,7 +266,7 @@ QString GraphIO::internalLayoutCommandForFile(const QString& fileName)
std::string cmd = "dot";
parse(s.c_str(),
(
- !(keyword_p("strict")) >> (keyword_p("graph")[assign_a(cmd,"neato")])
+ !(keyword_p("strict")) >> (keyword_p("graph")[assign_a(cmd,"dot")])
), (space_p|comment_p("/*", "*/")) );
return QString::fromStdString(cmd); // + " -Txdot" ;
diff --git a/src/kgraphviz/graphio.h b/src/kgraphviz/graphio.h
index 72bb7b2..51d5a20 100644
--- a/src/kgraphviz/graphio.h
+++ b/src/kgraphviz/graphio.h
@@ -21,6 +21,7 @@
#define GRAPHIO_H
#include <QObject>
+#include <QProcess>
#include "kgraphviz_export.h"
diff --git a/src/kgraphviz/graphio_p.h b/src/kgraphviz/graphio_p.h
index 01666d6..a1d7211 100644
--- a/src/kgraphviz/graphio_p.h
+++ b/src/kgraphviz/graphio_p.h
@@ -35,6 +35,8 @@ public:
void reset();
+ static QString toString(QProcess::ProcessError error);
+
DotGraph* m_dotGraph;
QProcess m_process;
@@ -45,6 +47,7 @@ Q_SIGNALS:
private Q_SLOTS:
void processFinished(int, QProcess::ExitStatus);
+ void processError(QProcess::ProcessError);
};
#endif
More information about the kgraphviewer-devel
mailing list