summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2012-12-30 13:42:35 +0100
committerArno <am@disconnect.de>2012-12-30 13:42:35 +0100
commit6ca8a6fab443c0b4ac7f6249c9ef02457ddf4f55 (patch)
treecf5a50340feeccf136eb7b99cd7a0699f43b7111
parenta069898249b863b0982b1807afa8d0b0912b496e (diff)
downloadSheMov-6ca8a6fab443c0b4ac7f6249c9ef02457ddf4f55.tar.gz
SheMov-6ca8a6fab443c0b4ac7f6249c9ef02457ddf4f55.tar.bz2
SheMov-6ca8a6fab443c0b4ac7f6249c9ef02457ddf4f55.zip
Allow moving files from one Series to another
Allow moving files from one SeriesPart to another. Had to add another global variable for this.
-rw-r--r--archivetreeview.cpp1
-rw-r--r--filestreemodel.cpp28
-rw-r--r--filestreemodel.h4
-rw-r--r--filestreewidget.cpp53
-rw-r--r--filestreewidget.h19
-rw-r--r--shemov.cpp3
-rw-r--r--shemov.h1
-rw-r--r--smglobals.cpp4
-rw-r--r--smglobals.h4
9 files changed, 116 insertions, 1 deletions
diff --git a/archivetreeview.cpp b/archivetreeview.cpp
index 2ccc043..372e841 100644
--- a/archivetreeview.cpp
+++ b/archivetreeview.cpp
@@ -58,6 +58,7 @@ ArchiveTreeView::ArchiveTreeView(QWidget *parent) : QWidget(parent), mShowAllFil
connect(mSeriesWidget->seriesTree(), SIGNAL(doubleClicked(QModelIndex)), this, SLOT(playSelected()));
mSeriesModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel"));
connect(mSeriesModel, SIGNAL(localsChanged()), this, SLOT(invalidateSorting()));
+ SmGlobals::instance()->setSeriesTreeWidget(mSeriesWidget);
// files view
mFilesWidget = new FilesTreeWidget;
diff --git a/filestreemodel.cpp b/filestreemodel.cpp
index e59bd99..5fa926e 100644
--- a/filestreemodel.cpp
+++ b/filestreemodel.cpp
@@ -45,6 +45,8 @@ FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeMo
mFileTypeQuery = new QSqlQuery(mDb);
mFileTypeQuery->prepare("SELECT sifiletype FROM files WHERE cmd5sum = :md5");
mFileSizeLessThanQueryTemplate = QString("SELECT cmd5sum FROM files WHERE bisize <= :size AND sifiletype = 1 AND idvd = -1 ORDER BY bisize DESC LIMIT %1");
+ mUpdateSeriesPartQuery = new QSqlQuery(mDb);
+ mUpdateSeriesPartQuery->prepare("UPDATE files SET iseriespart_id = :partid WHERE ifiles_id = :fileid");
//file types
mFileTypes.insert(1, tr("Movie"));
@@ -79,6 +81,7 @@ FilesTreeModel::~FilesTreeModel(){
}
void FilesTreeModel::setIds(const QList<int> &seriesPartIds){
+ mCurrentIds = seriesPartIds;
QStringList ids;
foreach(int s, seriesPartIds){
ids << QString::number(s);
@@ -175,7 +178,7 @@ QVariant FilesTreeModel::data(const QModelIndex &index, int role) const{
if(index.column() == FileName){
if(item->data(Favorite).toBool() == true){
return mFavoriteColor;
- }else if(item->data(DvdNo) == -1){
+ }else if(item->data(DvdNo) == -1){
return mLocalColor;
}else if(item->data(DvdNo).toInt() > 0){
return mArchivedColor;
@@ -492,6 +495,25 @@ bool FilesTreeModel::deleteFiles(const QModelIndexList &files){
return true;
}
+bool FilesTreeModel::updateSeries(int newSeries, QList<QPersistentModelIndex> files){
+ if(files.isEmpty()){
+ return false;
+ }
+ mDb.transaction();
+ foreach(QPersistentModelIndex idx, files){
+ mUpdateSeriesPartQuery->bindValue(":partid", newSeries);
+ mUpdateSeriesPartQuery->bindValue(":fileid", idx.data(FilesTreeModel::FilesIdRole));
+ if(!mUpdateSeriesPartQuery->exec()){
+ mDb.rollback();
+ return false;
+ }
+ }
+ mDb.commit();
+ refresh();
+ return true;
+}
+
+
void FilesTreeModel::readCache(){
QString settingsDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
QString cacheFile = QString("%1/%2").arg(settingsDir).arg("sizeduration.cache");
@@ -545,6 +567,10 @@ void FilesTreeModel::readSettings(){
mFavoriteColor = favorite.value<QColor>();
}
+void FilesTreeModel::refresh(){
+ setIds(mCurrentIds);
+}
+
void FilesTreeModel::populate(QSqlQuery &filesQuery){
SmTreeItem *root = new SmTreeItem(16);
SmTreeItem *files = new SmTreeItem(16, root);
diff --git a/filestreemodel.h b/filestreemodel.h
index 0ff7043..df3831b 100644
--- a/filestreemodel.h
+++ b/filestreemodel.h
@@ -52,6 +52,7 @@ class FilesTreeModel : public SmTreeModel {
bool addFile(const QString &fullPath, int type, int quality, int filePart, int seriesPartId, int dvd = -1);
bool deleteFile(const QModelIndex &file);
bool deleteFiles(const QModelIndexList &files);
+ bool updateSeries(int newSeries, QList<QPersistentModelIndex> files);
//misc
void readCache();
@@ -59,6 +60,7 @@ class FilesTreeModel : public SmTreeModel {
public slots:
void readSettings();
+ void refresh();
private:
//functions
@@ -74,6 +76,7 @@ class FilesTreeModel : public SmTreeModel {
QSqlQuery *mFilesQuery;
QSqlQuery *mDeleteFileQuery;
QSqlQuery *mFileTypeQuery;
+ QSqlQuery *mUpdateSeriesPartQuery;
QString mFileSizeLessThanQueryTemplate;
//misc
@@ -88,6 +91,7 @@ class FilesTreeModel : public SmTreeModel {
QColor mArchivedColor;
QColor mFavoriteColor;
qint64 mDvdSize;
+ QList<int> mCurrentIds;
};
#endif // FILESTREEMODEL_H
diff --git a/filestreewidget.cpp b/filestreewidget.cpp
index d510312..19dbbdf 100644
--- a/filestreewidget.cpp
+++ b/filestreewidget.cpp
@@ -35,6 +35,7 @@
#include "filestreewidget.h"
#include "smglobals.h"
#include "filestreemodel.h"
+#include "seriestreewidget.h"
#include "seriestreemodel.h"
#include "helper.h"
#include "pictureviewer2.h"
@@ -298,6 +299,19 @@ void FilesTreeWidget::playSelected(){
playItems(fullPaths);
}
+void FilesTreeWidget::moveToSeries(){
+ SeriesTreeWidget *vWidget = SmGlobals::instance()->seriesTreeWidget();
+ QModelIndex sel = vWidget->seriesTree()->selectionModel()->currentIndex();
+ QModelIndex real = vWidget->seriesProxy()->mapToSource(sel);
+ QModelIndexList nfiles = mView->selectionModel()->selectedRows();
+ QList<QPersistentModelIndex> files;
+ foreach (QModelIndex i, nfiles){
+ files << i;
+ }
+ FileMoveDialog fmd(real, files, 0, 0);
+ fmd.exec();
+}
+
void FilesTreeWidget::fileSelectionChanged(){
QModelIndexList selected = mView->selectionModel()->selectedRows();
qint64 selSize = 0;
@@ -594,3 +608,42 @@ bool FilesTreeSortModel::lessThan(const QModelIndex &left, const QModelIndex &ri
}
return QSortFilterProxyModel::lessThan(left, right);
}
+
+FileMoveDialog::FileMoveDialog(QPersistentModelIndex selected, QList<QPersistentModelIndex> files, QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f), mFiles(files){
+ QLabel *l1 = new QLabel(tr("Select destination"));
+ QVBoxLayout *selectionLayout = new QVBoxLayout;
+ selectionLayout->addWidget(l1);
+ mTree = new QTreeView;
+ mModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel"));
+ mTree->setModel(mModel);
+ selectionLayout->addWidget(mTree);
+ for(int i = 1; i < SeriesTreeModel::NumFields; ++i){
+ mTree->setColumnHidden(i, true);
+ }
+ mTree->resizeColumnToContents(0);
+ mTree->setAlternatingRowColors(true);
+ mTree->expand(selected);
+ mTree->scrollTo(selected, QAbstractItemView::PositionAtTop);
+ QHBoxLayout *buttonLayout = new QHBoxLayout;
+ mOk = new QPushButton(tr("Ok"));
+ connect(mOk, SIGNAL(clicked()), this, SLOT(accept()));
+ mCancel = new QPushButton(tr("Cancel"));
+ connect(mCancel, SIGNAL(clicked()), this, SLOT(reject()));
+ buttonLayout->setAlignment(Qt::AlignRight);
+ buttonLayout->addWidget(mOk);
+ buttonLayout->addWidget(mCancel);
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addLayout(selectionLayout);
+ mainLayout->addLayout(buttonLayout);
+ setLayout(mainLayout);
+}
+
+void FileMoveDialog::accept(){
+ if(mFiles.isEmpty()){
+ return;
+ }
+ FilesTreeModel *filesModel = static_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel"));
+ int newSeriesIdx = mTree->selectionModel()->currentIndex().data(SeriesTreeModel::SeriesPartIdRole).toInt();
+ filesModel->updateSeries(newSeriesIdx, mFiles);
+ QDialog::accept();
+}
diff --git a/filestreewidget.h b/filestreewidget.h
index 73f5d72..036ee0e 100644
--- a/filestreewidget.h
+++ b/filestreewidget.h
@@ -10,6 +10,8 @@
#include <QWidget>
#include <QTreeView>
+#include <QDialog>
+#include <QPersistentModelIndex>
#include <QSortFilterProxyModel>
typedef QList<QPersistentModelIndex> PersistenModelIndexList;
@@ -40,6 +42,7 @@ class FilesTreeWidget : public QWidget {
void edit(int column);
void suggest();
void playSelected();
+ void moveToSeries();
private slots:
void fileSelectionChanged();
@@ -99,4 +102,20 @@ class FilesTreeSortModel : public QSortFilterProxyModel {
protected:
virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
};
+
+class FileMoveDialog : public QDialog {
+ Q_OBJECT
+ public:
+ explicit FileMoveDialog(QPersistentModelIndex selected, QList<QPersistentModelIndex> files, QWidget *parent = 0, Qt::WindowFlags f = 0);
+
+ public slots:
+ virtual void accept();
+
+ private:
+ QPushButton *mOk;
+ QPushButton *mCancel;
+ QTreeView *mTree;
+ SeriesTreeModel *mModel;
+ QList<QPersistentModelIndex> mFiles;
+};
#endif
diff --git a/shemov.cpp b/shemov.cpp
index 155b37d..e391130 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -603,6 +603,8 @@ void SheMov::createActions(){
//Tree FileWidget actions
mMoveToBurnA = new QAction(tr("Move to burn directory"), this);
connect(mMoveToBurnA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(moveToBurn()));
+ mMoveToSeriesA = new QAction(tr("Move to series..."), this);
+ connect(mMoveToSeriesA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(moveToSeries()));
mMoveFilesA = new QAction(tr("Move to directory..."), this);
connect(mMoveFilesA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(moveToDirectory()));
mDeleteFilesFromTreeA = new QAction(tr("Delete file(s)..."), this);
@@ -906,6 +908,7 @@ void SheMov::createMenus(){
mATree->filesWidget()->filesTree()->addAction(mMoveToBurnA);
mATree->filesWidget()->filesTree()->addAction(mMoveFilesA);
+ mATree->filesWidget()->filesTree()->addAction(mMoveToSeriesA);
mATree->filesWidget()->filesTree()->addAction(createSeparator());
mATree->filesWidget()->filesTree()->addActions(mEditGroup->actions());
diff --git a/shemov.h b/shemov.h
index 96d0de1..9197245 100644
--- a/shemov.h
+++ b/shemov.h
@@ -151,6 +151,7 @@ class SheMov : public QMainWindow {
//TreeView FileWidget Actions
QAction *mMoveToBurnA;
+ QAction *mMoveToSeriesA;
QAction *mMoveFilesA;
QAction *mDeleteFilesFromTreeA;
QAction *mFilePropertiesA;
diff --git a/smglobals.cpp b/smglobals.cpp
index c435a2c..419f15c 100644
--- a/smglobals.cpp
+++ b/smglobals.cpp
@@ -123,6 +123,10 @@ SmGlobals::FrameCache *SmGlobals::frameCache() {
return mFrameCache;
}
+SeriesTreeWidget *SmGlobals::seriesTreeWidget(){
+ return mSeriesTreeWidget;
+}
+
QSize SmGlobals::cursorSize() {
if(!mCursorSize.isValid()){
XFixesCursorImage *curImage = XFixesGetCursorImage(QX11Info::display());
diff --git a/smglobals.h b/smglobals.h
index c396f76..5621fc4 100644
--- a/smglobals.h
+++ b/smglobals.h
@@ -15,6 +15,7 @@
class QAbstractItemModel;
class PictureViewer2;
class QPixmap;
+class SeriesTreeWidget;
class SmGlobals : public QObject {
Q_OBJECT
@@ -48,6 +49,8 @@ class SmGlobals : public QObject {
QAbstractItemModel *model(const QString &which);
PictureViewer2 *pictureViewer();
FrameCache *frameCache();
+ void setSeriesTreeWidget(SeriesTreeWidget *stree) { mSeriesTreeWidget = stree; }
+ SeriesTreeWidget *seriesTreeWidget();
QSize cursorSize();
const QSize minPVSize() const { return QSize(640, 480); }
const QHash<QString, QString> & icons() const { return mIcons; }
@@ -60,6 +63,7 @@ class SmGlobals : public QObject {
static SmGlobals *mInstance;
QHash<QString, QAbstractItemModel*> mModels;
PictureViewer2 *mPictureViewer;
+ SeriesTreeWidget *mSeriesTreeWidget;
SmGlobals::FrameCache *mFrameCache;
QSize mCursorSize;
QHash<QString, QString> mIcons;