summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2010-07-18 11:33:04 +0200
committerArno <am@disconnect.de>2010-07-18 11:33:04 +0200
commit88791c89ac1066a9c0118120e10ec3cc19c2ec72 (patch)
treeefe64de5f51bc4ab5821da7114ed9ebac16cccf7
parenta7a6b1c9f8f718b3082e6cc373459a1eba508848 (diff)
downloadSheMov-88791c89ac1066a9c0118120e10ec3cc19c2ec72.tar.gz
SheMov-88791c89ac1066a9c0118120e10ec3cc19c2ec72.tar.bz2
SheMov-88791c89ac1066a9c0118120e10ec3cc19c2ec72.zip
Implemented "move to burn directory" for TreeWidget
Files from the archive can be moved to a configurable directory with this function. The specified files won't be deleted from the database.
-rw-r--r--filestreemodel.cpp14
-rw-r--r--filestreemodel.h3
-rw-r--r--filestreewidget.cpp55
-rw-r--r--filestreewidget.h7
-rw-r--r--shemov.cpp7
-rw-r--r--shemov.h3
6 files changed, 89 insertions, 0 deletions
diff --git a/filestreemodel.cpp b/filestreemodel.cpp
index 348e536..8dc52ba 100644
--- a/filestreemodel.cpp
+++ b/filestreemodel.cpp
@@ -22,12 +22,15 @@ FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeMo
mUpdateQualityQuery->prepare("UPDATE files SET siquality = :quality WHERE ifiles_id = :id");
mInsertFileQuery = new QSqlQuery(mDb);
mInsertFileQuery->prepare("INSERT INTO files(iseriespart_id, tfilename, cmd5sum, bisize, idvd, sifiletype, sifileno, siquality) VALUES(:seriespartid, :fname, :md5, :size, :dvd, :type, :fileno, :quality)");
+ mFilesQuery = new QSqlQuery(mDb);
+ mFilesQuery->prepare("SELECT tfilename, cmd5sum FROM files WHERE iseriespart_id = :id");
}
FilesTreeModel::~FilesTreeModel(){
delete mUpdateDvdQuery;
delete mUpdateQualityQuery;
delete mInsertFileQuery;
+ delete mFilesQuery;
mDb = QSqlDatabase();
}
@@ -187,6 +190,17 @@ Qt::ItemFlags FilesTreeModel::flags(const QModelIndex &index) const{
return retval;
}
+QHash<QString, QString> FilesTreeModel::filesBySeriesPartId(int seriesPartId){
+ mFilesQuery->bindValue(":id", seriesPartId);
+ QHash<QString, QString> retval;
+ if(mFilesQuery->exec()){
+ while(mFilesQuery->next()){
+ retval.insert(mFilesQuery->value(0).toString(), mFilesQuery->value(1).toString());
+ }
+ }
+ return retval;
+}
+
bool FilesTreeModel::addFile(const QString &fullPath, int type, int quality, int filePart, int seriesPartId, int dvd){
QFileInfo fi(fullPath);
qint64 size = fi.size();
diff --git a/filestreemodel.h b/filestreemodel.h
index 7cff707..73c46e0 100644
--- a/filestreemodel.h
+++ b/filestreemodel.h
@@ -10,6 +10,7 @@
#include <QSqlDatabase>
#include <QList>
+#include <QHash>
#include "smtreemodel.h"
@@ -31,6 +32,7 @@ class FilesTreeModel : public SmTreeModel {
QVariant data(const QModelIndex &index, int role) const;
bool setData(const QModelIndex &index, const QVariant &value, int role);
Qt::ItemFlags flags(const QModelIndex &index) const;
+ QHash<QString, QString> filesBySeriesPartId(int seriesPartId);
//file manipulation
bool addFile(const QString &fullPath, int type, int quality, int filePart, int seriesPartId, int dvd = -1);
@@ -41,6 +43,7 @@ class FilesTreeModel : public SmTreeModel {
QSqlQuery *mUpdateDvdQuery;
QSqlQuery *mUpdateQualityQuery;
QSqlQuery *mInsertFileQuery;
+ QSqlQuery *mFilesQuery;
};
#endif // FILESTREEMODEL_H
diff --git a/filestreewidget.cpp b/filestreewidget.cpp
index 7af3f6f..d3d5ad4 100644
--- a/filestreewidget.cpp
+++ b/filestreewidget.cpp
@@ -6,6 +6,12 @@
*/
#include <QHBoxLayout>
+#include <QSettings>
+#include <QMessageBox>
+#include <QFile>
+#include <QDir>
+#include <QContextMenuEvent>
+#include <QMenu>
#include <QDebug>
@@ -13,6 +19,7 @@
#include "smmodelsingleton.h"
#include "filestreemodel.h"
#include "seriestreemodel.h"
+#include "helper.h"
FilesTreeWidget::FilesTreeWidget(QWidget *parent) : QWidget(parent), mSelectedSize(0){
//the view
@@ -36,6 +43,46 @@ FilesTreeWidget::FilesTreeWidget(QWidget *parent) : QWidget(parent), mSelectedSi
mSeriesModel = static_cast<SeriesTreeModel*>(SmModelSingleton::instance()->model("SeriesModel"));
}
+void FilesTreeWidget::moveToBurn(){
+ QModelIndexList selected = mView->selectionModel()->selectedRows();
+ if(selected.isEmpty()){
+ return;
+ }
+ QSettings s;
+ QString burnDir = s.value("paths/burn").toString();
+ if(burnDir.isEmpty()){
+ QMessageBox::critical(this, tr("Error"), tr("No target directory configured."));
+ return;
+ }
+ foreach(QModelIndex i, selected){
+ int type = i.data(FilesTreeModel::FileTypeRole).toInt();
+ if(type == FilesTreeModel::BackCover || type == FilesTreeModel::FrontCover || type == FilesTreeModel::GeneralCover){
+ continue;
+ }
+ int seriesPartId = i.data(FilesTreeModel::SeriesPartIdRole).toInt();
+ int seriesId = mSeriesModel->seriesIdByPartId(seriesPartId);
+ if(seriesId != -1){
+ QModelIndex seriesIdx = mSeriesModel->findValue(seriesId, QModelIndex(), SeriesTreeModel::SeriesId);
+ if(seriesIdx.isValid()){
+ QString seriesName = seriesIdx.data(SeriesTreeModel::NameRole).toString();
+ QString dirName = seriesName.replace(' ', ".");
+ QDir target(burnDir);
+ target.mkdir(dirName);
+ const QHash<QString, QString> files = mModel->filesBySeriesPartId(seriesPartId);
+ foreach(QString name, files.keys()){
+ QString sourceFile = Helper::createArchivePath(name, files.value(name));
+ QString targetFile = QString("%1/%2/%3").arg(burnDir).arg(dirName).arg(name);
+ if(name == i.data(FilesTreeModel::FileNameRole).toString()){
+ QFile::rename(sourceFile, targetFile);
+ }else{
+ QFile::copy(sourceFile, targetFile);
+ }
+ }
+ }
+ }
+ }
+}
+
void FilesTreeWidget::fileSelectionChanged(const QModelIndex &current, const QModelIndex &previous){
Q_UNUSED(previous);
int seriesPartId = current.data(FilesTreeModel::SeriesPartIdRole).toInt();
@@ -73,6 +120,14 @@ void FilesTreeWidget::fileSelectionChanged(const QItemSelection &selected, const
FilesTreeView::FilesTreeView(QWidget *parent) : QTreeView(parent){}
+void FilesTreeView::contextMenuEvent(QContextMenuEvent *event){
+ QMenu ctxMenu;
+ foreach(QAction *a, actions()){
+ ctxMenu.addAction(a);
+ }
+ ctxMenu.exec(event->globalPos());
+}
+
FilesTreeSortModel::FilesTreeSortModel(QObject *parent) : QSortFilterProxyModel(parent) {}
bool FilesTreeSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const{
diff --git a/filestreewidget.h b/filestreewidget.h
index a5ef9b6..06f1d3c 100644
--- a/filestreewidget.h
+++ b/filestreewidget.h
@@ -16,6 +16,7 @@ class FilesTreeView;
class FilesTreeModel;
class FilesTreeSortModel;
class SeriesTreeModel;
+class QContextMenuEvent;
class FilesTreeWidget : public QWidget {
Q_OBJECT
@@ -24,6 +25,9 @@ class FilesTreeWidget : public QWidget {
FilesTreeView *filesTree() { return mView; }
void resetSize() { mSelectedSize = 0; }
+ public slots:
+ void moveToBurn();
+
private slots:
void fileSelectionChanged(const QModelIndex &current, const QModelIndex &previous);
void fileSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
@@ -45,6 +49,9 @@ class FilesTreeView : public QTreeView {
Q_OBJECT
public:
explicit FilesTreeView(QWidget *parent = 0);
+
+ protected:
+ virtual void contextMenuEvent(QContextMenuEvent *event);
};
class FilesTreeSortModel : public QSortFilterProxyModel {
diff --git a/shemov.cpp b/shemov.cpp
index e662bdd..46567c2 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -415,6 +415,10 @@ void SheMov::createActions(){
mShowNormalA->setCheckable(true);
mShowNormalA->setChecked(true);
+ //Tree FileWidget actions
+ mMoveToBurnA = new QAction(tr("Move to burn directory"), this);
+ connect(mMoveToBurnA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(moveToBurn()));
+
// misc
mOpenWithMapperFS = new QSignalMapper(this);
mOpenWithMapperAV = new QSignalMapper(this);
@@ -557,6 +561,9 @@ void SheMov::createMenus(){
mATree->seriesWidget()->seriesTree()->addAction(mExpandCurrentA);
mATree->seriesWidget()->seriesTree()->addAction(mExpandAllSeriesA);
mATree->seriesWidget()->seriesTree()->addAction(mCollapseAllSeriesA);
+
+ //ArchiveTreeView fileWidget context menu
+ mATree->filesWidget()->filesTree()->addAction(mMoveToBurnA);
}
void SheMov::createOpenWithMenuFS(){
diff --git a/shemov.h b/shemov.h
index ca7e840..dfd6786 100644
--- a/shemov.h
+++ b/shemov.h
@@ -114,6 +114,9 @@ class SheMov : public QMainWindow {
QAction *mShowNormalA;
QActionGroup *mViewTreeGroup;
+ //TreeView FileWidget Actions
+ QAction *mMoveToBurnA;
+
QActionGroup *mOpenWithGroupFS;
QActionGroup *mOpenWithGroupAV;
//EndActions