From f4a99fc9a5bac76c6bfd10212a80d5ece3b41aac Mon Sep 17 00:00:00 2001 From: Arno Date: Sun, 21 Nov 2010 11:04:42 +0100 Subject: Implemented mark as seen Added new action to mark files as seen. Marked files have the foreground color red. For this the database connection is needed quite early, so I had to call SmGlobals::instance() in the constructor of SheMov without using it. --- filesystemwidget.cpp | 89 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 4 deletions(-) (limited to 'filesystemwidget.cpp') diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp index 769bb50..ff73863 100644 --- a/filesystemwidget.cpp +++ b/filesystemwidget.cpp @@ -23,8 +23,12 @@ #include #include #include +#include + +//debug +#include +#include -#include #include #include "filesystemwidget.h" @@ -37,10 +41,8 @@ #include "pictureviewer.h" #include "smglobals.h" -extern int errno; - FilesystemWidget::FilesystemWidget(QWidget *parent) : QWidget(parent) { - mModel = new QFileSystemModel; + mModel = new FileSystemModel; mModel->setRootPath("/"); mModel->setFilter(QDir::AllEntries | QDir::NoDot); mModel->setReadOnly(false); @@ -466,6 +468,16 @@ void FilesystemWidget::dvdMount(){ } } +void FilesystemWidget::markSeen(){ + QStringList selected = selectedFiles(); + if(selected.isEmpty()){ + return; + } + foreach(QString p, selected){ + mModel->markAsSeen(p, !mModel->isSeen(p)); + } +} + void FilesystemWidget::setWindowTitle(const QString &dir){ mWindowTitle = QString("%1 - %2").arg(qApp->applicationName()).arg(dir); emit windowTitle(mWindowTitle); @@ -577,3 +589,72 @@ QStringList FilesystemWidget::selectedFiles(){ } return retval; } + +//FileSystemModel + +FileSystemModel::FileSystemModel(QObject *parent) : QFileSystemModel(parent){ + mDb = QSqlDatabase::database("treedb"); + mDb.open(); + QSqlQuery readSeen("SELECT tpath, dtseen FROM seen", mDb); + while(readSeen.next()){ + mSeen.insert(readSeen.value(0).toString(), readSeen.value(1).toDateTime()); + } + mDeleteFromSeenQuery = new QSqlQuery(mDb); + mDeleteFromSeenQuery->prepare("DELETE FROM seen WHERE tpath = :path"); + mMarkAsSeenQuery = new QSqlQuery(mDb); + mMarkAsSeenQuery->prepare("INSERT INTO seen (tpath) VALUES(:path)"); + cleanup(); +} + +FileSystemModel::~FileSystemModel(){ + delete mDeleteFromSeenQuery; + delete mMarkAsSeenQuery; + mDb = QSqlDatabase(); +} + +QVariant FileSystemModel::data(const QModelIndex &index, int role) const{ + if(role == Qt::ForegroundRole){ + QString path = index.data(QFileSystemModel::FilePathRole).toString(); + if(mSeen.keys().contains(path)){ + return QBrush(Qt::red); + } + } + return QFileSystemModel::data(index, role); +} + +bool FileSystemModel::isSeen(const QString &path) const{ + return mSeen.keys().contains(path); +} + +void FileSystemModel::markAsSeen(const QString &path, bool seen){ + if(seen){ + if(mSeen.keys().contains(path)){ + return; + } + mMarkAsSeenQuery->bindValue(":path", path); + bool ok = mMarkAsSeenQuery->exec(); + if(!ok){ + qDebug() << mMarkAsSeenQuery->lastError().text(); + } + mSeen.insert(path, QDateTime::currentDateTime()); + }else{ + mDeleteFromSeenQuery->bindValue(":path", path); + mDeleteFromSeenQuery->exec(); + mSeen.remove(path); + } +} + +void FileSystemModel::cleanup(){ + QStringList toRemove; + foreach(QString p, mSeen.keys()){ + QFileInfo fi(p); + if(!fi.exists()){ + mDeleteFromSeenQuery->bindValue(":path", p); + mDeleteFromSeenQuery->exec(); + toRemove << p; + } + } + foreach(QString r, toRemove){ + mSeen.remove(r); + } +} -- cgit v1.2.3-70-g09d2