summaryrefslogtreecommitdiffstats
path: root/graphbarwidget.cpp
diff options
context:
space:
mode:
authoram <am@f440f766-f032-0410-8965-dc7d17de2ca0>2009-11-28 16:00:04 +0000
committeram <am@f440f766-f032-0410-8965-dc7d17de2ca0>2009-11-28 16:00:04 +0000
commit2038b81df36cc44b63c44313a4fe39557c850760 (patch)
tree6a5144bfbc63d04c69a5168c206c05d1887c2179 /graphbarwidget.cpp
parentb61c945e41f1df211097ada08a264618e3da56e3 (diff)
downloadSheMov-2038b81df36cc44b63c44313a4fe39557c850760.tar.gz
SheMov-2038b81df36cc44b63c44313a4fe39557c850760.tar.bz2
SheMov-2038b81df36cc44b63c44313a4fe39557c850760.zip
-turned QualityStats into general purpose class GraphBarWidget
git-svn-id: file:///var/svn/repos2/shemov/trunk@429 f440f766-f032-0410-8965-dc7d17de2ca0
Diffstat (limited to 'graphbarwidget.cpp')
-rw-r--r--graphbarwidget.cpp125
1 files changed, 125 insertions, 0 deletions
diff --git a/graphbarwidget.cpp b/graphbarwidget.cpp
new file mode 100644
index 0000000..c6f9b0e
--- /dev/null
+++ b/graphbarwidget.cpp
@@ -0,0 +1,125 @@
+/*
+ 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.
+*/
+
+#include <QFontMetrics>
+#include <QPainter>
+
+#include "graphbarwidget.h"
+
+GraphBarWidget::GraphBarWidget(const QList<QList<QVariant> > data, QWidget *parent) : QWidget(parent), mMargin(10), mData(data) {
+ mBarHeight = fontMetrics().height();
+}
+
+int GraphBarWidget::maxValue() const {
+ int retval = -1;
+ foreach(QList<QVariant> l, mData){
+ if(l.at(1).toInt() > retval){
+ retval = l.at(1).toInt();
+ }
+ }
+ return retval;
+}
+
+QSize GraphBarWidget::maxDescr() const {
+ QFont f = font();
+ f.setBold(true);
+ QFontMetrics fm(f);
+ QSize retval(0,0);
+ foreach(QList<QVariant> l, mData){
+ QString descr = l.at(0).toString();
+ QSize curSize = fm.size(Qt::TextSingleLine, descr);
+ if(curSize.width() > retval.width()){
+ retval = curSize;
+ }
+ }
+ return retval;
+}
+
+QSize GraphBarWidget::maxCount() const {
+ QFontMetrics fm = fontMetrics();
+ QSize retval(0,0);
+ foreach(QList<QVariant> l, mData){
+ QString curCount = QString("(%1)").arg(l.at(2).toString());
+ QSize curSize = fm.size(Qt::TextSingleLine, curCount);
+ if(curSize.width() > retval.width()){
+ retval = curSize;
+ }
+ }
+ return retval;
+}
+
+QSize GraphBarWidget::sizeHint() const {
+ int height = mData.count() * mBarHeight;
+ height += mData.count() * mMargin;
+ height += mBarHeight + mMargin;
+ return QSize(400, height);
+}
+
+void GraphBarWidget::paintEvent(QPaintEvent *){
+ QPainter p(this);
+ QHash<QString, qreal> length; //int
+ QList<QList<QVariant> >::const_iterator it;
+
+ //draw background
+ QPen pen(Qt::red, 2);
+ p.setPen(pen);
+ QLinearGradient bgGradient(QPointF(0.0, height() / 2), QPointF(width(), height() / 2));
+ bgGradient.setColorAt(0, QColor(221, 107, 80));
+ bgGradient.setColorAt(1, QColor(251, 179, 150));
+ QBrush brush(bgGradient);
+ p.setBrush(brush);
+ p.drawRect(contentsRect());
+
+ //draw caption
+ QFont f = font();
+ f.setUnderline(true);
+ f.setBold(true);
+ p.setFont(f);
+ QString cap(caption());
+ QFontMetrics fm(f);
+ int captionStartx = (width() - fm.width(cap)) / 2;
+ int captionStarty = fm.height();
+ p.drawText(captionStartx, captionStarty, cap);
+
+ //prepare drawing data
+ int barsStarty = fm.height() + 2 * mMargin + 10;
+ f.setUnderline(false);
+ f.setBold(true);
+ p.setFont(f);
+ int maxdescr = maxDescr().width();
+ int maxcount = maxCount().width();
+
+ int barsStartx = maxdescr + 2 * mMargin;
+ int marginRight = maxcount + 2 * mMargin;
+ int maxWidth = width() - barsStartx - marginRight;
+ p.setRenderHints(QPainter::Antialiasing);
+ p.setPen(QPen(Qt::red, 1));
+
+ //calculate real lengths based on widget width
+ for(it = mData.constBegin(); it != mData.constEnd(); ++it){
+ qreal value = it->at(1).toDouble();
+ value = value / maxValue() * maxWidth;
+ length[it->at(0).toString()] = value;
+ }
+
+ //draw the bars and numbers
+ int ctr(0);
+ for(QList<QList<QVariant> >::const_iterator itr = mData.constBegin(); itr != mData.constEnd() ; ++itr, ++ctr){
+ int starty = barsStarty + ctr * p.fontMetrics().height() + ctr * mMargin;
+ p.drawText(mMargin, starty, itr->at(0).toString());
+ QLinearGradient barGradient(QPointF(barsStartx, starty), QPointF(width(), starty));
+ barGradient.setColorAt(0, QColor(0, 128, 170));
+ barGradient.setColorAt(1, QColor(131, 205, 214));
+ QBrush b(barGradient);
+ p.setBrush(b);
+ qreal len = length.value(itr->at(0).toString());
+ QRect bar(barsStartx, starty - p.fontMetrics().height() + p.fontMetrics().descent(), len, p.fontMetrics().height());
+ p.drawRect(bar);
+ int nStartx = barsStartx + len + mMargin;
+ p.drawText(nStartx, starty, QString(tr("(%1)")).arg(itr->at(2).toString()));
+ }
+}