Helpviewer/UrlBar/UrlBar.py

changeset 653
0540f3c52b46
child 657
099d1ab9073e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Helpviewer/UrlBar/UrlBar.py	Sun Oct 03 18:39:11 2010 +0200
@@ -0,0 +1,249 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2010 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the URL bar widget.
+"""
+
+from PyQt4.QtCore import Qt, QPointF, QUrl
+from PyQt4.QtGui import QColor, QPalette, QApplication, QLinearGradient
+from PyQt4.QtWebKit import QWebSettings
+
+from E5Gui.E5LineEdit import E5LineEdit
+from E5Gui.E5LineEditButton import E5LineEditButton
+
+from .FavIconLabel import FavIconLabel
+
+import UI.PixmapCache
+import Preferences
+
+class UrlBar(E5LineEdit):
+    """
+    Class implementing a line edit for entering URLs.
+    """
+    def __init__(self, mainWindow, parent = None):
+        """
+        Constructor
+        
+        @param mainWindow reference to the main window (HelpWindow)
+        @param parent reference to the parent widget (HelpBrowser)
+        """
+        E5LineEdit.__init__(self, parent) 
+        self.setInactiveText(self.trUtf8("Enter the location here."))
+        
+        self.__mw = mainWindow
+        self.__browser = None
+        self.__privateMode = QWebSettings.globalSettings().testAttribute(
+            QWebSettings.PrivateBrowsingEnabled)
+        
+        self.__favicon = FavIconLabel(self)
+        self.addWidget(self.__favicon, E5LineEdit.LeftSide)
+        
+        self.__privacyButton = E5LineEditButton(self)
+        self.__privacyButton.setIcon(UI.PixmapCache.getIcon("privateBrowsing.png"))
+        self.addWidget(self.__privacyButton, E5LineEdit.RightSide)
+        self.__privacyButton.setVisible(self.__privateMode)
+        
+        self.__clearButton = E5LineEditButton(self)
+        self.__clearButton.setIcon(UI.PixmapCache.getIcon("clearLeft.png"))
+        self.addWidget(self.__clearButton, E5LineEdit.RightSide)
+        self.__clearButton.setVisible(False)
+        
+        self.__privacyButton.clicked[()].connect(self.__privacyClicked)
+        self.__clearButton.clicked[()].connect(self.clear)
+        self.__mw.privacyChanged.connect(self.__privacyButton.setVisible)
+        self.textChanged.connect(self.__textChanged)
+    
+    def setBrowser(self, browser):
+        """
+        Public method to set the browser connection.
+        
+        @param browser reference to the browser widegt (HelpBrowser)
+        """
+        self.__browser = browser
+        self.__favicon.setBrowser(browser)
+        
+        self.__browser.urlChanged.connect(self.__browserUrlChanged)
+        self.__browser.loadProgress.connect(self.update)
+    
+    def browser(self):
+        """
+        Public method to get the associated browser (HelpBrowser)
+        """
+        return self.__browser
+    
+    def __browserUrlChanged(self, url):
+        """
+        Private slot to handle a URL change of the associated browser.
+        
+        @param url new URL of the browser (QUrl)
+        """
+        self.setText(str(url.toEncoded(), encoding = "utf-8"))
+        self.setCursorPosition(0)
+    
+    def setPrivateMode(self, on):
+        """
+        Public method to set the private mode.
+        
+        @param on flag indicating the privacy state (boolean)
+        """
+        self.__privateMode = on
+        self.__privacyButton.setVisible(on)
+    
+    def __privacyClicked(self):
+        """
+        Private slot to handle the click of the private mode button.
+        """
+        self.__mw.setPrivateMode(False)
+    
+    def __textChanged(self, txt):
+        """
+        Private slot to handle changes of the text.
+        
+        @param txt current text (string)
+        """
+        self.__clearButton.setVisible(txt != "")
+    
+    def preferencesChanged(self):
+        """
+        Public slot to handle a change of preferences.
+        """
+        self.update()
+    
+    def paintEvent(self, evt):
+        """
+        Protected method handling a paint event.
+        
+        @param evt reference to the paint event (QPaintEvent)
+        """
+        if self.__privateMode:
+            backgroundColor = QColor(220, 220, 220)     # light gray
+            foregroundColor = Qt.black
+        else:
+            backgroundColor = QApplication.palette().color(QPalette.Base)
+            foregroundColor = QApplication.palette().color(QPalette.Text)
+        
+        if self.__browser is not None:
+            p = self.palette()
+            progress = self.__browser.progress()
+            if progress == 0:
+                if self.__browser.url().scheme() == "https":
+                    backgroundColor = Preferences.getHelp("SaveUrlColor")
+                p.setBrush(QPalette.Base, backgroundColor);
+                p.setBrush(QPalette.Text, foregroundColor);
+            else:
+                if self.__browser.url().scheme() == "https":
+                    backgroundColor = Preferences.getHelp("SaveUrlColor")
+                highlight = QApplication.palette().color(QPalette.Highlight)
+                r = (highlight.red() + 2 * backgroundColor.red()) // 3
+                g = (highlight.green() + 2 * backgroundColor.green()) // 3
+                b = (highlight.blue() + 2 * backgroundColor.blue()) // 3
+                
+                loadingColor = QColor(r, g, b)
+                if abs(loadingColor.lightness() - backgroundColor.lightness()) < 20:    
+                    # special handling for special color schemes (e.g Gaia)
+                    r = (2 * highlight.red() + backgroundColor.red()) // 3
+                    g = (2 * highlight.green() + backgroundColor.green()) // 3
+                    b = (2 * highlight.blue() + backgroundColor.blue()) // 3
+                    loadingColor = QColor(r, g, b)
+                
+                gradient = QLinearGradient(QPointF(0, 0), QPointF(self.width(), 0))
+                gradient.setColorAt(0, loadingColor)
+                gradient.setColorAt(progress / 100 - 0.000001, loadingColor)
+                gradient.setColorAt(progress / 100, backgroundColor)
+                p.setBrush(QPalette.Base, gradient)
+            
+            self.setPalette(p)
+        
+        E5LineEdit.paintEvent(self, evt)
+    
+    def focusOutEvent(self, evt):
+        """
+        Protected method to handle focus out event.
+        
+        @param evt reference to the focus event (QFocusEvent)
+        """
+        if self.text() == "" and self.__browser is not None:
+            self.__browserUrlChanged(self.__browser.url())
+        E5LineEdit.focusOutEvent(self, evt)
+    
+    def mouseDoubleClickEvent(self, evt):
+        """
+        Protected method to handle mouse double click events.
+        
+        @param evt reference to the mouse event (QMouseEvent)
+        """
+        if evt.button() == Qt.LeftButton:
+            self.selectAll()
+        else:
+            E5LineEdit.mouseDoubleClickEvent(self, evt)
+    
+    def keyPressEvent(self, evt):
+        """
+        Protected method to handle key presses.
+        
+        @param evt reference to the key press event (QKeyEvent)
+        """
+        if evt.key() == Qt.Key_Escape and self.__browser is not None:
+            self.setText(str(self.__browser.url().toEncoded(), encoding = "utf-8"))
+            self.selectAll()
+            return
+        
+        currentText = self.text().strip()
+        if evt.key() in [Qt.Key_Enter, Qt.Key_Return] and \
+           not currentText.lower().startswith("http://"):
+            append = ""
+            if evt.modifiers() == Qt.KeyboardModifiers(Qt.ControlModifier):
+                append = ".com"
+            elif evt.modifiers() == \
+                    Qt.KeyboardModifiers(Qt.ControlModifier | Qt.ShiftModifier):
+                append = ".org"
+            elif evt.modifiers() == Qt.KeyboardModifiers(Qt.ShiftModifier):
+                append = ".net"
+            
+            if append != "":
+                url = QUrl("http://www." + currentText)
+                host = url.host()
+                if not host.lower().endswith(append):
+                    host += append
+                    url.setHost(host)
+                    self.setText(url.toString())
+        
+        E5LineEdit.keyPressEvent(self, evt)
+    
+    def dragEnterEvent(self, evt):
+        """
+        Protected method to handle drag enter events.
+        
+        @param evt reference to the drag enter event (QDragEnterEvent)
+        """
+        mimeData = evt.mimeData()
+        if mimeData.hasUrls() or mimeData.hasText():
+            evt.acceptProposedAction()
+        
+        E5LineEdit.dragEnterEvent(self, evt)
+    
+    def dropEvent(self, evt):
+        """
+        Protected method to handle drop events.
+        
+        @param evt reference to the drop event (QDropEvent)
+        """
+        mimeData = evt.mimeData()
+        
+        url = QUrl()
+        if mimeData.hasUrls():
+            url = mimeData.urls()[0]
+        elif mimeData.hasText():
+            url = QUrl.fromEncoded(mimeData.text().encode(), QUrl.TolerantMode)
+        
+        if url.isEmpty() or not url.isValid():
+            E5LineEdit.dropEvent(self, evt)
+            return
+        
+        self.setText(str(url.toEncoded(), encoding = "utf-8"))
+        self.selectAll()
+        
+        evt.acceptProposedAction()

eric ide

mercurial