+ // Process the item according to the type.
+ if (bookmarkStruct.isFolder) // This item is a folder.
+ {
+ // Add a submenu to the menu.
+ QMenu *submenuPointer = menuPointer->addMenu(bookmarkStruct.favoriteIcon, bookmarkStruct.name);
+
+ // Add the submenu to the beginning of the list of menus to be deleted on repopulate.
+ bookmarksMenuSubmenuList.prepend(new QPair<QMenu *, QMenu *>(menuPointer, submenuPointer));
+
+ // Populate any subfolders.
+ populateBookmarksMenuSubfolders(bookmarkStruct.folderId, submenuPointer);
+ }
+ else // This item is a bookmark.
+ {
+ // Add the bookmark to the menu.
+ QAction *menuBookmarkActionPointer = menuPointer->addAction(bookmarkStruct.favoriteIcon, bookmarkStruct.name, [=]
+ {
+ // Remove the focus from the URL line edit.
+ urlLineEditPointer->clearFocus();
+
+ // Load the URL.
+ tabWidgetPointer->loadUrlFromLineEdit(bookmarkStruct.url);
+ }
+ );
+
+ // Add the actions to the beginning of the list of bookmarks to be deleted on repopulate.
+ bookmarksMenuActionList.prepend(new QPair<QMenu *, QAction *>(menuPointer, menuBookmarkActionPointer));
+ }
+ }
+}
+
+void BrowserWindow::populateBookmarksToolBar()
+{
+ // Get the root folder contents (which has a folder ID of `0`).
+ QList<BookmarkStruct> *folderContentsListPointer = BookmarksDatabase::getFolderContents(0);
+
+ // Populate the bookmarks toolbar.
+ for (BookmarkStruct bookmarkStruct : *folderContentsListPointer)
+ {
+ // Process the item according to the type.
+ if (bookmarkStruct.isFolder) // This item is a folder.
+ {
+ // Add the subfolder action.
+ QAction *toolBarSubfolderActionPointer = bookmarksToolBarPointer->addAction(bookmarkStruct.favoriteIcon, bookmarkStruct.name);
+
+ // Add the bookmark database ID to the toolbar action.
+ toolBarSubfolderActionPointer->setData(bookmarkStruct.databaseId);
+
+ // Add the action to the beginning of the list of actions to be deleted on repopulate.
+ bookmarksToolBarActionList.prepend(toolBarSubfolderActionPointer);
+
+ // Create a subfolder menu.
+ QMenu *subfolderMenuPointer = new QMenu();
+
+ // Add the menu to the action.
+ toolBarSubfolderActionPointer->setMenu(subfolderMenuPointer);
+
+ // Add the submenu to the toolbar menu list.
+ bookmarksToolBarMenuList.append(new QPair<QMenu *, const double>(subfolderMenuPointer, bookmarkStruct.folderId));
+
+ // Set the popup mode for the menu.
+ dynamic_cast<QToolButton *>(bookmarksToolBarPointer->widgetForAction(toolBarSubfolderActionPointer))->setPopupMode(QToolButton::InstantPopup);
+
+ // Populate the subfolder.
+ populateBookmarksToolBarSubfolders(bookmarkStruct.folderId, subfolderMenuPointer);
+ }
+ else // This item is a bookmark.
+ {
+ // Add the bookmark to the toolbar.
+ QAction *toolBarBookmarkActionPointer = bookmarksToolBarPointer->addAction(bookmarkStruct.favoriteIcon, bookmarkStruct.name, [=]
+ {
+ // Remove the focus from the URL line edit.
+ urlLineEditPointer->clearFocus();
+
+ // Load the URL.
+ tabWidgetPointer->loadUrlFromLineEdit(bookmarkStruct.url);
+ }
+ );
+
+ // Add the bookmark database ID to the toolbar action.
+ toolBarBookmarkActionPointer->setData(bookmarkStruct.databaseId);
+
+ // Add the actions to the beginning of the current bookmarks lists.
+ bookmarksToolBarActionList.prepend(toolBarBookmarkActionPointer);
+ }
+ }
+
+ // Add the extra items to the toolbar folder menus. The first item in the pair is the menu pointer. The second is the folder ID.
+ for (QPair<QMenu *, const double> *menuAndFolderIdPairPointer : bookmarksToolBarMenuList)
+ {
+ // Add a separator.
+ menuAndFolderIdPairPointer->first->addSeparator();
+
+ // Add the open folder in new tabs action to the menu.
+ menuAndFolderIdPairPointer->first->addAction(QIcon::fromTheme(QLatin1String("tab-new")), i18nc("The open folder in new tabs action", "Open Folder in New Tabs"), [=]
+ {
+ // Get all the folder URLs.
+ QList<QString> *folderUrlsListPointer = BookmarksDatabase::getAllFolderUrls(menuAndFolderIdPairPointer->second);
+
+ // Open the URLs in new tabs. `true` removes the URL line edit focus, `false` does not load a background tab.
+ for (QString url : *folderUrlsListPointer)
+ tabWidgetPointer->addTab(true, false, url);
+ }
+ );
+
+ // Add the open folder in background tabs action to the menu.
+ menuAndFolderIdPairPointer->first->addAction(QIcon::fromTheme(QLatin1String("tab-new")), i18nc("The open folder in background tabs action", "Open Folder in Background Tabs"), [=]
+ {
+ // Get all the folder URLs.
+ QList<QString> *folderUrlsListPointer = BookmarksDatabase::getAllFolderUrls(menuAndFolderIdPairPointer->second);
+
+ // Open the URLs in new tabs. `true` removes the URL line edit focus, `true` loads a background tab.
+ for (QString url : *folderUrlsListPointer)
+ tabWidgetPointer->addTab(true, true, url);
+ }
+ );
+
+ // Add the open folder in new window action to the menu.
+ menuAndFolderIdPairPointer->first->addAction(QIcon::fromTheme(QLatin1String("window-new")), i18nc("The open folder in new window action", "Open Folder in New Window"), [=]
+ {
+ // Get all the folder URLs.
+ QList<QString> *folderUrlsListPointer = BookmarksDatabase::getAllFolderUrls(menuAndFolderIdPairPointer->second);
+
+ // Create a new browser window.
+ BrowserWindow *browserWindowPointer = new BrowserWindow(false, &folderUrlsListPointer->first());
+
+ // Get a count of the folder URLs.
+ const int folderUrls = folderUrlsListPointer->count();