Browse Source

Add a way to cancel a download

and cancel download when closing the window
fieldOfView 7 years ago
parent
commit
6503b87a3a
2 changed files with 49 additions and 4 deletions
  1. 11 0
      plugins/PluginBrowser/PluginBrowser.py
  2. 38 4
      plugins/PluginBrowser/PluginBrowser.qml

+ 11 - 0
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:

+ 38 - 4
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);
+                            }
+                        }
                     }
                 }