From c232f239d1988402c9c2d38fb1eb8a5295869010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 30 Nov 2014 16:30:01 +0100 Subject: [PATCH] added support for removing elements from a list --- YACReaderLibrary/db/comic_model.cpp | 69 ++++++++++++++++--- YACReaderLibrary/db/comic_model.h | 6 ++ YACReaderLibrary/db_helper.cpp | 64 +++++++++++++++++ YACReaderLibrary/db_helper.h | 4 ++ YACReaderLibrary/library_window.cpp | 67 ++++++++++++++---- YACReaderLibrary/library_window.h | 2 + .../yacreader_navigation_controller.cpp | 13 +++- .../yacreader_navigation_controller.h | 3 + 8 files changed, 204 insertions(+), 24 deletions(-) diff --git a/YACReaderLibrary/db/comic_model.cpp b/YACReaderLibrary/db/comic_model.cpp index 61cb7214..f1b84d01 100644 --- a/YACReaderLibrary/db/comic_model.cpp +++ b/YACReaderLibrary/db/comic_model.cpp @@ -801,16 +801,10 @@ void ComicModel::addComicsToFavorites(const QList & comicsList) { QList comics = getComics(comicsList); - DBHelper::insertComicsInFavorites(comics, QSqlDatabase()); - QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); - db.transaction(); - DBHelper::insertComicsInFavorites(comics,db); - db.commit(); - db.close(); QSqlDatabase::removeDatabase(_databasePath); } @@ -819,18 +813,71 @@ void ComicModel::addComicsToLabel(const QList &comicsList, qulonglo { QList comics = getComics(comicsList); - DBHelper::insertComicsInFavorites(comics, QSqlDatabase()); - QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); - db.transaction(); - DBHelper::insertComicsInLabel(comics,labelId,db); - db.commit(); + db.close(); + QSqlDatabase::removeDatabase(_databasePath); +} + +void ComicModel::deleteComicsFromFavorites(const QList &comicsList) +{ + QList comics = getComics(comicsList); + + QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); + + DBHelper::deleteComicsFromFavorites(comics,db); db.close(); QSqlDatabase::removeDatabase(_databasePath); + + deleteComicsFromModel(comicsList); + +} + +void ComicModel::deleteComicsFromLabel(const QList &comicsList, qulonglong labelId) +{ + QList comics = getComics(comicsList); + + QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); + + DBHelper::deleteComicsFromLabel(comics,labelId,db); + + db.close(); + QSqlDatabase::removeDatabase(_databasePath); + + deleteComicsFromModel(comicsList); +} + +void ComicModel::deleteComicsFromReadingList(const QList &comicsList, qulonglong readingListId) +{ + QList comics = getComics(comicsList); + + QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); + + DBHelper::deleteComicsFromReadingList(comics,readingListId,db); + + db.close(); + QSqlDatabase::removeDatabase(_databasePath); + + deleteComicsFromModel(comicsList); +} + +void ComicModel::deleteComicsFromModel(const QList &comicsList) +{ + QListIterator it(comicsList); + it.toBack(); + while(it.hasPrevious()) + { + int row = it.previous().row(); + beginRemoveRows(QModelIndex(),row,row); + _data.removeAt(row); + endRemoveRows(); + } + + if(_data.isEmpty()) + emit isEmpty(); } diff --git a/YACReaderLibrary/db/comic_model.h b/YACReaderLibrary/db/comic_model.h index a05eb024..90f92891 100644 --- a/YACReaderLibrary/db/comic_model.h +++ b/YACReaderLibrary/db/comic_model.h @@ -65,6 +65,12 @@ public: void addComicsToFavorites(const QList &comicsList); void addComicsToLabel(const QList &comicsList, qulonglong labelId); + void deleteComicsFromFavorites(const QList &comicsList); + void deleteComicsFromLabel(const QList &comicsList, qulonglong labelId); + void deleteComicsFromReadingList(const QList &comicsList, qulonglong readingListId); + + void deleteComicsFromModel(const QList &comicsList); + QHash roleNames() const; enum Columns { diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index 0e1bb1bb..a41a4641 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -161,6 +161,62 @@ void DBHelper::removeListFromDB(qulonglong id, QSqlDatabase &db) query.exec(); } +void DBHelper::deleteComicsFromFavorites(const QList &comicsList, QSqlDatabase &db) +{ + db.transaction(); + + QLOG_DEBUG() << "deleteComicsFromFavorites----------------------------------"; + + QSqlQuery query(db); + query.prepare("DELETE FROM comic_default_reading_list WHERE comic_id = :comic_id AND default_reading_list_id = 1"); + foreach(ComicDB comic, comicsList) + { + query.bindValue(":comic_id", comic.id); + query.exec(); + } + + db.commit(); +} + +void DBHelper::deleteComicsFromLabel(const QList &comicsList, qulonglong labelId, QSqlDatabase &db) +{ + db.transaction(); + + QLOG_DEBUG() << "deleteComicsFromLabel----------------------------------"; + + QSqlQuery query(db); + query.prepare("DELETE FROM comic_label WHERE comic_id = :comic_id AND label_id = :label_id"); + foreach(ComicDB comic, comicsList) + { + query.bindValue(":comic_id", comic.id); + query.bindValue(":label_id", labelId); + query.exec(); + + QLOG_DEBUG() << "cid = " << comic.id << "lid = " << labelId; + QLOG_DEBUG() << query.lastError().databaseText() << "-" << query.lastError().driverText(); + } + + db.commit(); +} + +void DBHelper::deleteComicsFromReadingList(const QList &comicsList, qulonglong readingListId, QSqlDatabase &db) +{ + db.transaction(); + + QLOG_DEBUG() << "deleteComicsFromReadingList----------------------------------"; + + QSqlQuery query(db); + query.prepare("DELETE FROM comic_reading_list WHERE comic_id = :comic_id AND reading_list_id = :reading_list_id"); + foreach(ComicDB comic, comicsList) + { + query.bindValue(":comic_id", comic.id); + query.bindValue(":reading_list_id", readingListId); + query.exec(); + } + + db.commit(); +} + //updates void DBHelper::update(ComicDB * comic, QSqlDatabase & db) { @@ -423,6 +479,8 @@ void DBHelper::insertComicsInFavorites(const QList &comicsList, QSqlDat QSqlRecord record = getNumComicsInFavoritesQuery.record(); int numComics = record.value(0).toInt();*/ + db.transaction(); + QSqlQuery query(db); query.prepare("INSERT INTO comic_default_reading_list (default_reading_list_id, comic_id) " "VALUES (1, :comic_id)"); @@ -433,10 +491,14 @@ void DBHelper::insertComicsInFavorites(const QList &comicsList, QSqlDat //query.bindValue(":order", numComics++); query.exec(); } + + db.commit(); } void DBHelper::insertComicsInLabel(const QList &comicsList, qulonglong labelId, QSqlDatabase &db) { + db.transaction(); + QSqlQuery query(db); query.prepare("INSERT INTO comic_label (label_id, comic_id) " "VALUES (:label_id, :comic_id)"); @@ -447,6 +509,8 @@ void DBHelper::insertComicsInLabel(const QList &comicsList, qulonglong query.bindValue(":comic_id", comic.id); query.exec(); } + + db.commit(); } //queries QList DBHelper::getFoldersFromParent(qulonglong parentId, QSqlDatabase & db, bool sort) diff --git a/YACReaderLibrary/db_helper.h b/YACReaderLibrary/db_helper.h index 306a305f..148d21a8 100644 --- a/YACReaderLibrary/db_helper.h +++ b/YACReaderLibrary/db_helper.h @@ -36,6 +36,10 @@ public: static void removeFromDB(ComicDB * comic, QSqlDatabase & db); static void removeLabelFromDB(qulonglong id, QSqlDatabase & db); static void removeListFromDB(qulonglong id, QSqlDatabase & db); + //logic deletes + static void deleteComicsFromFavorites(const QList & comicsList, QSqlDatabase & db); + static void deleteComicsFromLabel(const QList & comicsList, qulonglong labelId, QSqlDatabase & db); + static void deleteComicsFromReadingList(const QList & comicsList, qulonglong readingListId, QSqlDatabase & db); //inserts static qulonglong insert(Folder * folder, QSqlDatabase & db); static qulonglong insert(ComicDB * comic, QSqlDatabase & db); diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index 4588ecb8..1a44262d 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -2510,26 +2510,38 @@ QModelIndexList LibraryWindow::getSelectedComics() void LibraryWindow::deleteComics() { - int ret = QMessageBox::question(this,tr("Delete comics"),tr("All the selected comics will be deleted from your disk. Are you sure?"),QMessageBox::Yes,QMessageBox::No); + //TODO + if(!listsView->selectionModel()->selectedRows().isEmpty()) + { + deleteComicsFromList(); + }else + { + deleteComicsFromDisk(); + } +} - if(ret == QMessageBox::Yes) - { +void LibraryWindow::deleteComicsFromDisk() +{ + int ret = QMessageBox::question(this,tr("Delete comics"),tr("All the selected comics will be deleted from your disk. Are you sure?"),QMessageBox::Yes,QMessageBox::No); - QModelIndexList indexList = getSelectedComics(); + if(ret == QMessageBox::Yes) + { + + QModelIndexList indexList = getSelectedComics(); QList comics = comicsModel->getComics(indexList); - QList paths; - QString libraryPath = currentPath(); - foreach(ComicDB comic, comics) - { + QList paths; + QString libraryPath = currentPath(); + foreach(ComicDB comic, comics) + { paths.append(libraryPath + comic.path); QLOG_INFO() << comic.path; QLOG_INFO() << comic.id; QLOG_INFO() << comic.parentId; - } + } - ComicsRemover * remover = new ComicsRemover(indexList,paths); + ComicsRemover * remover = new ComicsRemover(indexList,paths); QThread * thread = NULL; thread = new QThread(this); @@ -2542,10 +2554,10 @@ void LibraryWindow::deleteComics() connect(remover, SIGNAL(remove(int)), comicsModel, SLOT(remove(int))); connect(remover, SIGNAL(removeError()),this,SLOT(setRemoveError())); connect(remover, SIGNAL(finished()), comicsModel, SLOT(finishTransaction())); - + connect(remover, SIGNAL(finished()),this,SLOT(checkEmptyFolder())); connect(remover, SIGNAL(finished()),this,SLOT(checkRemoveError())); - connect(remover, SIGNAL(finished()), remover, SLOT(deleteLater())); + connect(remover, SIGNAL(finished()), remover, SLOT(deleteLater())); connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); if(thread != NULL) @@ -2553,6 +2565,37 @@ void LibraryWindow::deleteComics() } } +void LibraryWindow::deleteComicsFromList() +{ + int ret = QMessageBox::question(this,tr("Remove comics"),tr("Comics will only be deleted from the current label/list. Are you sure?"),QMessageBox::Yes,QMessageBox::No); + + if(ret == QMessageBox::Yes) + { + QModelIndexList indexList = getSelectedComics(); + if(indexList.isEmpty()) + return; + + QModelIndex mi = listsModelProxy->mapToSource(listsView->currentIndex()); + + ReadingListModel::TypeList typeList = (ReadingListModel::TypeList)mi.data(ReadingListModel::TypeListsRole).toInt(); + + qulonglong id = mi.data(ReadingListModel::IDRole).toULongLong(); + switch (typeList) { + case ReadingListModel::SpecialList: + //by now only 'favorites' + comicsModel->deleteComicsFromFavorites(indexList); + break; + case ReadingListModel::Label: + comicsModel->deleteComicsFromLabel(indexList,id); + break; + case ReadingListModel::ReadingList: + comicsModel->deleteComicsFromReadingList(indexList,id); + break; + } + } + +} + void LibraryWindow::showFoldersContextMenu(const QPoint &point) { QModelIndex sourceMI = foldersModelProxy->mapToSource(foldersView->indexAt(point)); diff --git a/YACReaderLibrary/library_window.h b/YACReaderLibrary/library_window.h index c72b4180..abc88731 100644 --- a/YACReaderLibrary/library_window.h +++ b/YACReaderLibrary/library_window.h @@ -346,6 +346,8 @@ public slots: void manageOpeningLibraryError(const QString & error); QModelIndexList getSelectedComics(); void deleteComics(); + void deleteComicsFromDisk(); + void deleteComicsFromList(); //void showSocial(); void showFoldersContextMenu(const QPoint & point); void libraryAlreadyExists(const QString & name); diff --git a/YACReaderLibrary/yacreader_navigation_controller.cpp b/YACReaderLibrary/yacreader_navigation_controller.cpp index 30830871..57e43c72 100644 --- a/YACReaderLibrary/yacreader_navigation_controller.cpp +++ b/YACReaderLibrary/yacreader_navigation_controller.cpp @@ -209,6 +209,17 @@ void YACReaderNavigationController::reselectCurrentList() selectedList(libraryWindow->listsView->currentIndex()); } +void YACReaderNavigationController::reselectCurrentSource() +{ + if(!libraryWindow->listsView->selectionModel()->selectedRows().isEmpty()) + { + reselectCurrentList(); + }else + { + reselectCurrentFolder(); + } +} + void YACReaderNavigationController::selectedIndexFromHistory(const YACReaderLibrarySourceContainer &sourceContainer) { //TODO NO searching allowed, just disable backward/forward actions in searching mode @@ -273,7 +284,7 @@ void YACReaderNavigationController::setupConnections() connect(libraryWindow->listsView,SIGNAL(clicked(QModelIndex)),this,SLOT(selectedList(QModelIndex))); connect(libraryWindow->historyController,SIGNAL(modelIndexSelected(YACReaderLibrarySourceContainer)),this,SLOT(selectedIndexFromHistory(YACReaderLibrarySourceContainer))); connect(libraryWindow->emptyFolderWidget,SIGNAL(subfolderSelected(QModelIndex,int)),this,SLOT(selectSubfolder(QModelIndex,int))); - connect(libraryWindow->comicsModel,SIGNAL(isEmpty()),this,SLOT(reselectCurrentFolder())); + connect(libraryWindow->comicsModel,SIGNAL(isEmpty()),this,SLOT(reselectCurrentSource())); } qulonglong YACReaderNavigationController::folderModelIndexToID(const QModelIndex &mi) diff --git a/YACReaderLibrary/yacreader_navigation_controller.h b/YACReaderLibrary/yacreader_navigation_controller.h index fe0959bd..2dbeac28 100644 --- a/YACReaderLibrary/yacreader_navigation_controller.h +++ b/YACReaderLibrary/yacreader_navigation_controller.h @@ -22,6 +22,9 @@ public slots: //reading lists void selectedList(const QModelIndex & mi); void reselectCurrentList(); + + void reselectCurrentSource(); + //history navigation void selectedIndexFromHistory(const YACReaderLibrarySourceContainer &sourceContainer); void loadIndexFromHistory(const YACReaderLibrarySourceContainer &sourceContainer);