diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 02f50e7a02..5ef3e6e335 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -8,7 +8,7 @@ from UM.PluginRegistry import PluginRegistry from UM.Application import Application from UM.Version import Version -from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest +from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal, pyqtSlot from PyQt5.QtQml import QQmlComponent, QQmlContext @@ -94,10 +94,7 @@ class PluginBrowser(QObject, Extension): def _onDownloadPluginProgress(self, bytes_sent, bytes_total): if bytes_total > 0: new_progress = bytes_sent / bytes_total * 100 - if new_progress > self._download_progress: - self._download_progress = new_progress - self.onDownloadProgressChanged.emit() - self._download_progress = new_progress + self.setDownloadProgress(new_progress) if new_progress == 100.0: self.setIsDownloading(False) self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) @@ -117,6 +114,11 @@ class PluginBrowser(QObject, Extension): def downloadProgress(self): return self._download_progress + def setDownloadProgress(self, progress): + if progress != self._download_progress: + self._download_progress = progress + self.onDownloadProgressChanged.emit() + @pyqtSlot(str) def downloadAndInstallPlugin(self, url): Logger.log("i", "Attempting to download & install plugin from %s", url) @@ -124,9 +126,8 @@ class PluginBrowser(QObject, Extension): self._download_plugin_request = QNetworkRequest(url) self._download_plugin_request.setRawHeader(*self._request_header) self._download_plugin_reply = self._network_manager.get(self._download_plugin_request) - self._download_progress = 0 + self.setDownloadProgress(0) self.setIsDownloading(True) - self.onDownloadProgressChanged.emit() self._download_plugin_reply.downloadProgress.connect(self._onDownloadPluginProgress) @pyqtProperty(QObject, notify=pluginsMetadataChanged) @@ -180,6 +181,16 @@ class PluginBrowser(QObject, Extension): def _onRequestFinished(self, reply): reply_url = reply.url().toString() + + if reply.error() == QNetworkReply.TimeoutError: + Logger.log("w", "Got a timeout.") + # Reset everything. + self.setDownloadProgress(0) + self.setIsDownloading(False) + if self._download_plugin_reply: + self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) + self._download_plugin_reply.abort() + self._download_plugin_reply = None if reply.operation() == QNetworkAccessManager.GetOperation: if reply_url == self._api_url + "plugins": try: @@ -193,9 +204,20 @@ class PluginBrowser(QObject, Extension): # Ignore any operation that is not a get operation pass + def _onNetworkAccesibleChanged(self, accessible): + if accessible == 0: + self.setDownloadProgress(0) + self.setIsDownloading(False) + if self._download_plugin_reply: + self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) + self._download_plugin_reply.abort() + self._download_plugin_reply = None + def _createNetworkManager(self): if self._network_manager: self._network_manager.finished.disconnect(self._onRequestFinished) + self._network_manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged) self._network_manager = QNetworkAccessManager() - self._network_manager.finished.connect(self._onRequestFinished) \ No newline at end of file + self._network_manager.finished.connect(self._onRequestFinished) + self._network_manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) \ No newline at end of file