+
+QList<int>* DraggableTreeView::getRootSelectedDatabaseIds(QList<int> *selectedDatabaseIdsPointer) const
+{
+ // Create a list of the database IDs of the contents of each selected folder.
+ QList<int> 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<int>* rootSelectedDatabaseIdsListPointer = new QList<int>;
+
+ // 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;
+}
+
+void DraggableTreeView::moveToBeginningOfFolder(const QModelIndex &dropModelIndex, QList<int> *selectedDatabaseIdsListPointer, QList<int> *rootSelectedDatabaseIdsListPointer,
+ std::list<double> *previousParentFolderIdListPointer) const
+{
+ // 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<BookmarkStruct> *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)
+ previousParentFolderIdListPointer->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;
+ }
+}