// Get the list of currently selected items that are moving.
QList<QModelIndex> indexesMovingList = selectedIndexes();
- // Create a list of database IDs that are moving.
- QList<int> *databaseIdsMovingListPointer = new QList<int>;
+ // Create a list of selected database IDs.
+ QList<int> *selectedDatabaseIdsListPointer = new QList<int>;
- // 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<int> *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<double> 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<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)
+ 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<BookmarkStruct> *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<BookmarkStruct> *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;
// 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<BookmarkStruct> *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<BookmarkStruct> *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;
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<BookmarkStruct> *bookmarksExceptSelectedListPointer = BookmarksDatabase::getBookmarksExcept(databaseIdsMovingListPointer);
+ // Get a list of all the items in the root folder except those selected.
+ QList<BookmarkStruct> *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<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;
+}