summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <arno@disconnect.de>2018-01-02 22:09:07 +0100
committerArno <arno@disconnect.de>2018-01-02 22:09:07 +0100
commitb5dc8c10367537aec8ce7c061f608ca896ec9f36 (patch)
tree3038603c5b485b8a92593a2b24295327d9b71702
parentc77061d4d19de23c805ccbcc7cc229b221d4c1d5 (diff)
downloadShemovCleaner-b5dc8c10367537aec8ce7c061f608ca896ec9f36.tar.gz
ShemovCleaner-b5dc8c10367537aec8ce7c061f608ca896ec9f36.tar.bz2
ShemovCleaner-b5dc8c10367537aec8ce7c061f608ca896ec9f36.zip
Implement cache for FileWidget
Some data-gathering is quite expensive and requires a QProcess, like getting the duration, so cache it in memory using QCache. Once the cache is filled, the UI is much snappier. This simplifies gatherData() a bit. It's still quite a long function, but now it doesn't create the QStandardItems any more. I moved it to a separate function.
-rw-r--r--ShemovCleaner.pro6
-rw-r--r--cachedfiledata.cpp3
-rw-r--r--cachedfiledata.h19
-rw-r--r--filewidget.cpp210
-rw-r--r--filewidget.h5
5 files changed, 156 insertions, 87 deletions
diff --git a/ShemovCleaner.pro b/ShemovCleaner.pro
index 3c2522c..cc357f6 100644
--- a/ShemovCleaner.pro
+++ b/ShemovCleaner.pro
@@ -35,7 +35,8 @@ HEADERS += actorwidget.h \
torrentdisplay.h \
torrentparser.h \
torrentwidget.h \
- viewer.h
+ viewer.h \
+ cachedfiledata.h
SOURCES += actorwidget.cpp \
configurationwidget.cpp \
filecopier.cpp \
@@ -52,5 +53,6 @@ SOURCES += actorwidget.cpp \
torrentdisplay.cpp \
torrentparser.cpp \
torrentwidget.cpp \
- viewer.cpp
+ viewer.cpp \
+ cachedfiledata.cpp
RESOURCES += shemovcleaner.qrc
diff --git a/cachedfiledata.cpp b/cachedfiledata.cpp
new file mode 100644
index 0000000..6f51edb
--- /dev/null
+++ b/cachedfiledata.cpp
@@ -0,0 +1,3 @@
+#include "cachedfiledata.h"
+
+CachedFileData::CachedFileData() : seconds(0), size(0), attr(-1), copied(false) {}
diff --git a/cachedfiledata.h b/cachedfiledata.h
new file mode 100644
index 0000000..9b5fe48
--- /dev/null
+++ b/cachedfiledata.h
@@ -0,0 +1,19 @@
+#ifndef CACHEDFILEDATA_H
+#define CACHEDFILEDATA_H
+
+#include <QString>
+
+struct CachedFileData {
+ explicit CachedFileData();
+ QString fullPath;
+ QString name;
+ QString mimeType;
+ QString duration;
+ QString md5Sum;
+ qint64 seconds;
+ qint64 size;
+ int attr;
+ bool copied;
+};
+
+#endif // CACHEDFILEDATA_H
diff --git a/filewidget.cpp b/filewidget.cpp
index 948a5d6..e2be4e1 100644
--- a/filewidget.cpp
+++ b/filewidget.cpp
@@ -36,6 +36,7 @@
#include "filesorter.h"
#include "filedisplay.h"
#include "filecopier.h"
+#include "cachedfiledata.h"
#include "origindialog.h"
#include "helper.h"
#include "globals.h"
@@ -45,6 +46,7 @@
FileWidget::FileWidget(QWidget *parent) : QWidget(parent), mCopyToMenu(0) {
mFileCopier = new FileCopier(this);
mCopyProgress = new ProgressDialog;
+ mFileCache.setMaxCost(500);
connect(mFileCopier, SIGNAL(newFile(QString,QString,qint64)), this, SLOT(setupProgress(QString,QString,qint64)));
connect(mFileCopier, SIGNAL(bytesRead(qint64)), this, SLOT(setCopyProgress(qint64)));
connect(mFileCopier, SIGNAL(bytesReadIntval(qint64,qint64)), this, SLOT(setCopySummary(qint64,qint64)));
@@ -241,9 +243,6 @@ void FileWidget::gatherData(){
mModel->clear();
QStandardItem *root = mModel->invisibleRootItem();
mModel->setHorizontalHeaderLabels(QStringList() << QChar(0x26A7) << tr("Name") << QChar(0x26A5) << tr("MIME") << tr("Duration") << tr("Size") << tr("MD5"));
- QBrush redBrush(Qt::red);
- QBrush greenBrush(Qt::darkGreen);
- QBrush blueBrush(Qt::darkBlue);
QMimeDatabase db;
qApp->setOverrideCursor(Qt::BusyCursor);
@@ -256,94 +255,70 @@ void FileWidget::gatherData(){
while(it.hasNext()){
QFileInfo fi = it.next();
emit statusMessage(gatherMsg.arg(fi.fileName()).arg(QString::number(count)));
- 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);
- if(i == Md5Column){
- item->setFont(QFont("courier new"));
- item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
- }
- if(i == SizeColumn){
- item->setFont(QFont("courier new"));
- item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
- }
- fData << item;
- }
- 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);
- int haveFile = md5Count(md5);
- if(haveFile){
- fData[IconColumn]->setIcon(QIcon(":/huge_bra.png"));
- fData[NameColumn]->setForeground(greenBrush);
- attr = Present;
- }else{
- QString complFn = fi.completeBaseName();
- bool hasOrig = haveOrigin(complFn);
- if(hasOrig){
- fData[IconColumn]->setIcon(QIcon(":/butt_plug.png"));
- fData[NameColumn]->setForeground(blueBrush);
- attr = Origin;
+ CachedFileData *fd = mFileCache[fi.absoluteFilePath()];
+ if(!fd){
+ bool insert = true;
+ fd = new CachedFileData;
+ QMimeType mime = db.mimeTypeForFile(fi);
+ fd->attr = NotPresent;
+ Helper::Duration dur;
+ QString md5(tr("n/a"));
+ QString duration(tr("n/a"));
+ qint64 seconds = 0;
+ if(mime.name().startsWith("video")){
+ md5 = Helper::md5Sum(fi.absoluteFilePath());
+ fd->md5Sum = md5;
+ int haveFile = md5Count(md5);
+ if(haveFile){
+ fd->attr = Present;
}else{
- fData[IconColumn]->setIcon(QIcon(":/chastity_belt.png"));
- fData[NameColumn]->setForeground(redBrush);
- attr = NotPresent;
+ QString complFn = fi.completeBaseName();
+ bool hasOrig = haveOrigin(complFn);
+ if(hasOrig){
+ fd->attr = Origin;
+ }else{
+ fd->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() == ".."){
+ fd->attr = ParentDir;
+ insert = false;
+ }else{
+ fd->attr = Directory;
+ insert = false;
}
- }
- 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"));
- attr = ParentDir;
}else{
- fData[IconColumn]->setIcon(QIcon(":/folder.png"));
- attr = Directory;
+ fd->attr = NoVideo;
+ insert = false;
}
- }else{
- fData[IconColumn]->setIcon(QIcon(":/gaping_ass.png"));
- attr = NoVideo;
- }
- if(fi.isFile()){
- qint64 sizemb = fi.size();
- QLocale l;
- QString size = QString("%1").arg(l.toString(sizemb));
- fData[SizeColumn]->setText(size);
- if(copyDirFiles.contains(fi.fileName())){
- fData[CopiedColumn]->setText(QChar(0x2642));
- fData[CopiedColumn]->setForeground(blueBrush);
- }else{
- fData[CopiedColumn]->setText(QChar(0x2640));
- fData[CopiedColumn]->setForeground(redBrush);
+ if(fi.isFile()){
+ qint64 sizemb = fi.size();
+ fd->size = sizemb;
+ if(copyDirFiles.contains(fi.fileName())){
+ fd->copied = true;
+ }else{
+ fd->copied = false;
+ }
+ ++count;
+ totalSize += sizemb;
+ }
+ fd->duration = duration;
+ fd->md5Sum = md5;
+ fd->mimeType = mime.name();
+ fd->name = fi.fileName();
+ fd->fullPath = fi.absoluteFilePath();
+ if(insert){
+ mFileCache.insert(fi.absoluteFilePath(), fd);
}
- ++count;
- totalSize += sizemb;
- }
- fData[DurationColumn]->setText(duration);
- fData[DurationColumn]->setData(seconds, SecondsRole);
- 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, AttrsRole);
- fData[i]->setData(fi.absoluteFilePath(), FullPathRole);
- fData[i]->setData(md5, MD5SumRole);
}
- root->appendRow(fData);
+ root->appendRow(constructRow(fd));
}
mFileView->setSortingEnabled(true);
readHeaderData();
@@ -445,6 +420,71 @@ void FileWidget::cutOrCopy(){
clip->setMimeData(mMimeData);
}
+QList<QStandardItem*> FileWidget::constructRow(CachedFileData *fd) const{
+ QList<QStandardItem*> fData;
+ QBrush redBrush(Qt::red);
+ QBrush greenBrush(Qt::darkGreen);
+ QBrush blueBrush(Qt::darkBlue);
+ for(int i = 0; i < ColumnCount; ++i){
+ QStandardItem *item = new QStandardItem;
+ item->setEditable(false);
+ if(i == Md5Column){
+ item->setFont(QFont("courier new"));
+ item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ }
+ if(i == SizeColumn){
+ item->setFont(QFont("courier new"));
+ item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ }
+ fData << item;
+ }
+ fData[NameColumn]->setText(fd->name);
+ fData[Md5Column]->setText(fd->md5Sum);
+ int attr = fd->attr;
+ if(attr == Present){
+ fData[IconColumn]->setIcon(QIcon(":/huge_bra.png"));
+ fData[NameColumn]->setForeground(greenBrush);
+ }else if(attr == Origin){
+ fData[IconColumn]->setIcon(QIcon(":/butt_plug.png"));
+ fData[NameColumn]->setForeground(blueBrush);
+ }else if(attr == NotPresent){
+ fData[IconColumn]->setIcon(QIcon(":/chastity_belt.png"));
+ fData[NameColumn]->setForeground(redBrush);
+ }else if(attr == ParentDir){
+ fData[IconColumn]->setIcon(QIcon(":/up_dick.png"));
+ }else if(attr == Directory){
+ fData[IconColumn]->setIcon(QIcon(":/folder.png"));
+ }else if(attr == NoVideo){
+ fData[IconColumn]->setIcon(QIcon(":/gaping_ass.png"));
+ }
+ qint64 size = fd->size;
+ QLocale l;
+ QString sizeStr = QString("%1").arg(l.toString(size));
+ fData[SizeColumn]->setText(sizeStr);
+ bool copied = fd->copied;
+ if(copied){
+ fData[CopiedColumn]->setText(QChar(0x2642));
+ fData[CopiedColumn]->setForeground(blueBrush);
+ }else{
+ fData[CopiedColumn]->setText(QChar(0x2640));
+ fData[CopiedColumn]->setForeground(redBrush);
+ }
+ fData[DurationColumn]->setText(fd->duration);
+ fData[DurationColumn]->setData(fd->seconds, SecondsRole);
+ QString mimeType = fd->mimeType;
+ if(mimeType == "inode/directory"){
+ fData[MimeColumn]->setText("directory");
+ }else{
+ fData[MimeColumn]->setText(mimeType);
+ }
+ for(int i = 0; i < ColumnCount; ++i){
+ fData[i]->setData(fd->attr, AttrsRole);
+ fData[i]->setData(fd->fullPath, FullPathRole);
+ fData[i]->setData(fd->md5Sum, MD5SumRole);
+ }
+ return fData;
+}
+
void FileWidget::paste(){
QClipboard *clip = qApp->clipboard();
const QMimeData *md = clip->mimeData();
diff --git a/filewidget.h b/filewidget.h
index b4c94e3..9c466fa 100644
--- a/filewidget.h
+++ b/filewidget.h
@@ -9,6 +9,7 @@
#include <QToolBar>
#include <QFileInfo>
#include <QLineEdit>
+#include <QCache>
class QLineEdit;
class QStandardItemModel;
@@ -23,6 +24,8 @@ class OriginDialog;
class QMenu;
class FileCopier;
class ProgressDialog;
+class CachedFileData;
+class QStandardItem;
class FileWidget : public QWidget {
Q_OBJECT
@@ -86,6 +89,7 @@ class FileWidget : public QWidget {
void readSettings();
void writeSettings();
void cutOrCopy();
+ QList<QStandardItem*> constructRow(CachedFileData *fd) const;
QAction *createSeparator();
QLineEdit *mDir;
QLineEdit *mFilter;
@@ -117,6 +121,7 @@ class FileWidget : public QWidget {
VideoSorter *mProxy;
OriginDialog *mOrignDlg;
FileCopier *mFileCopier;
+ QCache<QString, CachedFileData> mFileCache;
int mFileAction;
};