eric6/WebBrowser/ZoomManager/ZoomManager.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
child 7229
53054eb5b15a
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2015 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a manager for site specific zoom level settings.
8 """
9
10 from __future__ import unicode_literals
11
12 import json
13
14 from PyQt5.QtCore import pyqtSignal, QObject
15
16 from Utilities.AutoSaver import AutoSaver
17 import Preferences
18
19
20 class ZoomManager(QObject):
21 """
22 Class implementing a manager for site specific zoom level settings.
23
24 @signal changed() emitted to indicate a change of the zoom level
25 """
26 changed = pyqtSignal()
27
28 def __init__(self, parent=None):
29 """
30 Constructor
31
32 @param parent reference to the parent object (QObject)
33 """
34 super(ZoomManager, self).__init__(parent)
35
36 self.__zoomDB = {}
37
38 self.__saveTimer = AutoSaver(self, self.save)
39
40 self.changed.connect(self.__saveTimer.changeOccurred)
41
42 self.__loaded = False
43
44 def close(self):
45 """
46 Public method to close the zoom manager.
47 """
48 self.__saveTimer.saveIfNeccessary()
49
50 def load(self):
51 """
52 Public method to load the bookmarks.
53 """
54 if self.__loaded:
55 return
56
57 dbString = Preferences.getWebBrowser("ZoomValuesDB")
58 if dbString:
59 try:
60 db = json.loads(dbString)
61 self.__zoomDB = db
62 except ValueError:
63 # ignore silently
64 pass
65
66 self.__loaded = True
67
68 def save(self):
69 """
70 Public method to save the zoom values.
71 """
72 if not self.__loaded:
73 return
74
75 from WebBrowser.WebBrowserWindow import WebBrowserWindow
76 if not WebBrowserWindow.isPrivate():
77 dbString = json.dumps(self.__zoomDB)
78 Preferences.setWebBrowser("ZoomValuesDB", dbString)
79
80 def __keyFromUrl(self, url):
81 """
82 Private method to generate a DB key for an URL.
83
84 @param url URL to generate a key for
85 @type QUrl
86 @return key for the given URL
87 @rtype str
88 """
89 if url.isEmpty():
90 key = ""
91 else:
92 scheme = url.scheme()
93 host = url.host()
94 if host:
95 key = host
96 elif scheme == "file":
97 path = url.path()
98 key = path.rsplit("/", 1)[0]
99 else:
100 key = ""
101
102 return key
103
104 def setZoomValue(self, url, zoomValue):
105 """
106 Public method to record the zoom value for the given URL.
107
108 Note: Only zoom values not equal 100% are recorded.
109
110 @param url URL of the page to remember the zoom value for
111 @type QUrl
112 @param zoomValue zoom value for the URL
113 @type int
114 """
115 self.load()
116
117 key = self.__keyFromUrl(url)
118 if not key:
119 return
120
121 if ((zoomValue == 100 and key not in self.__zoomDB) or
122 (key in self.__zoomDB and self.__zoomDB[key] == zoomValue)):
123 return
124
125 if zoomValue == 100:
126 del self.__zoomDB[key]
127 else:
128 self.__zoomDB[key] = zoomValue
129
130 self.changed.emit()
131
132 def zoomValue(self, url):
133 """
134 Public method to get the zoom value for an URL.
135
136 @param url URL of the page to get the zoom value for
137 @type QUrl
138 @return zoomValue zoom value for the URL
139 @rtype int
140 """
141 self.load()
142
143 key = self.__keyFromUrl(url)
144 if not key:
145 zoom = 100
146
147 if key in self.__zoomDB:
148 zoom = self.__zoomDB[key]
149 else:
150 # default zoom value (i.e. no zoom)
151 zoom = 100
152
153 return zoom
154
155 def clear(self):
156 """
157 Public method to clear the saved zoom values.
158 """
159 self.__zoomDB = {}
160 self.__loaded = True
161
162 self.changed.emit()
163
164 def removeZoomValue(self, site):
165 """
166 Public method to remove a zoom value entry.
167
168 @param site web site name
169 @type str
170 """
171 self.load()
172
173 if site in self.__zoomDB:
174 del self.__zoomDB[site]
175 self.changed.emit()
176
177 def allSiteNames(self):
178 """
179 Public method to get a list of all site names.
180
181 @return sorted list of all site names
182 @rtype list of str
183 """
184 self.load()
185
186 return sorted(self.__zoomDB.keys())
187
188 def sitesCount(self):
189 """
190 Public method to get the number of available sites.
191
192 @return number of sites
193 @rtype int
194 """
195 self.load()
196
197 return len(self.__zoomDB)
198
199 def siteInfo(self, site):
200 """
201 Public method to get the zoom value for the site.
202
203 @param site web site name
204 @type str
205 @return zoom value for the site
206 @rtype int
207 """
208 self.load()
209
210 if site not in self.__zoomDB:
211 return None
212
213 return self.__zoomDB[site]
214
215
216 _ZoomManager = None
217
218
219 def instance():
220 """
221 Global function to get a reference to the zoom manager and create it, if
222 it hasn't been yet.
223
224 @return reference to the zoom manager object
225 @rtype ZoomManager
226 """
227 global _ZoomManager
228
229 if _ZoomManager is None:
230 _ZoomManager = ZoomManager()
231
232 return _ZoomManager

eric ide

mercurial