summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--seriestreemodel.cpp39
-rw-r--r--seriestreemodel.h7
-rw-r--r--seriestreewidget.cpp91
-rw-r--r--seriestreewidget.h25
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: