diff options
-rw-r--r-- | archivetreeview.cpp | 1 | ||||
-rw-r--r-- | filestreemodel.cpp | 28 | ||||
-rw-r--r-- | filestreemodel.h | 4 | ||||
-rw-r--r-- | filestreewidget.cpp | 53 | ||||
-rw-r--r-- | filestreewidget.h | 19 | ||||
-rw-r--r-- | shemov.cpp | 3 | ||||
-rw-r--r-- | shemov.h | 1 | ||||
-rw-r--r-- | smglobals.cpp | 4 | ||||
-rw-r--r-- | smglobals.h | 4 |
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 @@ -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()); @@ -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; |