summaryrefslogtreecommitdiffstats
path: root/statisticsdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'statisticsdialog.cpp')
-rw-r--r--statisticsdialog.cpp239
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;
}