diff --git a/YACReaderLibrary/db/data_base_management.cpp b/YACReaderLibrary/db/data_base_management.cpp index 6b0e8a4b..d545c277 100644 --- a/YACReaderLibrary/db/data_base_management.cpp +++ b/YACReaderLibrary/db/data_base_management.cpp @@ -246,7 +246,7 @@ bool DataBaseManagement::createV8Tables(QSqlDatabase &database) queryReadingList.prepare("CREATE TABLE reading_list (" "id INTEGER PRIMARY KEY, " "parentId INTEGER, " - "ordering INTEGER, " //only use it if the parentId is NULL + "ordering INTEGER DEFAULT 0, " //only use it if the parentId is NULL "name TEXT NOT NULL, " "finished BOOLEAN DEFAULT 0, " "completed BOOLEAN DEFAULT 1, " diff --git a/YACReaderLibrary/db/reading_list_item.cpp b/YACReaderLibrary/db/reading_list_item.cpp index 2f89c1d8..9991b62f 100644 --- a/YACReaderLibrary/db/reading_list_item.cpp +++ b/YACReaderLibrary/db/reading_list_item.cpp @@ -122,6 +122,15 @@ void ReadingListItem::appendChild(ReadingListItem *item) childItems.append(item); else { + if(item->parent->getId()==0) //sort by name, top level child + { + + } + else + { + + } + /*ReadingListItem * last = childItems.back(); QString nameLast = last->data(1).toString(); //TODO usar info name si est� disponible, sino el nombre del fichero..... QString nameCurrent = item->data(1).toString(); @@ -163,6 +172,11 @@ void ReadingListItem::setName(const QString &name) itemData[0] = name; } +QList ReadingListItem::children() +{ + return childItems; +} + int ReadingListItem::row() const { if (parent) diff --git a/YACReaderLibrary/db/reading_list_item.h b/YACReaderLibrary/db/reading_list_item.h index 9f7399fa..f68865d9 100644 --- a/YACReaderLibrary/db/reading_list_item.h +++ b/YACReaderLibrary/db/reading_list_item.h @@ -56,6 +56,7 @@ public: qulonglong getId() const; QString name() const; void setName(const QString & name); + QList children(); private: QList childItems; diff --git a/YACReaderLibrary/db/reading_list_model.cpp b/YACReaderLibrary/db/reading_list_model.cpp index e59351f1..ded924a3 100644 --- a/YACReaderLibrary/db/reading_list_model.cpp +++ b/YACReaderLibrary/db/reading_list_model.cpp @@ -156,7 +156,7 @@ QModelIndex ReadingListModel::parent(const QModelIndex &index) const return QModelIndex(); } -void ReadingListModel::setupModelData(QString path) +void ReadingListModel::setupReadingListsData(QString path) { beginResetModel(); @@ -194,12 +194,48 @@ void ReadingListModel::addNewLabel(const QString &name, YACReader::LabelColors c QSqlDatabase::removeDatabase(_databasePath); } +void ReadingListModel::addReadingList(const QString &name) +{ + QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); + + qulonglong id = DBHelper::insertReadingList(name,db); + ReadingListItem * newItem; + rootItem->appendChild(newItem = new ReadingListItem(QList() + << name + << id + << false + << true + << 0)); + + items.insert(id, newItem); + + int pos = rootItem->children().indexOf(newItem); + + pos += specialLists.count()+1+labels.count()+labels.count()>0?1:0; + + beginInsertRows(QModelIndex(), pos, pos); + endInsertRows(); + + QSqlDatabase::removeDatabase(_databasePath); +} + +void ReadingListModel::addReadingListAt(const QString &name, const QModelIndex &mi) +{ + +} + bool ReadingListModel::isEditable(const QModelIndex &mi) { ListItem * item = static_cast(mi.internalPointer()); return typeid(*item) != typeid(SpecialListItem); } +bool ReadingListModel::isReadingList(const QModelIndex &mi) +{ + ListItem * item = static_cast(mi.internalPointer()); + return typeid(*item) == typeid(ReadingListItem); +} + QString ReadingListModel::name(const QModelIndex &mi) { return data(mi,Qt::DisplayRole).toString(); @@ -219,16 +255,22 @@ void ReadingListModel::rename(const QModelIndex &mi, const QString &name) ReadingListItem * rli = static_cast(item); rli->setName(name); DBHelper::renameList(item->getId(), name, db); + + if(rli->parent->getId()!=0) + { + //TODO + //move row depending on the name + }else + emit dataChanged(index(mi.row(), 0), index(mi.row(), 0)); } else if(typeid(*item) == typeid(LabelItem)) { LabelItem * li = static_cast(item); li->setName(name); DBHelper::renameLabel(item->getId(), name, db); + emit dataChanged(index(mi.row(), 0), index(mi.row(), 0)); } - emit dataChanged(index(mi.row(), 0), index(mi.row(), 0)); - QSqlDatabase::removeDatabase(_databasePath); } @@ -255,19 +297,42 @@ void ReadingListModel::cleanAll() rootItem = 0; } -void ReadingListModel::setupModelData(QSqlQuery &sqlquery, ReadingListItem *parent) +void ReadingListModel::setupReadingListsData(QSqlQuery &sqlquery, ReadingListItem *parent) { + items.insert(parent->getId(),parent); + while (sqlquery.next()) + { + QSqlRecord record = sqlquery.record(); + ReadingListItem * rli = new ReadingListItem(QList() + << record.value("name") + << record.value("id") + << record.value("finished") + << record.value("completed") + << record.value("ordering")); + + ReadingListItem * currentParent; + if(record.value("parentId").isNull()) + currentParent = rootItem; + else + currentParent = items.value(record.value("parentId").toULongLong()); + + parent->appendChild(rli); + + items.insert(rli->getId(),rli); + } } QList ReadingListModel::setupSpecialLists(QSqlDatabase & db) { QList list; - QSqlQuery selectQuery("SELECT * FROM default_reading_list ORDER BY id",db); + QSqlQuery selectQuery("SELECT * FROM default_reading_list ORDER BY id,name",db); while(selectQuery.next()) { QSqlRecord record = selectQuery.record(); - list << new SpecialListItem(QList() << record.value("name") << record.value("id")); + list << new SpecialListItem(QList() + << record.value("name") + << record.value("id")); } //Reading after Favorites, Why? Because I want :P @@ -307,14 +372,19 @@ QList ReadingListModel::setupLabels(QSqlDatabase & db) void ReadingListModel::setupReadingLists(QSqlDatabase & db) { //setup root item - rootItem = new ReadingListItem(QList() /*<< 0*/ << "ROOT" << "atr"); + rootItem = new ReadingListItem(QList() << "ROOT" << 0 << true << false); + + QSqlQuery selectQuery("select * from reading_list order by parentId,name",db); //setup reading lists - ReadingListItem * node1; - rootItem->appendChild(node1 = new ReadingListItem(QList() /*<< 0*/ << "My reading list" << "atr")); - rootItem->appendChild(new ReadingListItem(QList() /*<< 0*/ << "X timeline" << "atr")); + setupReadingListsData(selectQuery,rootItem); - node1->appendChild(new ReadingListItem(QList() /*<< 0*/ << "sublist" << "atr",node1)); + //TEST +// ReadingListItem * node1; +// rootItem->appendChild(node1 = new ReadingListItem(QList() /*<< 0*/ << "My reading list" << "atr")); +// rootItem->appendChild(new ReadingListItem(QList() /*<< 0*/ << "X timeline" << "atr")); + +// node1->appendChild(new ReadingListItem(QList() /*<< 0*/ << "sublist" << "atr",node1)); } int ReadingListModel::addLabelIntoList(LabelItem *item) diff --git a/YACReaderLibrary/db/reading_list_model.h b/YACReaderLibrary/db/reading_list_model.h index 88c69692..8579927a 100644 --- a/YACReaderLibrary/db/reading_list_model.h +++ b/YACReaderLibrary/db/reading_list_model.h @@ -32,9 +32,12 @@ public: QModelIndex parent(const QModelIndex &index) const; //Convenience methods - void setupModelData(QString path); + void setupReadingListsData(QString path); void addNewLabel(const QString & name, YACReader::LabelColors color); + void addReadingList(const QString & name);//top level reading list + void addReadingListAt(const QString & name, const QModelIndex & mi); bool isEditable(const QModelIndex & mi); + bool isReadingList(const QModelIndex & mi); QString name(const QModelIndex & mi); void rename(const QModelIndex & mi, const QString & name); @@ -45,7 +48,7 @@ public slots: private: void cleanAll(); - void setupModelData(QSqlQuery &sqlquery, ReadingListItem *parent); + void setupReadingListsData(QSqlQuery &sqlquery, ReadingListItem *parent); QList setupSpecialLists(QSqlDatabase &db); QList setupLabels(QSqlDatabase &db); void setupReadingLists(QSqlDatabase &db); diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index 373bebbc..10d69a37 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -389,6 +389,16 @@ qulonglong DBHelper::insertLabel(const QString &name, YACReader::LabelColors col query.exec(); return query.lastInsertId().toULongLong(); } + +qulonglong DBHelper::insertReadingList(const QString &name, QSqlDatabase &db) +{ + QSqlQuery query(db); + query.prepare("INSERT INTO reading_list (name) " + "VALUES (:name)"); + query.bindValue(":name", name); + query.exec(); + return query.lastInsertId().toULongLong(); +} //queries QList DBHelper::getFoldersFromParent(qulonglong parentId, QSqlDatabase & db, bool sort) { diff --git a/YACReaderLibrary/db_helper.h b/YACReaderLibrary/db_helper.h index 47485b48..01c4cc1f 100644 --- a/YACReaderLibrary/db_helper.h +++ b/YACReaderLibrary/db_helper.h @@ -38,6 +38,7 @@ public: static qulonglong insert(Folder * folder, QSqlDatabase & db); static qulonglong insert(ComicDB * comic, QSqlDatabase & db); static qulonglong insertLabel(const QString & name, YACReader::LabelColors color , QSqlDatabase & db); + static qulonglong insertReadingList(const QString & name, QSqlDatabase & db); //updates static void update(qulonglong libraryId, ComicInfo & comicInfo); static void update(ComicDB * comics, QSqlDatabase & db); diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index 0a8bf194..ebc37479 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -1212,7 +1212,7 @@ void LibraryWindow::loadLibrary(const QString & name) foldersModel->setupModelData(path); foldersView->setModel(foldersModel); - listsModel->setupModelData(path); + listsModel->setupReadingListsData(path); listsView->setModel(listsModel); if(foldersModel->rowCount(QModelIndex())>0) @@ -1628,7 +1628,20 @@ void LibraryWindow::errorDeletingFolder() void LibraryWindow::addNewReadingList() { + bool ok; + QString newListName = QInputDialog::getText(this, tr("Add new reading lists"), + tr("List name:"), QLineEdit::Normal, + "", &ok); + if (ok) { + QModelIndexList selectedLists = listsView->selectionModel()->selectedIndexes(); + if(selectedLists.isEmpty() || listsModel->isReadingList(selectedLists.at(0))) + listsModel->addReadingList(newListName); //top level + else + { + listsModel->addReadingListAt(newListName,selectedLists.at(0)); + } + } } void LibraryWindow::deleteSelectedReadingList()