annotate historywidget.cpp @ 120:c92f5859c707

* Add incremental log (though not incremental relayout)
author Chris Cannam
date Mon, 29 Nov 2010 11:01:19 +0000
parents 005a54380502
children c3e8342d2de9
rev   line source
Chris@116 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@116 2
Chris@116 3 /*
Chris@116 4 EasyMercurial
Chris@116 5
Chris@116 6 Based on HgExplorer by Jari Korhonen
Chris@116 7 Copyright (c) 2010 Jari Korhonen
Chris@116 8 Copyright (c) 2010 Chris Cannam
Chris@116 9 Copyright (c) 2010 Queen Mary, University of London
Chris@116 10
Chris@116 11 This program is free software; you can redistribute it and/or
Chris@116 12 modify it under the terms of the GNU General Public License as
Chris@116 13 published by the Free Software Foundation; either version 2 of the
Chris@116 14 License, or (at your option) any later version. See the file
Chris@116 15 COPYING included with this distribution for more information.
Chris@116 16 */
Chris@116 17
Chris@116 18 #include "historywidget.h"
Chris@116 19
Chris@119 20 #include "changesetscene.h"
Chris@116 21 #include "panned.h"
Chris@116 22 #include "panner.h"
Chris@116 23 #include "grapher.h"
Chris@116 24 #include "debug.h"
Chris@116 25
Chris@116 26 #include <iostream>
Chris@116 27
Chris@116 28 #include <QGridLayout>
Chris@116 29
Chris@116 30 HistoryWidget::HistoryWidget()
Chris@116 31 {
Chris@116 32 m_panned = new Panned;
Chris@116 33 m_panner = new Panner;
Chris@116 34
Chris@116 35 QGridLayout *layout = new QGridLayout;
Chris@116 36 layout->addWidget(m_panned, 0, 0);
Chris@116 37 layout->addWidget(m_panner, 0, 1);
Chris@116 38 m_panner->setMaximumWidth(80);
Chris@116 39 m_panner->connectToPanned(m_panned);
Chris@116 40
Chris@116 41 setLayout(layout);
Chris@116 42 }
Chris@116 43
Chris@116 44 HistoryWidget::~HistoryWidget()
Chris@116 45 {
Chris@116 46 clearChangesets();
Chris@116 47 }
Chris@116 48
Chris@116 49 void HistoryWidget::clearChangesets()
Chris@116 50 {
Chris@116 51 foreach (Changeset *cs, m_changesets) delete cs;
Chris@116 52 m_changesets.clear();
Chris@116 53 }
Chris@116 54
Chris@120 55 void HistoryWidget::parseNewLog(QString log)
Chris@120 56 {
Chris@120 57 DEBUG << "HistoryWidget::parseNewLog: log has " << log.length() << " chars" << endl;
Chris@120 58 Changesets csets = parseChangeSets(log);
Chris@120 59 DEBUG << "HistoryWidget::parseNewLog: log has " << csets.size() << " changesets" << endl;
Chris@120 60 clearChangesets();
Chris@120 61 m_changesets = csets;
Chris@120 62 layoutAll();
Chris@120 63 }
Chris@120 64
Chris@120 65 void HistoryWidget::parseIncrementalLog(QString log)
Chris@120 66 {
Chris@120 67 DEBUG << "HistoryWidget::parseIncrementalLog: log has " << log.length() << " chars" << endl;
Chris@120 68 Changesets csets = parseChangeSets(log);
Chris@120 69 DEBUG << "HistoryWidget::parseIncrementalLog: log has " << csets.size() << " changesets" << endl;
Chris@120 70 if (!csets.empty()) {
Chris@120 71 m_changesets << csets;
Chris@120 72 layoutAll();
Chris@120 73 }
Chris@120 74 }
Chris@120 75
Chris@120 76 void HistoryWidget::layoutAll()
Chris@116 77 {
Chris@119 78 ChangesetScene *scene = new ChangesetScene();
Chris@116 79 ChangesetItem *tipItem = 0;
Chris@116 80
Chris@120 81 if (!m_changesets.empty()) {
Chris@116 82 Grapher g(scene);
Chris@116 83 try {
Chris@120 84 g.layout(m_changesets);
Chris@116 85 } catch (std::string s) {
Chris@116 86 std::cerr << "Internal error: Layout failed: " << s << std::endl;
Chris@116 87 }
Chris@120 88 tipItem = g.getItemFor(m_changesets[0]);
Chris@120 89 DEBUG << "tipItem is " << tipItem << " for tip changeset "
Chris@120 90 << m_changesets[0]->id() << endl;
Chris@116 91 }
Chris@116 92
Chris@116 93 QGraphicsScene *oldScene = m_panned->scene();
Chris@116 94 m_panned->setScene(scene);
Chris@116 95 m_panner->setScene(scene);
Chris@116 96
Chris@116 97 if (oldScene) delete oldScene;
Chris@116 98 if (tipItem) tipItem->ensureVisible();
Chris@116 99 }
Chris@116 100
Chris@116 101 Changesets HistoryWidget::parseChangeSets(QString changeSetsStr)
Chris@116 102 {
Chris@116 103 Changesets csets = Changeset::parseChangesets(changeSetsStr);
Chris@116 104 for (int i = 0; i+1 < csets.size(); ++i) {
Chris@116 105 Changeset *cs = csets[i];
Chris@116 106 if (cs->parents().empty()) {
Chris@116 107 QStringList list;
Chris@116 108 list.push_back(csets[i+1]->id());
Chris@116 109 cs->setParents(list);
Chris@116 110 }
Chris@116 111 }
Chris@116 112 return csets;
Chris@116 113 }