Browse Source

Disable sync button while in progress

Need to show a bit more feedback I think. Let's see what the design said...

Contributes to issue CURA-8609.
Ghostkeeper 3 years ago
parent
commit
e7b49ee551

+ 18 - 5
cura/Machines/Models/MaterialManagementModel.py

@@ -2,7 +2,7 @@
 # Cura is released under the terms of the LGPLv3 or higher.
 
 import copy  # To duplicate materials.
-from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QUrl
+from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QUrl
 from PyQt5.QtGui import QDesktopServices
 from typing import Any, Dict, Optional, TYPE_CHECKING
 import uuid  # To generate new GUIDs for new materials.
@@ -35,6 +35,7 @@ class MaterialManagementModel(QObject):
     def __init__(self, parent: QObject = None):
         super().__init__(parent)
         self._sync_all_dialog = None  # type: Optional[QObject]
+        self._export_upload_status = "idle"
         self._checkIfNewMaterialsWereInstalled()
 
     def _checkIfNewMaterialsWereInstalled(self) -> None:
@@ -330,12 +331,11 @@ class MaterialManagementModel(QObject):
         """
         if self._sync_all_dialog is None:
             qml_path = Resources.getPath(cura.CuraApplication.CuraApplication.ResourceTypes.QmlFiles, "Preferences", "Materials", "MaterialsSyncDialog.qml")
-            self._sync_all_dialog = cura.CuraApplication.CuraApplication.getInstance().createQmlComponent(qml_path, {
-                "materialManagementModel": self,
-                "pageIndex": 0
-            })
+            self._sync_all_dialog = cura.CuraApplication.CuraApplication.getInstance().createQmlComponent(qml_path, {})
         if self._sync_all_dialog is None:  # Failed to load QML file.
             return
+        self._sync_all_dialog.setProperty("materialManagementModel", self)
+        self._sync_all_dialog.setProperty("pageIndex", 0)  # Return to first page.
         self._sync_all_dialog.show()
 
     @pyqtSlot(result = QUrl)
@@ -388,10 +388,23 @@ class MaterialManagementModel(QObject):
             except OSError as e:
                 Logger.log("e", f"An error has occurred while writing the material \'{metadata['id']}\' in the file \'{filename}\': {e}.")
 
+    exportUploadStatusChanged = pyqtSignal()
+
+    @pyqtProperty(str, notify = exportUploadStatusChanged)
+    def exportUploadStatus(self):
+        return self._export_upload_status
+
     @pyqtSlot()
     def exportUpload(self) -> None:
         """
         Export all materials and upload them to the user's account.
         """
+        self._export_upload_status = "uploading"
+        self.exportUploadStatusChanged.emit()
         job = UploadMaterialsJob()
+        job.uploadCompleted.connect(self.exportUploadCompleted)
         job.start()
+
+    def exportUploadCompleted(self):
+        self._export_upload_status = "idle"
+        self.exportUploadStatusChanged.emit()

+ 4 - 0
cura/PrinterOutput/UploadMaterialsJob.py

@@ -11,6 +11,7 @@ from cura.UltimakerCloud import UltimakerCloudConstants  # To know where the API
 from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope  # To know how to communicate with this server.
 from UM.Job import Job
 from UM.Logger import Logger
+from UM.Signal import Signal
 from UM.TaskManagement.HttpRequestManager import HttpRequestManager  # To call the API.
 from UM.TaskManagement.HttpRequestScope import JsonDecoratorScope
 
@@ -33,6 +34,8 @@ class UploadMaterialsJob(Job):
         super().__init__()
         self._scope = JsonDecoratorScope(UltimakerCloudScope(cura.CuraApplication.CuraApplication.getInstance()))  # type: JsonDecoratorScope
 
+    uploadCompleted = Signal()
+
     def run(self):
         archive_file = tempfile.NamedTemporaryFile("wb", delete = False)
         archive_file.close()
@@ -78,6 +81,7 @@ class UploadMaterialsJob(Job):
             self.setResult(self.Result.FAILED)
             return
         self.setResult(self.Result.SUCCESS)
+        self.uploadCompleted.emit()
 
     def onError(self, reply: "QNetworkReply", error: Optional["QNetworkReply.NetworkError"]):
         pass  # TODO: Handle errors.

+ 8 - 0
resources/qml/Preferences/Materials/MaterialsSyncDialog.qml

@@ -355,6 +355,14 @@ Window
                         anchors.right: parent.right
                         text: catalog.i18nc("@button", "Sync")
                         onClicked: materialManagementModel.exportUpload()
+                        enabled:
+                        {
+                            if(!materialManagementModel)
+                            {
+                                return false;
+                            }
+                            return materialManagementModel.exportUploadStatus != "uploading";
+                        }
                     }
                 }
             }