summaryrefslogtreecommitdiffstats
path: root/filewidget.cpp
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 /filewidget.cpp
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.
Diffstat (limited to 'filewidget.cpp')
-rw-r--r--filewidget.cpp210
1 files changed, 125 insertions, 85 deletions
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();