Helpviewer/SpeedDial/SpeedDial.py

changeset 1699
10706f6ad9d2
parent 1670
6fd889391d2c
child 1700
40c911b8c0dd
equal deleted inserted replaced
1698:dba994e19891 1699:10706f6ad9d2
11 11
12 from PyQt4.QtCore import pyqtSignal, pyqtSlot, QObject, QCryptographicHash, QByteArray, \ 12 from PyQt4.QtCore import pyqtSignal, pyqtSlot, QObject, QCryptographicHash, QByteArray, \
13 QUrl, qWarning 13 QUrl, qWarning
14 from PyQt4.QtWebKit import QWebPage 14 from PyQt4.QtWebKit import QWebPage
15 15
16 from E5Gui import E5MessageBox
17
18 from .Page import Page
16 from .PageThumbnailer import PageThumbnailer 19 from .PageThumbnailer import PageThumbnailer
17 20 from .SpeedDialReader import SpeedDialReader
18 import Preferences 21 from .SpeedDialWriter import SpeedDialWriter
22
23 from Utilities.AutoSaver import AutoSaver
19 import Utilities 24 import Utilities
20
21
22 class Page(object):
23 """
24 Class to hold the data for a speed dial page.
25 """
26 def __init__(self, url="", title="", broken=False):
27 """
28 Constructor
29
30 @param url URL of the page (string)
31 @param title title of the page (string)
32 """
33 self.url = url
34 self.title = title
35 self.broken = broken
36
37 def __eq__(self, other):
38 """
39 Public method implementing the equality operator.
40
41 @param other reference to the other page object (Page)
42 @return flag indicating equality (boolean)
43 """
44 return self.title == other.title and \
45 self.url == other.url
46 25
47 26
48 class SpeedDial(QObject): 27 class SpeedDial(QObject):
49 """ 28 """
50 Class implementing the speed dial. 29 Class implementing the speed dial.
51 30
52 @signal pagesChanged() emitted after the list of pages changed 31 @signal pagesChanged() emitted after the list of pages changed
32 @signal speedDialSaved() emitted after the speed dial data was saved
53 """ 33 """
54 pagesChanged = pyqtSignal() 34 pagesChanged = pyqtSignal()
35 speedDialSaved = pyqtSignal()
55 36
56 def __init__(self, parent=None): 37 def __init__(self, parent=None):
57 """ 38 """
58 Constructor 39 Constructor
59 40
72 self.__thumbnailers = [] 53 self.__thumbnailers = []
73 54
74 self.__initialize() 55 self.__initialize()
75 56
76 self.pagesChanged.connect(self.__pagesChanged) 57 self.pagesChanged.connect(self.__pagesChanged)
58
59 self.__saveTimer = AutoSaver(self, self.save)
60 self.pagesChanged.connect(self.__saveTimer.changeOccurred)
77 61
78 def addWebFrame(self, frame): 62 def addWebFrame(self, frame):
79 """ 63 """
80 Public method to add a web frame. 64 Public method to add a web frame.
81 65
152 self.__initialScript += "addBox('{0}', '{1}', '{2}');\n".format( 136 self.__initialScript += "addBox('{0}', '{1}', '{2}');\n".format(
153 page.url, page.title, imgSource) 137 page.url, page.title, imgSource)
154 138
155 return self.__initialScript 139 return self.__initialScript
156 140
141 def getFileName(self):
142 """
143 Public method to get the file name of the user agents file.
144
145 @return name of the user agents file (string)
146 """
147 return os.path.join(Utilities.getConfigDir(), "browser", "speedDial.xml")
148
157 def __initialize(self): 149 def __initialize(self):
158 """ 150 """
159 Private method to initialize the speed dial. 151 Private method to initialize the speed dial.
160 """ 152 """
161 allPages = Preferences.Prefs.settings.value("Help/SpeedDial/Pages", "") 153 self.__thumbnailsDirectory = os.path.join(
162 154 Utilities.getConfigDir(), "browser", "thumbnails")
163 if not allPages: 155 # Create directory if it does not exist yet
156 if not os.path.exists(self.__thumbnailsDirectory):
157 os.makedirs(self.__thumbnailsDirectory)
158
159 self.__load()
160
161 def __load(self):
162 """
163 Private method to load the speed dial configuration.
164 """
165 speedDialFile = self.getFileName()
166 if os.path.exists(speedDialFile):
167 reader = SpeedDialReader()
168 allPages, pagesPerRow, speedDialSize = reader.read(speedDialFile)
169 self.__pagesPerRow = pagesPerRow if pagesPerRow else 4
170 self.__speedDialSize = speedDialSize if speedDialSize else 231
171
172 if allPages:
173 self.__webPages = allPages
174 self.pagesChanged.emit()
175 else:
164 allPages = \ 176 allPages = \
165 'url:"http://eric-ide.python-projects.org/"|title:"Eric Web Site";'\ 177 'url:"http://eric-ide.python-projects.org/"|title:"Eric Web Site";'\
166 'url:"http://www.riverbankcomputing.com/"|title:"PyQt4 Web Site";'\ 178 'url:"http://www.riverbankcomputing.com/"|title:"PyQt4 Web Site";'\
167 'url:"http://qt.nokia.com/"|title:"Qt Web Site";'\ 179 'url:"http://qt.nokia.com/"|title:"Qt Web Site";'\
168 'url:"http://www.python.org"|title:"Python Language Website";'\ 180 'url:"http://www.python.org"|title:"Python Language Website";'\
169 'url:"http://www.google.com"|title:"Google";' 181 'url:"http://www.google.com"|title:"Google";'
170 self.changed(allPages) 182 self.changed(allPages)
171 183
172 self.__thumbnailsDirectory = os.path.join( 184 def save(self):
173 Utilities.getConfigDir(), "browser", "thumbnails") 185 """
174 # Create directory if it does not exist yet 186 Public method to save the speed dial configuration.
175 if not os.path.exists(self.__thumbnailsDirectory): 187 """
176 os.makedirs(self.__thumbnailsDirectory) 188 speedDialFile = self.getFileName()
189 writer = SpeedDialWriter()
190 if not writer.write(speedDialFile,
191 self.__webPages, self.__pagesPerRow, self.__speedDialSize):
192 E5MessageBox.critical(None,
193 self.trUtf8("Saving Speed Dial data"),
194 self.trUtf8("""<p>Speed Dial data could not be saved to <b>{0}</b></p>"""
195 ).format(speedDialFile))
196 else:
197 self.speedDialSaved.emit()
198
199 def close(self):
200 """
201 Public method to close the user agents manager.
202 """
203 self.__saveTimer.saveIfNeccessary()
177 204
178 def pageForUrl(self, url): 205 def pageForUrl(self, url):
179 """ 206 """
180 Public method to get the page for the given URL. 207 Public method to get the page for the given URL.
181 208
278 """ 305 """
279 Public slot to set the number of pages per row. 306 Public slot to set the number of pages per row.
280 307
281 @param count number of pages per row (integer) 308 @param count number of pages per row (integer)
282 """ 309 """
283 Preferences.Prefs.settings.setValue("Help/SpeedDial/PagesPerRow", count) 310 self.__pagesPerRow = count
311 self.__saveTimer.changeOccurred()
284 312
285 def pagesInRow(self): 313 def pagesInRow(self):
286 """ 314 """
287 Public method to get the number of dials per row. 315 Public method to get the number of dials per row.
288 316
289 @return number of dials per row (integer) 317 @return number of dials per row (integer)
290 """ 318 """
291 return int( 319 return self.__pagesPerRow
292 Preferences.Prefs.settings.value("Help/SpeedDial/PagesPerRow", 4))
293 320
294 @pyqtSlot(int) 321 @pyqtSlot(int)
295 def setSdSize(self, size): 322 def setSdSize(self, size):
296 """ 323 """
297 Public slot to set the size of the speed dial. 324 Public slot to set the size of the speed dial.
298 325
299 @param size size of the speed dial (integer) 326 @param size size of the speed dial (integer)
300 """ 327 """
301 Preferences.Prefs.settings.setValue("Help/SpeedDial/SpeedDialSize", size) 328 self.__speedDialSize = size
329 self.__saveTimer.changeOccurred()
302 330
303 def sdSize(self): 331 def sdSize(self):
304 """ 332 """
305 Public method to get the speed dial size. 333 Public method to get the speed dial size.
306 334
307 @return speed dial size (integer) 335 @return speed dial size (integer)
308 """ 336 """
309 return int( 337 return self.__speedDialSize
310 Preferences.Prefs.settings.value("Help/SpeedDial/SpeedDialSize", 231))
311 338
312 def __thumbnailCreated(self, image): 339 def __thumbnailCreated(self, image):
313 """ 340 """
314 Private slot to handle the creation of a thumbnail image. 341 Private slot to handle the creation of a thumbnail image.
315 342
368 395
369 def __pagesChanged(self): 396 def __pagesChanged(self):
370 """ 397 """
371 Private slot to react on a change of the pages configuration. 398 Private slot to react on a change of the pages configuration.
372 """ 399 """
373 # step 1: save the list of pages 400 # update all speed dial pages
374 Preferences.Prefs.settings.setValue(
375 "Help/SpeedDial/Pages", self.__generateAllPages())
376
377 # step 2: update all speed dial pages
378 self.__regenerateScript = True 401 self.__regenerateScript = True
379 for frame in self.__cleanFrames(): 402 for frame in self.__cleanFrames():
380 frame.page().triggerAction(QWebPage.Reload) 403 frame.page().triggerAction(QWebPage.Reload)
381
382 def __generateAllPages(self):
383 """
384 Private method to generate s string with all pages managed by the speed dial.
385
386 @return string with all pages (string)
387 """
388 allPages = ""
389
390 for page in self.__webPages:
391 entry = 'url:"{0}"|title:"{1}";'.format(page.url, page.title)
392 allPages += entry
393
394 return allPages

eric ide

mercurial