summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <arno@disconnect.de>2016-09-04 03:32:56 +0200
committerArno <arno@disconnect.de>2016-09-04 03:32:56 +0200
commit8945f641f468e373b4d8d907bcc2f5be2922962e (patch)
tree93b388c81a31abbc9573603e43017098a78853ba
parente11e257f88726fd04774bf0ca4584d1678bc7f9b (diff)
downloadShemovCleaner-8945f641f468e373b4d8d907bcc2f5be2922962e.tar.gz
ShemovCleaner-8945f641f468e373b4d8d907bcc2f5be2922962e.tar.bz2
ShemovCleaner-8945f641f468e373b4d8d907bcc2f5be2922962e.zip
Display duration and num. of selected Files
When selecting files in FileWidget, calculate the total duration and display it in the status bar. Also count the selected Files and show them. Update status bar on changing tabs.
-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();