mirror of
https://github.com/YACReader/yacreader
synced 2025-07-22 06:54:39 -04:00
added support for removing elements from a list
This commit is contained in:
@ -801,16 +801,10 @@ void ComicModel::addComicsToFavorites(const QList<QModelIndex> & comicsList)
|
|||||||
{
|
{
|
||||||
QList<ComicDB> comics = getComics(comicsList);
|
QList<ComicDB> comics = getComics(comicsList);
|
||||||
|
|
||||||
DBHelper::insertComicsInFavorites(comics, QSqlDatabase());
|
|
||||||
|
|
||||||
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
|
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
|
||||||
|
|
||||||
db.transaction();
|
|
||||||
|
|
||||||
DBHelper::insertComicsInFavorites(comics,db);
|
DBHelper::insertComicsInFavorites(comics,db);
|
||||||
|
|
||||||
db.commit();
|
|
||||||
|
|
||||||
db.close();
|
db.close();
|
||||||
QSqlDatabase::removeDatabase(_databasePath);
|
QSqlDatabase::removeDatabase(_databasePath);
|
||||||
}
|
}
|
||||||
@ -819,18 +813,71 @@ void ComicModel::addComicsToLabel(const QList<QModelIndex> &comicsList, qulonglo
|
|||||||
{
|
{
|
||||||
QList<ComicDB> comics = getComics(comicsList);
|
QList<ComicDB> comics = getComics(comicsList);
|
||||||
|
|
||||||
DBHelper::insertComicsInFavorites(comics, QSqlDatabase());
|
|
||||||
|
|
||||||
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
|
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
|
||||||
|
|
||||||
db.transaction();
|
|
||||||
|
|
||||||
DBHelper::insertComicsInLabel(comics,labelId,db);
|
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();
|
db.close();
|
||||||
QSqlDatabase::removeDatabase(_databasePath);
|
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -65,6 +65,12 @@ public:
|
|||||||
void addComicsToFavorites(const QList<QModelIndex> &comicsList);
|
void addComicsToFavorites(const QList<QModelIndex> &comicsList);
|
||||||
void addComicsToLabel(const QList<QModelIndex> &comicsList, qulonglong labelId);
|
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;
|
QHash<int, QByteArray> roleNames() const;
|
||||||
|
|
||||||
enum Columns {
|
enum Columns {
|
||||||
|
@ -161,6 +161,62 @@ void DBHelper::removeListFromDB(qulonglong id, QSqlDatabase &db)
|
|||||||
query.exec();
|
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
|
//updates
|
||||||
void DBHelper::update(ComicDB * comic, QSqlDatabase & db)
|
void DBHelper::update(ComicDB * comic, QSqlDatabase & db)
|
||||||
{
|
{
|
||||||
@ -423,6 +479,8 @@ void DBHelper::insertComicsInFavorites(const QList<ComicDB> &comicsList, QSqlDat
|
|||||||
QSqlRecord record = getNumComicsInFavoritesQuery.record();
|
QSqlRecord record = getNumComicsInFavoritesQuery.record();
|
||||||
int numComics = record.value(0).toInt();*/
|
int numComics = record.value(0).toInt();*/
|
||||||
|
|
||||||
|
db.transaction();
|
||||||
|
|
||||||
QSqlQuery query(db);
|
QSqlQuery query(db);
|
||||||
query.prepare("INSERT INTO comic_default_reading_list (default_reading_list_id, comic_id) "
|
query.prepare("INSERT INTO comic_default_reading_list (default_reading_list_id, comic_id) "
|
||||||
"VALUES (1, :comic_id)");
|
"VALUES (1, :comic_id)");
|
||||||
@ -433,10 +491,14 @@ void DBHelper::insertComicsInFavorites(const QList<ComicDB> &comicsList, QSqlDat
|
|||||||
//query.bindValue(":order", numComics++);
|
//query.bindValue(":order", numComics++);
|
||||||
query.exec();
|
query.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
db.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DBHelper::insertComicsInLabel(const QList<ComicDB> &comicsList, qulonglong labelId, QSqlDatabase &db)
|
void DBHelper::insertComicsInLabel(const QList<ComicDB> &comicsList, qulonglong labelId, QSqlDatabase &db)
|
||||||
{
|
{
|
||||||
|
db.transaction();
|
||||||
|
|
||||||
QSqlQuery query(db);
|
QSqlQuery query(db);
|
||||||
query.prepare("INSERT INTO comic_label (label_id, comic_id) "
|
query.prepare("INSERT INTO comic_label (label_id, comic_id) "
|
||||||
"VALUES (: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.bindValue(":comic_id", comic.id);
|
||||||
query.exec();
|
query.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
db.commit();
|
||||||
}
|
}
|
||||||
//queries
|
//queries
|
||||||
QList<LibraryItem *> DBHelper::getFoldersFromParent(qulonglong parentId, QSqlDatabase & db, bool sort)
|
QList<LibraryItem *> DBHelper::getFoldersFromParent(qulonglong parentId, QSqlDatabase & db, bool sort)
|
||||||
|
@ -36,6 +36,10 @@ public:
|
|||||||
static void removeFromDB(ComicDB * comic, QSqlDatabase & db);
|
static void removeFromDB(ComicDB * comic, QSqlDatabase & db);
|
||||||
static void removeLabelFromDB(qulonglong id, QSqlDatabase & db);
|
static void removeLabelFromDB(qulonglong id, QSqlDatabase & db);
|
||||||
static void removeListFromDB(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
|
//inserts
|
||||||
static qulonglong insert(Folder * folder, QSqlDatabase & db);
|
static qulonglong insert(Folder * folder, QSqlDatabase & db);
|
||||||
static qulonglong insert(ComicDB * comic, QSqlDatabase & db);
|
static qulonglong insert(ComicDB * comic, QSqlDatabase & db);
|
||||||
|
@ -2509,6 +2509,18 @@ QModelIndexList LibraryWindow::getSelectedComics()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LibraryWindow::deleteComics()
|
void LibraryWindow::deleteComics()
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
if(!listsView->selectionModel()->selectedRows().isEmpty())
|
||||||
|
{
|
||||||
|
deleteComicsFromList();
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
deleteComicsFromDisk();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
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);
|
||||||
|
|
||||||
@ -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)
|
void LibraryWindow::showFoldersContextMenu(const QPoint &point)
|
||||||
{
|
{
|
||||||
QModelIndex sourceMI = foldersModelProxy->mapToSource(foldersView->indexAt(point));
|
QModelIndex sourceMI = foldersModelProxy->mapToSource(foldersView->indexAt(point));
|
||||||
|
@ -346,6 +346,8 @@ public slots:
|
|||||||
void manageOpeningLibraryError(const QString & error);
|
void manageOpeningLibraryError(const QString & error);
|
||||||
QModelIndexList getSelectedComics();
|
QModelIndexList getSelectedComics();
|
||||||
void deleteComics();
|
void deleteComics();
|
||||||
|
void deleteComicsFromDisk();
|
||||||
|
void deleteComicsFromList();
|
||||||
//void showSocial();
|
//void showSocial();
|
||||||
void showFoldersContextMenu(const QPoint & point);
|
void showFoldersContextMenu(const QPoint & point);
|
||||||
void libraryAlreadyExists(const QString & name);
|
void libraryAlreadyExists(const QString & name);
|
||||||
|
@ -209,6 +209,17 @@ void YACReaderNavigationController::reselectCurrentList()
|
|||||||
selectedList(libraryWindow->listsView->currentIndex());
|
selectedList(libraryWindow->listsView->currentIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void YACReaderNavigationController::reselectCurrentSource()
|
||||||
|
{
|
||||||
|
if(!libraryWindow->listsView->selectionModel()->selectedRows().isEmpty())
|
||||||
|
{
|
||||||
|
reselectCurrentList();
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
reselectCurrentFolder();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void YACReaderNavigationController::selectedIndexFromHistory(const YACReaderLibrarySourceContainer &sourceContainer)
|
void YACReaderNavigationController::selectedIndexFromHistory(const YACReaderLibrarySourceContainer &sourceContainer)
|
||||||
{
|
{
|
||||||
//TODO NO searching allowed, just disable backward/forward actions in searching mode
|
//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->listsView,SIGNAL(clicked(QModelIndex)),this,SLOT(selectedList(QModelIndex)));
|
||||||
connect(libraryWindow->historyController,SIGNAL(modelIndexSelected(YACReaderLibrarySourceContainer)),this,SLOT(selectedIndexFromHistory(YACReaderLibrarySourceContainer)));
|
connect(libraryWindow->historyController,SIGNAL(modelIndexSelected(YACReaderLibrarySourceContainer)),this,SLOT(selectedIndexFromHistory(YACReaderLibrarySourceContainer)));
|
||||||
connect(libraryWindow->emptyFolderWidget,SIGNAL(subfolderSelected(QModelIndex,int)),this,SLOT(selectSubfolder(QModelIndex,int)));
|
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)
|
qulonglong YACReaderNavigationController::folderModelIndexToID(const QModelIndex &mi)
|
||||||
|
@ -22,6 +22,9 @@ public slots:
|
|||||||
//reading lists
|
//reading lists
|
||||||
void selectedList(const QModelIndex & mi);
|
void selectedList(const QModelIndex & mi);
|
||||||
void reselectCurrentList();
|
void reselectCurrentList();
|
||||||
|
|
||||||
|
void reselectCurrentSource();
|
||||||
|
|
||||||
//history navigation
|
//history navigation
|
||||||
void selectedIndexFromHistory(const YACReaderLibrarySourceContainer &sourceContainer);
|
void selectedIndexFromHistory(const YACReaderLibrarySourceContainer &sourceContainer);
|
||||||
void loadIndexFromHistory(const YACReaderLibrarySourceContainer &sourceContainer);
|
void loadIndexFromHistory(const YACReaderLibrarySourceContainer &sourceContainer);
|
||||||
|
Reference in New Issue
Block a user