summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--filesystemwidget.cpp89
-rw-r--r--filesystemwidget.h32
-rw-r--r--shemov.cpp11
-rw-r--r--shemov.h1
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 <QRegExp>
#include <QFile>
#include <QTextStream>
+#include <QSqlQuery>
+
+//debug
+#include <QDebug>
+#include <QSqlError>
-#include <errno.h>
#include <string.h>
#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 <QWidget>
#include <QPair>
+#include <QFileSystemModel>
+#include <QHash>
+#include <QSqlDatabase>
+#include <QDateTime>
-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<QString, QStringList> 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<QString, QDateTime> 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;