diff options
author | am <am@f440f766-f032-0410-8965-dc7d17de2ca0> | 2009-09-06 15:01:05 +0000 |
---|---|---|
committer | am <am@f440f766-f032-0410-8965-dc7d17de2ca0> | 2009-09-06 15:01:05 +0000 |
commit | 5e86b6d1cff1d9baacad8c34b062267a382b1990 (patch) | |
tree | aa16d3c60942d45205c0e9f2aaf03ba5a79a09eb /statisticsdialog.cpp | |
parent | 7c2a67b93e0e2b80bb89985c92a5aafc6b2b3d65 (diff) | |
download | SheMov-5e86b6d1cff1d9baacad8c34b062267a382b1990.tar.gz SheMov-5e86b6d1cff1d9baacad8c34b062267a382b1990.tar.bz2 SheMov-5e86b6d1cff1d9baacad8c34b062267a382b1990.zip |
-implemented statistics for quality distribution
-filter bar in archiveview can now be activated by pressing enter
git-svn-id: file:///var/svn/repos2/shemov/trunk@406 f440f766-f032-0410-8965-dc7d17de2ca0
Diffstat (limited to 'statisticsdialog.cpp')
-rw-r--r-- | statisticsdialog.cpp | 85 |
1 files changed, 79 insertions, 6 deletions
diff --git a/statisticsdialog.cpp b/statisticsdialog.cpp index 09b9d15..3bae0eb 100644 --- a/statisticsdialog.cpp +++ b/statisticsdialog.cpp @@ -7,6 +7,7 @@ #include <QTabWidget> #include <QPainter> +#include <QVBoxLayout> #include <QHBoxLayout> #include <QSqlQuery> #include <QVariant> @@ -15,20 +16,36 @@ #include <QPainter> #include <QPen> #include <QBrush> -#include <QGradient> +#include <QLinearGradient> +#include <QPushButton> +#include <QSqlError> #include "statisticsdialog.h" StatisticsDialog::StatisticsDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ - QHBoxLayout *mainLayout = new QHBoxLayout; + 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) { +QualityStats::QualityStats(QWidget *parent) : QWidget(parent), mMargin(10), mMaxValue(0) { QSqlQuery q("SELECT DISTINCT(iquality), COUNT(iquality) FROM movies GROUP BY iquality"); - q.exec(); 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(); @@ -36,9 +53,65 @@ QualityStats::QualityStats(QWidget *parent) : QWidget(parent), mMargin(10) { void QualityStats::paintEvent(QPaintEvent *){ QPainter p(this); - int width = size().width(); - QPen pen(Qt::red); + QMap<int, qreal> length; + QMap<int, int>::const_iterator it; + QMap<int, qreal>::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<qreal>(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 { |