From 004b9243248a29eaa73b5fae5a5ef7b5ca914f94 Mon Sep 17 00:00:00 2001 From: Arno Date: Sun, 25 Jul 2010 13:00:30 +0200 Subject: 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. --- statisticsdialog.cpp | 239 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 169 insertions(+), 70 deletions(-) (limited to 'statisticsdialog.cpp') diff --git a/statisticsdialog.cpp b/statisticsdialog.cpp index ba93726..30141c2 100644 --- a/statisticsdialog.cpp +++ b/statisticsdialog.cpp @@ -6,89 +6,188 @@ */ #include -#include #include #include #include #include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include +#include +#include +#include #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 > 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(".*")); + 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 > qualityData; - QSqlQuery q("SELECT DISTINCT(iquality), COUNT(iquality) FROM movies GROUP BY iquality ORDER BY iquality"); - while(q.next()){ - QList d; - d << q.value(0) << q.value(1) << q.value(1); - qualityData << d; +QString StatisticsDialog::table(const QList > &data, int max) const { + QString table; + QLocale loc; + foreach(QList l, data){ + table.append(""); + int percent = l.at(1).toInt() * 100 / max - 1; + percent = percent < 1 ? 1 : percent; + table.append(QString("%1").arg(l.at(0).toString())); + table.append(QString("
").arg(percent)); + table.append(QString("%1").arg(loc.toString(l.at(1).toInt()))); + table.append(""); } - GraphBarWidget *qs = new GraphBarWidget(qualityData); - qs->setCaption(tr("Movie qualities")); - mTab->addTab(qs, tr("Quality Distribution")); - mainLayout->addWidget(mTab); - - // genre distribution - QList > 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 d; - d << q2.value(1) << q2.value(2) << q2.value(2); - genreData << d; + return table; +} + +QList > StatisticsDialog::queryData(const QString &query) const { + QSqlDatabase db = QSqlDatabase::database("treedb"); + QSqlQuery q(query, db); + QList > retval; + while(q.next()){ + QList 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 > 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 d; - d << q3.value(1) << q3.value(2) << q3.value(2); - actorData << d; + return retval; +} + +int StatisticsDialog::max(const QList > &data) const{ + int retval = 0; + foreach(QList 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("Number of series%1").arg(numSeries)); + retval.append(QString("Number of movies%1").arg(numMovies)); + retval.append(QString("Number of files%1").arg(numFiles)); + retval.append(QString("Number of movie files%1").arg(numMovieFiles)); + retval.append(QString("Number of cover files%1").arg(numCoverFiles)); + retval.append(QString("Total archive size%1 GB").arg(loc.toString(totalArchiveSize))); + retval.append(QString("Local files size%1 GB").arg(loc.toString(localFileSize))); + retval.append(QString("Archived files size%1 GB").arg(loc.toString(archivedFileSize))); + retval.append(QString("Number of actors%1").arg(actorCount)); + retval.append(QString("Number of genres%1").arg(genreCount)); + return retval; } -- cgit v1.2.3-70-g09d2