diff options
-rw-r--r-- | ShemovCleaner.pro | 6 | ||||
-rw-r--r-- | filedisplay.cpp | 155 | ||||
-rw-r--r-- | filedisplay.h | 40 | ||||
-rw-r--r-- | filewidget.cpp | 22 | ||||
-rw-r--r-- | filewidget.h | 5 |
5 files changed, 220 insertions, 8 deletions
diff --git a/ShemovCleaner.pro b/ShemovCleaner.pro index b176492..7990762 100644 --- a/ShemovCleaner.pro +++ b/ShemovCleaner.pro @@ -22,7 +22,8 @@ SOURCES += main.cpp\ shemovcleaner.cpp \ configurationwidget.cpp \ filewidget.cpp \ - helper.cpp + helper.cpp \ + filedisplay.cpp HEADERS += \ filesorter.h \ @@ -32,7 +33,8 @@ HEADERS += \ shemovcleaner.h \ configurationwidget.h \ filewidget.h \ - helper.h + helper.h \ + filedisplay.h DISTFILES += diff --git a/filedisplay.cpp b/filedisplay.cpp new file mode 100644 index 0000000..bce77d9 --- /dev/null +++ b/filedisplay.cpp @@ -0,0 +1,155 @@ +#include <QTabWidget> +#include <QVBoxLayout> +#include <QHBoxLayout> +#include <QGridLayout> +#include <QLineEdit> +#include <QLabel> +#include <QTextEdit> +#include <QPushButton> +#include <QSqlDatabase> +#include <QSqlQuery> +#include <QPushButton> +#include <QGroupBox> +#include <QDir> + +#include "filedisplay.h" + +FileDisplay::FileDisplay(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) { + mTab = new QTabWidget; + mDBData = new DBData; + mTab->addTab(mDBData, tr("Database")); + + //button layout + QHBoxLayout *buttonL = new QHBoxLayout; + QPushButton *closeBtn = new QPushButton(tr("Close")); + connect(closeBtn, SIGNAL(clicked()), this, SLOT(hide())); + buttonL->addStretch(); + buttonL->addWidget(closeBtn); + buttonL->addStretch(); + + //dialog layout + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(mTab); + mainLayout->addLayout(buttonL); + setLayout(mainLayout); + setWindowTitle(tr("File Info")); +} + +void FileDisplay::setFileData(const QString &fullPath, const QString &md5Sum) { + mFullPath = fullPath; + mMd5 = md5Sum; + mDBData->setFileData(fullPath, md5Sum); +} + +DBData::DBData(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f) { + QLabel *seriesNameL = new QLabel(tr("Series")); + mSeriesName = new QLineEdit; + mSeriesName->setReadOnly(true); + QLabel *fullPathL = new QLabel(tr("File")); + mFullPath = new QLineEdit; + mFullPath->setReadOnly(true); + QLabel *md5L = new QLabel(tr("MD5")); + mMd5 = new QLineEdit; + mMd5->setReadOnly(true); + + QGridLayout *topL = new QGridLayout; + topL->addWidget(seriesNameL, 0, 0); + topL->addWidget(mSeriesName, 0, 1); + topL->addWidget(fullPathL, 1, 0); + topL->addWidget(mFullPath, 1, 1); + topL->addWidget(md5L, 2, 0); + topL->addWidget(mMd5, 2, 1); + QGroupBox *topGB = new QGroupBox(tr("General")); + topGB->setLayout(topL); + + mActors = new QTextEdit; + mActors->setReadOnly(true); + QGroupBox *actorsGB = new QGroupBox(tr("Actors")); + QHBoxLayout *actorsGBL = new QHBoxLayout; + actorsGBL->addWidget(mActors); + actorsGB->setLayout(actorsGBL); + + mGenres = new QTextEdit; + mGenres->setReadOnly(true); + QGroupBox *genresGB = new QGroupBox(tr("Genres")); + QHBoxLayout *genresGBL = new QHBoxLayout; + genresGBL->addWidget(mGenres); + genresGB->setLayout(genresGBL); + + QHBoxLayout *textL = new QHBoxLayout; + textL->addWidget(genresGB); + textL->addWidget(actorsGB); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(topGB); + mainLayout->addLayout(textL); + setLayout(mainLayout); +} + +void DBData::setFileData(const QString &fullPath, const QString &md5Sum){ + mFullPath->setText(QDir::toNativeSeparators(fullPath)); + mFullPath->home(false); + mMd5->setText(md5Sum); + gatherData(); +} + +void DBData::gatherData(){ + const QString &md5 = mMd5->text(); + const QString &fp = mFullPath->text(); + QSqlDatabase db = QSqlDatabase::database("shemovdb"); + if(!db.isOpen()){ + db.open(); + } + + //series name + QVariantList seriesRes; + QSqlQuery seriesQ1(db); + seriesQ1.prepare("SELECT series.tseries_name, seriesparts.tsubtitle, seriesparts.iseriespart, seriesparts.iseriesparts_id FROM files, seriesparts, series WHERE files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id AND files.cmd5sum = :md5"); + seriesQ1.bindValue(":md5", md5); + seriesQ1.exec(); + while(seriesQ1.next()){ + seriesRes << seriesQ1.value(0) << seriesQ1.value(1) << seriesQ1.value(2) << seriesQ1.value(3); + } + if(seriesRes.isEmpty()){ + QSqlQuery seriesQ2(db); + seriesQ2.prepare("SELECT series.tseries_name, seriesparts.tsubtitle, seriesparts.iseriespart, seriesparts.iseriesparts_id FROM files_origin, files, seriesparts, series WHERE files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id AND files_origin.cmd5sum = :md5 AND files_origin.ifiles_id = files.ifiles_id"); + seriesQ2.bindValue(":md5", md5); + seriesQ2.exec(); + while(seriesQ2.next()){ + seriesRes << seriesQ2.value(0) << seriesQ2.value(1) << seriesQ2.value(2) << seriesQ2.value(3); + } + } + QString seriesName(seriesRes.at(0).toString()); + if(seriesRes.at(1).isValid()){ + seriesName.append(QString(" - %1").arg(seriesRes.at(1).toString())); + } + if(seriesRes.at(2).toInt()){ + seriesName.append(QString(" - %1").arg(seriesRes.at(2).toString())); + } + mSeriesName->setText(seriesName); + + //actors + int seriesPartId = seriesRes.at(3).toInt(); + QSqlQuery actorsQ(db); + actorsQ.prepare("SELECT actors.tactorname FROM actors, seriesparts, seriesparts_actormap WHERE actors.iactors_id = seriesparts_actormap.iactors_id AND seriesparts_actormap.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts.iseriesparts_id = :id ORDER BY actors.tactorname"); + QStringList actors; + actorsQ.bindValue(":id", seriesPartId); + actorsQ.exec(); + while(actorsQ.next()){ + actors << actorsQ.value(0).toString(); + } + QString actorsText = actors.join("\n"); + mActors->setText(actorsText); + + //genres + QSqlQuery genresQ(db); + genresQ.prepare("SELECT genres.tgenrename FROM genres, seriesparts, seriesparts_genremap WHERE genres.igenres_id = seriesparts_genremap.igenres_id AND seriesparts_genremap.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts.iseriesparts_id = :id ORDER BY genres.tgenrename"); + QStringList genres; + genresQ.bindValue(":id", seriesPartId); + genresQ.exec(); + while(genresQ.next()){ + genres << genresQ.value(0).toString(); + } + QString genresText = genres.join("\n"); + mGenres->setText(genresText); +} diff --git a/filedisplay.h b/filedisplay.h new file mode 100644 index 0000000..93b6a4a --- /dev/null +++ b/filedisplay.h @@ -0,0 +1,40 @@ +#ifndef FILEDISPLAY_H +#define FILEDISPLAY_H + +#include <QWidget> +#include <QDialog> + +class QLineEdit; +class QTextEdit; +class QTabWidget; +class DBData; + +class FileDisplay : public QDialog { + Q_OBJECT + public: + explicit FileDisplay(QWidget *parent = 0, Qt::WindowFlags f = 0); + void setFileData(const QString &fullPath, const QString &md5Sum); + + private: + QTabWidget *mTab; + DBData *mDBData; + QString mFullPath; + QString mMd5; +}; + +class DBData : public QWidget { + Q_OBJECT + public: + explicit DBData(QWidget *parent = 0, Qt::WindowFlags f = 0); + void setFileData(const QString &fullPath, const QString &md5Sum); + + private: + void gatherData(); + QLineEdit *mSeriesName; + QLineEdit *mFullPath; + QLineEdit *mMd5; + QTextEdit *mActors; + QTextEdit *mGenres; +}; + +#endif // FILEDISPLAY_H diff --git a/filewidget.cpp b/filewidget.cpp index 0e3c9f1..aab6fe1 100644 --- a/filewidget.cpp +++ b/filewidget.cpp @@ -22,6 +22,7 @@ #include "filewidget.h" #include "filesorter.h" +#include "filedisplay.h" #include "helper.h" FileWidget::FileWidget(QWidget *parent) : QWidget(parent) { @@ -83,6 +84,8 @@ void FileWidget::setupGui(){ mQFiles = QSqlQuery(mDb); mQFiles.prepare("SELECT COUNT(*) FROM files WHERE cmd5sum = :md5"); + mFileDisplay = new FileDisplay(this); + QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(topL); mainLayout->addWidget(mFileView); @@ -120,8 +123,9 @@ void FileWidget::gatherData(){ fData << item; } fData[NameColumn]->setText(fi.fileName()); + QString md5(tr("n/a")); if(mime.name().startsWith("video")){ - QString md5 = Helper::md5Sum(fi.absoluteFilePath()); + md5 = Helper::md5Sum(fi.absoluteFilePath()); fData[Md5Column]->setText(md5); int haveFile = md5Count(md5); if(haveFile){ @@ -141,18 +145,19 @@ void FileWidget::gatherData(){ fData[IconColumn]->setIcon(QIcon(":/folder.png")); attr = Directory; } - fData[Md5Column]->setText(tr("n/a")); }else{ fData[IconColumn]->setIcon(QIcon(":/gaping_ass.png")); - fData[Md5Column]->setText(tr("n/a")); attr = NoVideo; } + fData[Md5Column]->setText(md5); fData[MimeColumn]->setText(mime.name()); if(mime.name() == "inode/directory"){ fData[MimeColumn]->setText("directory"); } for(int i = 0; i < ColumnCount; ++i){ - fData[i]->setData(attr); + fData[i]->setData(attr, AttrsRole); + fData[i]->setData(fi.absoluteFilePath(), FullPathRole); + fData[i]->setData(md5, MD5SumRole); } root->appendRow(fData); } @@ -224,13 +229,20 @@ void FileWidget::searchFile(){ void FileWidget::itemDoubleClicked(const QModelIndex &idx){ if(idx.column() == NameColumn){ - int attr = idx.data(Qt::UserRole + 1).toInt(); + int attr = idx.data(AttrsRole).toInt(); if(attr == ParentDir || attr == Directory){ QDir d(mDir->text()); d.cd(idx.data().toString()); QString newDir = d.absolutePath(); mDir->setText(QDir::toNativeSeparators(newDir)); gatherData(); + return; + } + if(attr == Present){ + QString fp = idx.data(FullPathRole).toString(); + QString md5 = idx.data(MD5SumRole).toString(); + mFileDisplay->setFileData(fp, md5); + mFileDisplay->show(); } } } diff --git a/filewidget.h b/filewidget.h index 05bae9d..385eeff 100644 --- a/filewidget.h +++ b/filewidget.h @@ -10,13 +10,15 @@ class QPushButton; class QStandardItemModel; class QTreeView; class VideoSorter; +class FileDisplay; class FileWidget : public QWidget { Q_OBJECT public: enum FileAttrs { NotPresent = 0, Present = 1, NoVideo = 2, ParentDir = 3, Directory = 4 }; + enum CustomRoles { AttrsRole = Qt::UserRole + 1, FullPathRole = Qt::UserRole + 2, MD5SumRole = Qt::UserRole + 3 }; enum { ColumnCount = 4 }; - enum Colums { IconColumn = 0, NameColumn = 1, MimeColumn = 2, Md5Column = 3 }; + enum Columns { IconColumn = 0, NameColumn = 1, MimeColumn = 2, Md5Column = 3 }; explicit FileWidget(QWidget *parent = 0); ~FileWidget(); @@ -43,6 +45,7 @@ class FileWidget : public QWidget { QSqlDatabase mDb; QSqlQuery mQOrigin; QSqlQuery mQFiles; + FileDisplay *mFileDisplay; }; #endif // FILEWIDGET_H |