diff options
-rw-r--r-- | filestreemodel.cpp | 29 | ||||
-rw-r--r-- | filestreemodel.h | 3 | ||||
-rw-r--r-- | filestreewidget.cpp | 120 | ||||
-rw-r--r-- | filestreewidget.h | 18 | ||||
-rw-r--r-- | filesystemwidget.h | 12 | ||||
-rw-r--r-- | seriestreemodel.cpp | 2 | ||||
-rw-r--r-- | seriestreemodel.h | 1 | ||||
-rw-r--r-- | shemov.cpp | 34 | ||||
-rw-r--r-- | shemov.h | 6 |
9 files changed, 112 insertions, 113 deletions
diff --git a/filestreemodel.cpp b/filestreemodel.cpp index f47f8c3..5bb0741 100644 --- a/filestreemodel.cpp +++ b/filestreemodel.cpp @@ -33,6 +33,8 @@ FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeMo mUpdateQualityQuery->prepare("UPDATE files SET siquality = :quality WHERE ifiles_id = :id"); mUpdatePartNoQuery = new QSqlQuery(mDb); mUpdatePartNoQuery->prepare("UPDATE files SET sifileno = :partno WHERE ifiles_id = :id"); + mUpdateFileTypeQuery = new QSqlQuery(mDb); + mUpdateFileTypeQuery->prepare("UPDATE files SET sifiletype = :filetype 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); @@ -60,6 +62,10 @@ FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeMo //misc mSeriesModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); readCache(); + mEditableColumns.insert(tr("Set part no."), PartNo); + mEditableColumns.insert(tr("Set quality"), Quality); + mEditableColumns.insert(tr("Set file type"), FileType); + mEditableColumns.insert(tr("Set dvd no."), DvdNo); } FilesTreeModel::~FilesTreeModel(){ @@ -277,6 +283,25 @@ bool FilesTreeModel::setData(const QModelIndex &index, const QVariant &value, in return true; } } + if(index.column() == FileType){ + mUpdateFileTypeQuery->bindValue(":id", index.data(FilesIdRole)); + mUpdateFileTypeQuery->bindValue(":filetype", value); + if(mUpdateFileTypeQuery->exec()){ + int oldFileType = index.data(FileTypeRole).toInt(); + item->setData(FileType, value); + QModelIndex newParent = QModelIndex(); + if((oldFileType == 1) && (value.toInt() != 1)){ + newParent = find("Covers"); + } + if((oldFileType > 1) && (value.toInt() == 1)){ + newParent = find("Movies"); + } + if(newParent.isValid()){ + reparent(index, newParent); + } + return true; + } + } } return false; } @@ -289,8 +314,8 @@ Qt::ItemFlags FilesTreeModel::flags(const QModelIndex &index) const{ return Qt::ItemIsEnabled; } Qt::ItemFlags retval = Qt::ItemIsEnabled | Qt::ItemIsSelectable; - if(index.column() == DvdNo || index.column() == Quality || index.column() == PartNo){ - return retval | Qt::ItemIsEditable; + if(mEditableColumns.values().contains(index.column())){ + retval |= Qt::ItemIsEditable; } return retval; } diff --git a/filestreemodel.h b/filestreemodel.h index 5140478..7acca2c 100644 --- a/filestreemodel.h +++ b/filestreemodel.h @@ -29,6 +29,7 @@ class FilesTreeModel : public SmTreeModel { const QHash<int, QString> fileTypes() const { return mFileTypes; } const QHash<int, QString> coverTypes() const { return mCoverTypes; } const QString modeName(int mode = -1) const; + const QHash<QString, int> editableColumns() const { return mEditableColumns; } int mode() const { return mMode; } ~FilesTreeModel(); @@ -64,6 +65,7 @@ class FilesTreeModel : public SmTreeModel { QSqlQuery *mUpdateDvdQuery; QSqlQuery *mUpdateQualityQuery; QSqlQuery *mUpdatePartNoQuery; + QSqlQuery *mUpdateFileTypeQuery; QSqlQuery *mInsertFileQuery; QSqlQuery *mFilesQuery; QSqlQuery *mDeleteFileQuery; @@ -74,6 +76,7 @@ class FilesTreeModel : public SmTreeModel { QHash<int, QString> mCoverTypes; QHash<int, QString> mModeNames; QHash<QString, QString> mPicsDurationCache; + QHash<QString, int> mEditableColumns; SeriesTreeModel *mSeriesModel; int mMode; const int mMagic; diff --git a/filestreewidget.cpp b/filestreewidget.cpp index 9ca20d0..941c7ac 100644 --- a/filestreewidget.cpp +++ b/filestreewidget.cpp @@ -22,6 +22,7 @@ #include <QEvent> #include <QSettings> #include <QHeaderView> +#include <QInputDialog> #include "filestreewidget.h" #include "smglobals.h" @@ -106,29 +107,6 @@ void FilesTreeWidget::moveToBurn(){ } } -void FilesTreeWidget::setDvdNo(){ - DvdNoDialog dlg(this); - int retval = dlg.exec(); - if(retval == QDialog::Accepted){ - QModelIndexList selected = mView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - int dvdNo = dlg.dvdNo(); - foreach(QModelIndex i, selected){ - int type = i.data(FilesTreeModel::FileTypeRole).toInt(); - if(type != FilesTreeModel::Movie){ - continue; - } - QModelIndex real = mProxy->mapToSource(i); - if(real.isValid()){ - QModelIndex dvdColumn = mModel->index(real.row(), FilesTreeModel::DvdNo, real.parent()); - mModel->setData(dvdColumn, dvdNo, Qt::EditRole); - } - } - } -} - void FilesTreeWidget::removeFiles(){ QModelIndexList selected = mView->selectionModel()->selectedRows(); if(selected.isEmpty()){ @@ -195,22 +173,55 @@ void FilesTreeWidget::fileProperties(){ } dlg.exec(); } - } -void FilesTreeWidget::editQuality(){ - QModelIndex current = mView->selectionModel()->currentIndex(); - if(current.isValid()){ - QModelIndex qualityIndex = mView->model()->index(current.row(), FilesTreeModel::Quality, current.parent()); - mView->edit(qualityIndex); +void FilesTreeWidget::edit(int column){ + QModelIndexList currentSel = mView->selectionModel()->selectedRows(); + if(currentSel.isEmpty()){ + return; } -} - -void FilesTreeWidget::editPart(){ - QModelIndex current = mView->selectionModel()->currentIndex(); - if(current.isValid()){ - QModelIndex qualityIndex = mView->model()->index(current.row(), FilesTreeModel::PartNo, current.parent()); - mView->edit(qualityIndex); + const QHash<QString, int> cols = mModel->editableColumns(); + if(!cols.values().contains(column)){ + return; + } + QModelIndexList sIdxes; + foreach(QModelIndex idx, currentSel){ + QModelIndex pIdx = filesTree()->model()->index(idx.row(), column, idx.parent()); + if(pIdx.isValid()){ + sIdxes << mProxy->mapToSource(pIdx); + } + } + QString msg = cols.key(column); + if(column == FilesTreeModel::FileType){ + QStringList fileTypes = mModel->fileTypes().values(); + qSort(fileTypes); + int inputIdx = fileTypes.indexOf(sIdxes.first().data().toString()); + QString item = QInputDialog::getItem(this, msg, msg, fileTypes, inputIdx, false); + if(!item.isEmpty()){ + int fileTypeInt = mModel->fileTypes().key(item); + foreach(QModelIndex curIdx, sIdxes){ + mModel->setData(curIdx, fileTypeInt, Qt::EditRole); + } + } + return; + } + bool dialogOk = false; + int value = -1; + if(column == FilesTreeModel::PartNo){ + value = QInputDialog::getInt(this, msg, msg, sIdxes.first().data().toInt(), -1, 2147483647, 1, &dialogOk); + } + if(column == FilesTreeModel::Quality){ + value = QInputDialog::getInt(this, msg, msg, sIdxes.first().data().toInt(), -1, 10, 1, &dialogOk); + } + if(column == FilesTreeModel::DvdNo){ + SeriesTreeModel *seriesModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); + int nextDvdNo = seriesModel->findNextDvdNo(); + value = QInputDialog::getInt(this, msg, msg, nextDvdNo, -1, 2147483647, 1, &dialogOk); + } + if(dialogOk){ + foreach(QModelIndex curIdx, sIdxes){ + mModel->setData(curIdx, value, Qt::EditRole); + } } } @@ -288,7 +299,6 @@ void FilesTreeView::setModel(QAbstractItemModel *model){ header()->setSectionHidden(i, true); } readHeaderConfig(); - connect(header(), SIGNAL(sectionMoved(int,int,int)), this, SLOT(sectionHasMoved(int,int,int))); } void FilesTreeView::readConfig(){ @@ -402,39 +412,3 @@ bool FilesTreeSortModel::lessThan(const QModelIndex &left, const QModelIndex &ri } return QSortFilterProxyModel::lessThan(left, right); } - -DvdNoDialog::DvdNoDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ - //spin box - QHBoxLayout *spinBoxLayout = new QHBoxLayout; - QLabel *l1 = new QLabel(tr("Select &Dvd no.")); - mDvdNo = new QSpinBox; - l1->setBuddy(mDvdNo); - spinBoxLayout->addWidget(l1); - spinBoxLayout->addWidget(mDvdNo); - mDvdNo->setMinimum(-1); - SeriesTreeModel *seriesModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); - int nextDvdNo = seriesModel->findNextDvdNo(); - mDvdNo->setValue(nextDvdNo); - - //buttons - QHBoxLayout *buttonLayout = new QHBoxLayout; - mOk = new QPushButton(tr("Ok")); - connect(mOk, SIGNAL(clicked()), this, SLOT(accept())); - buttonLayout->addStretch(); - buttonLayout->addWidget(mOk); - mCancel = new QPushButton(tr("Cancel")); - connect(mCancel, SIGNAL(clicked()), this, SLOT(reject())); - buttonLayout->addWidget(mCancel); - - //main layout - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->addLayout(spinBoxLayout); - mainLayout->addLayout(buttonLayout); - setLayout(mainLayout); - - setWindowTitle(tr("Select Dvd no.")); -} - -int DvdNoDialog::dvdNo() const { - return mDvdNo->value(); -} diff --git a/filestreewidget.h b/filestreewidget.h index ae8e27b..a0c9c2f 100644 --- a/filestreewidget.h +++ b/filestreewidget.h @@ -33,12 +33,10 @@ class FilesTreeWidget : public QWidget { public slots: void moveToBurn(); - void setDvdNo(); void removeFiles(); void moveToDirectory(); void fileProperties(); - void editQuality(); - void editPart(); + void edit(int column); private slots: void fileSelectionChanged(const QModelIndex ¤t, const QModelIndex &previous); @@ -91,18 +89,4 @@ class FilesTreeSortModel : public QSortFilterProxyModel { protected: virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const; }; - -class DvdNoDialog : public QDialog { - Q_OBJECT - public: - DvdNoDialog(QWidget *parent = 0, Qt::WindowFlags f = 0); - ~DvdNoDialog() {} - int dvdNo() const; - - private: - QSpinBox *mDvdNo; - QPushButton *mOk; - QPushButton *mCancel; -}; - #endif diff --git a/filesystemwidget.h b/filesystemwidget.h index 0cc3abc..e41ff52 100644 --- a/filesystemwidget.h +++ b/filesystemwidget.h @@ -34,12 +34,12 @@ class FilesystemWidget : public QWidget { Q_OBJECT public: FilesystemWidget(QWidget *parent = 0); - ~FilesystemWidget() {}; - FileView *fileView() { return mFileView; }; - FilesystemFileProxy *fileProxy() { return mFileProxy; }; - FileSystemModel *dirModel() { return mModel; }; - const QString windowTitle() const { return mWindowTitle; }; - PictureViewer *pictureViewer() { return mPicViewer; }; + ~FilesystemWidget() {} + FileView *fileView() { return mFileView; } + FilesystemFileProxy *fileProxy() { return mFileProxy; } + FileSystemModel *dirModel() { return mModel; } + const QString windowTitle() const { return mWindowTitle; } + PictureViewer *pictureViewer() { return mPicViewer; } bool isMounted(); signals: diff --git a/seriestreemodel.cpp b/seriestreemodel.cpp index ccc6abe..bd82acc 100644 --- a/seriestreemodel.cpp +++ b/seriestreemodel.cpp @@ -256,7 +256,7 @@ int SeriesTreeModel::findNextDvdNo() const{ while(mNextDvdNoQuery->next()){ dvdno = mNextDvdNoQuery->value(0).toInt(); } - return dvdno; + return ++dvdno; } bool SeriesTreeModel::deleteFromSeries(const QModelIndex &what){ diff --git a/seriestreemodel.h b/seriestreemodel.h index e26e49b..e25c111 100644 --- a/seriestreemodel.h +++ b/seriestreemodel.h @@ -23,7 +23,6 @@ class SeriesTreeModel : public SmTreeModel { enum CustomRoles { NameRole = Qt::UserRole + 1, SeriesIdRole = Qt::UserRole + 2, SeriesPartIdRole = Qt::UserRole + 3, SeriesPartRole = Qt::UserRole + 4, TypeRole = Qt::UserRole + 5 }; enum Fields { Name = 0, SeriesId = 1, SeriesPartId = 2, SeriesPart = 3, Type = 4 }; enum Types { Series, Part, NewSeries }; - //enum Filter { ClearFilter, ActorFilter, GenreFilter }; enum QueryType { NumericQuery, TextQuery }; explicit SeriesTreeModel(QStringList &headers, QObject *parent = 0); ~SeriesTreeModel(); @@ -161,6 +161,7 @@ void SheMov::configure(){ void SheMov::tabChanged(int newTab){ mEditFSMenuA->setVisible(newTab == 0); + mEditAVMenuA->setVisible(newTab == 1); if(newTab == 0){ setWindowTitle(mFSWidget->windowTitle()); mCdupA->setEnabled(true); @@ -353,6 +354,20 @@ void SheMov::createActions(){ mConfigA = new QAction(QIcon(":/chastity_belt.png"), tr("Configure..."), this); connect(mConfigA, SIGNAL(triggered()), this, SLOT(configure())); + //Edit menu (AV) + QSignalMapper *editMapper = new QSignalMapper(this); + FilesTreeModel *filesModel = qobject_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); + const QHash<QString, int> editableColumns = filesModel->editableColumns(); + mEditGroup = new QActionGroup(this); + for(QHash<QString, int>::const_iterator it = editableColumns.constBegin(); it != editableColumns.constEnd(); ++it){ + QAction *a = new QAction(it.key(), this); + connect(a, SIGNAL(triggered()), editMapper, SLOT(map())); + a->setData(it.key()); + mEditGroup->addAction(a); + editMapper->setMapping(a, it.value()); + } + connect(editMapper, SIGNAL(mapped(int)), mATree->filesWidget(), SLOT(edit(int))); + //Edit menu rename submenu mTemplateA = new QAction(tr("Set as template"), this); mTemplateA->setShortcut(tr("CTRL+t")); @@ -426,7 +441,6 @@ void SheMov::createActions(){ connect(mShowNoCoverDialogA, SIGNAL(triggered()), mATree, SLOT(showNoCoverDialog())); //Tree view headers - FilesTreeModel *filesModel = static_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); QHash<QString, int> headerData = filesModel->headerData(); QSignalMapper *headerMapper = new QSignalMapper(this); mFilesTreeHeadersGroup = new QActionGroup(this); @@ -446,12 +460,6 @@ void SheMov::createActions(){ connect(mMoveToBurnA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(moveToBurn())); mMoveFilesA = new QAction(tr("Move to directory..."), this); connect(mMoveFilesA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(moveToDirectory())); - mSetDvdNoA = new QAction(tr("Set dvd number"), this); - connect(mSetDvdNoA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(setDvdNo())); - mSetQualityA = new QAction(tr("Set quality"), this); - connect(mSetQualityA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(editQuality())); - mSetPartNoA = new QAction(tr("Set Part no"), this); - connect(mSetPartNoA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(editPart())); mDeleteFilesFromTreeA = new QAction(tr("Delete file(s)..."), this); connect(mDeleteFilesFromTreeA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(removeFiles())); mFilePropertiesA = new QAction(tr("Properties..."), this); @@ -546,6 +554,14 @@ void SheMov::createMenus(){ } mTreeViewMenu->addMenu(mTreeHeaderMenu); + //TreeView edit menu + mEditAVMenu = new QMenu(tr("Edit"), this); + foreach(QAction *a, mEditGroup->actions()){ + mEditAVMenu->addAction(a); + } + mEditAVMenuA = menuBar()->addMenu(mEditAVMenu); + + QMenu *helpMenu = new QMenu(tr("&Help"), this); helpMenu->addAction(mAboutShemovA); helpMenu->addAction(mAboutQtA); @@ -618,9 +634,7 @@ void SheMov::createMenus(){ QAction *sep7 = new QAction(this); sep7->setSeparator(true); mATree->filesWidget()->filesTree()->addAction(sep7); - mATree->filesWidget()->filesTree()->addAction(mSetDvdNoA); - mATree->filesWidget()->filesTree()->addAction(mSetQualityA); - mATree->filesWidget()->filesTree()->addAction(mSetPartNoA); + mATree->filesWidget()->filesTree()->addActions(mEditGroup->actions()); QAction *sep8 = new QAction(this); sep8->setSeparator(true); mATree->filesWidget()->filesTree()->addAction(sep8); @@ -121,9 +121,6 @@ class SheMov : public QMainWindow { //TreeView FileWidget Actions QAction *mMoveToBurnA; QAction *mMoveFilesA; - QAction *mSetDvdNoA; - QAction *mSetQualityA; - QAction *mSetPartNoA; QAction *mDeleteFilesFromTreeA; QAction *mFilePropertiesA; QAction *mCopyUnixFullPathA; @@ -135,6 +132,7 @@ class SheMov : public QMainWindow { QActionGroup *mOpenWithGroupAV; QActionGroup *mCleanupGroup; QActionGroup *mFilesTreeHeadersGroup; + QActionGroup *mEditGroup; //EndActions QSignalMapper *mRenameMapper; @@ -143,12 +141,14 @@ class SheMov : public QMainWindow { QSignalMapper *mCleanupMapper; QMenu *mEditFSMenu; + QMenu *mEditAVMenu; QMenu *mOpenWithMenuFS; QMenu *mOpenWithMenuAV; QMenu *mRenameMenu; QMenu *mTreeViewMenu; QMenu *mTreeHeaderMenu; QAction *mEditFSMenuA; + QAction *mEditAVMenuA; //widgets + dialogs QTabWidget *mTab; |