diff src/changesetview.cpp @ 397:61bde1f0ff0a item_appearance_adjustments

Replace DateItems (background items for date shading) with a date range list in the scene and dedicated rendering for it in the graphics view: this way we can ensure the shading spans the full width and the dates are always visible
author Chris Cannam
date Wed, 25 May 2011 14:32:32 +0100
parents
children 533519ebc0cb
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/changesetview.cpp	Wed May 25 14:32:32 2011 +0100
@@ -0,0 +1,89 @@
+/* -*- 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 "changesetview.h"
+#include "changesetscene.h"
+#include "colourset.h"
+#include "debug.h"
+
+#include <QScrollBar>
+
+ChangesetView::ChangesetView() :
+    Panned()
+{
+    connect(horizontalScrollBar(), SIGNAL(valueChanged(int)),
+	    this, SLOT(horizontalScrollHappened()));
+}
+
+void
+ChangesetView::horizontalScrollHappened()
+{
+    DEBUG << "ChangesetView::horizontalScrollHappened" << endl;
+    invalidateScene(rect(), QGraphicsScene::BackgroundLayer);
+    viewport()->update();
+}
+
+void
+ChangesetView::drawBackground(QPainter *paint, const QRectF &rect)
+{
+    DEBUG << "ChangesetView::drawBackground" << endl;
+
+    ChangesetScene *cs = qobject_cast<ChangesetScene *>(scene());
+
+    if (!cs) {
+	QGraphicsView::drawBackground(paint, rect);
+	return;
+    }
+
+    DEBUG << "ChangesetView::drawBackground: have scene" << endl;
+
+    ChangesetScene::DateRanges ranges = cs->getDateRanges();
+
+    paint->setClipRect(rect);
+
+    DEBUG << "clip rect is " << rect << endl;
+
+    paint->save();
+    QFont f(paint->font());
+    f.setBold(true);
+    paint->setFont(f);
+
+    float x = mapToScene(0, 0).x();
+    float w = mapToScene(width(), 0).x() - x;
+    float px = mapToScene(5, 0).x();
+
+    QBrush oddBrush(QColor::fromRgb(250, 250, 250));
+    QBrush evenBrush(QColor::fromRgb(240, 240, 240));
+
+    //!!! todo: select only the ranges actually within range!
+    
+    for (ChangesetScene::DateRanges::const_iterator i = ranges.begin();
+         i != ranges.end(); ++i) {
+
+	ChangesetScene::DateRange range = i.value();
+
+        QRectF r = QRectF(x, range.minrow * 90 - 25,
+			  w, range.nrows * 90).normalized();
+
+	paint->fillRect(r, range.even ? evenBrush : oddBrush);
+        paint->drawText(px, range.minrow * 90 - 10, range.label);
+    }
+
+    paint->restore();
+}
+
+