added support for removing elements from a list

This commit is contained in:
Luis Ángel San Martín
2014-11-30 16:30:01 +01:00
parent 53eaf14d64
commit c232f239d1
8 changed files with 204 additions and 24 deletions

View File

@ -801,16 +801,10 @@ void ComicModel::addComicsToFavorites(const QList<QModelIndex> & comicsList)
{
QList<ComicDB> 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<QModelIndex> &comicsList, qulonglo
{
QList<ComicDB> 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<QModelIndex> &comicsList)
{
QList<ComicDB> comics = getComics(comicsList);
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
DBHelper::deleteComicsFromFavorites(comics,db);
db.close();
QSqlDatabase::removeDatabase(_databasePath);
deleteComicsFromModel(comicsList);
}
void ComicModel::deleteComicsFromLabel(const QList<QModelIndex> &comicsList, qulonglong labelId)
{
QList<ComicDB> 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<QModelIndex> &comicsList, qulonglong readingListId)
{
QList<ComicDB> 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<QModelIndex> &comicsList)
{
QListIterator<QModelIndex> 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();
}

View File

@ -65,6 +65,12 @@ public:
void addComicsToFavorites(const QList<QModelIndex> &comicsList);
void addComicsToLabel(const QList<QModelIndex> &comicsList, qulonglong labelId);
void deleteComicsFromFavorites(const QList<QModelIndex> &comicsList);
void deleteComicsFromLabel(const QList<QModelIndex> &comicsList, qulonglong labelId);
void deleteComicsFromReadingList(const QList<QModelIndex> &comicsList, qulonglong readingListId);
void deleteComicsFromModel(const QList<QModelIndex> &comicsList);
QHash<int, QByteArray> roleNames() const;
enum Columns {

View File

@ -161,6 +161,62 @@ void DBHelper::removeListFromDB(qulonglong id, QSqlDatabase &db)
query.exec();
}
void DBHelper::deleteComicsFromFavorites(const QList<ComicDB> &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<ComicDB> &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<ComicDB> &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<ComicDB> &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<ComicDB> &comicsList, QSqlDat
//query.bindValue(":order", numComics++);
query.exec();
}
db.commit();
}
void DBHelper::insertComicsInLabel(const QList<ComicDB> &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<ComicDB> &comicsList, qulonglong
query.bindValue(":comic_id", comic.id);
query.exec();
}
db.commit();
}
//queries
QList<LibraryItem *> DBHelper::getFoldersFromParent(qulonglong parentId, QSqlDatabase & db, bool sort)

View File

@ -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<ComicDB> & comicsList, QSqlDatabase & db);
static void deleteComicsFromLabel(const QList<ComicDB> & comicsList, qulonglong labelId, QSqlDatabase & db);
static void deleteComicsFromReadingList(const QList<ComicDB> & comicsList, qulonglong readingListId, QSqlDatabase & db);
//inserts
static qulonglong insert(Folder * folder, QSqlDatabase & db);
static qulonglong insert(ComicDB * comic, QSqlDatabase & db);

View File

@ -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<ComicDB> comics = comicsModel->getComics(indexList);
QList<QString> paths;
QString libraryPath = currentPath();
foreach(ComicDB comic, comics)
{
QList<QString> 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);
@ -2545,7 +2557,7 @@ void LibraryWindow::deleteComics()
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));

View File

@ -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);

View File

@ -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)

View File

@ -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);