]> gitweb.stoutner.com Git - PrivacyBrowserPC.git/commitdiff
Don't open all the bookmark folders when the dialog opens. https://redmine.stoutner...
authorSoren Stoutner <soren@stoutner.com>
Fri, 10 Apr 2026 03:27:12 +0000 (20:27 -0700)
committerSoren Stoutner <soren@stoutner.com>
Fri, 10 Apr 2026 03:27:12 +0000 (20:27 -0700)
src/dialogs/BookmarksDialog.cpp
src/dialogs/BookmarksDialog.h

index 1845df2a808d92c5b8fcad9fc0634a7490c91e51..0c9de6f8cbf64c51320349067371a92b06a40179 100644 (file)
@@ -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<double> parentFolderIdList;
@@ -140,10 +140,45 @@ void BookmarksDialog::deleteItems() const
     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();
@@ -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<int> foldersToExpandDatabaseIdList) const
 {
     // Get the folder contents.
     QList<BookmarkStruct> *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.
index 028aa3317eb7603e4deaee585b6f846c8fcba7b6..dd9195e2858156e57a00845e9dec2ae0d55b6bc2 100644 (file)
@@ -1,5 +1,5 @@
 /* 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/>.
  *
@@ -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<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;
 };