From: Soren Stoutner Date: Fri, 10 Apr 2026 03:27:12 +0000 (-0700) Subject: Don't open all the bookmark folders when the dialog opens. https://redmine.stoutner... X-Git-Tag: v0.9~3 X-Git-Url: https://gitweb.stoutner.com/?a=commitdiff_plain;h=caf3248dd67b4552622b703a00f4e8b5e9b0a3d7;p=PrivacyBrowserPC.git Don't open all the bookmark folders when the dialog opens. https://redmine.stoutner.com/issues/1322 --- diff --git a/src/dialogs/BookmarksDialog.cpp b/src/dialogs/BookmarksDialog.cpp index 1845df2..0c9de6f 100644 --- a/src/dialogs/BookmarksDialog.cpp +++ b/src/dialogs/BookmarksDialog.cpp @@ -105,7 +105,7 @@ BookmarksDialog::BookmarksDialog(QWidget *parentWidgetPointer, QIcon currentWebs 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 parentFolderIdList; @@ -140,10 +140,45 @@ void BookmarksDialog::deleteItems() const Q_EMIT bookmarkUpdated(); } -void BookmarksDialog::populateBookmarks() const +QList BookmarksDialog::getExpandedFoldersDatabaseIdList(QModelIndex parentIndex) const +{ + // Create a list of expanded folder database ids. + QList 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 currentlyExpandedFoldersDatabaseIdsList = getExpandedFoldersDatabaseIdList(draggableTreeViewPointer->rootIndex()); // Clear the current contents of the tree model. treeModelPointer->clear(); @@ -168,7 +203,7 @@ void BookmarksDialog::populateBookmarks() const 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")); @@ -189,7 +224,7 @@ void BookmarksDialog::populateBookmarks() const // 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); @@ -198,19 +233,19 @@ void BookmarksDialog::populateBookmarks() const 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 foldersToExpandDatabaseIdList) const { // Get the folder contents. QList *folderContentsListPointer = BookmarksDatabase::getFolderContents(folderId); @@ -253,13 +288,17 @@ void BookmarksDialog::populateSubfolders(QStandardItem *folderItemNamePointer, c // 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(); @@ -268,6 +307,16 @@ void BookmarksDialog::refreshBookmarks() const 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. diff --git a/src/dialogs/BookmarksDialog.h b/src/dialogs/BookmarksDialog.h index 028aa33..dd9195e 100644 --- a/src/dialogs/BookmarksDialog.h +++ b/src/dialogs/BookmarksDialog.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: GPL-3.0-or-later - * SPDX-FileCopyrightText: 2023-2024 Soren Stoutner + * SPDX-FileCopyrightText: 2023-2024, 2026 Soren Stoutner * * This file is part of Privacy Browser PC . * @@ -52,8 +52,9 @@ Q_SIGNALS: 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(); @@ -63,17 +64,20 @@ private Q_SLOTS: 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 getExpandedFoldersDatabaseIdList(QModelIndex parentIndex) const; + void populateBookmarks(); + void populateSubfolders(QStandardItem *folderItemNamePointer, const double folderId, QList foldersToExpandDatabaseIdList) const; void selectSubfolderContents(const QModelIndex &parentModelIndex) const; void updateUi() const; };