diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index ee1b8906da..76d4b4d284 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -141,6 +141,17 @@ class PluginBrowser(QObject, Extension): self.setIsDownloading(True) self._download_plugin_reply.downloadProgress.connect(self._onDownloadPluginProgress) + @pyqtSlot() + def cancelDownload(self): + Logger.log("i", "user cancelled the download of a plugin") + self._download_plugin_reply.abort() + self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) + self._download_plugin_reply = None + self._download_plugin_request = None + + self.setDownloadProgress(0) + self.setIsDownloading(False) + @pyqtProperty(QObject, notify=pluginsMetadataChanged) def pluginsModel(self): if self._plugins_model is None: diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index f9cff06898..7d7ade5d95 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -33,6 +33,7 @@ UM.Dialog text: catalog.i18nc("@action:button", "Refresh") onClicked: manager.requestPluginList() anchors.right: parent.right + enabled: !manager.isDownloading } } ScrollView @@ -48,6 +49,7 @@ UM.Dialog model: manager.pluginsModel anchors.fill: parent + property var activePlugin delegate: pluginDelegate } } @@ -75,7 +77,14 @@ UM.Dialog id: closeButton text: catalog.i18nc("@action:button", "Close") iconName: "dialog-close" - onClicked: base.close() + onClicked: + { + if (manager.isDownloading) + { + manager.cancelDownload() + } + base.close(); + } anchors.bottom: parent.bottom anchors.right: parent.right } @@ -123,7 +132,11 @@ UM.Dialog id: downloadButton text: { - if (model.already_installed) + if (manager.isDownloading && pluginList.activePlugin == model) + { + return catalog.i18nc("@action:button", "Cancel"); + } + else if (model.already_installed) { if (model.can_upgrade) { @@ -133,11 +146,32 @@ UM.Dialog } return catalog.i18nc("@action:button", "Download"); } - onClicked: manager.downloadAndInstallPlugin(model.file_location) + onClicked: + { + if(!manager.isDownloading) + { + pluginList.activePlugin = model; + manager.downloadAndInstallPlugin(model.file_location); + } + else + { + manager.cancelDownload(); + } + } anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter - enabled: (!model.already_installed || model.can_upgrade) && !manager.isDownloading + enabled: + { + if (manager.isDownloading) + { + return (pluginList.activePlugin == model); + } + else + { + return (!model.already_installed || model.can_upgrade); + } + } } }