X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserPC.git;a=blobdiff_plain;f=src%2Fwidgets%2FDraggableTreeView.cpp;h=6471b08b4bf0f6ffba130efce540e9215421017f;hp=1fa07a56498c74bf94d8a69c02bc83ec815ee26e;hb=29dbafaca706ea6a34cd881060ebf680378f39b4;hpb=3331f3d1a5d8924a67bcac2a2c842e15a421fea2 diff --git a/src/widgets/DraggableTreeView.cpp b/src/widgets/DraggableTreeView.cpp index 1fa07a5..6471b08 100644 --- a/src/widgets/DraggableTreeView.cpp +++ b/src/widgets/DraggableTreeView.cpp @@ -36,52 +36,105 @@ void DraggableTreeView::dropEvent(QDropEvent *dropEvent) // Get the list of currently selected items that are moving. QList indexesMovingList = selectedIndexes(); - // Create a list of database IDs that are moving. - QList *databaseIdsMovingListPointer = new QList; + // Create a list of selected database IDs. + QList *selectedDatabaseIdsListPointer = new QList; - // Populate the list of moving database IDs. + // Populate the list of selected database IDs. for (const QModelIndex &modelIndex : indexesMovingList) { // Only process model indexes from the bookmark name column (by default, there will be model indexes from all the visible columns in the list). - if (modelIndex.column() == BookmarksDialog::BOOKMARK_NAME_COLUMN) - databaseIdsMovingListPointer->append(modelIndex.siblingAtColumn(BookmarksDialog::DATABASE_ID_COLUMN).data().toInt()); + if (modelIndex.column() == BookmarksDialog::NAME_COLUMN) + selectedDatabaseIdsListPointer->append(modelIndex.siblingAtColumn(BookmarksDialog::DATABASE_ID_COLUMN).data().toInt()); } + // Get a list of root selected database IDs. + QList *rootSelectedDatabaseIdsListPointer = getRootSelectedDatabaseIds(selectedDatabaseIdsListPointer); + // Get the drop position. int dropPosition = dropIndicatorPosition(); // Get the drop model index. QModelIndex dropModelIndex = indexAt(dropEvent->pos()); - // Get the drop display order. - int dropDisplayOrder = dropModelIndex.siblingAtColumn(BookmarksDialog::DISPLAY_ORDER).data().toInt(); + // Create a previous parent folder ID standard C++ list (which can be sorted and from which duplicates can be removed). + std::list previousParentFolderIdList; // Process the move according to the drop position. switch (dropPosition) { case QAbstractItemView::OnItem: - // TODO Implement for moving into a folder. + { + // Get the new parent folder ID. + double newParentFolderId = dropModelIndex.siblingAtColumn(BookmarksDialog::FOLDER_ID_COLUMN).data().toDouble(); + + // Get a list of all the items in the target folder except those selected. + QList *itemsInFolderExceptSelectedListPointer = BookmarksDatabase::getBookmarksInFolderExcept(newParentFolderId, selectedDatabaseIdsListPointer); + + // Initialize a new display order tracker. + int newDisplayOrder = 0; + + // Move all the items to the top of the target folder. + for (const int databaseId : *rootSelectedDatabaseIdsListPointer) + { + // Get the item's current parent folder ID. + double currentParentFolderId = BookmarksDatabase::getParentFolderId(databaseId); + + // Add the parent folder ID to the list of previous parent folders if the item is from a different folder. + if (currentParentFolderId != newParentFolderId) + previousParentFolderIdList.push_back(currentParentFolderId); + + // Update the parent folder and display order for each bookmark. + BookmarksDatabase::updateParentFolderAndDisplayOrder(databaseId, newParentFolderId, newDisplayOrder); + + // Increment the new display order. + ++newDisplayOrder; + } + + // Update the display order of the existing items in the folder. + for (const BookmarkStruct &bookmarkStruct : *itemsInFolderExceptSelectedListPointer) + { + // Set the bookmark's display order if it has changed. + if (bookmarkStruct.displayOrder != newDisplayOrder) + BookmarksDatabase::updateDisplayOrder(bookmarkStruct.databaseId, newDisplayOrder); + + // Increment the new display order. + ++newDisplayOrder; + } break; + } case QAbstractItemView::AboveItem: { - // Get a list of all the bookmarks except those selected. - QList *bookmarksExceptSelectedListPointer = BookmarksDatabase::getBookmarksExcept(databaseIdsMovingListPointer); + // Get the drop display order. + int dropDisplayOrder = dropModelIndex.siblingAtColumn(BookmarksDialog::DISPLAY_ORDER_COLUMN).data().toInt(); + + // Get the drop parent folder ID. + double dropParentFolderId = dropModelIndex.parent().siblingAtColumn(BookmarksDialog::FOLDER_ID_COLUMN).data().toInt(); + + // Get a list of all the items in the target folder except those selected. + QList *itemsInFolderExceptSelectedListPointer = BookmarksDatabase::getBookmarksInFolderExcept(dropParentFolderId, selectedDatabaseIdsListPointer); // Initialize a new display order tracker. int newDisplayOrder = 0; - // Move the bookmarks. - for (const BookmarkStruct &bookmarkStruct : *bookmarksExceptSelectedListPointer) + // Process all the items in the target folder, moving in the new ones. + for (const BookmarkStruct &bookmarkStruct : *itemsInFolderExceptSelectedListPointer) { // Check to see if this is the drop display order. if (bookmarkStruct.displayOrder == dropDisplayOrder) { // Add all of the bookmarks being moved to this point. - for (const int databaseId : *databaseIdsMovingListPointer) + for (const int databaseId : *rootSelectedDatabaseIdsListPointer) { - // Update the display order for each bookmark. - BookmarksDatabase::updateDisplayOrder(databaseId, newDisplayOrder); + // Get the item's current parent folder ID. + double currentParentFolderId = BookmarksDatabase::getParentFolderId(databaseId); + + // Add the parent folder ID to the list of previous parent folders if the item is from a different folder. + if (currentParentFolderId != dropParentFolderId) + previousParentFolderIdList.push_back(currentParentFolderId); + + // Update the parent folder and display order for each bookmark. + BookmarksDatabase::updateParentFolderAndDisplayOrder(databaseId, dropParentFolderId, newDisplayOrder); // Increment the new display order. ++newDisplayOrder; @@ -90,29 +143,34 @@ void DraggableTreeView::dropEvent(QDropEvent *dropEvent) // Set the bookmark's display order if it has changed. if (bookmarkStruct.displayOrder != newDisplayOrder) - BookmarksDatabase::updateDisplayOrder(bookmarkStruct.id, newDisplayOrder); + BookmarksDatabase::updateDisplayOrder(bookmarkStruct.databaseId, newDisplayOrder); // Increment the new display order. ++newDisplayOrder; } - break; } case QAbstractItemView::BelowItem: { - // Get a list of all the bookmarks except those selected. - QList *bookmarksExceptSelectedListPointer = BookmarksDatabase::getBookmarksExcept(databaseIdsMovingListPointer); + // Get the drop display order. + int dropDisplayOrder = dropModelIndex.siblingAtColumn(BookmarksDialog::DISPLAY_ORDER_COLUMN).data().toInt(); + + // Get the drop parent folder ID. + double dropParentFolderId = dropModelIndex.parent().siblingAtColumn(BookmarksDialog::FOLDER_ID_COLUMN).data().toInt(); + + // Get a list of all the items in the target folder except those selected. + QList *itemsInFolderExceptSelectedListPointer = BookmarksDatabase::getBookmarksInFolderExcept(dropParentFolderId, selectedDatabaseIdsListPointer); // Initialize a new display order tracker. int newDisplayOrder = 0; - // Move the bookmarks. - for (const BookmarkStruct &bookmarkStruct : *bookmarksExceptSelectedListPointer) + // Process all the items in the target folder, moving in the new ones. + for (const BookmarkStruct &bookmarkStruct : *itemsInFolderExceptSelectedListPointer) { // Set the bookmark's display order if it has changed. if (bookmarkStruct.displayOrder != newDisplayOrder) - BookmarksDatabase::updateDisplayOrder(bookmarkStruct.id, newDisplayOrder); + BookmarksDatabase::updateDisplayOrder(bookmarkStruct.databaseId, newDisplayOrder); // Increment the new display order. ++newDisplayOrder; @@ -121,51 +179,106 @@ void DraggableTreeView::dropEvent(QDropEvent *dropEvent) if (bookmarkStruct.displayOrder == dropDisplayOrder) { // Add all of the bookmarks being moved to this point. - for (const int databaseId : *databaseIdsMovingListPointer) + for (const int databaseId : *rootSelectedDatabaseIdsListPointer) { - // Update the display order for each bookmark. - BookmarksDatabase::updateDisplayOrder(databaseId, newDisplayOrder); + // Get the item's current parent folder ID. + double currentParentFolderId = BookmarksDatabase::getParentFolderId(databaseId); + + // Add the parent folder ID to the list of previous parent folders if the item is from a different folder. + if (currentParentFolderId != dropParentFolderId) + previousParentFolderIdList.push_back(currentParentFolderId); + + // Update the parent folder and display order for each bookmark. + BookmarksDatabase::updateParentFolderAndDisplayOrder(databaseId, dropParentFolderId, newDisplayOrder); // Increment the new display order. ++newDisplayOrder; } } } - break; } case QAbstractItemView::OnViewport: + { + // Get the drop parent folder ID. + double dropParentFolderId = 0; - // Get a list of all the bookmarks except those selected. - QList *bookmarksExceptSelectedListPointer = BookmarksDatabase::getBookmarksExcept(databaseIdsMovingListPointer); + // Get a list of all the items in the root folder except those selected. + QList *itemsInFolderExceptSelectedListPointer = BookmarksDatabase::getBookmarksInFolderExcept(dropParentFolderId, selectedDatabaseIdsListPointer); // Initialize a new display order tracker. int newDisplayOrder = 0; - // Move the bookmarks. - for (const BookmarkStruct &bookmarkStruct : *bookmarksExceptSelectedListPointer) + // Update the display order of the existing items in the folder. + for (const BookmarkStruct &bookmarkStruct : *itemsInFolderExceptSelectedListPointer) { // Set the bookmark's display order if it has changed. if (bookmarkStruct.displayOrder != newDisplayOrder) - BookmarksDatabase::updateDisplayOrder(bookmarkStruct.id, newDisplayOrder); + BookmarksDatabase::updateDisplayOrder(bookmarkStruct.databaseId, newDisplayOrder); // Increment the new display order. ++newDisplayOrder; } // Add all of the bookmarks being moved to the end of the list. - for (const int databaseId : *databaseIdsMovingListPointer) + for (const int databaseId : *rootSelectedDatabaseIdsListPointer) { - // Update the display order for each bookmark. - BookmarksDatabase::updateDisplayOrder(databaseId, newDisplayOrder); + // Get the item's current parent folder ID. + double currentParentFolderId = BookmarksDatabase::getParentFolderId(databaseId); + + // Add the parent folder ID to the list of previous parent folders if the item is from a different folder. + if (currentParentFolderId != dropParentFolderId) + previousParentFolderIdList.push_back(currentParentFolderId); + + // Update the parent folder and display order for each bookmark. + BookmarksDatabase::updateParentFolderAndDisplayOrder(databaseId, dropParentFolderId, newDisplayOrder); // Increment the new display order. ++newDisplayOrder; } break; + } } + // Sort the previous parent folder ID list. + previousParentFolderIdList.sort(); + + // Remove duplicates from the parent folder ID list. + previousParentFolderIdList.unique(); + + // Update the folder contents display order for each previous parent folder. + for (const double parentFolderId : previousParentFolderIdList) + BookmarksDatabase::updateFolderContentsDisplayOrder(parentFolderId); + // Emit the bookmarks moved signal. emit bookmarksMoved(); } + +QList* DraggableTreeView::getRootSelectedDatabaseIds(QList *selectedDatabaseIdsPointer) const +{ + // Create a list of the database IDs of the contents of each selected folder. + QList selectedFoldersContentsDatabaseIds; + + // Populate the list of the database IDs of the contents of each selected folder. + for (const int databaseId : *selectedDatabaseIdsPointer) + { + // If this is not the root item and is a folder, get the database IDs of the contents. + if ((databaseId != -1) && BookmarksDatabase::isFolder(databaseId)) + selectedFoldersContentsDatabaseIds.append(*BookmarksDatabase::getFolderContentsDatabaseIds(BookmarksDatabase::getFolderId(databaseId))); + } + + // Create a root selected database IDs list. + QList* rootSelectedDatabaseIdsListPointer = new QList; + + // Populate the root selected database IDs list. + for (const int databaseId : *selectedDatabaseIdsPointer) + { + // Add the database ID to the root selected database IDs list if it isn't the root item and it isn't contained in the selected folder contents database IDs list. + if ((databaseId != -1) && !selectedFoldersContentsDatabaseIds.contains(databaseId)) + rootSelectedDatabaseIdsListPointer->append(databaseId); + } + + // Return the root selected database IDs list. + return rootSelectedDatabaseIdsListPointer; +}