src/eric7/WebBrowser/ZoomManager/ZoomManager.py

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

eric ide

mercurial