diff options
-rw-r--r-- | filesystemwidget.cpp | 2 | ||||
-rw-r--r-- | smdirmodel.cpp | 14 | ||||
-rw-r--r-- | smdirmodel.h | 7 | ||||
-rw-r--r-- | smdirwatcher.cpp | 39 | ||||
-rw-r--r-- | smdirwatcher.h | 10 |
5 files changed, 65 insertions, 7 deletions
diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp index a28fea3..dce3b19 100644 --- a/filesystemwidget.cpp +++ b/filesystemwidget.cpp @@ -43,7 +43,7 @@ FilesystemWidget::FilesystemWidget(QWidget *parent) : QWidget(parent), mClipboar mIconProvider = new SheMovIconProvider; mModel->setIconProvider(mIconProvider); - QStringList fHeaders = QStringList() << tr("Name") << tr("Size") << tr("Type") << tr("Created") << tr("Md5Sum") << tr("Dur./Size") << tr("Bitrate") << tr("Full Path"); + QStringList fHeaders = QStringList() << tr("Name") << tr("Size") << tr("Type") << tr("Created") << tr("Md5Sum") << tr("Dur./Size") << tr("Bitrate") << tr("Full Path") << tr("Present"); mFileModel = new SmDirModel(fHeaders, this); connect(mFileModel, SIGNAL(needResize()), this, SLOT(resizeFileView())); diff --git a/smdirmodel.cpp b/smdirmodel.cpp index 8a6c961..6053890 100644 --- a/smdirmodel.cpp +++ b/smdirmodel.cpp @@ -57,6 +57,8 @@ QVariant SmDirModel::data(const QModelIndex &index, int role) const{ return i->data(Bitrate); case FullPathRole: return i->data(FullPath); + case PresentRole: + return i->data(Present); case Qt::DecorationRole: { if(index.column() == 0){ QStringList mime = i->data(Type).toString().split('/'); @@ -67,8 +69,15 @@ QVariant SmDirModel::data(const QModelIndex &index, int role) const{ return mIcons.value("other"); } return mIcons.value(mime.at(0).toLower()); + }else{ + return QVariant(); } } + case Qt::ForegroundRole: + if(index.column() == 0 && i->data(Present).toInt() > 0){ + return QVariant(QColor(Qt::darkGreen)); + } + return SmTreeModel::data(index, role); case Qt::DisplayRole: { if(index.column() == DurSize){ QVariant d = i->data(DurSize); @@ -85,6 +94,7 @@ QVariant SmDirModel::data(const QModelIndex &index, int role) const{ } } + default: return SmTreeModel::data(index, role); } @@ -187,6 +197,10 @@ void SmDirModel::refresh(){ setDir(mCurrentDir); } +void SmDirModel::setCheckForPresent(bool check){ + mCollector->setCheckForPresent(check); +} + void SmDirModel::populate(SmTreeItem *root){ setRoot(root); emit needResize(); diff --git a/smdirmodel.h b/smdirmodel.h index fac9041..8f000e4 100644 --- a/smdirmodel.h +++ b/smdirmodel.h @@ -22,9 +22,9 @@ class SmDataColletor; class SmDirModel : public SmTreeModel { Q_OBJECT public: - enum CustomRoles { NameRole = Qt::UserRole + 1, SizeRole = Qt::UserRole + 2, TypeRole = Qt::UserRole + 3, CreatedRole = Qt::UserRole + 4, Md5sumRole = Qt::UserRole + 5, DurSizeRole = Qt::UserRole + 6, BitrateRole = Qt::UserRole + 7, FullPathRole = Qt::UserRole + 8 }; - enum Fields { Name = 0, Size = 1, Type = 2, Created = 3, Md5sum = 4, DurSize = 5, Bitrate = 6, FullPath = 7 }; - enum { NumFields = 8 }; + enum CustomRoles { NameRole = Qt::UserRole + 1, SizeRole = Qt::UserRole + 2, TypeRole = Qt::UserRole + 3, CreatedRole = Qt::UserRole + 4, Md5sumRole = Qt::UserRole + 5, DurSizeRole = Qt::UserRole + 6, BitrateRole = Qt::UserRole + 7, FullPathRole = Qt::UserRole + 8, PresentRole = Qt::UserRole + 9 }; + 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 }; explicit SmDirModel(const QStringList &headers, QObject *parent = 0); ~SmDirModel(); @@ -40,6 +40,7 @@ class SmDirModel : public SmTreeModel { void dirEvent(const QList<QVariant> &data, int e); void readSettings(); void refresh(); + void setCheckForPresent(bool check); private slots: void populate(SmTreeItem *root); diff --git a/smdirwatcher.cpp b/smdirwatcher.cpp index 2db94d9..09aead4 100644 --- a/smdirwatcher.cpp +++ b/smdirwatcher.cpp @@ -95,7 +95,14 @@ void SmDirWatcher::run(){ } } -SmDataColletor::SmDataColletor(const int numFields, QObject *parent) : QThread(parent), mSemFree(0), mSemUsed(0), mDataQueue(0), mNumFields(numFields) {} +SmDataColletor::SmDataColletor(const int numFields, QObject *parent) : QThread(parent), mSemFree(0), mSemUsed(0), mDataQueue(0), mNumFields(numFields), mCheckForPresent(true) { + QSqlDatabase db = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), "collectordb"); + db.open(); + mPicPresentQ = new QSqlQuery(db); + mPicPresentQ->prepare("SELECT COUNT(cmd5sum) FROM pics WHERE cmd5sum = :md5"); + mMovPresentQ = new QSqlQuery(db); + mMovPresentQ->prepare("SELECT COUNT(cmd5sum) FROM files WHERE cmd5sum = :md5"); +} void SmDataColletor::init(QSemaphore *set, QSemaphore *get, QQueue<QPair<QString, SmDirWatcher::DWEvent> > *data){ mSemFree = set; @@ -103,6 +110,11 @@ void SmDataColletor::init(QSemaphore *set, QSemaphore *get, QQueue<QPair<QString mDataQueue = data; } +void SmDataColletor::setCheckForPresent(bool present){ + QMutexLocker l(&mCheckForPresentMx); + mCheckForPresent = present; +} + void SmDataColletor::run(){ forever { mSemUsed->acquire(); @@ -135,7 +147,7 @@ SmTreeItem * SmDataColletor::populate(const QString &dir){ return retval; } -const QList<QVariant> SmDataColletor::fileData(const QFileInfo &fi) const{ +const QList<QVariant> SmDataColletor::fileData(const QFileInfo &fi){ QList<QVariant> data; data << fi.fileName() << fi.size(); QString mime = Helper::mimeType(fi.absoluteFilePath()); @@ -150,5 +162,28 @@ const QList<QVariant> SmDataColletor::fileData(const QFileInfo &fi) const{ } data << Helper::md5Sum(fi.absoluteFilePath()); data << si << fi.absoluteFilePath(); + data << 0; + mCheckForPresentMx.lock(); + bool p = mCheckForPresent; + mCheckForPresentMx.unlock(); + if(p){ + QSqlQuery *curQuery = 0; + if(mime.startsWith("video")){ + curQuery = mMovPresentQ; + } + if(mime.startsWith("image")){ + curQuery = mPicPresentQ; + } + if(curQuery){ + curQuery->bindValue(":md5", data.at(4)); + if(curQuery->exec()){ + QVariant res; + while(curQuery->next()){ + res = curQuery->value(0); + } + data[8] = res; + } + } + } return data; } diff --git a/smdirwatcher.h b/smdirwatcher.h index 4a85c5a..3a30360 100644 --- a/smdirwatcher.h +++ b/smdirwatcher.h @@ -13,6 +13,9 @@ #include <QVariant> #include <QFileInfo> #include <QQueue> +#include <QMutex> +#include <QSqlDatabase> +#include <QSqlQuery> class SmTreeItem; class QSemaphore; @@ -53,6 +56,7 @@ class SmDataColletor : public QThread { void init(QSemaphore *set, QSemaphore *get, QQueue<QPair<QString, SmDirWatcher::DWEvent> > *data); public slots: + void setCheckForPresent(bool present); void run(); signals: @@ -62,13 +66,17 @@ class SmDataColletor : public QThread { private: SmTreeItem *populate(const QString &dir); - const QList<QVariant> fileData(const QFileInfo &fi) const; + const QList<QVariant> fileData(const QFileInfo &fi); QString mCurrent; QSemaphore *mSemFree; QSemaphore *mSemUsed; QQueue<QPair<QString, SmDirWatcher::DWEvent> > *mDataQueue; int mMode; const int mNumFields; + bool mCheckForPresent; + QMutex mCheckForPresentMx; + QSqlQuery *mPicPresentQ; + QSqlQuery *mMovPresentQ; }; #endif // SMDIRWATCHER_H |