Chris@119: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@119: Chris@119: /* Chris@119: EasyMercurial Chris@119: Chris@119: Based on HgExplorer by Jari Korhonen Chris@119: Copyright (c) 2010 Jari Korhonen Chris@244: Copyright (c) 2011 Chris Cannam Chris@244: Copyright (c) 2011 Queen Mary, University of London Chris@119: Chris@119: This program is free software; you can redistribute it and/or Chris@119: modify it under the terms of the GNU General Public License as Chris@119: published by the Free Software Foundation; either version 2 of the Chris@119: License, or (at your option) any later version. See the file Chris@119: COPYING included with this distribution for more information. Chris@119: */ Chris@119: Chris@119: #include "changesetscene.h" Chris@119: #include "changesetitem.h" Chris@141: #include "uncommitteditem.h" Chris@397: #include "debug.h" Chris@397: Chris@397: #include Chris@397: Chris@119: Chris@119: ChangesetScene::ChangesetScene() Chris@397: // Supply a non-NULL but trivial scene rect to inhibit automatic Chris@397: // updates from QGraphicsScene, because we will set the rect Chris@397: // explicitly in itemAddCompleted Chris@397: : QGraphicsScene(QRectF(0, 0, 1, 1)), m_detailShown(0) Chris@119: { Chris@119: } Chris@119: Chris@119: void Chris@141: ChangesetScene::addChangesetItem(ChangesetItem *item) Chris@141: { Chris@141: addItem(item); Chris@141: Chris@141: connect(item, SIGNAL(detailShown()), Chris@141: this, SLOT(changesetDetailShown())); Chris@141: Chris@168: connect(item, SIGNAL(detailHidden()), Chris@168: this, SLOT(changesetDetailHidden())); Chris@168: Chris@141: connect(item, SIGNAL(updateTo(QString)), Chris@141: this, SIGNAL(updateTo(QString))); Chris@141: Chris@141: connect(item, SIGNAL(diffToCurrent(QString)), Chris@141: this, SIGNAL(diffToCurrent(QString))); Chris@141: Chris@148: connect(item, SIGNAL(diffToParent(QString, QString)), Chris@148: this, SIGNAL(diffToParent(QString, QString))); Chris@141: Chris@289: connect(item, SIGNAL(showSummary(Changeset *)), Chris@289: this, SIGNAL(showSummary(Changeset *))); Chris@288: Chris@141: connect(item, SIGNAL(mergeFrom(QString)), Chris@141: this, SIGNAL(mergeFrom(QString))); Chris@141: Chris@278: connect(item, SIGNAL(newBranch(QString)), Chris@278: this, SIGNAL(newBranch(QString))); Chris@278: Chris@514: connect(item, SIGNAL(closeBranch(QString)), Chris@514: this, SIGNAL(closeBranch(QString))); Chris@514: Chris@141: connect(item, SIGNAL(tag(QString)), Chris@141: this, SIGNAL(tag(QString))); Chris@141: } Chris@141: Chris@141: void Chris@141: ChangesetScene::addUncommittedItem(UncommittedItem *item) Chris@141: { Chris@141: addItem(item); Chris@141: Chris@141: connect(item, SIGNAL(commit()), Chris@141: this, SIGNAL(commit())); Chris@141: Chris@141: connect(item, SIGNAL(revert()), Chris@141: this, SIGNAL(revert())); Chris@141: Chris@141: connect(item, SIGNAL(diff()), Chris@141: this, SIGNAL(diffWorkingFolder())); Chris@153: Chris@168: connect(item, SIGNAL(showSummary()), Chris@168: this, SIGNAL(showSummary())); Chris@168: Chris@153: connect(item, SIGNAL(showWork()), Chris@153: this, SIGNAL(showWork())); Chris@311: Chris@311: connect(item, SIGNAL(newBranch()), Chris@311: this, SIGNAL(newBranch())); Chris@311: Chris@311: connect(item, SIGNAL(noBranch()), Chris@311: this, SIGNAL(noBranch())); Chris@311: Chris@141: } Chris@141: Chris@141: void Chris@397: ChangesetScene::addDateRange(QString label, int minrow, int nrows, bool even) Chris@168: { Chris@397: DateRange dr; Chris@397: dr.label = label; Chris@397: dr.minrow = minrow; Chris@397: dr.nrows = nrows; Chris@397: dr.even = even; Chris@397: m_dateRanges[minrow] = dr; Chris@397: } Chris@168: Chris@397: void Chris@397: ChangesetScene::itemAddCompleted() Chris@397: { Chris@402: connect(this, SIGNAL(changed(const QList &)), Chris@402: this, SLOT(recalculateSceneRect())); Chris@402: recalculateSceneRect(); Chris@402: } Chris@402: Chris@402: void Chris@402: ChangesetScene::recalculateSceneRect() Chris@402: { Chris@402: QRectF existingSr = sceneRect(); Chris@402: Chris@397: QRectF r = itemsBoundingRect(); Chris@397: float minwidth = 300; //!!! Chris@402: DEBUG << "ChangesetScene::recalculateSceneRect: minwidth = " << minwidth Chris@397: << ", r = " << r << endl; Chris@397: if (r.width() < minwidth) { Chris@397: float edgediff = (minwidth - r.width()) / 2; Chris@397: r.setLeft(r.left() - edgediff); Chris@397: r.setRight(r.right() + edgediff); Chris@397: } Chris@402: DEBUG << "ChangesetScene::recalculateSceneRect: r now is " << r << endl; Chris@402: Chris@402: setSceneRect(r.united(existingSr)); Chris@168: } Chris@168: Chris@168: void Chris@119: ChangesetScene::changesetDetailShown() Chris@119: { Chris@119: ChangesetItem *csi = qobject_cast(sender()); Chris@119: if (!csi) return; Chris@119: Chris@124: if (m_detailShown && m_detailShown != csi) { Chris@119: m_detailShown->hideDetail(); Chris@119: } Chris@119: m_detailShown = csi; Chris@119: } Chris@119: Chris@168: void Chris@168: ChangesetScene::changesetDetailHidden() Chris@168: { Chris@168: m_detailShown = 0; Chris@401: itemAddCompleted(); Chris@168: } Chris@168: Chris@168: void Chris@397: ChangesetScene::drawBackground(QPainter *paint, const QRectF &rect) Chris@168: { Chris@397: QGraphicsScene::drawBackground(paint, rect); Chris@168: } Chris@397: Chris@168: Chris@281: ChangesetItem * Chris@281: ChangesetScene::getItemById(QString id) Chris@281: { Chris@281: foreach (QGraphicsItem *it, items()) { Chris@281: ChangesetItem *csit = dynamic_cast(it); Chris@281: if (csit && csit->getId() == id) return csit; Chris@281: } Chris@288: return 0; Chris@281: } Chris@281: Chris@281: