diff options
Diffstat (limited to 'statisticsdialog.cpp')
-rw-r--r-- | statisticsdialog.cpp | 118 |
1 files changed, 34 insertions, 84 deletions
diff --git a/statisticsdialog.cpp b/statisticsdialog.cpp index 5a48f63..ba93726 100644 --- a/statisticsdialog.cpp +++ b/statisticsdialog.cpp @@ -24,16 +24,49 @@ #include "statisticsdialog.h" #include "actorcountmodel.h" +#include "graphbarwidget.h" StatisticsDialog::StatisticsDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ QVBoxLayout *mainLayout = new QVBoxLayout; mTab = new QTabWidget; // quality distribution - QualityStats * qs = new QualityStats; + QList<QList<QVariant> > qualityData; + QSqlQuery q("SELECT DISTINCT(iquality), COUNT(iquality) FROM movies GROUP BY iquality ORDER BY iquality"); + while(q.next()){ + QList<QVariant> d; + d << q.value(0) << q.value(1) << q.value(1); + qualityData << d; + } + GraphBarWidget *qs = new GraphBarWidget(qualityData); + qs->setCaption(tr("Movie qualities")); mTab->addTab(qs, tr("Quality Distribution")); mainLayout->addWidget(mTab); + // genre distribution + QList<QList<QVariant> > genreData; + QSqlQuery q2("SELECT DISTINCT(genre.igenreid), genre.tgenrename, COUNT(movies.imovid) FROM movies, genre WHERE movies.igenreid = genre.igenreid GROUP by genre.igenreid, genre.tgenrename ORDER by genre.tgenrename"); + while(q2.next()){ + QList<QVariant> d; + d << q2.value(1) << q2.value(2) << q2.value(2); + genreData << d; + } + GraphBarWidget *gs = new GraphBarWidget(genreData); + gs->setCaption(tr("Genre Distribution")); + mTab->addTab(gs, tr("Genre Distribution")); + + // top ten actors + QList<QList<QVariant> > actorData; + QSqlQuery q3("SELECT DISTINCT(actor.iactorid), actor.tactorname, COUNT(DISTINCT(movies.ttitle)) AS num FROM movies, actor, movieactormap WHERE actor.iactorid = movieactormap.iactorid AND movieactormap.imovid = movies.imovid GROUP BY actor.iactorid, actor.tactorname ORDER BY num DESC LIMIT 10"); + while(q3.next()){ + QList<QVariant> d; + d << q3.value(1) << q3.value(2) << q3.value(2); + actorData << d; + } + GraphBarWidget *as = new GraphBarWidget(actorData); + as->setCaption(tr("Top 10 actors")); + mTab->addTab(as, tr("Top 10 actors")); + // actor count QWidget *actorWidget = new QWidget; QHBoxLayout *actorLayout = new QHBoxLayout; @@ -59,86 +92,3 @@ StatisticsDialog::StatisticsDialog(QWidget *parent, Qt::WindowFlags f) : QDialog 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<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 { - int height = mQualityDistrib.count() * mBarHeight; - height += mQualityDistrib.count() * mMargin; - height += mBarHeight + mMargin; - return QSize(400, height); -} - |