8 """ |
8 """ |
9 |
9 |
10 from __future__ import unicode_literals |
10 from __future__ import unicode_literals |
11 |
11 |
12 from PyQt5.QtCore import pyqtSlot, Qt, QModelIndex, QFileInfo |
12 from PyQt5.QtCore import pyqtSlot, Qt, QModelIndex, QFileInfo |
13 from PyQt5.QtGui import QCursor |
13 from PyQt5.QtGui import QCursor, QKeySequence |
14 from PyQt5.QtWidgets import QDialog, QStyle, QFileIconProvider, QMenu, \ |
14 from PyQt5.QtWidgets import QDialog, QStyle, QFileIconProvider, QMenu, \ |
15 QApplication |
15 QApplication, QShortcut |
16 from PyQt5.QtNetwork import QNetworkRequest |
|
17 from PyQt5.QtWebKit import QWebSettings |
|
18 |
16 |
19 from E5Gui import E5MessageBox |
17 from E5Gui import E5MessageBox |
20 |
18 |
21 from .Ui_DownloadManager import Ui_DownloadManager |
19 from .Ui_DownloadManager import Ui_DownloadManager |
22 |
20 |
48 self.setWindowFlags(Qt.Window) |
46 self.setWindowFlags(Qt.Window) |
49 |
47 |
50 self.__saveTimer = AutoSaver(self, self.save) |
48 self.__saveTimer = AutoSaver(self, self.save) |
51 |
49 |
52 self.__model = DownloadModel(self) |
50 self.__model = DownloadModel(self) |
53 self.__manager = Helpviewer.HelpWindow.HelpWindow\ |
51 self.__manager = WebBrowserWindow.networkManager() |
54 .networkAccessManager() |
|
55 |
52 |
56 self.__iconProvider = None |
53 self.__iconProvider = None |
57 self.__downloads = [] |
54 self.__downloads = [] |
58 self.__downloadDirectory = "" |
55 self.__downloadDirectory = "" |
59 self.__loaded = False |
56 self.__loaded = False |
67 self.downloadsView.horizontalHeader().setStretchLastSection(True) |
64 self.downloadsView.horizontalHeader().setStretchLastSection(True) |
68 self.downloadsView.setModel(self.__model) |
65 self.downloadsView.setModel(self.__model) |
69 self.downloadsView.setContextMenuPolicy(Qt.CustomContextMenu) |
66 self.downloadsView.setContextMenuPolicy(Qt.CustomContextMenu) |
70 self.downloadsView.customContextMenuRequested.connect( |
67 self.downloadsView.customContextMenuRequested.connect( |
71 self.__customContextMenuRequested) |
68 self.__customContextMenuRequested) |
|
69 |
|
70 self.__clearShortcut = QShortcut(QKeySequence("Ctrl+L"), self) |
|
71 self.__clearShortcut.activated.connect(self.on_cleanupButton_clicked) |
72 |
72 |
73 self.__load() |
73 self.__load() |
74 |
74 |
75 def __customContextMenuRequested(self, pos): |
75 def __customContextMenuRequested(self, pos): |
76 """ |
76 """ |
162 if not res: |
162 if not res: |
163 self.show() |
163 self.show() |
164 return False |
164 return False |
165 return True |
165 return True |
166 |
166 |
167 def download(self, requestOrUrl, requestFileName=False, mainWindow=None): |
167 def download(self, downloadItem): |
168 """ |
168 """ |
169 Public method to download a file. |
169 Public method to download a file. |
170 |
170 |
171 @param requestOrUrl reference to a request object (QNetworkRequest) |
171 @param downloadItem reference to the download object containing the |
172 or a URL to be downloaded (QUrl) |
172 download data. |
173 @keyparam requestFileName flag indicating to ask for the |
173 @type QWebEngineDownloadItem |
174 download file name (boolean) |
174 """ |
175 @keyparam mainWindow reference to the main window (HelpWindow) |
175 if downloadItem.url().isEmpty(): |
176 """ |
|
177 request = QNetworkRequest(requestOrUrl) |
|
178 if request.url().isEmpty(): |
|
179 return |
|
180 self.handleUnsupportedContent( |
|
181 self.__manager.get(request), |
|
182 requestFileName=requestFileName, |
|
183 download=True, |
|
184 mainWindow=mainWindow) |
|
185 |
|
186 def handleUnsupportedContent(self, reply, requestFileName=False, |
|
187 webPage=None, download=False, |
|
188 mainWindow=None): |
|
189 """ |
|
190 Public method to handle unsupported content by downloading the |
|
191 referenced resource. |
|
192 |
|
193 @param reply reference to the reply object (QNetworkReply) |
|
194 @keyparam requestFileName indicating to ask for a filename |
|
195 (boolean) |
|
196 @keyparam webPage reference to the web page (HelpWebPage) |
|
197 @keyparam download flag indicating a download request (boolean) |
|
198 @keyparam mainWindow reference to the main window (HelpWindow) |
|
199 """ |
|
200 if reply is None or reply.url().isEmpty(): |
|
201 return |
|
202 |
|
203 size = reply.header(QNetworkRequest.ContentLengthHeader) |
|
204 if size == 0: |
|
205 return |
176 return |
206 |
177 |
207 from .DownloadItem import DownloadItem |
178 from .DownloadItem import DownloadItem |
208 itm = DownloadItem( |
179 itm = DownloadItem(downloadItem, parent=self) |
209 reply=reply, requestFilename=requestFileName, |
|
210 webPage=webPage, download=download, parent=self, |
|
211 mainWindow=mainWindow) |
|
212 self.__addItem(itm) |
180 self.__addItem(itm) |
213 |
181 |
214 if itm.canceledFileSelect(): |
182 if itm.canceledFileSelect(): |
215 return |
183 return |
216 |
184 |
269 self.downloadsView.setRowHeight( |
237 self.downloadsView.setRowHeight( |
270 row, |
238 row, |
271 max(oldHeight, itm.minimumSizeHint().height() * 1.5)) |
239 max(oldHeight, itm.minimumSizeHint().height() * 1.5)) |
272 |
240 |
273 remove = False |
241 remove = False |
274 globalSettings = QWebSettings.globalSettings() |
242 # TODO: Private Browsing |
275 if not itm.downloading() and \ |
243 ## globalSettings = QWebSettings.globalSettings() |
276 globalSettings.testAttribute(QWebSettings.PrivateBrowsingEnabled): |
244 ## if not itm.downloading() and \ |
277 remove = True |
245 ## globalSettings.testAttribute(QWebSettings.PrivateBrowsingEnabled): |
|
246 ## remove = True |
278 |
247 |
279 if itm.downloadedSuccessfully() and \ |
248 if itm.downloadedSuccessfully() and \ |
280 self.removePolicy() == DownloadManager.RemoveSuccessFullDownload: |
249 self.removePolicy() == DownloadManager.RemoveSuccessFullDownload: |
281 remove = True |
250 remove = True |
282 |
251 |
324 Preferences.setWebBrowser("DownloadManagerSize", self.size()) |
293 Preferences.setWebBrowser("DownloadManagerSize", self.size()) |
325 Preferences.setWebBrowser("DownloadManagerPosition", self.pos()) |
294 Preferences.setWebBrowser("DownloadManagerPosition", self.pos()) |
326 if self.removePolicy() == DownloadManager.RemoveExit: |
295 if self.removePolicy() == DownloadManager.RemoveExit: |
327 return |
296 return |
328 |
297 |
329 downloads = [] |
298 # TODO: Downloads: check saving downloads |
330 for download in self.__downloads: |
299 ## downloads = [] |
331 downloads.append(download.getData()) |
300 ## for download in self.__downloads: |
332 Preferences.setWebBrowser("DownloadManagerDownloads", downloads) |
301 ## downloads.append(download.getData()) |
|
302 ## Preferences.setWebBrowser("DownloadManagerDownloads", downloads) |
333 |
303 |
334 def __load(self): |
304 def __load(self): |
335 """ |
305 """ |
336 Private method to load the download settings. |
306 Private method to load the download settings. |
337 """ |
307 """ |
342 if size.isValid(): |
312 if size.isValid(): |
343 self.resize(size) |
313 self.resize(size) |
344 pos = Preferences.getWebBrowser("DownloadManagerPosition") |
314 pos = Preferences.getWebBrowser("DownloadManagerPosition") |
345 self.move(pos) |
315 self.move(pos) |
346 |
316 |
347 downloads = Preferences.getWebBrowser("DownloadManagerDownloads") |
317 # TODO: Downloads: check laoding downloads |
348 for download in downloads: |
318 ## downloads = Preferences.getWebBrowser("DownloadManagerDownloads") |
349 if not download[0].isEmpty() and \ |
319 ## for download in downloads: |
350 download[1] != "": |
320 ## if not download[0].isEmpty() and \ |
351 from .DownloadItem import DownloadItem |
321 ## download[1] != "": |
352 itm = DownloadItem(parent=self) |
322 ## from .DownloadItem import DownloadItem |
353 itm.setData(download) |
323 ## itm = DownloadItem(parent=self) |
354 self.__addItem(itm) |
324 ## itm.setData(download) |
|
325 ## self.__addItem(itm) |
355 self.cleanupButton.setEnabled( |
326 self.cleanupButton.setEnabled( |
356 (len(self.__downloads) - self.activeDownloads()) > 0) |
327 (len(self.__downloads) - self.activeDownloads()) > 0) |
357 |
328 |
358 self.__loaded = True |
329 self.__loaded = True |
359 self.__updateActiveItemCount() |
330 self.__updateActiveItemCount() |
449 |
420 |
450 ########################################################################### |
421 ########################################################################### |
451 ## Context menu related methods below |
422 ## Context menu related methods below |
452 ########################################################################### |
423 ########################################################################### |
453 |
424 |
|
425 # TODO: Downloads: check the context menu actions |
454 def __currentItem(self): |
426 def __currentItem(self): |
455 """ |
427 """ |
456 Private method to get a reference to the current item. |
428 Private method to get a reference to the current item. |
457 |
429 |
458 @return reference to the current item (DownloadItem) |
430 @return reference to the current item (DownloadItem) |