diff options
author | Arno <am@disconnect.de> | 2010-07-25 13:00:30 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2010-07-25 13:00:30 +0200 |
commit | 004b9243248a29eaa73b5fae5a5ef7b5ca914f94 (patch) | |
tree | 0b1f9f413d798390fba316d5093bbd5dcd466398 /statisticsdialog.cpp | |
parent | bfcb2cd0e0168e1f740678a626a5d5077cf6e677 (diff) | |
download | SheMov-004b9243248a29eaa73b5fae5a5ef7b5ca914f94.tar.gz SheMov-004b9243248a29eaa73b5fae5a5ef7b5ca914f94.tar.bz2 SheMov-004b9243248a29eaa73b5fae5a5ef7b5ca914f94.zip |
Fixed StatisticsDialog
adapted StatisticsDialog to the new database schema and make it use
WebKit and HTML to display the graph bars.
This change obsoleted the classes ActorCountModel and GraphBarWidget.
Diffstat (limited to 'statisticsdialog.cpp')
-rw-r--r-- | statisticsdialog.cpp | 239 |
1 files changed, 169 insertions, 70 deletions
diff --git a/statisticsdialog.cpp b/statisticsdialog.cpp index ba93726..30141c2 100644 --- a/statisticsdialog.cpp +++ b/statisticsdialog.cpp @@ -6,89 +6,188 @@ */ #include <QTabWidget> -#include <QPainter> #include <QVBoxLayout> #include <QHBoxLayout> #include <QSqlQuery> #include <QVariant> -#include <QFontMetrics> -#include <QApplication> -#include <QPainter> -#include <QPen> -#include <QBrush> -#include <QLinearGradient> #include <QPushButton> -#include <QSqlError> -#include <QTreeView> -#include <QSortFilterProxyModel> +#include <QLocale> +#include <QFile> +#include <QWebView> #include "statisticsdialog.h" -#include "actorcountmodel.h" -#include "graphbarwidget.h" StatisticsDialog::StatisticsDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ + //html skeleton + QFile htmlFile(":/statistics.html"); + htmlFile.open(QIODevice::ReadOnly); + QString html = htmlFile.readAll(); + + //genre distribution + QWebView *genreView = new QWebView; + QString genreHtml = html; + genreHtml.replace("{title}", tr("Genre distribution")); + genreHtml.replace("{desc}", tr("Genres")); + QList<QList<QVariant> > data = queryData("SELECT genres.tgenrename, COUNT(seriesparts_genremap.iseriesparts_id) FROM genres, seriesparts_genremap WHERE genres.igenres_id = seriesparts_genremap.igenres_id GROUP BY genres.tgenrename ORDER BY count DESC;"); + QString tableData = table(data, max(data)); + genreHtml.replace("{table}", tableData); + genreView->setHtml(genreHtml); + + //quality distribution + QWebView *qualityView = new QWebView; + QString qualityHtml = html; + qualityHtml.replace("{title}", tr("Quality distribution")); + qualityHtml.replace("{desc}", tr("Quality")); + data = queryData("SELECT files.siquality, COUNT(seriesparts.iseriesparts_id) FROM files, seriesparts WHERE files.iseriespart_id = seriesparts.iseriesparts_id AND files.siquality IS NOT NULL GROUP BY files.siquality ORDER by siquality desc;"); + tableData = table(data, max(data)); + qualityHtml.replace("{table}", tableData); + qualityView->setHtml(qualityHtml); + + //top 20 actors + QWebView *topActorView = new QWebView; + QString topActorHtml = html; + topActorHtml.replace("{title}", tr("Top 20 actors")); + topActorHtml.replace("{desc}", tr("Actor")); + data = queryData("SELECT actors.tactorname, COUNT(seriesparts_actormap.iseriesparts_id) FROM actors, seriesparts_actormap WHERE actors.iactors_id = seriesparts_actormap.iactors_id GROUP BY actors.tactorname ORDER BY count desc LIMIT 20"); + tableData = table(data, max(data)); + topActorHtml.replace("{table}", tableData); + topActorView->setHtml(topActorHtml); + + //general statistics + QWebView *generalView = new QWebView; + QString generalHtml = html; + generalHtml.remove(QRegExp("<thead>.*</thead>")); + tableData = generalStatistics(); + generalHtml.replace("{title}", tr("General statistics")); + generalHtml.replace("{table}", tableData); + generalView->setHtml(generalHtml); + + //tab + QTabWidget *tab = new QTabWidget; + tab->addTab(genreView, tr("Genres")); + tab->addTab(qualityView, tr("Quality")); + tab->addTab(topActorView, tr("Top 20 actors")); + tab->addTab(generalView, tr("General statistics")); + + //close button + QPushButton *close = new QPushButton(tr("Close")); + connect(close, SIGNAL(clicked()), this, SLOT(accept())); + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->setAlignment(Qt::AlignCenter); + buttonLayout->addWidget(close); + + //the dialog QVBoxLayout *mainLayout = new QVBoxLayout; - mTab = new QTabWidget; + mainLayout->addWidget(tab); + mainLayout->addLayout(buttonLayout); + setLayout(mainLayout); + setWindowTitle(tr("SheMov - Statistics")); +} - // quality distribution - 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; +QString StatisticsDialog::table(const QList<QList<QVariant> > &data, int max) const { + QString table; + QLocale loc; + foreach(QList<QVariant> l, data){ + table.append("<tr>"); + int percent = l.at(1).toInt() * 100 / max - 1; + percent = percent < 1 ? 1 : percent; + table.append(QString("<td class=\"descr\">%1</td>").arg(l.at(0).toString())); + table.append(QString("<td class=\"bar\"><div style=\"width: %1%\" class=\"bar\"></div></td>").arg(percent)); + table.append(QString("<td class=\"total\">%1</td>").arg(loc.toString(l.at(1).toInt()))); + table.append("</tr>"); } - 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; + return table; +} + +QList<QList<QVariant> > StatisticsDialog::queryData(const QString &query) const { + QSqlDatabase db = QSqlDatabase::database("treedb"); + QSqlQuery q(query, db); + QList<QList<QVariant> > retval; + while(q.next()){ + QList<QVariant> data; + data << q.value(0) << q.value(1); + retval << data; } - 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; + return retval; +} + +int StatisticsDialog::max(const QList<QList<QVariant> > &data) const{ + int retval = 0; + foreach(QList<QVariant> l, data){ + int value = l.at(1).toInt(); + if(value > retval){ + retval = value; + } } - 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; - QTreeView *actorView = new QTreeView; - actorView->setRootIsDecorated(false); - ActorCountModel *aModel = new ActorCountModel; - QSortFilterProxyModel *proxy = new QSortFilterProxyModel(this); - proxy->setSourceModel(aModel); - actorView->setModel(proxy); - actorView->resizeColumnToContents(0); - actorLayout->addWidget(actorView); - actorWidget->setLayout(actorLayout); - actorView->setSortingEnabled(true); - mTab->addTab(actorWidget, tr("Actor overview")); + return retval; +} - 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); +QString StatisticsDialog::generalStatistics() const{ + //get database + QSqlDatabase db = QSqlDatabase::database("treedb"); + + //series count + QSqlQuery q1("SELECT COUNT(*) FROM series", db); + q1.first(); + int numSeries = q1.value(0).toInt(); + + //movies count + QSqlQuery q2("SELECT COUNT(*) FROM seriesparts", db); + q2.first(); + int numMovies = q2.value(0).toInt(); + + //files count + QSqlQuery q3("SELECT COUNT(*) FROM files", db); + q3.first(); + int numFiles = q3.value(0).toInt(); + + //movie files + QSqlQuery q4("SELECT COUNT(*) FROM files WHERE sifiletype = 1", db); + q4.first(); + int numMovieFiles = q4.value(0).toInt(); + + //cover files + QSqlQuery q5("SELECT COUNT(*) FROM files WHERE sifiletype != 1", db); + q5.first(); + int numCoverFiles = q5.value(0).toInt(); + + //total archive size + QSqlQuery q6("SELECT ROUND(SUM(bisize) / 1024 / 1024 / 1024, 2) FROM files", db); + q6.first(); + float totalArchiveSize = q6.value(0).toFloat(); + + //local file size + QSqlQuery q7("SELECT ROUND(SUM(bisize) / 1024 / 1024 / 1024, 2) FROM files WHERE idvd = -1", db); + q7.first(); + float localFileSize = q7.value(0).toFloat(); + + //archived file size + QSqlQuery q8("SELECT ROUND(SUM(bisize) / 1024 / 1024 / 1024, 2) FROM files WHERE idvd != -1", db); + q8.first(); + float archivedFileSize = q8.value(0).toFloat(); + + //actor count + QSqlQuery q9("SELECT COUNT(*) FROM actors", db); + q9.first(); + int actorCount = q9.value(0).toInt(); + + //genre count + QSqlQuery q10("SELECT COUNT(*) FROM genres", db); + q10.first(); + int genreCount = q10.value(0).toInt(); + + //build the tabel + QString retval; + QLocale loc; + retval.append(QString("<tr><td>Number of series</td><td style=\"padding-left: 30px\">%1</td></tr>").arg(numSeries)); + retval.append(QString("<tr><td>Number of movies</td><td style=\"padding-left: 30px\">%1</td></tr>").arg(numMovies)); + retval.append(QString("<tr><td>Number of files</td><td style=\"padding-left: 30px\">%1</td></tr>").arg(numFiles)); + retval.append(QString("<tr><td>Number of movie files</td><td style=\"padding-left: 30px\">%1</td></tr>").arg(numMovieFiles)); + retval.append(QString("<tr><td>Number of cover files</td><td style=\"padding-left: 30px\">%1</td></tr>").arg(numCoverFiles)); + retval.append(QString("<tr><td>Total archive size</td><td style=\"padding-left: 30px\">%1 GB</td></tr>").arg(loc.toString(totalArchiveSize))); + retval.append(QString("<tr><td>Local files size</td><td style=\"padding-left: 30px\">%1 GB</td></tr>").arg(loc.toString(localFileSize))); + retval.append(QString("<tr><td>Archived files size</td><td style=\"padding-left: 30px\">%1 GB</td></tr>").arg(loc.toString(archivedFileSize))); + retval.append(QString("<tr><td>Number of actors</td><td style=\"padding-left: 30px\">%1</td></tr>").arg(actorCount)); + retval.append(QString("<tr><td>Number of genres</td><td style=\"padding-left: 30px\">%1</td></tr>").arg(genreCount)); + return retval; } |