summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoram <am@f440f766-f032-0410-8965-dc7d17de2ca0>2009-07-04 14:42:16 +0000
committeram <am@f440f766-f032-0410-8965-dc7d17de2ca0>2009-07-04 14:42:16 +0000
commit2b2b3b79bf8b2d9be52a6058e3af03bf314bd9db (patch)
tree108261a66ec40e88b1b04fe963379037f75e7b2b
parent9a43a9abb164583656e36a87b6ccf3b7f5ba48e2 (diff)
downloadSheMov-2b2b3b79bf8b2d9be52a6058e3af03bf314bd9db.tar.gz
SheMov-2b2b3b79bf8b2d9be52a6058e3af03bf314bd9db.tar.bz2
SheMov-2b2b3b79bf8b2d9be52a6058e3af03bf314bd9db.zip
-finished model, I think
-started gui git-svn-id: file:///var/svn/repos2/shemov/trunk@376 f440f766-f032-0410-8965-dc7d17de2ca0
-rw-r--r--filesystemdirproxy.cpp22
-rw-r--r--filesystemdirproxy.h22
-rw-r--r--filesystemwidget.cpp22
-rw-r--r--filesystemwidget.h30
-rw-r--r--movieitem.cpp10
-rw-r--r--movieitem.h4
-rw-r--r--moviemodel.cpp57
-rw-r--r--moviemodel.h7
-rw-r--r--shemov.pro8
9 files changed, 171 insertions, 11 deletions
diff --git a/filesystemdirproxy.cpp b/filesystemdirproxy.cpp
new file mode 100644
index 0000000..ff97309
--- /dev/null
+++ b/filesystemdirproxy.cpp
@@ -0,0 +1,22 @@
+/*
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version
+ 2 of the License, or (at your option) any later version.
+*/
+
+#include <QDirModel>
+#include <QModelIndex>
+
+#include "filesystemdirproxy.h"
+
+FilesystemDirProxy::FilesystemDirProxy(QObject *parent) : QSortFilterProxyModel(parent) {};
+
+bool FilesystemDirProxy::filterAcceptsRow(int sourcerow, const QModelIndex &sourceparent) const {
+ QDirModel *m = static_cast<QDirModel*>(sourceModel());
+ QModelIndex idx = m->index(sourcerow, 0, sourceparent);
+ if(!idx.isValid()){
+ return false;
+ }
+ return m->isDir(idx);
+}
diff --git a/filesystemdirproxy.h b/filesystemdirproxy.h
new file mode 100644
index 0000000..e86773f
--- /dev/null
+++ b/filesystemdirproxy.h
@@ -0,0 +1,22 @@
+/*
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version
+ 2 of the License, or (at your option) any later version.
+*/
+
+#ifndef FILESYSTEMDIRPROXY_H
+#define FILESYSTEMDIRPROXY_H
+
+#include <QSortFilterProxyModel>
+
+class FilesystemDirProxy : public QSortFilterProxyModel {
+ Q_OBJECT
+ public:
+ FilesystemDirProxy(QObject *parent = 0);
+ ~FilesystemDirProxy() {};
+ virtual bool filterAcceptsRow(int sourcerow, const QModelIndex &source_parent) const;
+};
+
+#endif
+
diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp
new file mode 100644
index 0000000..5e30b66
--- /dev/null
+++ b/filesystemwidget.cpp
@@ -0,0 +1,22 @@
+/*
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version
+ 2 of the License, or (at your option) any later version.
+*/
+
+#include <QDirModel>
+#include <QTreeView>
+
+#include "filesystemwidget.h"
+#include "filesystemdirproxy.h"
+
+FilesystemWidget::FilesystemWidget(QWidget *parent) : QWidget(parent) {
+ mModel = new QDirModel;
+ mModel->setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
+ mDirProxy = new FilesystemDirProxy;
+ mDirProxy->setSourceModel(mModel);
+ mDirView = new QTreeView;
+ mDirView->setModel(mDirProxy);
+
+}
diff --git a/filesystemwidget.h b/filesystemwidget.h
new file mode 100644
index 0000000..63707da
--- /dev/null
+++ b/filesystemwidget.h
@@ -0,0 +1,30 @@
+/*
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version
+ 2 of the License, or (at your option) any later version.
+*/
+
+#ifndef FILESYSTEMWIDGET_H
+#define FILESYSTEMWIDGET_H
+
+#include <QWidget>
+
+class QDirModel;
+class QTreeView;
+class FilesystemDirProxy;
+
+class FilesystemWidget : public QWidget {
+ Q_OBJECT
+ public:
+ FilesystemWidget(QWidget *parent = 0);
+ ~FilesystemWidget() {};
+
+ private:
+ QDirModel *mModel;
+ QTreeView *mDirView;
+ FilesystemDirProxy *mDirProxy;
+};
+
+#endif
+
diff --git a/movieitem.cpp b/movieitem.cpp
index defca5c..b2fa545 100644
--- a/movieitem.cpp
+++ b/movieitem.cpp
@@ -37,7 +37,7 @@ bool MovieItem::setData(const QList<QVariant> &data){
return true;
}
-void MovieItem::setDataAt(const QVariant &data, Columns column){
+void MovieItem::setDataAt(int column, const QVariant &data){
mRows[column] = data;
}
@@ -69,7 +69,7 @@ void MovieItem::setGenreName(){
genreQuery.bindValue(":id", genreId);
genreQuery.exec();
while(genreQuery.next()){
- setDataAt(genreQuery.value(0), Genre);
+ setDataAt(Genre, genreQuery.value(0));
}
}
@@ -87,15 +87,15 @@ void MovieItem::setSize(){
QString sizeString(tr("%1 %2iB"));
if(size > 1024){
double value = size / 1024.0;
- setDataAt(sizeString.arg(QString::number(value, 'f', 2), "K"), Size);
+ setDataAt(Size, sizeString.arg(QString::number(value, 'f', 2), "K"));
}
if(size > (1024 * 1024)){
double value = size / (1024.0 * 1024.0);
- setDataAt(sizeString.arg(QString::number(value, 'f', 2), "M"), Size);
+ setDataAt(Size, sizeString.arg(QString::number(value, 'f', 2), "M"));
}
if(size > (1024 * 1024 * 1024)){
double value = size / (1024.0 * 1024.0 * 1024.0);
- setDataAt(sizeString.arg(QString::number(value, 'f', 2), "G"), Size);
+ setDataAt(Size, sizeString.arg(QString::number(value, 'f', 2), "G"));
}
}
diff --git a/movieitem.h b/movieitem.h
index af8e530..edd46b4 100644
--- a/movieitem.h
+++ b/movieitem.h
@@ -18,7 +18,7 @@ class MovieItem : public QObject {
Q_OBJECT
Q_ENUMS(Columns)
public:
- enum Columns { Title = 1, Filename = 2, Md5Sum = 3, Size = 4, Genre = 5, Quality = 6, Dvd = 7 };
+ enum Columns { Title = 0, Filename = 1, Md5Sum = 2, Size = 3, Genre = 4, Quality = 5, Dvd = 6 };
enum { NumRows = 7 };
MovieItem(int id = -1, QObject *parent = 0);
~MovieItem() {};
@@ -26,7 +26,7 @@ class MovieItem : public QObject {
void setId(int id);
int genreId() const { return mGenreId; };
bool setData(const QList<QVariant> &data);
- void setDataAt(const QVariant &data, Columns column);
+ void setDataAt(int column, const QVariant &data);
const QList<QVariant> data() const;
const QVariant dataAt(int column) const;
const QList<QVariant> actors() const { return mActors; };
diff --git a/moviemodel.cpp b/moviemodel.cpp
index 53849cc..9e6e493 100644
--- a/moviemodel.cpp
+++ b/moviemodel.cpp
@@ -13,15 +13,30 @@
MovieModel::MovieModel(QObject *parent) : QAbstractItemModel(parent) {
mHeaders << tr("Title") << tr("Filename") << tr("MD5Sum") << tr("Size") << tr("Genre") << tr("Quality") << tr("Archived");
mInsertQuery = new QSqlQuery("SELECT insert_movie(:title, :filename, :md5, :filesize, :genre, :quality, :dvd");
+ mDeleteQuery = new QSqlQuery("DELETE FROM movies WHERE imovid = :id");
mDeleteActorsForMovie = new QSqlQuery("DELETE FROM movieactormap WHERE imovid = :id");
mInsertActorsForMovie = new QSqlQuery("INSERT INTO movieactormap VALUES(:movid, :actorid");
mDeleteCovers = new QSqlQuery("DELETE FROM covers WHERE imovid = :id");
mInsertCovers = new QSqlQuery("INSERT INTO covers VALUES(:filename, :movid, :covertype, :md5sum");
+ mColumnQueries << new QSqlQuery("UPDATE movies SET ttitle = :value WHERE imovid = :id");
+ mColumnQueries << new QSqlQuery("UPDATE movies SET tfilename = :value WHERE imovid = :id");
+ mColumnQueries << new QSqlQuery("UPDATE movies SET cmd5sum = :value WHERE imovid = :id");
+ mColumnQueries << new QSqlQuery("UPDATE movies SET bisize = :value WHERE imovid = :id");
+ mColumnQueries << new QSqlQuery("UPDATE movies SET igenreid = :value WHERE imovid = :id");
+ mColumnQueries << new QSqlQuery("UPDATE movies SET iquality = :value WHERE imovid = :id");
+ mColumnQueries << new QSqlQuery("UPDATE movies SET idvd = :value WHERE imovid = :id");
populate();
}
MovieModel::~MovieModel(){
qDeleteAll(mItems);
+ qDeleteAll(mColumnQueries);
+ delete mInsertQuery;
+ delete mDeleteQuery;
+ delete mDeleteActorsForMovie;
+ delete mInsertActorsForMovie;
+ delete mDeleteCovers;
+ delete mInsertCovers;
}
QModelIndex MovieModel::index(int row, int column, const QModelIndex &parent) const{
@@ -91,7 +106,7 @@ bool MovieModel::removeRows(int row, int count, const QModelIndex &){
return true;
}
-bool MovieModel::setDataAt(const QModelIndex &idx, const QList<QVariant> &data, const QList<QVariant> &actors, const QList<CoverItem> &covers){
+bool MovieModel::setRow(const QModelIndex &idx, const QList<QVariant> &data, const QList<QVariant> &actors, const QList<CoverItem> &covers){
if(!idx.isValid() || (data.size() > MovieItem::NumRows)){
return false;
}
@@ -125,6 +140,25 @@ bool MovieModel::setDataAt(const QModelIndex &idx, const QList<QVariant> &data,
return true;
}
+bool MovieModel::setDataAt(const QModelIndex &idx, const QVariant &data){
+ if(!idx.isValid()){
+ return false;
+ }
+ MovieItem *item = static_cast<MovieItem *>(idx.internalPointer());
+ Q_ASSERT(item != 0);
+ int id = item->id();
+ int column = idx.column();
+ QSqlQuery *query = mColumnQueries.at(column);
+ query->bindValue(":value", data);
+ query->bindValue(":id", id);
+ if(!query->exec()){
+ return false;
+ }
+ item->setDataAt(column, data);
+ emit dataChanged(idx, idx);
+ return true;
+}
+
void MovieModel::setActors(int id, const QList<QVariant> &actors){
mDeleteActorsForMovie->bindValue(":id", id);
mDeleteActorsForMovie->exec();
@@ -147,6 +181,27 @@ void MovieModel::setCovers(int id, const QList<CoverItem> &covers){
}
}
+void MovieModel::addMovie(const QList<QVariant> &data, const QList<QVariant> &actors, const QList<CoverItem> &covers){
+ int row = rowCount(QModelIndex());
+ insertRows(row, 1, QModelIndex());
+ QModelIndex i = index(row, 0, QModelIndex());
+ setRow(i, data, actors, covers);
+}
+
+void MovieModel::removeMovie(const QModelIndex &idx){
+ if(!idx.isValid()){
+ return;
+ }
+ MovieItem *item = static_cast<MovieItem*>(idx.internalPointer());
+ Q_ASSERT(item != 0);
+ int id = item->id();
+ mDeleteQuery->bindValue(":id", id);
+ if(!mDeleteQuery->exec()){
+ return;
+ }
+ removeRows(idx.row(), 1, QModelIndex());
+}
+
void MovieModel::populate(){
QSqlQuery movieQuery("SELECT imovid FROM movies");
movieQuery.exec();
diff --git a/moviemodel.h b/moviemodel.h
index acfa8fa..2f3587a 100644
--- a/moviemodel.h
+++ b/moviemodel.h
@@ -32,15 +32,20 @@ class MovieModel : public QAbstractItemModel {
QVariant headerData(int section, Qt::Orientation o, int role) const;
bool insertRows(int row, int count, const QModelIndex &);
bool removeRows(int row, int count, const QModelIndex &);
- bool setDataAt(const QModelIndex &index, const QList<QVariant> &data, const QList<QVariant> &actors, const QList<CoverItem> &covers);
+ bool setRow(const QModelIndex &idx, const QList<QVariant> &data, const QList<QVariant> &actors, const QList<CoverItem> &covers);
+ bool setDataAt(const QModelIndex &idx, const QVariant &data);
void setActors(int id, const QList<QVariant> &actors);
void setCovers(int id, const QList<CoverItem> &covers);
+ void addMovie(const QList<QVariant> &data, const QList<QVariant> &actors, const QList<CoverItem> &covers);
+ void removeMovie(const QModelIndex &idx);
private:
void populate();
QList<MovieItem*> mItems;
QList<QVariant> mHeaders;
+ QList<QSqlQuery*> mColumnQueries;
QSqlQuery *mInsertQuery;
+ QSqlQuery *mDeleteQuery;
QSqlQuery *mDeleteActorsForMovie;
QSqlQuery *mInsertActorsForMovie;
QSqlQuery *mDeleteCovers;
diff --git a/shemov.pro b/shemov.pro
index 55a6647..d869881 100644
--- a/shemov.pro
+++ b/shemov.pro
@@ -6,9 +6,13 @@ SOURCES = main.cpp \
listmodel.cpp \
movieitem.cpp \
moviemodel.cpp \
-coveritem.cpp
+coveritem.cpp \
+filesystemdirproxy.cpp \
+filesystemwidget.cpp
HEADERS = listitem.h \
listmodel.h \
movieitem.h \
moviemodel.h \
-coveritem.h
+coveritem.h \
+filesystemdirproxy.h \
+filesystemwidget.h