summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--filewidget.cpp34
-rw-r--r--filewidget.h15
-rw-r--r--shemovcleaner.cpp22
-rw-r--r--shemovcleaner.h4
-rw-r--r--torrentwidget.h4
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();