diff hgexpwidget.cpp @ 44:bed7ab59f62e

* A snatched bit of work on graph layout
author Chris Cannam
date Tue, 09 Nov 2010 17:51:12 +0000
parents c32067cd19f8
children 4286836bb3c9
line wrap: on
line diff
--- a/hgexpwidget.cpp	Sun Nov 07 19:59:54 2010 +0000
+++ b/hgexpwidget.cpp	Tue Nov 09 17:51:12 2010 +0000
@@ -11,6 +11,9 @@
 #include "logparser.h"
 #include "changeset.h"
 #include "changesetitem.h"
+#include "grapher.h"
+
+#include <iostream>
 
 #define REMOTE_REPO_STR  "Remote repository: "
 #define LOCAL_REPO_STR   "Local repository: "
@@ -245,12 +248,51 @@
     gv->scene()->deleteLater();
     QGraphicsScene *scene = new QGraphicsScene();
     Changesets csets = parseChangeSets(hgLogList);
+    if (csets.empty()) return;
+    ChangesetItemMap csetItemMap;
     foreach (Changeset *cs, csets) {
         ChangesetItem *item = new ChangesetItem(cs);
         item->setX(0);
-        item->setY(cs->number() * 100);
+        item->setY(0);
+	csetItemMap[cs] = item;
         scene->addItem(item);
     }
+    try {
+	Grapher().layout(csets, csetItemMap);
+    } catch (std::string s) {
+	std::cerr << "Internal error: Layout failed: " << s << std::endl;
+    }
+/*
+    QMap<QString, Changeset *> idCsetMap;
+    foreach (Changeset *cs, csets) {
+	if (cs->id() == "") {
+	    throw std::string("Changeset has no ID");
+	}
+	if (idCsetMap.contains(cs->id())) {
+	    throw std::string("Changeset ID is already in map");
+	}
+	idCsetMap[cs->id()] = cs;
+    }
+    typedef QSet<int> ColumnSet;
+    typedef QMap<int, ColumnSet> GridAlloc;
+    typedef QMap<Changeset *, ChangesetItem *> ChangesetItemMap;
+    ChangesetItemMap csetItemMap;
+    foreach (Changeset *cs, csets) {
+        ChangesetItem *item = new ChangesetItem(cs);
+        item->setX(0);
+        item->setY(-cs->number() * 100);
+	csetItemMap[cs] = item;
+        scene->addItem(item);
+    }
+    QSet<Changeset *> handled;
+    for (int i = csets.size() - 1; i >= 0; --i) {
+	Changeset *cs = csets[i];
+	if (handled.contains(cs)) continue;
+	
+	
+	handled.insert(cs);
+    }
+*/
     gv->setScene(scene);
 }
 
@@ -326,10 +368,24 @@
     foreach (LogEntry e, log) {
         Changeset *cs = new Changeset();
         foreach (QString key, e.keys()) {
-            cs->setProperty(key.toLocal8Bit().data(), e.value(key));
+	    if (key == "parents") {
+		QStringList parents = e.value(key).split
+		    (" ", QString::SkipEmptyParts);
+		cs->setParents(parents);
+	    } else {
+		cs->setProperty(key.toLocal8Bit().data(), e.value(key));
+	    }
         }
         csets.push_back(cs);
     }
+    for (int i = 0; i+1 < csets.size(); ++i) {
+	Changeset *cs = csets[i];
+	if (cs->parents().empty()) {
+	    QStringList list;
+	    list.push_back(csets[i+1]->id());
+	    cs->setParents(list);
+	}
+    }
     return csets;
 }