summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2010-12-06 19:10:19 +0100
committerArno <am@disconnect.de>2010-12-06 19:10:19 +0100
commita87e4d8c3c2102e9728dd5df303acca7ae08b343 (patch)
tree29b2b7d2c5f532da2ea18152e7cf34ad51b1016f
parentcb4d80e6a642ef0cd3180aed2155d86144c83395 (diff)
downloadSheMov-a87e4d8c3c2102e9728dd5df303acca7ae08b343.tar.gz
SheMov-a87e4d8c3c2102e9728dd5df303acca7ae08b343.tar.bz2
SheMov-a87e4d8c3c2102e9728dd5df303acca7ae08b343.zip
Edit values in archive
This commit introduces QInputDialogs for all values editable in the archive. Inline editing in the view doesn't seem the right choice regarding usability. Fixed a long standing bug in nextDvdNo(). That was off by one. Return one more than max(value). Also got rid of DvdNoDialog, replaced by a QInputDialog.
-rw-r--r--filestreemodel.cpp29
-rw-r--r--filestreemodel.h3
-rw-r--r--filestreewidget.cpp120
-rw-r--r--filestreewidget.h18
-rw-r--r--filesystemwidget.h12
-rw-r--r--seriestreemodel.cpp2
-rw-r--r--seriestreemodel.h1
-rw-r--r--shemov.cpp34
-rw-r--r--shemov.h6
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 &current, 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();
diff --git a/shemov.cpp b/shemov.cpp
index 8019445..0d6c12c 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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);
diff --git a/shemov.h b/shemov.h
index 3097483..05273bd 100644
--- a/shemov.h
+++ b/shemov.h
@@ -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;