diff options
-rw-r--r-- | filewidget.cpp | 34 | ||||
-rw-r--r-- | filewidget.h | 15 | ||||
-rw-r--r-- | shemovcleaner.cpp | 22 | ||||
-rw-r--r-- | shemovcleaner.h | 4 | ||||
-rw-r--r-- | torrentwidget.h | 4 |
5 files changed, 72 insertions, 7 deletions
diff --git a/filewidget.cpp b/filewidget.cpp index aab6fe1..0a2bbbb 100644 --- a/filewidget.cpp +++ b/filewidget.cpp @@ -19,6 +19,9 @@ #include <QHeaderView> #include <QApplication> #include <QCursor> +#include <QJsonObject> +#include <QJsonDocument> +#include <QItemSelectionModel> #include "filewidget.h" #include "filesorter.h" @@ -90,6 +93,8 @@ void FileWidget::setupGui(){ mainLayout->addLayout(topL); mainLayout->addWidget(mFileView); setLayout(mainLayout); + + connect(mFileView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(fileSelectionChanged(QItemSelection,QItemSelection))); } void FileWidget::selectDir(){ @@ -103,7 +108,7 @@ void FileWidget::gatherData(){ QFileInfoList fl = d.entryInfoList(QStringList() << "*", QDir::Files | QDir::Dirs | QDir::NoDot, QDir::Name | QDir::DirsFirst); mModel->clear(); QStandardItem *root = mModel->invisibleRootItem(); - mModel->setHorizontalHeaderLabels(QStringList() << QChar(0x26A7) << tr("Name") << tr("MIME") << tr("MD5")); + mModel->setHorizontalHeaderLabels(QStringList() << QChar(0x26A7) << tr("Name") << tr("MIME") << tr("Duration") << tr("MD5")); QBrush redBrush(Qt::red); QBrush greenBrush(Qt::darkGreen); @@ -114,6 +119,7 @@ void FileWidget::gatherData(){ QMimeType mime = db.mimeTypeForFile(fi); QList<QStandardItem*> fData; FileAttrs attr = NotPresent; + Helper::Duration dur; for(int i = 0; i < ColumnCount; ++i){ QStandardItem *item = new QStandardItem; item->setEditable(false); @@ -124,6 +130,8 @@ void FileWidget::gatherData(){ } fData[NameColumn]->setText(fi.fileName()); QString md5(tr("n/a")); + QString duration(tr("n/a")); + qint64 seconds = 0; if(mime.name().startsWith("video")){ md5 = Helper::md5Sum(fi.absoluteFilePath()); fData[Md5Column]->setText(md5); @@ -137,6 +145,12 @@ void FileWidget::gatherData(){ fData[NameColumn]->setForeground(redBrush); attr = NotPresent; } + QJsonDocument jDoc = Helper::ffpmegData(fi.absoluteFilePath()); + QJsonObject jObj = jDoc.object(); + QJsonValue durationV = jObj["format"].toObject()["duration"]; + seconds = durationV.toVariant().toDouble(); + dur = Helper::Duration(seconds); + duration = dur.toString(); }else if(fi.isDir()){ if(fi.fileName() == ".."){ fData[IconColumn]->setIcon(QIcon(":/up_dick.png")); @@ -149,6 +163,8 @@ void FileWidget::gatherData(){ fData[IconColumn]->setIcon(QIcon(":/gaping_ass.png")); attr = NoVideo; } + fData[DurationColumn]->setText(duration); + fData[DurationColumn]->setData(seconds, SecondsRole); fData[Md5Column]->setText(md5); fData[MimeColumn]->setText(mime.name()); if(mime.name() == "inode/directory"){ @@ -227,6 +243,22 @@ void FileWidget::searchFile(){ } } +void FileWidget::fileSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected){ + Q_UNUSED(selected); + Q_UNUSED(deselected); + int count = mFileView->selectionModel()->selectedRows().count(); + int total = mModel->rowCount(); + QString msg = QString("%1/%2").arg(QString::number(count)).arg(QString::number(total)); + emit selectionCountChanged(msg); + QModelIndexList idxl = mFileView->selectionModel()->selectedRows(DurationColumn); + qint64 seconds = 0; + foreach(QModelIndex idx, idxl){ + seconds += idx.data(SecondsRole).toLongLong(); + } + Helper::Duration dur(seconds); + emit durationChanged(dur.toString()); +} + void FileWidget::itemDoubleClicked(const QModelIndex &idx){ if(idx.column() == NameColumn){ int attr = idx.data(AttrsRole).toInt(); diff --git a/filewidget.h b/filewidget.h index 385eeff..7726230 100644 --- a/filewidget.h +++ b/filewidget.h @@ -4,6 +4,7 @@ #include <QWidget> #include <QSqlDatabase> #include <QSqlQuery> +#include <QItemSelection> class QLineEdit; class QPushButton; @@ -16,12 +17,20 @@ 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 Columns { IconColumn = 0, NameColumn = 1, MimeColumn = 2, Md5Column = 3 }; + enum CustomRoles { AttrsRole = Qt::UserRole + 1, FullPathRole = Qt::UserRole + 2, DurationRole = Qt::UserRole + 3, MD5SumRole = Qt::UserRole + 4, SecondsRole = Qt::UserRole + 5 }; + enum { ColumnCount = 5 }; + enum Columns { IconColumn = 0, NameColumn = 1, MimeColumn = 2, DurationColumn = 3, Md5Column = 4 }; explicit FileWidget(QWidget *parent = 0); ~FileWidget(); + signals: + void statusMessage(const QString &msg); + void selectionCountChanged(const QString &msg); + void durationChanged(const QString &duration); + + public slots: + void fileSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); + private slots: void gatherData(); void selectDir(); diff --git a/shemovcleaner.cpp b/shemovcleaner.cpp index 70b44ad..f5d74ad 100644 --- a/shemovcleaner.cpp +++ b/shemovcleaner.cpp @@ -36,6 +36,10 @@ ShemovCleaner::ShemovCleaner(QWidget *parent, Qt::WindowFlags f) : QMainWindow(p createActions(); connect(mTorrentTab, SIGNAL(statusMessage(QString)), this, SLOT(statusBarMessage(QString))); connect(mTorrentTab, SIGNAL(selectionCountChanged(QString)), this, SLOT(setSelectionCount(QString))); + connect(mFileTab, SIGNAL(statusMessage(QString)), this, SLOT(statusBarMessage(QString))); + connect(mFileTab, SIGNAL(selectionCountChanged(QString)), this, SLOT(setSelectionCount(QString))); + connect(mFileTab, SIGNAL(durationChanged(QString)), this, SLOT(setDuration(QString))); + connect(mTab, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int))); QSettings s; restoreGeometry(s.value("geometry").toByteArray()); @@ -45,6 +49,10 @@ void ShemovCleaner::statusBarMessage(const QString &msg){ statusBar()->showMessage(msg); } +void ShemovCleaner::setDuration(const QString &msg){ + mDuration->setText(msg); +} + void ShemovCleaner::setSelectionCount(const QString &msg){ mSelected->setText(msg); } @@ -57,6 +65,15 @@ void ShemovCleaner::configure(){ } } +void ShemovCleaner::tabChanged(int idx){ + if(idx == Torrents){ + mTorrentTab->fileSelectionChanged(QItemSelection(), QItemSelection()); + setDuration("00:00:00"); + }else if(idx == Videos){ + mFileTab->fileSelectionChanged(QItemSelection(), QItemSelection()); + } +} + void ShemovCleaner::closeEvent(QCloseEvent *e){ QSettings s; s.setValue("geometry", saveGeometry()); @@ -67,8 +84,13 @@ void ShemovCleaner::createStatusBar(){ QLabel *l1 = new QLabel(tr("Sel.")); mSelected = new QLabel("000/000"); mSelected->setFrameStyle(QFrame::Panel | QFrame::Sunken); + QLabel *l2 = new QLabel(tr("Dur.")); + mDuration = new QLabel("00:00:00"); + mDuration->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addPermanentWidget(l1); statusBar()->addPermanentWidget(mSelected); + statusBar()->addPermanentWidget(l2); + statusBar()->addPermanentWidget(mDuration); } void ShemovCleaner::createActions(){ diff --git a/shemovcleaner.h b/shemovcleaner.h index e21dbe4..441b0a3 100644 --- a/shemovcleaner.h +++ b/shemovcleaner.h @@ -12,12 +12,15 @@ class QAction; class ShemovCleaner : public QMainWindow { Q_OBJECT public: + enum Tabs { Torrents = 0, Videos = 1 }; ShemovCleaner(QWidget *parent = 0, Qt::WindowFlags f = 0); public slots: void statusBarMessage(const QString &msg); void setSelectionCount(const QString &msg); + void setDuration(const QString &msg); void configure(); + void tabChanged(int idx); protected: virtual void closeEvent(QCloseEvent *e); @@ -28,6 +31,7 @@ class ShemovCleaner : public QMainWindow { void openDatabase(); QAction *createSeparator(); QLabel *mSelected; + QLabel *mDuration; QTabWidget *mTab; TorrentWidget *mTorrentTab; FileWidget *mFileTab; diff --git a/torrentwidget.h b/torrentwidget.h index 5b1852c..10a67d8 100644 --- a/torrentwidget.h +++ b/torrentwidget.h @@ -37,13 +37,11 @@ class TorrentWidget : public QWidget { void moveFiles(); void torrentInfo(); void searchFile(); + void fileSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); protected: virtual void contextMenuEvent(QContextMenuEvent *e); - private slots: - void fileSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); - private: void setupGui(); void readHeaderData(); |