WebBrowser/ZoomManager/ZoomManager.py

branch
QtWebEngine
changeset 4726
c26e2a2dc0cb
parent 4631
5c1a96925da4
child 4817
0a4e2fb0e93c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebBrowser/ZoomManager/ZoomManager.py	Sun Feb 07 18:08:48 2016 +0100
@@ -0,0 +1,228 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2016 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a manager for site specific zoom level settings.
+"""
+
+from __future__ import unicode_literals
+
+import json
+
+from PyQt5.QtCore import pyqtSignal, QObject
+
+from Utilities.AutoSaver import AutoSaver
+import Preferences
+
+
+class ZoomManager(QObject):
+    """
+    Class implementing a manager for site specific zoom level settings.
+    """
+    changed = pyqtSignal()
+    
+    def __init__(self, parent=None):
+        """
+        Constructor
+        
+        @param parent reference to the parent object (QObject)
+        """
+        super(ZoomManager, self).__init__(parent)
+        
+        self.__zoomDB = {}
+        
+        self.__saveTimer = AutoSaver(self, self.save)
+        
+        self.changed.connect(self.__saveTimer.changeOccurred)
+        
+        self.__loaded = False
+    
+    def close(self):
+        """
+        Public method to close the zoom manager.
+        """
+        self.__saveTimer.saveIfNeccessary()
+    
+    def load(self):
+        """
+        Public method to load the bookmarks.
+        """
+        if self.__loaded:
+            return
+        
+        dbString = Preferences.getWebBrowser("ZoomValuesDB")
+        if dbString:
+            try:
+                db = json.loads(dbString)
+                self.__zoomDB = db
+            except ValueError:
+                # ignore silently
+                pass
+        
+        self.__loaded = True
+    
+    def save(self):
+        """
+        Public method to save the zoom values.
+        """
+        if not self.__loaded:
+            return
+        
+        dbString = json.dumps(self.__zoomDB)
+        Preferences.setWebBrowser("ZoomValuesDB", dbString)
+    
+    def __keyFromUrl(self, url):
+        """
+        Private method to generate a DB key for an URL.
+        
+        @param url URL to generate a key for
+        @type QUrl
+        @return key for the given URL
+        @rtype str
+        """
+        if url.isEmpty():
+            key = ""
+        else:
+            scheme = url.scheme()
+            host = url.host()
+            if host:
+                key = host
+            elif scheme == "file":
+                path = url.path()
+                key = path.rsplit("/", 1)[0]
+            else:
+                key = ""
+        
+        return key
+    
+    def setZoomValue(self, url, zoomValue):
+        """
+        Public method to record the zoom value for the given URL.
+        
+        Note: Only zoom values not equal 100% are recorded.
+        
+        @param url URL of the page to remember the zoom value for
+        @type QUrl
+        @param zoomValue zoom value for the URL
+        @type int
+        """
+        self.load()
+        
+        key = self.__keyFromUrl(url)
+        if not key:
+            return
+        
+        if ((zoomValue == 100 and key not in self.__zoomDB) or
+                (key in self.__zoomDB and self.__zoomDB[key] == zoomValue)):
+            return
+        
+        if zoomValue == 100:
+            del self.__zoomDB[key]
+        else:
+            self.__zoomDB[key] = zoomValue
+        
+        self.changed.emit()
+    
+    def zoomValue(self, url):
+        """
+        Public method to get the zoom value for an URL.
+        
+        @param url URL of the page to get the zoom value for
+        @type QUrl
+        @return zoomValue zoom value for the URL
+        @rtype int
+        """
+        self.load()
+        
+        key = self.__keyFromUrl(url)
+        if not key:
+            zoom = 100
+        
+        if key in self.__zoomDB:
+            zoom = self.__zoomDB[key]
+        else:
+            # default zoom value (i.e. no zoom)
+            zoom = 100
+        
+        return zoom
+    
+    def clear(self):
+        """
+        Public method to clear the saved zoom values.
+        """
+        self.__zoomDB = {}
+        self.__loaded = True
+        
+        self.changed.emit()
+    
+    def removeZoomValue(self, site):
+        """
+        Public method to remove a zoom value entry.
+        
+        @param site web site name
+        @type str
+        """
+        self.load()
+        
+        if site in self.__zoomDB:
+            del self.__zoomDB[site]
+            self.changed.emit()
+    
+    def allSiteNames(self):
+        """
+        Public method to get a list of all site names.
+        
+        @return sorted list of all site names
+        @rtype list of str
+        """
+        self.load()
+        
+        return sorted(self.__zoomDB.keys())
+    
+    def sitesCount(self):
+        """
+        Public method to get the number of available sites.
+        
+        @return number of sites
+        @rtype int
+        """
+        self.load()
+        
+        return len(self.__zoomDB)
+    
+    def siteInfo(self, site):
+        """
+        Public method to get the zoom value for the site.
+        
+        @param site web site name
+        @type str
+        @return zoom value for the site
+        @rtype int
+        """
+        self.load()
+        
+        if site not in self.__zoomDB:
+            return None
+        
+        return self.__zoomDB[site]
+
+
+__ZoomManager = None
+
+
+def instance():
+    """
+    Global function to get a reference to the zoom manager and create it, if
+    it hasn't been yet.
+    
+    @return reference to the zoom manager object
+    @rtype ZoomManager
+    """
+    global __ZoomManager
+    
+    if __ZoomManager is None:
+        __ZoomManager = ZoomManager()
+    
+    return __ZoomManager

eric ide

mercurial