summaryrefslogtreecommitdiffstats
path: root/seriestreemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'seriestreemodel.cpp')
-rw-r--r--seriestreemodel.cpp188
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);
+}