summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archiveview.cpp2
-rw-r--r--delegates.cpp2
-rw-r--r--shemov.cpp1
-rw-r--r--smdirmodel.cpp69
-rw-r--r--smdirmodel.h4
-rw-r--r--smdirwatcher.cpp177
-rw-r--r--smdirwatcher.h54
-rw-r--r--smglobals.cpp4
-rw-r--r--smglobals.h3
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");
}
diff --git a/shemov.cpp b/shemov.cpp
index f1ea39a..b7ffc9a 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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