annotate historywidget.cpp @ 122:c3e8342d2de9

* Further fix to incremental log (put new changesets on the correct end of the list!)
author Chris Cannam
date Mon, 29 Nov 2010 11:14:29 +0000
parents c92f5859c707
children 3afa1ce339ec
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@122 58 Changesets csets = Changeset::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@122 68 Changesets csets = Changeset::parseChangesets(log);
Chris@120 69 DEBUG << "HistoryWidget::parseIncrementalLog: log has " << csets.size() << " changesets" << endl;
Chris@120 70 if (!csets.empty()) {
Chris@122 71 csets << m_changesets;
Chris@122 72 m_changesets = csets;
Chris@120 73 layoutAll();
Chris@120 74 }
Chris@120 75 }
Chris@120 76
Chris@120 77 void HistoryWidget::layoutAll()
Chris@116 78 {
Chris@122 79 setChangesetParents();
Chris@122 80
Chris@119 81 ChangesetScene *scene = new ChangesetScene();
Chris@116 82 ChangesetItem *tipItem = 0;
Chris@116 83
Chris@120 84 if (!m_changesets.empty()) {
Chris@116 85 Grapher g(scene);
Chris@116 86 try {
Chris@120 87 g.layout(m_changesets);
Chris@116 88 } catch (std::string s) {
Chris@116 89 std::cerr << "Internal error: Layout failed: " << s << std::endl;
Chris@116 90 }
Chris@120 91 tipItem = g.getItemFor(m_changesets[0]);
Chris@120 92 DEBUG << "tipItem is " << tipItem << " for tip changeset "
Chris@120 93 << m_changesets[0]->id() << endl;
Chris@116 94 }
Chris@116 95
Chris@116 96 QGraphicsScene *oldScene = m_panned->scene();
Chris@116 97 m_panned->setScene(scene);
Chris@116 98 m_panner->setScene(scene);
Chris@116 99
Chris@116 100 if (oldScene) delete oldScene;
Chris@116 101 if (tipItem) tipItem->ensureVisible();
Chris@116 102 }
Chris@116 103
Chris@122 104 void HistoryWidget::setChangesetParents()
Chris@116 105 {
Chris@122 106 for (int i = 0; i+1 < m_changesets.size(); ++i) {
Chris@122 107 Changeset *cs = m_changesets[i];
Chris@116 108 if (cs->parents().empty()) {
Chris@116 109 QStringList list;
Chris@122 110 list.push_back(m_changesets[i+1]->id());
Chris@116 111 cs->setParents(list);
Chris@116 112 }
Chris@116 113 }
Chris@116 114 }