summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--seriestreemodel.cpp120
-rw-r--r--seriestreemodel.h4
-rw-r--r--seriestreewidget.cpp7
3 files changed, 90 insertions, 41 deletions
diff --git a/seriestreemodel.cpp b/seriestreemodel.cpp
index 0edbd8e..eb6022b 100644
--- a/seriestreemodel.cpp
+++ b/seriestreemodel.cpp
@@ -24,6 +24,8 @@ SeriesTreeModel::SeriesTreeModel(QStringList &headers, QObject *parent) : SmTree
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");
+ mSeriesInsertQuery = new QSqlQuery(mDb);
+ mSeriesInsertQuery->prepare("INSERT INTO series(tseries_name) VALUES(:name)");
populate();
}
@@ -32,6 +34,7 @@ SeriesTreeModel::~SeriesTreeModel(){
delete mUpdateSeriesIdQuery;
delete mUpdateSeriesNameQuery;
delete mDeleteSeriesQuery;
+ delete mSeriesInsertQuery;
mDb.close();
mDb = QSqlDatabase();
}
@@ -57,7 +60,7 @@ QVariant SeriesTreeModel::data(const QModelIndex &index, int role) const{
if(role == Qt::DisplayRole){
if(index.column() == Name){
int type = index.data(TypeRole).toInt();
- if(type == Series){
+ if(type == Series || type == NewSeries){
return item->data(Name);
}else if(type == Part){
QString retval = QString("%1 %2").arg(item->data(Name).toString()).arg(item->data(SeriesPart).toInt());
@@ -75,7 +78,7 @@ QVariant SeriesTreeModel::data(const QModelIndex &index, int role) const{
}
}
if(role == Qt::EditRole){
- if(index.data(TypeRole) == Series){
+ if(index.data(TypeRole) == Series || index.data(TypeRole) == NewSeries){
if(index.column() == 0){
return item->data(Name);
}
@@ -104,54 +107,25 @@ bool SeriesTreeModel::setData(const QModelIndex &index, const QVariant &value, i
return false;
}
if(role == Qt::EditRole){
- if(index.data(Type).toInt() == Series){
+ if(index.data(TypeRole).toInt() == Series){
//change of series name
if(index.column() == Name){
QModelIndex newSeries = findValue(value, index.parent(), index.column());
if(newSeries == index){
+ //no change made, exit gracefully
return false;
}
- int oldSeriesId = index.data(SeriesIdRole).toInt();
+ //int oldSeriesId = index.data(SeriesIdRole).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{
- return false;
- }
+ //series already exists, merge
+ return mergeSeries(index, newSeries);
}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);
- emit needResort();
- return true;
- }
+ return renameSeries(index, value);
}
-
}
+ }else if(index.data(TypeRole).toInt() == NewSeries){
+ return setNewSeries(index, value);
}
}
return false;
@@ -190,3 +164,71 @@ void SeriesTreeModel::populate(){
}
setRoot(rootItem);
}
+
+bool SeriesTreeModel::mergeSeries(const QModelIndex &from, const QModelIndex &to){
+ //new series name already exists
+ int oldSeriesId = from.data(SeriesIdRole).toInt();
+ int newSeriesId = to.data(SeriesIdRole).toInt();
+ mUpdateSeriesIdQuery->bindValue(":oldid", oldSeriesId);
+ mUpdateSeriesIdQuery->bindValue(":newid", newSeriesId);
+ if(mUpdateSeriesIdQuery->exec()){
+ SmTreeItem *oldParent = static_cast<SmTreeItem*>(from.internalPointer());
+ SmTreeItem *newParent = static_cast<SmTreeItem*>(to.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, to.data(NameRole));
+ newParent->appendChild(curItem);
+ oldParent->removeChild(i, false);
+ }
+ mDeleteSeriesQuery->bindValue(":id", oldSeriesId);
+ if(mDeleteSeriesQuery->exec()){
+ //series has to be empty
+ root()->removeChild(from.row());
+ }
+ reset();
+ return true;
+ }
+ return false;
+}
+
+bool SeriesTreeModel::renameSeries(const QModelIndex &source, const QVariant &value){
+ int oldSeriesId = source.data(SeriesIdRole).toInt();
+ mUpdateSeriesNameQuery->bindValue(":newname", value);
+ mUpdateSeriesNameQuery->bindValue(":id", oldSeriesId);
+ if(mUpdateSeriesNameQuery->exec()){
+ SmTreeItem *curItem = static_cast<SmTreeItem*>(source.internalPointer());
+ curItem->setData(Name, value);
+ emit dataChanged(source, source);
+ emit needResort();
+ return true;
+ }
+ return false;
+}
+
+bool SeriesTreeModel::setNewSeries(const QModelIndex &source, const QVariant &value){
+ QString newName = value.toString();
+ if(newName.isEmpty()){
+ return false;
+ }
+ SmTreeItem *item = static_cast<SmTreeItem*>(source.internalPointer());
+ mDb.transaction();
+ mSeriesInsertQuery->bindValue(":name", value);
+ if(mSeriesInsertQuery->exec()){
+ QSqlQuery lastId("SELECT currval('series_iseries_id__seq')", mDb);
+ if(lastId.next()){
+ int newId = lastId.value(0).toInt();
+ item->setData(Name, value);
+ item->setData(SeriesId, newId);
+ item->setData(Type, Series);
+ QModelIndex end = index(source.row(), item->childCount() - 1, source.parent());
+ emit dataChanged(source, end);
+ emit needResort();
+ mDb.commit();
+ return true;
+ }
+ }
+ mDb.rollback();
+ return false;
+}
diff --git a/seriestreemodel.h b/seriestreemodel.h
index 507761c..f2a6f9f 100644
--- a/seriestreemodel.h
+++ b/seriestreemodel.h
@@ -36,11 +36,15 @@ class SeriesTreeModel : public SmTreeModel {
private:
void populate();
+ bool mergeSeries(const QModelIndex &from, const QModelIndex &to);
+ bool renameSeries(const QModelIndex &source, const QVariant &value);
+ bool setNewSeries(const QModelIndex &source, const QVariant &value);
QSqlDatabase mDb;
QSqlQuery *mSeriesPartsQuery;
QSqlQuery *mUpdateSeriesIdQuery;
QSqlQuery *mUpdateSeriesNameQuery;
QSqlQuery *mDeleteSeriesQuery;
+ QSqlQuery *mSeriesInsertQuery;
};
#endif // SERIESTREEMODEL_H
diff --git a/seriestreewidget.cpp b/seriestreewidget.cpp
index 5fb7d2c..816a293 100644
--- a/seriestreewidget.cpp
+++ b/seriestreewidget.cpp
@@ -58,11 +58,13 @@ SeriesTreeWidget::SeriesTreeWidget(QWidget *parent) : QWidget(parent){
void SeriesTreeWidget::newSeries(){
QList<QVariant> data;
- data << tr("<New series>") << -1 << -1 << 0 << SeriesTreeModel::NewSeries;
+ data << tr("<New series>") << QVariant() << QVariant() << QVariant() << SeriesTreeModel::NewSeries;
if(mModel->addRow(data, QModelIndex())){
QModelIndex newRow = mModel->index(mModel->rowCount(QModelIndex()) - 1, 0, QModelIndex());
if(newRow.isValid()){
- mView->edit(newRow);
+ QModelIndex proxyIndex = mProxy->mapFromSource(newRow);
+ mView->selectionModel()->setCurrentIndex(proxyIndex, QItemSelectionModel::ClearAndSelect);
+ mView->edit(proxyIndex);
}
}
}
@@ -73,6 +75,7 @@ void SeriesTreeWidget::filter(){
void SeriesTreeWidget::resort(){
mView->sortByColumn(0, mProxy->sortOrder());
+ mView->scrollTo(mView->selectionModel()->currentIndex(), QAbstractItemView::PositionAtCenter);
}
SeriesTreeView::SeriesTreeView(QWidget *parent) : QTreeView(parent) {}