/* 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 "statisticsdialog.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; mainLayout->addWidget(tab); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); setWindowTitle(tr("SheMov - Statistics")); } 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(""); } 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; } 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; } } return retval; } 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; }