diff options
-rw-r--r-- | ShemovCleaner.pro | 6 | ||||
-rw-r--r-- | cachedfiledata.cpp | 3 | ||||
-rw-r--r-- | cachedfiledata.h | 19 | ||||
-rw-r--r-- | filewidget.cpp | 210 | ||||
-rw-r--r-- | filewidget.h | 5 |
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; }; |