From 666db6b8c2d7704415946c0a8d69adb3cf5ae7f5 Mon Sep 17 00:00:00 2001 From: Arno Date: Tue, 3 Sep 2013 08:16:46 +0200 Subject: Introduce Expensive Operations Add a configuration Option to (de-)select expensive file operations. That would be md5Summing and gathering the Bitrate/Duration. That should help the performance on networked directories... --- configurationdialog.cpp | 57 ++++++++++++++++++++++++++----------------------- configurationdialog.h | 2 +- filesystemwidget.cpp | 2 ++ smdirmodel.cpp | 5 +++-- smdirmodel.h | 2 ++ smdirwatcher.cpp | 39 ++++++++++++++++++++------------- smdirwatcher.h | 2 ++ 7 files changed, 64 insertions(+), 45 deletions(-) diff --git a/configurationdialog.cpp b/configurationdialog.cpp index da7142d..2c5c804 100644 --- a/configurationdialog.cpp +++ b/configurationdialog.cpp @@ -5,38 +5,38 @@ 2 of the License, or (at your option) any later version. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include -#include -#include -#include +#include +#include +#include #include -#include +#include #include #include #include #include #include -#include +#include #include #include #include #include #include -#include +#include #include "configurationdialog.h" #include "programconfigurator.h" @@ -91,7 +91,16 @@ ConfigurationDialog::ConfigurationDialog(QWidget *parent, Qt::WindowFlags f) : S copyL->addRow(tr("Strip from path"), mStripPath); copyBox->setLayout(copyL); pathLayout->addWidget(copyBox); - mTab->addTab(pathWidget, tr("Directories")); + + //expensive option + QGroupBox *expensiveBox = new QGroupBox(tr("Expensive file operations")); + QHBoxLayout *expensiveL = new QHBoxLayout; + mExpensive = new QCheckBox(tr("Do expenive file operations")); + expensiveL->addWidget(mExpensive); + expensiveBox->setLayout(expensiveL); + pathLayout->addWidget(expensiveBox); + pathLayout->addStretch(Qt::Vertical); + mTab->addTab(pathWidget, tr("Files")); //misc tab QWidget *miscWidget = new QWidget; @@ -288,12 +297,6 @@ ConfigurationDialog::ConfigurationDialog(QWidget *parent, Qt::WindowFlags f) : S dbBox->setLayout(dbFormL); QVBoxLayout *dbWidgetLayout = new QVBoxLayout; dbWidgetLayout->addWidget(dbBox); - QGroupBox *miscDbBox = new QGroupBox(tr("Misc.")); - QVBoxLayout *miscDbLayout= new QVBoxLayout; - mCheckPresent = new QCheckBox(tr("Check database for files")); - miscDbLayout->addWidget(mCheckPresent); - miscDbBox->setLayout(miscDbLayout); - dbWidgetLayout->addWidget(miscDbBox); dbWidgetLayout->addStretch(); QWidget *dbWidget = new QWidget; dbWidget->setLayout(dbWidgetLayout); @@ -480,6 +483,7 @@ void ConfigurationDialog::readSettings(){ mCoverPath->setText(s.value("paths/coverpath").toString()); mWindowsDrive->setText(s.value("paths/windowsdrive").toString()); mStripPath->setText(s.value("paths/strippath").toString()); + mExpensive->setChecked(s.value("ui/expensiveops", true).toBool()); //read pictures mInfoBox->setCurrentIndex(mInfoBox->findData(s.value("ui/infoposition", TopLeft).toInt())); @@ -492,7 +496,6 @@ void ConfigurationDialog::readSettings(){ mDatabaseName->setText(s.value("database/dbname").toString()); mDatabaseUsername->setText(s.value("database/dbuser").toString()); mDatabasePassword->setText(s.value("database/dbpass").toString()); - mCheckPresent->setChecked(s.value("database/checkpresent", false).toBool()); //read colors QVariant clip = s.value("ui/clipcolor", QVariant(QColor(Qt::darkBlue))); @@ -545,6 +548,7 @@ void ConfigurationDialog::writeSettings(){ s.setValue("paths/windowsdrive", mWindowsDrive->text()); s.setValue("paths/strippath", mStripPath->text()); s.setValue("paths/coverpath", mCoverPath->text()); + s.setValue("ui/expensiveops", (mExpensive->checkState() == Qt::Checked)); //write icons s.setValue("ui/foldericon", mIconForFolder->currentText()); @@ -578,7 +582,6 @@ void ConfigurationDialog::writeSettings(){ s.setValue("database/dbname", mDatabaseName->text()); s.setValue("database/dbuser", mDatabaseUsername->text()); s.setValue("database/dbpass", mDatabasePassword->text()); - s.setValue("database/checkpresent", (mCheckPresent->checkState() == Qt::Checked)); //write movies mMovieConfig->writeSettings(); diff --git a/configurationdialog.h b/configurationdialog.h index c266d37..6775478 100644 --- a/configurationdialog.h +++ b/configurationdialog.h @@ -81,7 +81,7 @@ class ConfigurationDialog : public SmDialog { QCheckBox *mAutoAddCovers; QCheckBox *mIconizeCovers; QCheckBox *mAutoRefresh; - QCheckBox *mCheckPresent; + QCheckBox *mExpensive; QSpinBox *mHoverOpacity; QSpinBox *mCursorOffset; QSpinBox *mPVWidth; diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp index 64f5ee8..da8acb2 100644 --- a/filesystemwidget.cpp +++ b/filesystemwidget.cpp @@ -343,6 +343,8 @@ void FilesystemWidget::readSettings(){ mDirView->selectionModel()->setCurrentIndex(pidx, QItemSelectionModel::ClearAndSelect); } } + bool expensiveOps = s.value("ui/expensiveops", true).toBool(); + mFileModel->watcher()->setExpensiveOps(expensiveOps); QPoint picViewerPos = s.value("windows/picviewer").toPoint(); mPicViewer->move(picViewerPos); mFileView->readConfig(); diff --git a/smdirmodel.cpp b/smdirmodel.cpp index 6c84784..8a403d1 100644 --- a/smdirmodel.cpp +++ b/smdirmodel.cpp @@ -15,7 +15,7 @@ #include "smglobals.h" #include "helper.h" -SmDirModel::SmDirModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mHeaders(headers){ +SmDirModel::SmDirModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mHeaders(headers), mExpensiveOps(true){ mDb = QSqlDatabase::database("treedb"); mWatch = new SmDirWatcher(NumFields, this); connect(mWatch, SIGNAL(needRefresh()), this, SLOT(refresh())); @@ -102,7 +102,6 @@ bool SmDirModel::setData(const QModelIndex &index, const QVariant &value, int ro QString newPath = QString("%1/%2").arg(dir).arg(newName); QFile::rename(old, newPath); emit needResize(); - // watcher->collector will do the rest return true; } return SmTreeModel::setData(index, value, role); @@ -177,6 +176,8 @@ void SmDirModel::readSettings(){ mRefreshTimer->start(); connect(mRefreshTimer, SIGNAL(timeout()), this, SLOT(refresh())); } + bool expensive = s.value("ui/expensiveops", true).toBool(); + mWatch->setExpensiveOps(expensive); } void SmDirModel::refresh(){ diff --git a/smdirmodel.h b/smdirmodel.h index 26f34cf..19609fd 100644 --- a/smdirmodel.h +++ b/smdirmodel.h @@ -35,6 +35,7 @@ class SmDirModel : public SmTreeModel { QDir dir() const; QFileInfo fileInfo(const QModelIndex &idx) const; QTimer *refreshTimer() { return mRefreshTimer; } + SmDirWatcher *watcher() { return mWatch; } public slots: void setDir(const QString &dir); @@ -62,6 +63,7 @@ class SmDirModel : public SmTreeModel { QTimer *mRefreshTimer; QMap mIcons; QSqlDatabase mDb; + bool mExpensiveOps; }; class TimerHandler { diff --git a/smdirwatcher.cpp b/smdirwatcher.cpp index d825c2c..038c4cf 100644 --- a/smdirwatcher.cpp +++ b/smdirwatcher.cpp @@ -17,7 +17,7 @@ #include "smtreeitem.h" #include "helper.h" -SmDirWatcher::SmDirWatcher(int numFields, QObject *parent) : QThread(parent), mFd(0), mDescr(0), mNumFields(numFields) { +SmDirWatcher::SmDirWatcher(int numFields, QObject *parent) : QThread(parent), mFd(0), mDescr(0), mNumFields(numFields), mExpensiveOps(true) { mBufLen = 1024 * (sizeof(struct inotify_event) + 16); mINdata = new char[mBufLen]; mFd = inotify_init(); @@ -47,20 +47,22 @@ void SmDirWatcher::setDir(const QString &dir){ QString mime = data.at(SmDirModel::Type).toString(); SmTreeItem *newItem = new SmTreeItem(data, rootItem); rootItem->appendChild(newItem); - Md5Summer *s = new Md5Summer(fi.absoluteFilePath()); - s->setAutoDelete(false); - connect(s, SIGNAL(md5sumDone(QString,QString)), this, SIGNAL(setMd5Sum(QString,QString))); - mAsyncTasks.append(s); - if(mime.startsWith("video")){ - FfmpegGatherer *g = new FfmpegGatherer(fi.absoluteFilePath()); - g->setAutoDelete(false); - connect(g, SIGNAL(ffmpegDone(QString,QVariantMap)), this, SIGNAL(setFfmpeg(QString,QVariantMap))); - mAsyncTasks.append(g); - }else if(mime.startsWith("image")){ - PicSizeGatherer *pg = new PicSizeGatherer(fi.absoluteFilePath()); - pg->setAutoDelete(false); - connect(pg, SIGNAL(picSizeDone(QString,QVariant)), this, SIGNAL(setPicSize(QString,QVariant))); - mAsyncTasks.append(pg); + if(mExpensiveOps){ + Md5Summer *s = new Md5Summer(fi.absoluteFilePath()); + s->setAutoDelete(false); + connect(s, SIGNAL(md5sumDone(QString,QString)), this, SIGNAL(setMd5Sum(QString,QString))); + mAsyncTasks.append(s); + if(mime.startsWith("video")){ + FfmpegGatherer *g = new FfmpegGatherer(fi.absoluteFilePath()); + g->setAutoDelete(false); + connect(g, SIGNAL(ffmpegDone(QString,QVariantMap)), this, SIGNAL(setFfmpeg(QString,QVariantMap))); + mAsyncTasks.append(g); + }else if(mime.startsWith("image")){ + PicSizeGatherer *pg = new PicSizeGatherer(fi.absoluteFilePath()); + pg->setAutoDelete(false); + connect(pg, SIGNAL(picSizeDone(QString,QVariant)), this, SIGNAL(setPicSize(QString,QVariant))); + mAsyncTasks.append(pg); + } } } emit population(rootItem); @@ -79,6 +81,9 @@ void SmDirWatcher::startAsyncJobs(){ } void SmDirWatcher::gatherAsync(const QString &path){ + if(!mExpensiveOps){ + return; + } QString mimeType = Helper::mimeType(path); Md5Summer *s = new Md5Summer(path); connect(s, SIGNAL(md5sumDone(QString,QString)), this, SIGNAL(setMd5Sum(QString,QString))); @@ -94,6 +99,10 @@ void SmDirWatcher::gatherAsync(const QString &path){ } } +void SmDirWatcher::setExpensiveOps(bool expensiveOps){ + mExpensiveOps = expensiveOps; +} + QList SmDirWatcher::generalData(const QString &path){ QFileInfo fi(path); QList data; diff --git a/smdirwatcher.h b/smdirwatcher.h index 9ec9181..775ca63 100644 --- a/smdirwatcher.h +++ b/smdirwatcher.h @@ -46,6 +46,7 @@ class SmDirWatcher : public QThread { void setDir(const QString &dir); void startAsyncJobs(); void gatherAsync(const QString &path); + void setExpensiveOps(bool expensiveOps); private: QList generalData(const QString &path); @@ -57,6 +58,7 @@ class SmDirWatcher : public QThread { QThreadPool *mAsyncPool; int mNumFields; QList mAsyncTasks; + bool mExpensiveOps; }; class AsyncTask : public QObject, public QRunnable { -- cgit v1.2.3-70-g09d2