annotate historywidget.cpp @ 119:005a54380502

* Make scene remember which item has its details showing, and remove the previous one when a new one is clicked
author Chris Cannam
date Sun, 28 Nov 2010 21:52:00 +0000
parents 807c79350bf1
children c92f5859c707
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@116 55 void HistoryWidget::parseLog(QString log)
Chris@116 56 {
Chris@119 57 ChangesetScene *scene = new ChangesetScene();
Chris@116 58 Changesets csets = parseChangeSets(log);
Chris@116 59 ChangesetItem *tipItem = 0;
Chris@116 60
Chris@116 61 if (!csets.empty()) {
Chris@116 62 Grapher g(scene);
Chris@116 63 try {
Chris@116 64 g.layout(csets);
Chris@116 65 } catch (std::string s) {
Chris@116 66 std::cerr << "Internal error: Layout failed: " << s << std::endl;
Chris@116 67 }
Chris@116 68 tipItem = g.getItemFor(csets[0]);
Chris@116 69 }
Chris@116 70
Chris@116 71 QGraphicsScene *oldScene = m_panned->scene();
Chris@116 72 m_panned->setScene(scene);
Chris@116 73 m_panner->setScene(scene);
Chris@116 74
Chris@116 75 if (oldScene) delete oldScene;
Chris@116 76 clearChangesets();
Chris@116 77
Chris@116 78 m_changesets = csets;
Chris@116 79
Chris@116 80 if (tipItem) tipItem->ensureVisible();
Chris@116 81 }
Chris@116 82
Chris@116 83 Changesets HistoryWidget::parseChangeSets(QString changeSetsStr)
Chris@116 84 {
Chris@116 85 Changesets csets = Changeset::parseChangesets(changeSetsStr);
Chris@116 86 for (int i = 0; i+1 < csets.size(); ++i) {
Chris@116 87 Changeset *cs = csets[i];
Chris@116 88 if (cs->parents().empty()) {
Chris@116 89 QStringList list;
Chris@116 90 list.push_back(csets[i+1]->id());
Chris@116 91 cs->setParents(list);
Chris@116 92 }
Chris@116 93 }
Chris@116 94 return csets;
Chris@116 95 }