comparison 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
comparison
equal deleted inserted replaced
43:c32067cd19f8 44:bed7ab59f62e
9 #include "hgexpwidget.h" 9 #include "hgexpwidget.h"
10 #include "common.h" 10 #include "common.h"
11 #include "logparser.h" 11 #include "logparser.h"
12 #include "changeset.h" 12 #include "changeset.h"
13 #include "changesetitem.h" 13 #include "changesetitem.h"
14 #include "grapher.h"
15
16 #include <iostream>
14 17
15 #define REMOTE_REPO_STR "Remote repository: " 18 #define REMOTE_REPO_STR "Remote repository: "
16 #define LOCAL_REPO_STR "Local repository: " 19 #define LOCAL_REPO_STR "Local repository: "
17 #define WORKFOLDER_STR "Working folder: " 20 #define WORKFOLDER_STR "Working folder: "
18 21
243 //!!! 246 //!!!
244 QGraphicsView *gv = static_cast<QGraphicsView *>(historyGraphPageWidget); 247 QGraphicsView *gv = static_cast<QGraphicsView *>(historyGraphPageWidget);
245 gv->scene()->deleteLater(); 248 gv->scene()->deleteLater();
246 QGraphicsScene *scene = new QGraphicsScene(); 249 QGraphicsScene *scene = new QGraphicsScene();
247 Changesets csets = parseChangeSets(hgLogList); 250 Changesets csets = parseChangeSets(hgLogList);
251 if (csets.empty()) return;
252 ChangesetItemMap csetItemMap;
248 foreach (Changeset *cs, csets) { 253 foreach (Changeset *cs, csets) {
249 ChangesetItem *item = new ChangesetItem(cs); 254 ChangesetItem *item = new ChangesetItem(cs);
250 item->setX(0); 255 item->setX(0);
251 item->setY(cs->number() * 100); 256 item->setY(0);
257 csetItemMap[cs] = item;
252 scene->addItem(item); 258 scene->addItem(item);
253 } 259 }
260 try {
261 Grapher().layout(csets, csetItemMap);
262 } catch (std::string s) {
263 std::cerr << "Internal error: Layout failed: " << s << std::endl;
264 }
265 /*
266 QMap<QString, Changeset *> idCsetMap;
267 foreach (Changeset *cs, csets) {
268 if (cs->id() == "") {
269 throw std::string("Changeset has no ID");
270 }
271 if (idCsetMap.contains(cs->id())) {
272 throw std::string("Changeset ID is already in map");
273 }
274 idCsetMap[cs->id()] = cs;
275 }
276 typedef QSet<int> ColumnSet;
277 typedef QMap<int, ColumnSet> GridAlloc;
278 typedef QMap<Changeset *, ChangesetItem *> ChangesetItemMap;
279 ChangesetItemMap csetItemMap;
280 foreach (Changeset *cs, csets) {
281 ChangesetItem *item = new ChangesetItem(cs);
282 item->setX(0);
283 item->setY(-cs->number() * 100);
284 csetItemMap[cs] = item;
285 scene->addItem(item);
286 }
287 QSet<Changeset *> handled;
288 for (int i = csets.size() - 1; i >= 0; --i) {
289 Changeset *cs = csets[i];
290 if (handled.contains(cs)) continue;
291
292
293 handled.insert(cs);
294 }
295 */
254 gv->setScene(scene); 296 gv->setScene(scene);
255 } 297 }
256 298
257 299
258 300
324 Changesets csets; 366 Changesets csets;
325 LogList log = LogParser(changeSetsStr).parse(); 367 LogList log = LogParser(changeSetsStr).parse();
326 foreach (LogEntry e, log) { 368 foreach (LogEntry e, log) {
327 Changeset *cs = new Changeset(); 369 Changeset *cs = new Changeset();
328 foreach (QString key, e.keys()) { 370 foreach (QString key, e.keys()) {
329 cs->setProperty(key.toLocal8Bit().data(), e.value(key)); 371 if (key == "parents") {
372 QStringList parents = e.value(key).split
373 (" ", QString::SkipEmptyParts);
374 cs->setParents(parents);
375 } else {
376 cs->setProperty(key.toLocal8Bit().data(), e.value(key));
377 }
330 } 378 }
331 csets.push_back(cs); 379 csets.push_back(cs);
380 }
381 for (int i = 0; i+1 < csets.size(); ++i) {
382 Changeset *cs = csets[i];
383 if (cs->parents().empty()) {
384 QStringList list;
385 list.push_back(csets[i+1]->id());
386 cs->setParents(list);
387 }
332 } 388 }
333 return csets; 389 return csets;
334 } 390 }
335 391
336 QString HgExpWidget::getCurrentFileListLine() 392 QString HgExpWidget::getCurrentFileListLine()