populateBookmarks();
}
-void BookmarksDialog::deleteItems() const
+void BookmarksDialog::deleteItems()
{
// Create a parent folder ID standard C++ list (which can be sorted and from which duplicates can be removed).
std::list<double> parentFolderIdList;
Q_EMIT bookmarkUpdated();
}
-void BookmarksDialog::populateBookmarks() const
+QList<int> BookmarksDialog::getExpandedFoldersDatabaseIdList(QModelIndex parentIndex) const
+{
+ // Create a list of expanded folder database ids.
+ QList<int> expandedFoldersDatabaseIdsList;
+
+ // Get a count of the number of children rows of the parent index.
+ int childrenRows = treeModelPointer->rowCount(parentIndex);
+
+ // Check each child row.
+ for (int i = 0; i < childrenRows; ++i)
+ {
+ // Get the child row model index.
+ QModelIndex childModelIndex = treeModelPointer->index(i, NAME_COLUMN, parentIndex);
+
+ // Check if the child model index is a folder.
+ bool isFolder = childModelIndex.siblingAtColumn(IS_FOLDER_COLUMN).data().toBool();
+
+ // Check if the child model index is expanded.
+ if (isFolder && draggableTreeViewPointer->isExpanded(childModelIndex))
+ {
+ // Append the database ID to the list of expanded folders.
+ expandedFoldersDatabaseIdsList.append(childModelIndex.siblingAtColumn(DATABASE_ID_COLUMN).data().toInt());
+
+ // Check for subfolders.
+ expandedFoldersDatabaseIdsList.append(getExpandedFoldersDatabaseIdList(childModelIndex));
+ }
+ }
+
+ // Return the list of the expanded folders database IDs.
+ return expandedFoldersDatabaseIdsList;
+}
+
+void BookmarksDialog::populateBookmarks()
{
// Store the current vertical scroll value.
- int verticalScrollValue = draggableTreeViewPointer->verticalScrollBar()->value();
+ verticalScrollValue = draggableTreeViewPointer->verticalScrollBar()->value();
+
+ // Get a list of the database IDs of all of the currently expanded folders.
+ QList<int> currentlyExpandedFoldersDatabaseIdsList = getExpandedFoldersDatabaseIdList(draggableTreeViewPointer->rootIndex());
// Clear the current contents of the tree model.
treeModelPointer->clear();
QStandardItem *rootItemNamePointer = new QStandardItem(QIcon::fromTheme(QLatin1String("bookmarks"), QIcon::fromTheme(QLatin1String("bookmark-new"))),
i18nc("The bookmarks root tree widget name", "Bookmarks"));
QStandardItem *rootItemUrlPointer = new QStandardItem(QLatin1String(""));
- QStandardItem *rootItemDatabaseIdPonter = new QStandardItem(QLatin1String("-1")); // The root item doesn't have a database ID.
+ QStandardItem *rootItemDatabaseIdPointer = new QStandardItem(QLatin1String("-1")); // The root item doesn't have a database ID.
QStandardItem *rootItemDisplayOrderPointer = new QStandardItem(QLatin1String("-1")); // The root item doesn't have a display order.
QStandardItem *rootItemIsFolderPointer = new QStandardItem(QLatin1String("1"));
QStandardItem *rootItemFolderIdPointer = new QStandardItem(QLatin1String("0"));
// Populate the bookmarks root item list.
bookmarksRootItemList.append(rootItemNamePointer);
bookmarksRootItemList.append(rootItemUrlPointer);
- bookmarksRootItemList.append(rootItemDatabaseIdPonter);
+ bookmarksRootItemList.append(rootItemDatabaseIdPointer);
bookmarksRootItemList.append(rootItemDisplayOrderPointer);
bookmarksRootItemList.append(rootItemIsFolderPointer);
bookmarksRootItemList.append(rootItemFolderIdPointer);
treeModelPointer->appendRow(bookmarksRootItemList);
// Populate the subfolders, starting with the root folder ID (`0`).
- populateSubfolders(rootItemNamePointer, 0);
+ populateSubfolders(rootItemNamePointer, 0, currentlyExpandedFoldersDatabaseIdsList);
- // Expand all the folders.
- draggableTreeViewPointer->expandAll();
+ // Restore the vertical scroll value after the draggable tree view is populated, which changes the range of the scroll bar.
+ restoreVerticalScrollBarConnection = connect(draggableTreeViewPointer->verticalScrollBar(), SIGNAL(rangeChanged(int, int)), this, SLOT(restoreVerticalScrollBarPosition(int, int)));
- // Restore the vertical scroll value.
- draggableTreeViewPointer->verticalScrollBar()->setValue(verticalScrollValue);
+ // Expand the root database folder.
+ draggableTreeViewPointer->setExpanded(treeModelPointer->indexFromItem(rootItemNamePointer), true);
// Update the UI.
updateUi();
}
-void BookmarksDialog::populateSubfolders(QStandardItem *folderItemNamePointer, const double folderId) const
+void BookmarksDialog::populateSubfolders(QStandardItem *folderItemNamePointer, const double folderId, QList<int> foldersToExpandDatabaseIdList) const
{
// Get the folder contents.
QList<BookmarkStruct> *folderContentsListPointer = BookmarksDatabase::getFolderContents(folderId);
// Add the bookmark to the parent folder.
folderItemNamePointer->appendRow(bookmarkItemList);
+ // Expand any folders that were previously expanded.
+ if (bookmarkStruct.isFolder && foldersToExpandDatabaseIdList.contains(bookmarkStruct.databaseId))
+ draggableTreeViewPointer->setExpanded(treeModelPointer->indexFromItem(nameItemPointer), true);
+
// Populate subfolders if this item is a folder.
if (bookmarkStruct.isFolder)
- populateSubfolders(nameItemPointer, bookmarkStruct.folderId);
+ populateSubfolders(nameItemPointer, bookmarkStruct.folderId, foldersToExpandDatabaseIdList);
}
}
-void BookmarksDialog::refreshBookmarks() const
+void BookmarksDialog::refreshBookmarks()
{
// Repopulate the bookmarks in this dialog
populateBookmarks();
Q_EMIT bookmarkUpdated();
}
+void BookmarksDialog::restoreVerticalScrollBarPosition(int, int) const
+{
+ // Restore the vertical scroll value.
+ draggableTreeViewPointer->verticalScrollBar()->setValue(verticalScrollValue);
+
+ // Disconnect the scroll bar updater. It should only run once each time the bookmarks are populated.
+ disconnect(restoreVerticalScrollBarConnection);
+}
+
+
void BookmarksDialog::selectSubfolderContents(const QModelIndex &parentModelIndex) const
{
// Get the index model.
/* SPDX-License-Identifier: GPL-3.0-or-later
- * SPDX-FileCopyrightText: 2023-2024 Soren Stoutner <soren@stoutner.com>
+ * SPDX-FileCopyrightText: 2023-2024, 2026 Soren Stoutner <soren@stoutner.com>
*
* This file is part of Privacy Browser PC <https://www.stoutner.com/privacy-browser-pc/>.
*
private Q_SLOTS:
// The private slots.
- void deleteItems() const;
- void refreshBookmarks() const;
+ void deleteItems();
+ void restoreVerticalScrollBarPosition(int, int) const;
+ void refreshBookmarks();
void showAddBookmarkDialog();
void showAddFolderDialog();
void showEditDialog();
private:
// The private variables.
QPushButton *deleteItemsButtonPointer;
+ DraggableTreeView *draggableTreeViewPointer;
QPushButton *editButtonPointer;
QStandardItemModel *treeModelPointer;
QItemSelectionModel *treeSelectionModelPointer;
- DraggableTreeView *draggableTreeViewPointer;
+ QMetaObject::Connection restoreVerticalScrollBarConnection;
+ int verticalScrollValue;
QIcon websiteFavoriteIcon;
QString websiteTitle;
QString websiteUrl;
// The private functions.
- void populateBookmarks() const;
- void populateSubfolders(QStandardItem *folderItemNamePointer, const double folderId) const;
+ QList<int> getExpandedFoldersDatabaseIdList(QModelIndex parentIndex) const;
+ void populateBookmarks();
+ void populateSubfolders(QStandardItem *folderItemNamePointer, const double folderId, QList<int> foldersToExpandDatabaseIdList) const;
void selectSubfolderContents(const QModelIndex &parentModelIndex) const;
void updateUi() const;
};