diff options
-rw-r--r-- | filesystemdirproxy.cpp | 22 | ||||
-rw-r--r-- | filesystemdirproxy.h | 22 | ||||
-rw-r--r-- | filesystemwidget.cpp | 22 | ||||
-rw-r--r-- | filesystemwidget.h | 30 | ||||
-rw-r--r-- | movieitem.cpp | 10 | ||||
-rw-r--r-- | movieitem.h | 4 | ||||
-rw-r--r-- | moviemodel.cpp | 57 | ||||
-rw-r--r-- | moviemodel.h | 7 | ||||
-rw-r--r-- | shemov.pro | 8 |
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; @@ -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 |