/* 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include "statisticsdialog.h" StatisticsDialog::StatisticsDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ QVBoxLayout *mainLayout = new QVBoxLayout; mTab = new QTabWidget; QualityStats * qs = new QualityStats; mTab->addTab(qs, tr("Quality Distribution")); mainLayout->addWidget(mTab); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->setAlignment(Qt::AlignHCenter); mOk = new QPushButton(tr("Ok")); connect(mOk, SIGNAL(clicked()), this, SLOT(accept())); buttonLayout->addWidget(mOk); mainLayout->addLayout(buttonLayout); QString title = QString(tr("%1 - Statistics")).arg(qApp->applicationName()); setLayout(mainLayout); setWindowTitle(title); } QualityStats::QualityStats(QWidget *parent) : QWidget(parent), mMargin(10), mMaxValue(0) { QSqlQuery q("SELECT DISTINCT(iquality), COUNT(iquality) FROM movies GROUP BY iquality"); while(q.next()){ mQualityDistrib[q.value(0).toInt()] = q.value(1).toInt(); if(q.value(1).toInt() > mMaxValue){ mMaxValue = q.value(1).toInt(); } } QFontMetrics fm(qApp->font()); mBarHeight = fm.height(); } void QualityStats::paintEvent(QPaintEvent *){ QPainter p(this); QMap length; QMap::const_iterator it; QMap::const_iterator itr; //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 = qApp->font(); f.setUnderline(true); f.setBold(true); p.setFont(f); QString caption(tr("Quality Distribution")); QFontMetrics fm(f); int captionStartx = (width() - fm.width(caption)) / 2; int captionStarty = fm.height(); p.drawText(captionStartx, captionStarty, caption); //prepare drawing data int barsStarty = fm.height() + 2 * mMargin; f.setUnderline(false); f.setBold(true); p.setFont(f); int maxKey = (--mQualityDistrib.end()).key(); int barsStartx = p.fontMetrics().width(QString::number(maxKey)) + 2 * mMargin; int marginRight = p.fontMetrics().width(QString(tr("(%1")).arg(QString::number(mMaxValue))) + 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 = mQualityDistrib.constBegin(); it != mQualityDistrib.constEnd(); ++it){ qreal value = it.value(); value = static_cast(value) / mMaxValue * maxWidth; length[it.key()] = value; } //draw the bars and numbers int ctr(0); for(itr = length.constBegin(); itr != length.constEnd(); ++itr, ++ctr){ int starty = barsStarty + ctr * p.fontMetrics().height() + ctr * mMargin; p.drawText(mMargin, starty, QString::number(itr.key())); 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); QRect bar(barsStartx, starty - p.fontMetrics().height() + p.fontMetrics().descent(), itr.value(), p.fontMetrics().height()); p.drawRect(bar); int nStartx = barsStartx + itr.value() + mMargin; p.drawText(nStartx, starty, QString(tr("(%1)")).arg(QString::number(mQualityDistrib[itr.key()]))); } } QSize QualityStats::sizeHint() const { int height = mQualityDistrib.count() * mBarHeight; height += mQualityDistrib.count() * mMargin; height += mBarHeight + mMargin; return QSize(400, height); }