diff options
-rw-r--r-- | filestreemodel.cpp | 14 | ||||
-rw-r--r-- | filestreemodel.h | 3 | ||||
-rw-r--r-- | filestreewidget.cpp | 55 | ||||
-rw-r--r-- | filestreewidget.h | 7 | ||||
-rw-r--r-- | shemov.cpp | 7 | ||||
-rw-r--r-- | shemov.h | 3 |
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 ¤t, 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 ¤t, 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 { @@ -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(){ @@ -114,6 +114,9 @@ class SheMov : public QMainWindow { QAction *mShowNormalA; QActionGroup *mViewTreeGroup; + //TreeView FileWidget Actions + QAction *mMoveToBurnA; + QActionGroup *mOpenWithGroupFS; QActionGroup *mOpenWithGroupAV; //EndActions |