diff options
-rw-r--r-- | archiveview.cpp | 2 | ||||
-rw-r--r-- | delegates.cpp | 2 | ||||
-rw-r--r-- | shemov.cpp | 1 | ||||
-rw-r--r-- | smdirmodel.cpp | 69 | ||||
-rw-r--r-- | smdirmodel.h | 4 | ||||
-rw-r--r-- | smdirwatcher.cpp | 177 | ||||
-rw-r--r-- | smdirwatcher.h | 54 | ||||
-rw-r--r-- | smglobals.cpp | 4 | ||||
-rw-r--r-- | smglobals.h | 3 |
9 files changed, 94 insertions, 222 deletions
diff --git a/archiveview.cpp b/archiveview.cpp index 95fc7aa..adff0f0 100644 --- a/archiveview.cpp +++ b/archiveview.cpp @@ -776,8 +776,6 @@ MetadataEditorWidget::MetadataEditorWidget(QWidget *parent) : QWidget(parent){ mainLayout->addWidget(srcGB); mainLayout->addWidget(commentGB); setLayout(mainLayout); - - connect(this, SIGNAL(oldSelected(QString)), this, SLOT(setOld(QString))); } void MetadataEditorWidget::setMetadata(const QList<QVariant> &data){ diff --git a/delegates.cpp b/delegates.cpp index ae99241..927726c 100644 --- a/delegates.cpp +++ b/delegates.cpp @@ -84,7 +84,7 @@ QString DurationDelegate::displayText(const QVariant &value, const QLocale &loca if(value.toString().contains("x")){ return value.toString(); } - qint64 secs = value.toInt(); + int secs = value.toFloat(); if(secs == 0){ return tr("n/a"); } @@ -54,6 +54,7 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla splash.showMessage(tr("Constructing Filemanager..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); mFSWidget = new FilesystemWidget; + SmGlobals::instance()->registerWidget("FSWidget", mFSWidget); setWindowTitle(mFSWidget->windowTitle()); mTab = new QTabWidget; mTab->addTab(mFSWidget, tr("Filemanager")); diff --git a/smdirmodel.cpp b/smdirmodel.cpp index b520d07..4f6968a 100644 --- a/smdirmodel.cpp +++ b/smdirmodel.cpp @@ -26,11 +26,7 @@ SmDirModel::SmDirModel(const QStringList &headers, QObject *parent) : SmTreeMode mRefreshTimer = new QTimer(this); readSettings(); - connect(this, SIGNAL(modelReset()), mWatch, SLOT(startAsyncJobs())); connect(mWatch, SIGNAL(population(SmTreeItem*)), this, SLOT(populate(SmTreeItem*))); - connect(mWatch, SIGNAL(setMd5Sum(QString,QString)), this, SLOT(setMd5Sum(QString,QString))); - connect(mWatch, SIGNAL(setFfmpeg(QString,QVariantMap)), this, SLOT(setFfmpeg(QString,QVariantMap))); - connect(mWatch, SIGNAL(setPicSize(QString,QVariant)), this, SLOT(setPicSize(QString,QVariant))); connect(mWatch, SIGNAL(newData(QList<QVariant>,int)), this, SLOT(dirEvent(QList<QVariant>,int))); } @@ -78,8 +74,15 @@ QVariant SmDirModel::data(const QModelIndex &index, int role) const{ } } case Qt::ForegroundRole: - if(index.column() == 0 && i->data(Present).toInt() > 0){ - return QVariant(QColor(Qt::darkGreen)); + if(index.column() == 0){ + if((i->data(Present).toInt() == InFiles) || (i->data(Present).toInt() == InPictures)){ + return QVariant(QColor(Qt::darkGreen)); + } + else if(i->data(Present).toInt() == InOrigin){ + return QVariant(QColor(Qt::darkRed)); + }else{ + return SmTreeModel::data(index, role); + } } return SmTreeModel::data(index, role); default: @@ -150,13 +153,10 @@ void SmDirModel::dirEvent(const QList<QVariant> &data, int e){ if(e == SmDirWatcher::Deleted){ removeRow(idx.row()); } - if(e == SmDirWatcher::Modified || e == SmDirWatcher::CloseWrite){ + if(e == SmDirWatcher::CloseWrite){ for(int i = 0; i < mHeaders.count(); ++i){ QModelIndex c = index(idx.row(), i, QModelIndex()); setData(c, data.at(i), Qt::EditRole); - if(e == SmDirWatcher::CloseWrite){ - mWatch->gatherAsync(data.at(FullPath).toString()); - } } } } @@ -183,53 +183,9 @@ void SmDirModel::refresh(){ setDir(mCurrentDir); } -void SmDirModel::setMd5Sum(QString path, QString md5){ - QModelIndex idx = find(path, FullPath); - if(idx.isValid()){ - QModelIndex md5Idx = createIndex(idx.column(), Md5sum, idx.internalPointer()); - setData(md5Idx, md5, Qt::EditRole); - QString mimeType = idx.data(TypeRole).toString(); - int present = 0; - QSqlQuery presentQ(mDb); - if(mimeType.startsWith("video")){ - presentQ.prepare("SELECT COUNT(*) FROM files WHERE cmd5sum = :md5"); - }else if(mimeType.startsWith("image")){ - presentQ.prepare("SELECT COUNT(*) FROM pics WHERE cmd5sum = :md5"); - }else{ - return; - } - presentQ.bindValue(":md5", md5); - presentQ.exec(); - while(presentQ.next()){ - present = presentQ.value(0).toInt(); - } - if(present){ - QModelIndex presentIdx = createIndex(idx.column(), Present, idx.internalPointer()); - setData(presentIdx, present, Qt::EditRole); - } - } -} - -void SmDirModel::setFfmpeg(QString path, QVariantMap data){ - QModelIndex idx = find(path, FullPath); - if(idx.isValid()){ - QModelIndex durIdx = createIndex(idx.column(), DurSize, idx.internalPointer()); - setData(durIdx, data["duration"].toDouble(), Qt::EditRole); - QModelIndex bitrateIdx = createIndex(idx.column(), Bitrate, idx.internalPointer()); - setData(bitrateIdx, data["bit_rate"], Qt::EditRole); - } -} - -void SmDirModel::setPicSize(QString path, QVariant data){ - QModelIndex idx = find(path, FullPath); - if(idx.isValid()){ - QModelIndex psIdx = createIndex(idx.column(), DurSize, idx.internalPointer()); - setData(psIdx, data, Qt::EditRole); - } -} - void SmDirModel::populate(SmTreeItem *root){ setRoot(root); + //mWatch->startAsyncJobs(); emit needResize(); } @@ -247,9 +203,6 @@ void SmDirModel::addFile(const QList<QVariant> &data){ beginResetModel(); root()->insertChild(w, newItem); endResetModel(); - if(!data.at(Md5sum).isValid() || !data.at(DurSize).isValid()){ - mWatch->gatherAsync(data.at(FullPath).toString()); - } return; } diff --git a/smdirmodel.h b/smdirmodel.h index 19609fd..c4cc4ab 100644 --- a/smdirmodel.h +++ b/smdirmodel.h @@ -27,6 +27,7 @@ class SmDirModel : public SmTreeModel { enum Fields { Name = 0, Size = 1, Type = 2, Created = 3, Md5sum = 4, DurSize = 5, Bitrate = 6, FullPath = 7, Present = 8 }; enum { NumFields = 9 }; enum FileDate { Access, Modified, Status }; + enum Present { InFiles, InOrigin, InPictures, InNone }; explicit SmDirModel(const QStringList &headers, QObject *parent = 0); virtual ~SmDirModel(); virtual QVariant data(const QModelIndex &index, int role) const; @@ -42,9 +43,6 @@ class SmDirModel : public SmTreeModel { void dirEvent(const QList<QVariant> &data, int e); void readSettings(); void refresh(); - void setMd5Sum(QString path, QString md5); - void setFfmpeg(QString path, QVariantMap data); - void setPicSize(QString path, QVariant data); private slots: void populate(SmTreeItem *root); diff --git a/smdirwatcher.cpp b/smdirwatcher.cpp index 59313bb..24deee1 100644 --- a/smdirwatcher.cpp +++ b/smdirwatcher.cpp @@ -8,6 +8,8 @@ #include <QDateTime> #include <QDir> #include <QImage> +#include <QProgressDialog> +#include <QApplication> #include <sys/inotify.h> #include <unistd.h> @@ -17,55 +19,38 @@ #include "smdirwatcher.h" #include "smtreeitem.h" #include "helper.h" +#include "smglobals.h" 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(); - mAsyncPool = new QThreadPool(this); } void SmDirWatcher::setDir(const QString &dir){ if(mDescr){ inotify_rm_watch(mFd, mDescr); //generates IN_IGNORE ??? } - foreach(AsyncTask *s, mAsyncTasks){ - s->skipMe(); - } - mAsyncPool->waitForDone(); - foreach(AsyncTask *s, mAsyncTasks){ - s->deleteLater(); - } - mAsyncTasks.clear(); mCurrent = dir; QDir d(mCurrent); + QWidget *fsWidget = SmGlobals::instance()->registeredWidgets().value("FSWidget"); + QProgressDialog *pDlg = new QProgressDialog(tr("Gathering data..."), QString(), 0, d.count(), fsWidget); + pDlg->setWindowModality(Qt::WindowModal); + Helper::centerWidget(pDlg); + pDlg->show(); SmTreeItem *rootItem = new SmTreeItem(mNumFields); - foreach(QFileInfo fi, d.entryInfoList()){ + for(uint i = 0; i < d.count(); ++i){ + QFileInfo fi = d.entryInfoList().at(i); + pDlg->setValue(i); + qApp->processEvents(); if(fi.fileName() == "." || fi.fileName() == ".."){ continue; } QList<QVariant> data = generalData(fi.absoluteFilePath()); - QString mime = data.at(SmDirModel::Type).toString(); SmTreeItem *newItem = new SmTreeItem(data, rootItem); rootItem->appendChild(newItem); - 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); - } - } } + pDlg->deleteLater(); emit population(rootItem); /* mask rationale: * IN_DELETE_SELF cannot happen since we're only @@ -75,31 +60,6 @@ void SmDirWatcher::setDir(const QString &dir){ mDescr = inotify_add_watch(mFd, qPrintable(dir), IN_CLOSE_WRITE | IN_CREATE | IN_DELETE | IN_MODIFY | IN_MOVED_FROM | IN_MOVED_TO); } -void SmDirWatcher::startAsyncJobs(){ - foreach(AsyncTask *s, mAsyncTasks){ - mAsyncPool->start(s); - } -} - -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))); - mAsyncPool->start(s); - if(mimeType.startsWith("video")){ - FfmpegGatherer *g = new FfmpegGatherer(path); - connect(g, SIGNAL(ffmpegDone(QString,QVariantMap)), this, SIGNAL(setFfmpeg(QString,QVariantMap))); - mAsyncPool->start(g); - }else if(mimeType.startsWith("image")){ - PicSizeGatherer *ps = new PicSizeGatherer(path); - connect(ps, SIGNAL(picSizeDone(QString,QVariant)), this, SIGNAL(setPicSize(QString,QVariant))); - mAsyncPool->start(ps); - } -} - void SmDirWatcher::setExpensiveOps(bool expensiveOps){ mExpensiveOps = expensiveOps; } @@ -111,11 +71,64 @@ QList<QVariant> SmDirWatcher::generalData(const QString &path){ QString mime = Helper::mimeType(fi.absoluteFilePath()); data << mime; data << fi.lastModified(); - data << QVariant() << QVariant() << QVariant(); - data << fi.absoluteFilePath() << 0; + QString md5; + if(mExpensiveOps){ + md5 = Helper::md5Sum(path); + data << md5; + if(mime.startsWith("video")){ + QVariantMap m = Helper::ffmpegData(fi.absoluteFilePath()); + data << m.value("duration") << m.value("bit_rate"); + }else if(mime.startsWith("image")){ + QVariant picSize = Helper::picSize(fi.absoluteFilePath()); + data << picSize << QVariant(); + }else{ + data << QVariant() << QVariant(); + } + data << fi.absoluteFilePath(); + int present = presenceData(md5); + data << present; + }else{ + data << QVariant() << QVariant() << QVariant() << fi.absoluteFilePath() << SmDirModel::InNone; + } return data; } +int SmDirWatcher::presenceData(QString &md5){ + int retval = SmDirModel::InNone; + QSqlDatabase db = QSqlDatabase::database("treedb"); + QSqlQuery present1Q(db); + present1Q.prepare("SELECT COUNT(*) FROM files WHERE cmd5sum = :md5"); + present1Q.bindValue(":md5", md5); + present1Q.exec(); + while(present1Q.next()){ + int c = present1Q.value(0).toInt(); + if(c > 0){ + retval = SmDirModel::InFiles; + } + } + QSqlQuery present2Q(db); + present2Q.prepare("SELECT COUNT(*) from files_origin WHERE cmd5sum = :md5"); + present2Q.bindValue(":md5", md5); + while(present2Q.next()){ + int c = present2Q.value(0).toInt(); + if(c > 0){ + retval = SmDirModel::InOrigin; + } + } + QSqlQuery present3Q(db); + present3Q.prepare("SELECT COUNT(*) FROM pics WHERE cmd5sum = :md5"); + present3Q.bindValue(":md5", md5); + while(present3Q.next()){ + int c = present3Q.value(0).toInt(); + if(c > 0){ + retval = SmDirModel::InPictures; + } + } + return retval; +} + +#include <QDebug> + void SmDirWatcher::run(){ struct pollfd pfd[1]; pfd[0].fd = mFd; @@ -140,12 +153,16 @@ void SmDirWatcher::run(){ QString name = QString("%1/%2").arg(mCurrent).arg(e->name); QList<QVariant> d = generalData(name); if(mask & IN_CREATE || mask & IN_MOVED_TO){ + qDebug() << "Adding" << name; emit newData(d, Added); }else if(mask & IN_DELETE || mask & IN_MOVED_FROM){ + qDebug() << "DEL|MOVE" << name; emit newData(d, Deleted); }else if(mask & IN_MODIFY){ + qDebug() << "MOD" << name; emit newData(d, Modified); }else if(mask & IN_CLOSE_WRITE){ + qDebug() << "CLOSEW" << name; emit newData(d, CloseWrite); } i += sizeof(inotify_event) + e->len; @@ -156,53 +173,3 @@ void SmDirWatcher::stop(){ quit(); wait(); } - -AsyncTask::AsyncTask(const QString &path) : mSkip(false), mPath(path) {} - -bool AsyncTask::skipMe(){ - if(mStatusMx.tryLock()){ - mSkip = true; - mStatusMx.unlock(); - return true; - } - return false; -} - -Md5Summer::Md5Summer(const QString &path) : AsyncTask(path) {} - -void Md5Summer::run(){ - mStatusMx.lock(); - bool skip = mSkip; - mStatusMx.unlock(); - if(skip){ - return; - } - QString md5 = Helper::md5Sum(mPath); - emit md5sumDone(mPath, md5); -} - -FfmpegGatherer::FfmpegGatherer(const QString &path) : AsyncTask(path) {} - -void FfmpegGatherer::run(){ - mStatusMx.lock(); - bool skip = mSkip; - mStatusMx.unlock(); - if(skip){ - return; - } - QVariantMap retval = Helper::ffmpegData(mPath); - emit ffmpegDone(mPath, retval); -} - -PicSizeGatherer::PicSizeGatherer(const QString &path) : AsyncTask(path) {} - -void PicSizeGatherer::run(){ - mStatusMx.lock(); - bool skip = mSkip; - mStatusMx.unlock(); - if(skip){ - return; - } - QVariant retval = Helper::picSize(mPath); - emit picSizeDone(mPath, retval); -} diff --git a/smdirwatcher.h b/smdirwatcher.h index 775ca63..579a4c3 100644 --- a/smdirwatcher.h +++ b/smdirwatcher.h @@ -44,70 +44,18 @@ class SmDirWatcher : public QThread { void run(); void stop(); void setDir(const QString &dir); - void startAsyncJobs(); - void gatherAsync(const QString &path); void setExpensiveOps(bool expensiveOps); private: QList<QVariant> generalData(const QString &path); + int presenceData(QString &md5); int mFd; int mDescr; QString mCurrent; char *mINdata; int mBufLen; - QThreadPool *mAsyncPool; int mNumFields; - QList<AsyncTask*> mAsyncTasks; bool mExpensiveOps; }; -class AsyncTask : public QObject, public QRunnable { - Q_OBJECT - public: - explicit AsyncTask(const QString &path = QString()); - bool skipMe(); - - protected: - virtual void run() = 0; - bool mSkip; - QMutex mStatusMx; - const QString mPath; -}; - -class Md5Summer : public AsyncTask { - Q_OBJECT - public: - explicit Md5Summer(const QString &path); - - signals: - void md5sumDone(QString, QString); - - protected: - virtual void run(); -}; - -class FfmpegGatherer : public AsyncTask { - Q_OBJECT - public: - explicit FfmpegGatherer(const QString &path); - - signals: - void ffmpegDone(QString, QVariantMap); - - protected: - virtual void run(); -}; - -class PicSizeGatherer : public AsyncTask { - Q_OBJECT - public: - explicit PicSizeGatherer(const QString &path); - - signals: - void picSizeDone(QString, QVariant); - - protected: - virtual void run(); -}; - #endif // SMDIRWATCHER_H diff --git a/smglobals.cpp b/smglobals.cpp index f228504..624effc 100644 --- a/smglobals.cpp +++ b/smglobals.cpp @@ -171,3 +171,7 @@ SmGlobals::SmGlobals() : mPictureViewer(0), mArchiveController(0){ mFiletypeMap.insert(FT_GENERALCOVER, tr("General Cover")); mFiletypeMap.insert(FT_ORIGIN, tr("Origin")); } + +void SmGlobals::registerWidget(const QString &name, QWidget *w){ + mWidgets.insert(name, w); +} diff --git a/smglobals.h b/smglobals.h index cbabbde..e28047d 100644 --- a/smglobals.h +++ b/smglobals.h @@ -42,6 +42,8 @@ class SmGlobals : public QObject { const QSize minPVSize() const { return QSize(640, 480); } const QHash<QString, QString> & icons() const { return mIcons; } QHash<int, QString> filetypeMap() const { return mFiletypeMap; } + QHash<QString, QWidget*> registeredWidgets() { return mWidgets; } + void registerWidget(const QString &name, QWidget *w); private: SmGlobals(); @@ -55,6 +57,7 @@ class SmGlobals : public QObject { QHash<QString, QString> mIcons; ArchiveController *mArchiveController; QHash<int, QString> mFiletypeMap; + QHash<QString, QWidget*> mWidgets; }; #endif |