annotate historywidget.cpp @ 128:fcaf09ee825d

* Show tags and current working copy parents in history graph
author Chris Cannam
date Mon, 29 Nov 2010 20:09:58 +0000
parents 3afa1ce339ec
children 4986642800f0
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@128 54
Chris@128 55 void HistoryWidget::setCurrent(QStringList ids)
Chris@128 56 {
Chris@128 57 if (m_currentIds == ids) return;
Chris@128 58 DEBUG << "HistoryWidget::setCurrent: " << ids.size() << " ids" << endl;
Chris@128 59 m_currentIds = ids;
Chris@128 60 updateCurrentItems();
Chris@128 61 }
Chris@128 62
Chris@128 63 void HistoryWidget::showUncommittedChanges(bool show)
Chris@128 64 {
Chris@128 65 //!!! implement!
Chris@128 66 }
Chris@116 67
Chris@120 68 void HistoryWidget::parseNewLog(QString log)
Chris@120 69 {
Chris@120 70 DEBUG << "HistoryWidget::parseNewLog: log has " << log.length() << " chars" << endl;
Chris@122 71 Changesets csets = Changeset::parseChangesets(log);
Chris@120 72 DEBUG << "HistoryWidget::parseNewLog: log has " << csets.size() << " changesets" << endl;
Chris@120 73 clearChangesets();
Chris@120 74 m_changesets = csets;
Chris@120 75 layoutAll();
Chris@120 76 }
Chris@120 77
Chris@120 78 void HistoryWidget::parseIncrementalLog(QString log)
Chris@120 79 {
Chris@120 80 DEBUG << "HistoryWidget::parseIncrementalLog: log has " << log.length() << " chars" << endl;
Chris@122 81 Changesets csets = Changeset::parseChangesets(log);
Chris@120 82 DEBUG << "HistoryWidget::parseIncrementalLog: log has " << csets.size() << " changesets" << endl;
Chris@120 83 if (!csets.empty()) {
Chris@122 84 csets << m_changesets;
Chris@122 85 m_changesets = csets;
Chris@120 86 layoutAll();
Chris@120 87 }
Chris@120 88 }
Chris@120 89
Chris@120 90 void HistoryWidget::layoutAll()
Chris@116 91 {
Chris@122 92 setChangesetParents();
Chris@122 93
Chris@119 94 ChangesetScene *scene = new ChangesetScene();
Chris@116 95 ChangesetItem *tipItem = 0;
Chris@116 96
Chris@120 97 if (!m_changesets.empty()) {
Chris@116 98 Grapher g(scene);
Chris@116 99 try {
Chris@120 100 g.layout(m_changesets);
Chris@116 101 } catch (std::string s) {
Chris@116 102 std::cerr << "Internal error: Layout failed: " << s << std::endl;
Chris@116 103 }
Chris@120 104 tipItem = g.getItemFor(m_changesets[0]);
Chris@120 105 DEBUG << "tipItem is " << tipItem << " for tip changeset "
Chris@120 106 << m_changesets[0]->id() << endl;
Chris@116 107 }
Chris@116 108
Chris@116 109 QGraphicsScene *oldScene = m_panned->scene();
Chris@116 110 m_panned->setScene(scene);
Chris@116 111 m_panner->setScene(scene);
Chris@116 112
Chris@116 113 if (oldScene) delete oldScene;
Chris@116 114 if (tipItem) tipItem->ensureVisible();
Chris@128 115
Chris@128 116 updateCurrentItems();
Chris@116 117 }
Chris@116 118
Chris@122 119 void HistoryWidget::setChangesetParents()
Chris@116 120 {
Chris@122 121 for (int i = 0; i+1 < m_changesets.size(); ++i) {
Chris@122 122 Changeset *cs = m_changesets[i];
Chris@123 123 // Need to reset this, as Grapher::layout will recalculate it
Chris@123 124 // and we don't want to end up with twice the children for
Chris@123 125 // each parent...
Chris@123 126 cs->setChildren(QStringList());
Chris@116 127 if (cs->parents().empty()) {
Chris@116 128 QStringList list;
Chris@122 129 list.push_back(m_changesets[i+1]->id());
Chris@116 130 cs->setParents(list);
Chris@116 131 }
Chris@116 132 }
Chris@116 133 }
Chris@128 134
Chris@128 135 void HistoryWidget::updateCurrentItems()
Chris@128 136 {
Chris@128 137 QGraphicsScene *scene = m_panned->scene();
Chris@128 138 if (!scene) return;
Chris@128 139 QList<QGraphicsItem *> items = scene->items();
Chris@128 140 foreach (QGraphicsItem *it, items) {
Chris@128 141 ChangesetItem *csit = dynamic_cast<ChangesetItem *>(it);
Chris@128 142 if (csit) {
Chris@128 143 QString id = csit->getChangeset()->id();
Chris@128 144 bool current = m_currentIds.contains(id);
Chris@128 145 if (current) {
Chris@128 146 DEBUG << "id " << id << " is current" << endl;
Chris@128 147 }
Chris@128 148 csit->setCurrent(current);
Chris@128 149 }
Chris@128 150 }
Chris@128 151 }
Chris@128 152