Mercurial > hg > easyhg
diff src/connectionitem.cpp @ 370:b9c153e00e84
Move source files to src/
author | Chris Cannam |
---|---|
date | Thu, 24 Mar 2011 10:27:51 +0000 |
parents | connectionitem.cpp@be483734bde5 |
children | ce6a70970808 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/connectionitem.cpp Thu Mar 24 10:27:51 2011 +0000 @@ -0,0 +1,132 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + EasyMercurial + + Based on HgExplorer by Jari Korhonen + Copyright (c) 2010 Jari Korhonen + Copyright (c) 2011 Chris Cannam + Copyright (c) 2011 Queen Mary, University of London + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#include "connectionitem.h" +#include "uncommitteditem.h" + +#include "changesetitem.h" +#include "changeset.h" +#include "colourset.h" + +#include <QPainter> + +QRectF +ConnectionItem::boundingRect() const +{ + if (!m_parent || !(m_child || m_uncommitted)) return QRectF(); + float xscale = 100; + float yscale = 90; + float size = 50; + + int p_col = m_parent->column(), p_row = m_parent->row(); + int c_col, c_row; + if (m_child) { + c_col = m_child->column(); c_row = m_child->row(); + } else { + c_col = m_uncommitted->column(); c_row = m_uncommitted->row(); + } + + return QRectF(xscale * c_col + size/2 - 2, + yscale * c_row + size - 2, + xscale * p_col - xscale * c_col + 4, + yscale * p_row - yscale * c_row - size + 4) + .normalized(); +} + +void +ConnectionItem::paint(QPainter *paint, const QStyleOptionGraphicsItem *, QWidget *) +{ + if (!m_parent || !(m_child || m_uncommitted)) return; + QPainterPath p; + + paint->save(); + + ColourSet *colourSet = ColourSet::instance(); + QString branch; + if (m_child) branch = m_child->getChangeset()->branch(); + else branch = m_uncommitted->branch(); + QColor branchColour = colourSet->getColourFor(branch); + + Qt::PenStyle ls = Qt::SolidLine; + if (!m_child) ls = Qt::DashLine; + + QTransform t = paint->worldTransform(); + float scale = std::min(t.m11(), t.m22()); + if (scale < 0.2) { + paint->setPen(QPen(branchColour, 0, ls)); + } else { + paint->setPen(QPen(branchColour, 2, ls)); + } + + float xscale = 100; + + float yscale = 90; + float size = 50; + float ygap = yscale - size - 2; + + int p_col = m_parent->column(), p_row = m_parent->row(); + int c_col, c_row; + if (m_child) { + c_col = m_child->column(); c_row = m_child->row(); + } else { + c_col = m_uncommitted->column(); c_row = m_uncommitted->row(); + } + + float c_x = xscale * c_col + size/2; + float p_x = xscale * p_col + size/2; + + // ensure line reaches the box, even if it's in a small height -- + // doesn't matter if we overshoot as the box is opaque and has a + // greater Z value + p.moveTo(c_x, yscale * c_row + size - 20); + + p.lineTo(c_x, yscale * c_row + size); + + if (p_col == c_col) { + + p.lineTo(p_x, yscale * p_row); + + } else if (m_type == Split || m_type == Normal) { + + // place the bulk of the line on the child (i.e. branch) row + + if (abs(p_row - c_row) > 1) { + p.lineTo(c_x, yscale * p_row - ygap); + } + + p.cubicTo(c_x, yscale * p_row, + p_x, yscale * p_row - ygap, + p_x, yscale * p_row); + + } else if (m_type == Merge) { + + // place bulk of the line on the parent row + + p.cubicTo(c_x, yscale * c_row + size + ygap, + p_x, yscale * c_row + size, + p_x, yscale * c_row + size + ygap); + + if (abs(p_row - c_row) > 1) { + p.lineTo(p_x, yscale * p_row); + } + } + + paint->drawPath(p); + paint->restore(); +} + +