diff options
author | Arno <am@disconnect.de> | 2011-05-07 21:18:02 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2011-05-07 21:18:02 +0200 |
commit | a4fa8d60eb78d410e3c51cb801a0537c890257ba (patch) | |
tree | b5e078859a76611efb5797843a4cd21b19fb7415 | |
parent | 25bd284eec824853e211c84861de4246ffbf6d3a (diff) | |
download | SheMov-a4fa8d60eb78d410e3c51cb801a0537c890257ba.tar.gz SheMov-a4fa8d60eb78d410e3c51cb801a0537c890257ba.tar.bz2 SheMov-a4fa8d60eb78d410e3c51cb801a0537c890257ba.zip |
Fix editing series and seriesparts
I guess this didn't work for quite some time. Show a dialog when
editing series or seriesparts. Before SeriesTreeModel::edit was
called, but that didn't really work.
-rw-r--r-- | seriestreemodel.cpp | 39 | ||||
-rw-r--r-- | seriestreemodel.h | 7 | ||||
-rw-r--r-- | seriestreewidget.cpp | 91 | ||||
-rw-r--r-- | seriestreewidget.h | 25 |
4 files changed, 144 insertions, 18 deletions
diff --git a/seriestreemodel.cpp b/seriestreemodel.cpp index b3c9a34..f18ef4d 100644 --- a/seriestreemodel.cpp +++ b/seriestreemodel.cpp @@ -25,8 +25,6 @@ SeriesTreeModel::SeriesTreeModel(QStringList &headers, QObject *parent) : SmTree mUpdateSeriesIdQuery->prepare("UPDATE seriesparts SET iseries_id = :newid WHERE iseries_id = :oldid"); mUpdateSeriesNameQuery = new QSqlQuery(mDb); mUpdateSeriesNameQuery->prepare("UPDATE series SET tseries_name = :newname WHERE iseries_id = :id"); - mUpdateFavoriteQuery = new QSqlQuery(mDb); - mUpdateFavoriteQuery->prepare("UPDATE seriesparts SET bfavorite = :fav WHERE iseriesparts_id = :id"); mDeleteSeriesQuery = new QSqlQuery(mDb); mDeleteSeriesQuery->prepare("DELETE FROM series where iseries_id = :id"); mDeleteSeriesPartQuery = new QSqlQuery(mDb); @@ -49,6 +47,10 @@ SeriesTreeModel::SeriesTreeModel(QStringList &headers, QObject *parent) : SmTree mFavoriteSeriesIdQuery->prepare("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts WHERE seriesparts.bfavorite = true and seriesparts.iseries_id = series.iseries_id"); mFavoriteSeriesPartsQuery = new QSqlQuery(mDb); mFavoriteSeriesPartsQuery->prepare("SELECT iseriesparts_id, iseriespart, tsubtitle FROM seriesparts WHERE iseries_id = :id AND bfavorite = true"); + mUpdateGenericTemplate = QString("UPDATE seriesparts SET %1 = :value WHERE iseriesparts_id = :id"); + mUpdateGenericMap.insert(Favorite, "bfavorite"); + mUpdateGenericMap.insert(Subtitle, "tsubtitle"); + mUpdateGenericMap.insert(SeriesPart, "iseriespart"); populate(); } @@ -56,7 +58,6 @@ SeriesTreeModel::~SeriesTreeModel(){ delete mSeriesPartsQuery; delete mUpdateSeriesIdQuery; delete mUpdateSeriesNameQuery; - delete mUpdateFavoriteQuery; delete mDeleteSeriesQuery; delete mDeleteSeriesPartQuery; delete mSeriesInsertQuery; @@ -146,6 +147,9 @@ QVariant SeriesTreeModel::data(const QModelIndex &index, int role) const{ if(role == FavoriteRole){ return item->data(Favorite); } + if(role == SubtitleRole){ + return item->data(Subtitle); + } return QVariant(); } @@ -171,11 +175,11 @@ bool SeriesTreeModel::setData(const QModelIndex &index, const QVariant &value, i return renameSeries(index, value); } } - }else if(index.data(TypeRole).toInt() == NewSeries){ - return setNewSeries(index, value); } - }else if(index.column() == Favorite){ - return setFavorite(index, value); + }else if(index.data(TypeRole).toInt() == NewSeries){ + return setNewSeries(index, value); + }else{ + return updateGeneric(index, value); } } return false; @@ -618,15 +622,22 @@ bool SeriesTreeModel::setNewSeries(const QModelIndex &source, const QVariant &va return false; } -bool SeriesTreeModel::setFavorite(const QModelIndex &source, const QVariant &value){ +bool SeriesTreeModel::updateGeneric(const QModelIndex &source, const QVariant &value){ + int column = source.column(); + if(!mUpdateGenericMap.contains(column)){ + return false; + } SmTreeItem *item = static_cast<SmTreeItem*>(source.internalPointer()); + QString table = mUpdateGenericMap.value(column); + QString queryString = QString(mUpdateGenericTemplate).arg(table); mDb.transaction(); - mUpdateFavoriteQuery->bindValue(":fav", value); - mUpdateFavoriteQuery->bindValue(":id", item->data(SeriesPartId)); - if(mUpdateFavoriteQuery->exec()){ - item->setData(Favorite, value); - QModelIndex start = index(source.row(), 0, source.parent()); - emit dataChanged(start, source); + QSqlQuery query(mDb); + query.prepare(queryString); + query.bindValue(":id", item->data(SeriesPartId)); + query.bindValue(":value", value); + if(query.exec()){ + item->setData(column, value); + emit dataChanged(source, source); mDb.commit(); return true; } diff --git a/seriestreemodel.h b/seriestreemodel.h index 2e07706..8488cd7 100644 --- a/seriestreemodel.h +++ b/seriestreemodel.h @@ -65,13 +65,16 @@ class SeriesTreeModel : public SmTreeModel { bool mergeSeries(const QModelIndex &from, const QModelIndex &to); bool renameSeries(const QModelIndex &source, const QVariant &value); bool setNewSeries(const QModelIndex &source, const QVariant &value); - bool setFavorite(const QModelIndex &source, const QVariant &value); + bool updateGeneric(const QModelIndex &source, const QVariant &value); + //bool setFavorite(const QModelIndex &source, const QVariant &value); + //bool setSubtitle(const QModelIndex &source, const QVariant &value); QString archivePath(const QString &fileName, const QString &md5sum) const; QSqlDatabase mDb; QSqlQuery *mSeriesPartsQuery; QSqlQuery *mUpdateSeriesIdQuery; QSqlQuery *mUpdateSeriesNameQuery; QSqlQuery *mUpdateFavoriteQuery; + QSqlQuery *mUpdateSubtitleQuery; QSqlQuery *mDeleteSeriesQuery; QSqlQuery *mDeleteSeriesPartQuery; QSqlQuery *mSeriesInsertQuery; @@ -84,7 +87,9 @@ class SeriesTreeModel : public SmTreeModel { QSqlQuery *mFavoriteSeriesIdQuery; QSqlQuery *mFavoriteSeriesPartsQuery; QHash<int, int> mSeriesPartSeriesMap; + QHash<int, QString> mUpdateGenericMap; QColor mFavoriteColor; + QString mUpdateGenericTemplate; }; #endif // SERIESTREEMODEL_H diff --git a/seriestreewidget.cpp b/seriestreewidget.cpp index 5b25f0f..e57905f 100644 --- a/seriestreewidget.cpp +++ b/seriestreewidget.cpp @@ -30,6 +30,12 @@ #include <QSqlQuery> #include <QSqlDatabase> #include <QThread> +#include <QGroupBox> +#include <QFormLayout> +#include <QCheckBox> +#include <QSpinBox> +#include <QFontMetrics> +#include <QApplication> #include "seriestreewidget.h" #include "smtreemodel.h" @@ -339,9 +345,9 @@ void SeriesTreeWidget::expandItems(const QStringList &items){ void SeriesTreeWidget::editItem(){ QModelIndex current = mView->selectionModel()->currentIndex(); - if(current.isValid()){ - mView->edit(current); - } + QModelIndex real = mProxy->mapToSource(current); + EditSeriesDialog dlg(real, this); + dlg.exec(); } void SeriesTreeWidget::producerFinished(QStringListModel *model){ @@ -546,6 +552,85 @@ void AddCoverDialog::typeChanged(const QString &type){ } } +EditSeriesDialog::EditSeriesDialog(const QModelIndex &idx, QWidget *parent) : QDialog(parent), mIdx(idx) { + //title + subtitle + QGroupBox *seriesTitleBox = new QGroupBox(tr("Title")); + mTitle = new QLineEdit; + QString title = mIdx.data(SeriesTreeModel::NameRole).toString(); + QFontMetrics fm(qApp->font()); + int titleWidth = fm.width(title); + mTitle->setMinimumWidth(titleWidth + fm.maxWidth()); + mTitle->setText(title); + QFormLayout *titleLayout = new QFormLayout; + titleLayout->addRow(tr("&Title"), mTitle); + mSubtitle = new QLineEdit; + mSubtitle->setEnabled(false); + int type = mIdx.data(SeriesTreeModel::TypeRole).toInt(); + if(type == SeriesTreeModel::Part){ + titleLayout->addRow(tr("&Subtitle"), mSubtitle); + mSubtitle->setEnabled(true); + mSubtitle->setText(mIdx.data(SeriesTreeModel::SubtitleRole).toString()); + mTitle->setEnabled(false); + } + seriesTitleBox->setLayout(titleLayout); + + //seriespart + favorite + QGroupBox *partDataBox = new QGroupBox(tr("Other data")); + QHBoxLayout *partNoLayout = new QHBoxLayout; + mPartNo = new QSpinBox; + mPartNo->setMinimum(1); + mPartNo->setValue(mIdx.data(SeriesTreeModel::SeriesPartRole).toInt()); + mHasPartNo = new QCheckBox(tr("Element has Part no.")); + connect(mHasPartNo, SIGNAL(stateChanged(int)), this, SLOT(hasPartNoStateChanged(int))); + mHasPartNo->setChecked(mIdx.data(SeriesTreeModel::SeriesPartRole).toInt()); + partNoLayout->addWidget(mHasPartNo); + partNoLayout->addStretch(); + partNoLayout->addWidget(mPartNo); + mFavorite = new QCheckBox(tr("Favorite")); + mFavorite->setChecked(mIdx.data(SeriesTreeModel::FavoriteRole).toBool()); + QVBoxLayout *partDataLayout = new QVBoxLayout; + partDataLayout->addLayout(partNoLayout); + partDataLayout->addWidget(mFavorite); + partDataBox->setLayout(partDataLayout); + + //buttons + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->addStretch(); + mOk = new QPushButton(tr("Ok")); + connect(mOk, SIGNAL(clicked()), this, SLOT(accept())); + 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->addWidget(seriesTitleBox); + mainLayout->addWidget(partDataBox); + partDataBox->setVisible(type == SeriesTreeModel::Part); + mainLayout->addLayout(buttonLayout); + setLayout(mainLayout); +} + +void EditSeriesDialog::accept(){ + SeriesTreeModel *model = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); + QModelIndex favoriteIdx = model->index(mIdx.row(), SeriesTreeModel::Favorite, mIdx.parent()); + model->setData(favoriteIdx, (mFavorite->checkState() == Qt::Checked), Qt::EditRole); + QModelIndex titleIdx = model->index(mIdx.row(), SeriesTreeModel::Name, mIdx.parent()); + model->setData(titleIdx, mTitle->text().toLower().trimmed(), Qt::EditRole); + QModelIndex subtitleIdx = model->index(mIdx.row(), SeriesTreeModel::Subtitle, mIdx.parent()); + model->setData(subtitleIdx, mSubtitle->text().toLower().trimmed(), Qt::EditRole); + bool hasPartNo = mHasPartNo->isChecked(); + int partNo = hasPartNo ? mPartNo->value() : 0; + QModelIndex partNoIdx = model->index(mIdx.row(), SeriesTreeModel::SeriesPart, mIdx.parent()); + model->setData(partNoIdx, partNo, Qt::EditRole); + QDialog::accept(); +} + +void EditSeriesDialog::hasPartNoStateChanged(int state){ + mPartNo->setEnabled(state == Qt::Checked); +} + CompleterProducer::CompleterProducer(int Mode, QObject *parent) : QObject(parent), mMode(Mode){ mDb = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), "complprod"); mDb.open(); diff --git a/seriestreewidget.h b/seriestreewidget.h index 2fd7b29..18964d0 100644 --- a/seriestreewidget.h +++ b/seriestreewidget.h @@ -14,6 +14,7 @@ #include <QDialog> #include <QSqlDatabase> #include <QHash> +#include <QPersistentModelIndex> class QLineEdit; class QPushButton; @@ -25,6 +26,8 @@ class QCompleter; class QStringListModel; class QSqlQuery; class QThread; +class QCheckBox; +class QSpinBox; class SeriesTreeModel; class SeriesTreeView; class SeriesTreeSortModel; @@ -139,6 +142,28 @@ class AddCoverDialog : public QDialog { FilesTreeModel *mFilesModel; }; +class EditSeriesDialog : public QDialog { + Q_OBJECT + public: + explicit EditSeriesDialog(const QModelIndex &idx, QWidget *parent = 0); + + public slots: + void accept(); + + private slots: + void hasPartNoStateChanged(int state); + + private: + QLineEdit *mTitle; + QLineEdit *mSubtitle; + QCheckBox *mFavorite; + QCheckBox *mHasPartNo; + QSpinBox *mPartNo; + QPushButton *mOk; + QPushButton *mCancel; + const QPersistentModelIndex mIdx; +}; + class CompleterProducer : public QObject { Q_OBJECT public: |