# HG changeset patch # User Chris Cannam # Date 1319108687 -3600 # Node ID 2981d2defa61b0a3b5a5fda34cf87210b06870c4 # Parent fc35aa6d433e753ecb4870ca76a679f65db6509b Introduce a graphical representation for merge from a closed to an open branch (half a connection item) diff -r fc35aa6d433e -r 2981d2defa61 src/connectionitem.cpp --- a/src/connectionitem.cpp Thu Oct 20 11:36:49 2011 +0100 +++ b/src/connectionitem.cpp Thu Oct 20 12:04:47 2011 +0100 @@ -21,18 +21,19 @@ #include "changesetitem.h" #include "changeset.h" #include "colourset.h" +#include "textabbrev.h" #include +#include QRectF ConnectionItem::boundingRect() const { - if (!m_parent || !(m_child || m_uncommitted)) return QRectF(); + if (!(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(); @@ -40,6 +41,13 @@ c_col = m_uncommitted->column(); c_row = m_uncommitted->row(); } + int p_col, p_row; + if (m_parent) { + p_col = m_parent->column(); p_row = m_parent->row(); + } else { + p_col = c_col - 1; p_row = c_row + 1; + } + return QRectF(xscale * c_col + size/2 - 2, yscale * c_row + size - 22, xscale * p_col - xscale * c_col + 6, @@ -50,7 +58,7 @@ void ConnectionItem::paint(QPainter *paint, const QStyleOptionGraphicsItem *, QWidget *) { - if (!m_parent || !(m_child || m_uncommitted)) return; + if (!(m_child || m_uncommitted)) return; QPainterPath p; paint->save(); @@ -83,7 +91,6 @@ 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(); @@ -91,6 +98,13 @@ c_col = m_uncommitted->column(); c_row = m_uncommitted->row(); } + int p_col, p_row; + if (m_parent) { + p_col = m_parent->column(); p_row = m_parent->row(); + } else { + p_col = c_col - 1; p_row = c_row + 1; + } + float c_x = xscale * c_col + size/2; float p_x = xscale * p_col + size/2; @@ -130,11 +144,42 @@ } } - // ensure line reaches the node -- again doesn't matter if we - // overshoot - p.lineTo(p_x, yscale * p_row + 20); + if (m_parent) { + // ensure line reaches the node -- again doesn't matter if we + // overshoot + p.lineTo(p_x, yscale * p_row + 20); + + } else { + + // no parent: merge from closed branch: draw only half the line + paint->setClipRect(QRectF((c_x + p_x)/2, yscale * c_row + size - 22, + xscale, yscale)); + } + paint->drawPath(p); + + if (!m_parent) { + + // merge from closed branch: draw branch name + + paint->setClipping(false); + + QFont f; + f.setPixelSize(11); + f.setBold(true); + f.setItalic(false); + paint->setFont(f); + + QString branch = m_mergedBranch; + if (branch == "") branch = "default"; + int wid = xscale; + branch = TextAbbrev::abbreviate(branch, QFontMetrics(f), wid); + paint->drawText((c_x + p_x)/2 - wid - 2, + yscale * c_row + size + ygap/2 + 2, + branch); + } + paint->restore(); } diff -r fc35aa6d433e -r 2981d2defa61 src/connectionitem.h --- a/src/connectionitem.h Thu Oct 20 11:36:49 2011 +0100 +++ b/src/connectionitem.h Thu Oct 20 12:04:47 2011 +0100 @@ -50,12 +50,14 @@ void setParent(ChangesetItem *p) { m_parent = p; } void setChild(ChangesetItem *c) { m_child = c; } void setChild(UncommittedItem *u) { m_uncommitted = u; } + void setMergedBranch(QString mb) { m_mergedBranch = mb; } private: Type m_type; ChangesetItem *m_parent; ChangesetItem *m_child; UncommittedItem *m_uncommitted; + QString m_mergedBranch; }; #endif // CONNECTIONITEM_H diff -r fc35aa6d433e -r 2981d2defa61 src/grapher.cpp --- a/src/grapher.cpp Thu Oct 20 11:36:49 2011 +0100 +++ b/src/grapher.cpp Thu Oct 20 12:04:47 2011 +0100 @@ -515,12 +515,16 @@ ChangesetItem *item = m_items[id]; bool merge = (cs->parents().size() > 1); foreach (QString parentId, cs->parents()) { - if (!m_items.contains(parentId)) continue; + if (!m_changesets.contains(parentId)) continue; ConnectionItem *conn = new ConnectionItem(); if (merge) conn->setConnectionType(ConnectionItem::Merge); conn->setChild(item); - conn->setParent(m_items[parentId]); conn->setZValue(-1); + if (m_items.contains(parentId)) { + conn->setParent(m_items[parentId]); + } else { + conn->setMergedBranch(m_changesets[parentId]->branch()); + } m_scene->addItem(conn); } }