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 +++++++++++++++++++++++++++++++++++++++++++++++++--- filesystemwidget.h | 32 ++++++++++++++++--- shemov.cpp | 11 +++++++ shemov.h | 1 + 4 files changed, 125 insertions(+), 8 deletions(-) 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); + } +} diff --git a/filesystemwidget.h b/filesystemwidget.h index b04feca..0cc3abc 100644 --- a/filesystemwidget.h +++ b/filesystemwidget.h @@ -10,8 +10,11 @@ #include #include +#include +#include +#include +#include -class QFileSystemModel; class QTreeView; class FilesystemDirProxy; class FileView; @@ -24,6 +27,8 @@ class QVariant; class MessageDialog; class PictureViewer; class QStringList; +class FileSystemModel; +class QSqlQuery; class FilesystemWidget : public QWidget { Q_OBJECT @@ -32,7 +37,7 @@ class FilesystemWidget : public QWidget { ~FilesystemWidget() {}; FileView *fileView() { return mFileView; }; FilesystemFileProxy *fileProxy() { return mFileProxy; }; - QFileSystemModel *dirModel() { return mModel; }; + FileSystemModel *dirModel() { return mModel; }; const QString windowTitle() const { return mWindowTitle; }; PictureViewer *pictureViewer() { return mPicViewer; }; bool isMounted(); @@ -59,6 +64,7 @@ class FilesystemWidget : public QWidget { void readSettings(); void writeSettings(); void dvdMount(); + void markSeen(); private slots: void doRenameFile(); @@ -72,7 +78,7 @@ class FilesystemWidget : public QWidget { QPair programData(const QString &prefix, const QString &preferred); QStringList selectedFiles(); QStringList mExpandedDirs; - QFileSystemModel *mModel; + FileSystemModel *mModel; QTreeView *mDirView; FileView *mFileView; FilesystemDirProxy *mDirProxy; @@ -86,5 +92,23 @@ class FilesystemWidget : public QWidget { QString mLastDir; }; -#endif +class FileSystemModel : public QFileSystemModel { + Q_OBJECT + public: + FileSystemModel(QObject *parent = 0); + ~FileSystemModel(); + virtual QVariant data(const QModelIndex &index, int role) const; + bool isSeen(const QString &path) const; + + public slots: + void markAsSeen(const QString &path, bool seen); + private: + void cleanup(); + QHash mSeen; + QSqlDatabase mDb; + QSqlQuery *mDeleteFromSeenQuery; + QSqlQuery *mMarkAsSeenQuery; +}; + +#endif diff --git a/shemov.cpp b/shemov.cpp index 1b3aca3..8821a7b 100644 --- a/shemov.cpp +++ b/shemov.cpp @@ -50,6 +50,9 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla //application icon qApp->setWindowIcon(QIcon(":/shemov.png")); + //init database as early as possible + (void) SmGlobals::instance(); + //FileSystemWidget + TabWidget mFSWidget = new FilesystemWidget; setWindowTitle(mFSWidget->windowTitle()); @@ -336,6 +339,8 @@ void SheMov::createActions(){ mMountDvdA = new QAction(QIcon(":/diaper.png"), tr("(Un)mount DVD drive"), this); mMountDvdA->setCheckable(true); connect(mMountDvdA, SIGNAL(triggered()), mFSWidget, SLOT(dvdMount())); + mMarkA = new QAction(tr("Mark as (un)seen"), this); + connect(mMarkA, SIGNAL(triggered()), mFSWidget, SLOT(markSeen())); mConfigA = new QAction(QIcon(":/chastity_belt.png"), tr("Configure..."), this); connect(mConfigA, SIGNAL(triggered()), this, SLOT(configure())); @@ -481,6 +486,8 @@ void SheMov::createMenus(){ mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mMountDvdA); mEditFSMenu->addSeparator(); + mEditFSMenu->addAction(mMarkA); + mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mConfigA); mEditFSMenuA = menuBar()->addMenu(mEditFSMenu); @@ -527,6 +534,10 @@ void SheMov::createMenus(){ QAction *sep10 = new QAction(this); sep10->setSeparator(true); mFSWidget->fileView()->addAction(sep10); + mFSWidget->fileView()->addAction(mMarkA); + QAction *sep11 = new QAction(this); + sep11->setSeparator(true); + mFSWidget->fileView()->addAction(sep11); mFSWidget->fileView()->addAction(mArchiveSelectedA); //ArchiveTreeView context menu diff --git a/shemov.h b/shemov.h index 963faf8..9ffa69b 100644 --- a/shemov.h +++ b/shemov.h @@ -81,6 +81,7 @@ class SheMov : public QMainWindow { QAction *mCdupA; QAction *mBackDirA; QAction *mMountDvdA; + QAction *mMarkA; QAction *mRenameCoverFA; QAction *mRenameCoverBA; QAction *mRenameCoverCA; -- cgit v1.2.3-70-g09d2