diff options
Diffstat (limited to 'filewidget.cpp')
-rw-r--r-- | filewidget.cpp | 210 |
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(); |