diff options
Diffstat (limited to 'seriestreemodel.cpp')
-rw-r--r-- | seriestreemodel.cpp | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/seriestreemodel.cpp b/seriestreemodel.cpp new file mode 100644 index 0000000..53098d1 --- /dev/null +++ b/seriestreemodel.cpp @@ -0,0 +1,188 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#include <QSqlQuery> +#include <QSqlError> +#include <QIcon> + +#include <QDebug> + +#include "seriestreemodel.h" +#include "smtreeitem.h" + +SeriesTreeModel::SeriesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent){ + mDb = QSqlDatabase::database("treedb"); + mSeriesPartsQuery = new QSqlQuery(mDb); + mSeriesPartsQuery->prepare("SELECT iseriesparts_id, iseriespart FROM seriesparts WHERE iseries_id = :id ORDER BY iseriespart"); + mUpdateSeriesIdQuery = new QSqlQuery(mDb); + mUpdateSeriesIdQuery->prepare("UPDATE series SET iseries_id = :newid WHERE iseries_id = :oldid"); + mUpdateSeriesNameQuery = new QSqlQuery(mDb); + mUpdateSeriesNameQuery->prepare("UPDATE series SET tseries_name = :newname WHERE iseries_id = :id"); + mDeleteSeriesQuery = new QSqlQuery(mDb); + mDeleteSeriesQuery->prepare("DELETE FROM series where iseries_id = :id"); + populate(); +} + +SeriesTreeModel::~SeriesTreeModel(){ + qDebug() << "dtor!"; + delete mSeriesPartsQuery; + delete mUpdateSeriesIdQuery; + delete mUpdateSeriesNameQuery; + delete mDeleteSeriesQuery; + mDb.close(); + QSqlDatabase::removeDatabase("treedb"); +} + +Qt::ItemFlags SeriesTreeModel::flags(const QModelIndex &index) const{ + if(!index.isValid()){ + return 0; + } + Qt::ItemFlags retval = Qt::ItemIsEnabled | Qt::ItemIsSelectable; + if(index.data(TypeRole).toInt() == Series){ + return retval | Qt::ItemIsEditable; + } + return retval; +} + +QVariant SeriesTreeModel::data(const QModelIndex &index, int role) const{ + if(!index.isValid()){ + return QVariant(); + } + + SmTreeItem *item = static_cast<SmTreeItem*>(index.internalPointer()); + + if(role == Qt::DisplayRole){ + if(index.column() == Name){ + int type = index.data(TypeRole).toInt(); + if(type == Series){ + return item->data(Name); + }else if(type == Part){ + QString retval = QString("%1 %2").arg(item->data(Name).toString()).arg(item->data(SeriesPart).toInt()); + return retval; + }else{ + return QVariant(); + } + }else{ + return item->data(index.column()); + } + } + if(role == Qt::DecorationRole){ + if(index.column() == 0){ + return QIcon(":/dildo.png"); + } + } + if(role == Qt::EditRole){ + if(index.data(TypeRole) == Series){ + if(index.column() == 0){ + return item->data(Name); + } + } + } + if(role == NameRole){ + return item->data(Name); + } + if(role == SeriesIdRole){ + return item->data(SeriesId); + } + if(role == SeriesPartIdRole){ + return item->data(SeriesPartId); + } + if(role == SeriesPartRole){ + return item->data(SeriesPart); + } + if(role == TypeRole){ + return item->data(Type); + } + return QVariant(); +} + +bool SeriesTreeModel::setData(const QModelIndex &index, const QVariant &value, int role){ + if(!index.isValid()){ + return false; + } + if(role == Qt::EditRole){ + if(index.data(Type).toInt() == Series){ + //change of series name + if(index.column() == Name){ + QModelIndex newSeries = findValue(value, index.parent(), index.column()); + int oldSeriesId = index.data(SeriesId).toInt(); + if(newSeries != QModelIndex()){ + //new series name already exists + int newSeriesId = newSeries.data(SeriesIdRole).toInt(); + mUpdateSeriesIdQuery->bindValue(":oldid", oldSeriesId); + mUpdateSeriesIdQuery->bindValue(":newid", newSeriesId); + if(mUpdateSeriesIdQuery->exec()){ + SmTreeItem *oldParent = static_cast<SmTreeItem*>(index.internalPointer()); + SmTreeItem *newParent = static_cast<SmTreeItem*>(newSeries.internalPointer()); + //reparent items to new series + for(int i = oldParent->childCount() - 1; i > -1; --i){ + SmTreeItem *curItem = oldParent->child(i); + curItem->setParent(newParent); + curItem->setData(Name, value); + newParent->appendChild(curItem); + oldParent->removeChild(i, false); + } + mDeleteSeriesQuery->bindValue(":id", oldSeriesId); + if(mDeleteSeriesQuery->exec()){ + //series has to be empty + root()->removeChild(index.row()); + } + reset(); + return true; + } + }else{ + //rename series + mUpdateSeriesNameQuery->bindValue(":newname", value); + mUpdateSeriesNameQuery->bindValue(":id", oldSeriesId); + if(mUpdateSeriesNameQuery->exec()){ + SmTreeItem *curItem = static_cast<SmTreeItem*>(index.internalPointer()); + curItem->setData(Name, value); + emit dataChanged(index, index); + mDb.commit(); + return true; + } + } + + } + } + } + return false; +} + +QModelIndex SeriesTreeModel::findValue(const QVariant &value, const QModelIndex &parent, int column) const{ + SmTreeItem *parentItem = root(); + if(parent != QModelIndex()){ + parentItem = static_cast<SmTreeItem*>(parent.internalPointer()); + } + for(int i = 0; i < parentItem->childCount(); ++i){ + SmTreeItem *childItem = parentItem->child(i); + if(value == childItem->data(column)){ + return createIndex(i, column, childItem); + } + } + return QModelIndex(); +} + +void SeriesTreeModel::populate(){ + QSqlQuery seriesQuery = QSqlQuery("SELECT iseries_id, tseries_name FROM series ORDER BY tseries_name", mDb); + SmTreeItem *rootItem = new SmTreeItem(5); + while(seriesQuery.next()){ + QList<QVariant> seriesData; + seriesData << seriesQuery.value(1) << seriesQuery.value(0) << QVariant() << QVariant() << Series; + SmTreeItem *seriesItem = new SmTreeItem(seriesData, rootItem); + rootItem->appendChild(seriesItem); + mSeriesPartsQuery->bindValue(":id", seriesData.at(1)); + mSeriesPartsQuery->exec(); + while(mSeriesPartsQuery->next()){ + QList<QVariant> partData; + partData << seriesData.at(Name) << seriesData.at(SeriesId) << mSeriesPartsQuery->value(0) << mSeriesPartsQuery->value(1) << Part; + SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); + seriesItem->appendChild(partItem); + } + } + setRoot(rootItem); +} |