Chris@117: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@117: Chris@117: /* Chris@117: EasyMercurial Chris@117: Chris@117: Based on HgExplorer by Jari Korhonen Chris@117: Copyright (c) 2010 Jari Korhonen Chris@117: Copyright (c) 2010 Chris Cannam Chris@117: Copyright (c) 2010 Queen Mary, University of London Chris@117: Chris@117: This program is free software; you can redistribute it and/or Chris@117: modify it under the terms of the GNU General Public License as Chris@117: published by the Free Software Foundation; either version 2 of the Chris@117: License, or (at your option) any later version. See the file Chris@117: COPYING included with this distribution for more information. Chris@117: */ Chris@117: Chris@117: #include "changesetdetailitem.h" Chris@117: #include "changeset.h" Chris@117: #include "textabbrev.h" Chris@117: #include "colourset.h" Chris@117: #include "debug.h" Chris@118: #include "common.h" Chris@117: Chris@118: #include Chris@117: #include Chris@117: Chris@117: ChangesetDetailItem::ChangesetDetailItem(Changeset *cs) : Chris@118: m_changeset(cs), m_doc(0) Chris@117: { Chris@117: m_font = QFont(); Chris@117: m_font.setPixelSize(11); Chris@117: m_font.setBold(false); Chris@117: m_font.setItalic(false); Chris@118: Chris@118: makeDocument(); Chris@118: } Chris@118: Chris@118: ChangesetDetailItem::~ChangesetDetailItem() Chris@118: { Chris@118: delete m_doc; Chris@117: } Chris@117: Chris@117: QRectF Chris@117: ChangesetDetailItem::boundingRect() const Chris@117: { Chris@118: int w = 350; Chris@118: m_doc->setTextWidth(w); Chris@118: return QRectF(0, -10, w, m_doc->size().height() + 10); Chris@117: } Chris@117: Chris@117: void Chris@117: ChangesetDetailItem::paint(QPainter *paint, Chris@117: const QStyleOptionGraphicsItem *option, Chris@117: QWidget *w) Chris@117: { Chris@117: paint->save(); Chris@117: Chris@117: ColourSet *colourSet = ColourSet::instance(); Chris@117: QColor branchColour = colourSet->getColourFor(m_changeset->branch()); Chris@117: QColor userColour = colourSet->getColourFor(m_changeset->author()); Chris@117: Chris@117: QFont f(m_font); Chris@117: Chris@117: QTransform t = paint->worldTransform(); Chris@117: float scale = std::min(t.m11(), t.m22()); Chris@117: if (scale > 1.0) { Chris@117: int ps = int((f.pixelSize() / scale) + 0.5); Chris@117: if (ps < 8) ps = 8; Chris@117: f.setPixelSize(ps); Chris@117: } Chris@117: Chris@117: if (scale < 0.1) { Chris@117: paint->setPen(QPen(branchColour, 0)); Chris@117: } else { Chris@117: paint->setPen(QPen(branchColour, 2)); Chris@117: } Chris@117: Chris@117: paint->setFont(f); Chris@117: QFontMetrics fm(f); Chris@117: int fh = fm.height(); Chris@117: Chris@117: int width = 350; Chris@118: m_doc->setTextWidth(width); Chris@118: int height = m_doc->size().height(); Chris@117: Chris@117: QRectF r(0.5, 0.5, width - 1, height - 1); Chris@117: paint->setBrush(Qt::white); Chris@117: paint->drawRect(r); Chris@117: Chris@117: if (scale < 0.1) { Chris@117: paint->restore(); Chris@117: return; Chris@117: } Chris@118: Chris@118: paint->setBrush(branchColour); Chris@118: QVector pts; Chris@118: pts.push_back(QPointF(width/2 - 5, 0)); Chris@118: pts.push_back(QPointF(width/2 + 5, 0)); Chris@118: pts.push_back(QPointF(width/2, -10)); Chris@118: pts.push_back(QPointF(width/2 - 5, 0)); Chris@118: paint->drawPolygon(QPolygonF(pts)); Chris@118: Chris@118: m_doc->drawContents(paint, r); Chris@118: Chris@117: /* Chris@117: paint->fillRect(QRectF(x0 + 0.5, 0.5, width - 4, fh - 0.5), Chris@117: QBrush(userColour)); Chris@117: Chris@117: paint->setPen(QPen(Qt::white)); Chris@117: Chris@117: int wid = width - 5; Chris@117: QString person = TextAbbrev::abbreviate(m_changeset->authorName(), fm, wid); Chris@117: paint->drawText(x0 + 3, fm.ascent(), person); Chris@117: Chris@117: paint->setPen(QPen(Qt::black)); Chris@117: Chris@117: if (m_showBranch) { Chris@117: // write branch name Chris@117: f.setBold(true); Chris@117: paint->setFont(f); Chris@117: QString branch = m_changeset->branch(); Chris@117: if (branch == "") branch = "default"; Chris@117: int wid = width - 3; Chris@117: branch = TextAbbrev::abbreviate(branch, QFontMetrics(f), wid); Chris@117: paint->drawText(x0, -fh + fm.ascent() - 4, branch); Chris@117: f.setBold(false); Chris@117: } Chris@117: Chris@117: // f.setItalic(true); Chris@117: fm = QFontMetrics(f); Chris@117: fh = fm.height(); Chris@117: paint->setFont(f); Chris@117: Chris@117: wid = width - 5; Chris@117: int nlines = (height / fh) - 1; Chris@117: if (nlines < 1) nlines = 1; Chris@117: comment = TextAbbrev::abbreviate(comment, fm, wid, TextAbbrev::ElideEnd, Chris@117: "...", nlines); Chris@117: Chris@117: QStringList lines = comment.split('\n'); Chris@117: for (int i = 0; i < lines.size(); ++i) { Chris@117: paint->drawText(x0 + 3, i * fh + fh + fm.ascent(), lines[i].trimmed()); Chris@117: } Chris@117: */ Chris@117: paint->restore(); Chris@117: } Chris@118: Chris@118: void Chris@118: ChangesetDetailItem::makeDocument() Chris@118: { Chris@118: delete m_doc; Chris@118: Chris@118: QString description; Chris@118: QString rowTemplate = "%1%2"; Chris@118: Chris@118: description = ""; Chris@118: Chris@118: QString comment = m_changeset->comment().trimmed(); Chris@118: comment = comment.replace(QRegExp("^\""), ""); Chris@118: comment = comment.replace(QRegExp("\"$"), ""); Chris@118: comment = comment.replace("\\\"", "\""); Chris@118: comment = xmlEncode(comment); Chris@118: comment = comment.replace("\\n", "
"); Chris@118: Chris@118: QStringList propNames, propTexts; Chris@118: Chris@118: propNames << "id" Chris@118: << "author" Chris@118: << "datetime" Chris@118: << "branch" Chris@118: << "tag" Chris@118: << "comment"; Chris@118: Chris@118: propTexts << QObject::tr("Identifier") Chris@118: << QObject::tr("Author") Chris@118: << QObject::tr("Date") Chris@118: << QObject::tr("Branch") Chris@118: << QObject::tr("Tag") Chris@118: << QObject::tr("Comment"); Chris@118: Chris@118: for (int i = 0; i < propNames.size(); ++i) { Chris@118: QString prop = propNames[i]; Chris@118: QString value; Chris@118: if (prop == "comment") value = comment; Chris@118: else { Chris@118: value = xmlEncode(m_changeset->property Chris@118: (prop.toLocal8Bit().data()).toString()); Chris@118: } Chris@118: if (value != "") { Chris@118: description += rowTemplate Chris@118: .arg(xmlEncode(propTexts[i])) Chris@118: .arg(value); Chris@118: } Chris@118: } Chris@118: Chris@118: description += "
"; Chris@118: Chris@118: DEBUG << "ChangesetDetailItem: description = " << description << endl; Chris@118: Chris@118: m_doc = new QTextDocument; Chris@118: m_doc->setHtml(description); Chris@118: } Chris@118: