src/eric7/WebBrowser/Bookmarks/BookmarksToolBar.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 8881
54e42bc2437a
child 9221
bf71ee032bb4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksToolBar.py	Thu Jul 07 11:23:56 2022 +0200
@@ -0,0 +1,276 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2009 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a tool bar showing bookmarks.
+"""
+
+from PyQt6.QtCore import pyqtSignal, Qt, QUrl, QCoreApplication
+from PyQt6.QtGui import QCursor
+from PyQt6.QtWidgets import QMenu
+from PyQt6.QtWebEngineCore import QWebEnginePage
+
+from EricWidgets.EricModelToolBar import EricModelToolBar
+
+from .BookmarksModel import BookmarksModel
+
+
+class BookmarksToolBar(EricModelToolBar):
+    """
+    Class implementing a tool bar showing bookmarks.
+    
+    @signal openUrl(QUrl, str) emitted to open a URL in the current tab
+    @signal newTab(QUrl, str) emitted to open a URL in a new tab
+    @signal newWindow(QUrl, str) emitted to open a URL in a new window
+    """
+    openUrl = pyqtSignal(QUrl, str)
+    newTab = pyqtSignal(QUrl, str)
+    newWindow = pyqtSignal(QUrl, str)
+    
+    def __init__(self, mainWindow, model, parent=None):
+        """
+        Constructor
+        
+        @param mainWindow reference to the main window (WebBrowserWindow)
+        @param model reference to the bookmarks model (BookmarksModel)
+        @param parent reference to the parent widget (QWidget)
+        """
+        EricModelToolBar.__init__(
+            self, QCoreApplication.translate("BookmarksToolBar", "Bookmarks"),
+            parent)
+        
+        self.__mw = mainWindow
+        self.__bookmarksModel = model
+        
+        self.__mw.bookmarksManager().bookmarksReloaded.connect(self.__rebuild)
+        
+        self.setModel(model)
+        self.setRootIndex(model.nodeIndex(
+            self.__mw.bookmarksManager().toolbar()))
+        
+        self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+        self.customContextMenuRequested.connect(self.__contextMenuRequested)
+        self.activated.connect(self.__bookmarkActivated)
+        
+        self.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon)
+        
+        self._build()
+    
+    def __rebuild(self):
+        """
+        Private slot to rebuild the toolbar.
+        """
+        self.__bookmarksModel = (
+            self.__mw.bookmarksManager().bookmarksModel()
+        )
+        self.setModel(self.__bookmarksModel)
+        self.setRootIndex(self.__bookmarksModel.nodeIndex(
+            self.__mw.bookmarksManager().toolbar()))
+        self._build()
+    
+    def __contextMenuRequested(self, pos):
+        """
+        Private slot to handle the context menu request.
+        
+        @param pos position the context menu shall be shown (QPoint)
+        """
+        act = self.actionAt(pos)
+        menu = QMenu()
+        
+        if act is not None:
+            v = act.data()
+            
+            button = self.widgetForAction(act)
+            if button.menu() is None:
+                act2 = menu.addAction(self.tr("Open"))
+                act2.setData(v)
+                act2.triggered.connect(
+                    lambda: self.__openBookmark(act2))
+                act2 = menu.addAction(self.tr("Open in New Tab\tCtrl+LMB"))
+                act2.setData(v)
+                act2.triggered.connect(
+                    lambda: self.__openBookmarkInNewTab(act2))
+                act2 = menu.addAction(self.tr("Open in New Window"))
+                act2.setData(v)
+                act2.triggered.connect(
+                    lambda: self.__openBookmarkInNewWindow(act2))
+                act2 = menu.addAction(self.tr("Open in New Private Window"))
+                act2.setData(v)
+                act2.triggered.connect(
+                    lambda: self.__openBookmarkInPrivateWindow(act2))
+                menu.addSeparator()
+            
+            act2 = menu.addAction(self.tr("Remove"))
+            act2.setData(v)
+            act2.triggered.connect(lambda: self.__removeBookmark(act2))
+            menu.addSeparator()
+            
+            act2 = menu.addAction(self.tr("Properties..."))
+            act2.setData(v)
+            act2.triggered.connect(lambda: self.__edit(act2))
+            menu.addSeparator()
+        
+        menu.addAction(self.tr("Add Bookmark..."), self.__newBookmark)
+        menu.addAction(self.tr("Add Folder..."), self.__newFolder)
+        
+        menu.exec(QCursor.pos())
+    
+    def __updateVisitCount(self, idx):
+        """
+        Private method to update the visit count of a bookmark.
+        
+        @param idx index of the bookmark item (QModelIndex)
+        """
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        
+        bookmarkNode = self.model().node(idx)
+        manager = WebBrowserWindow.bookmarksManager()
+        manager.incVisitCount(bookmarkNode)
+    
+    def __bookmarkActivated(self, idx):
+        """
+        Private slot handling the activation of a bookmark.
+        
+        @param idx index of the activated bookmark (QModelIndex)
+        """
+        if idx.isValid():
+            if self._mouseButton == Qt.MouseButton.XButton1:
+                self.__mw.currentBrowser().triggerPageAction(
+                    QWebEnginePage.WebAction.Back)
+            elif self._mouseButton == Qt.MouseButton.XButton2:
+                self.__mw.currentBrowser().triggerPageAction(
+                    QWebEnginePage.WebAction.Forward)
+            elif self._mouseButton == Qt.MouseButton.LeftButton:
+                if (
+                    self._keyboardModifiers &
+                    Qt.KeyboardModifier.ControlModifier
+                ):
+                    self.newTab.emit(
+                        idx.data(BookmarksModel.UrlRole),
+                        idx.data(Qt.ItemDataRole.DisplayRole))
+                elif (
+                    self._keyboardModifiers &
+                    Qt.KeyboardModifier.ShiftModifier
+                ):
+                    self.newWindow.emit(
+                        idx.data(BookmarksModel.UrlRole),
+                        idx.data(Qt.ItemDataRole.DisplayRole))
+                else:
+                    self.openUrl.emit(
+                        idx.data(BookmarksModel.UrlRole),
+                        idx.data(Qt.ItemDataRole.DisplayRole))
+                self.__updateVisitCount(idx)
+    
+    def __openBookmark(self, act):
+        """
+        Private slot to open a bookmark in the current browser tab.
+        
+        @param act reference to the triggering action
+        @type QAction
+        """
+        idx = self.index(act)
+        
+        self.openUrl.emit(
+            idx.data(BookmarksModel.UrlRole),
+            idx.data(Qt.ItemDataRole.DisplayRole))
+        self.__updateVisitCount(idx)
+    
+    def __openBookmarkInNewTab(self, act):
+        """
+        Private slot to open a bookmark in a new browser tab.
+        
+        @param act reference to the triggering action
+        @type QAction
+        """
+        idx = self.index(act)
+        
+        self.newTab.emit(
+            idx.data(BookmarksModel.UrlRole),
+            idx.data(Qt.ItemDataRole.DisplayRole))
+        self.__updateVisitCount(idx)
+    
+    def __openBookmarkInNewWindow(self, act):
+        """
+        Private slot to open a bookmark in a new window.
+        
+        @param act reference to the triggering action
+        @type QAction
+        """
+        idx = self.index(act)
+        
+        self.newWindow.emit(
+            idx.data(BookmarksModel.UrlRole),
+            idx.data(Qt.ItemDataRole.DisplayRole))
+        self.__updateVisitCount(idx)
+    
+    def __openBookmarkInPrivateWindow(self, act):
+        """
+        Private slot to open a bookmark in a new private window.
+        
+        @param act reference to the triggering action
+        @type QAction
+        """
+        idx = self.index(act)
+        url = idx.data(BookmarksModel.UrlRole)
+        
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        WebBrowserWindow.mainWindow().newPrivateWindow(url)
+        self.__updateVisitCount(idx)
+    
+    def __removeBookmark(self, act):
+        """
+        Private slot to remove a bookmark.
+        
+        @param act reference to the triggering action
+        @type QAction
+        """
+        idx = self.index(act)
+        
+        self.__bookmarksModel.removeRow(idx.row(), self.rootIndex())
+    
+    def __newBookmark(self):
+        """
+        Private slot to add a new bookmark.
+        """
+        from .AddBookmarkDialog import AddBookmarkDialog
+        dlg = AddBookmarkDialog()
+        dlg.setCurrentIndex(self.rootIndex())
+        dlg.exec()
+    
+    def __newFolder(self):
+        """
+        Private slot to add a new bookmarks folder.
+        """
+        from .AddBookmarkDialog import AddBookmarkDialog
+        dlg = AddBookmarkDialog()
+        dlg.setCurrentIndex(self.rootIndex())
+        dlg.setFolder(True)
+        dlg.exec()
+    
+    def _createMenu(self):
+        """
+        Protected method to create the menu for a tool bar action.
+        
+        @return menu for a tool bar action (EricModelMenu)
+        """
+        from .BookmarksMenu import BookmarksMenu
+        menu = BookmarksMenu(self)
+        menu.openUrl.connect(self.openUrl)
+        menu.newTab.connect(self.newTab)
+        menu.newWindow.connect(self.newWindow)
+        return menu
+    
+    def __edit(self, act):
+        """
+        Private slot to edit a bookmarks properties.
+        
+        @param act reference to the triggering action
+        @type QAction
+        """
+        from .BookmarkPropertiesDialog import BookmarkPropertiesDialog
+        idx = self.index(act)
+        node = self.__bookmarksModel.node(idx)
+        dlg = BookmarkPropertiesDialog(node)
+        dlg.exec()

eric ide

mercurial