From 888fd0382a5b782fcadee0a76c0fb07f0a83d3eb Mon Sep 17 00:00:00 2001 From: Andrew Donaldson Date: Mon, 4 Dec 2017 21:16:30 +1100 Subject: [PATCH 01/17] Add Fedora to test for nvidia driver work around. --- cura_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index d725bc1200..313b161a7d 100755 --- a/cura_app.py +++ b/cura_app.py @@ -12,7 +12,7 @@ from UM.Platform import Platform #WORKAROUND: GITHUB-88 GITHUB-385 GITHUB-612 if Platform.isLinux(): # Needed for platform.linux_distribution, which is not available on Windows and OSX # For Ubuntu: https://bugs.launchpad.net/ubuntu/+source/python-qt4/+bug/941826 - if platform.linux_distribution()[0] in ("debian", "Ubuntu", "LinuxMint"): # TODO: Needs a "if X11_GFX == 'nvidia'" here. The workaround is only needed on Ubuntu+NVidia drivers. Other drivers are not affected, but fine with this fix. + if platform.linux_distribution()[0] in ("debian", "Ubuntu", "LinuxMint", "Fedora"): # TODO: Needs a "if X11_GFX == 'nvidia'" here. The workaround is only needed on Ubuntu+NVidia drivers. Other drivers are not affected, but fine with this fix. import ctypes from ctypes.util import find_library libGL = find_library("GL") From 1bb5b8ff3e77b20938d6eae30938b992fe6f638e Mon Sep 17 00:00:00 2001 From: Guillem Date: Tue, 13 Mar 2018 12:31:03 +0100 Subject: [PATCH 02/17] add Copy all values to all extruders context menu option --- cura/Settings/MachineManager.py | 12 ++++++++++++ resources/qml/Settings/SettingView.qml | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index eb720000bf..557fd97b43 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -550,6 +550,18 @@ class MachineManager(QObject): if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value: extruder_stack.userChanges.setProperty(key, "value", new_value) # TODO: nested property access, should be improved + ## Copy the value of all settings of the current extruder to all other extruders as well as the global container. + @pyqtSlot() + def copyAllValuesToExtruders(self): + for key in self._active_container_stack.getAllKeys(): + new_value = self._active_container_stack.getProperty(key, "value") + extruder_stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())] + + # check in which stack the value has to be replaced + for extruder_stack in extruder_stacks: + if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value: + extruder_stack.userChanges.setProperty(key, "value", new_value) # TODO: nested property access, should be improved + @pyqtProperty(str, notify = activeVariantChanged) def activeVariantName(self) -> str: if self._active_container_stack: diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 615e66277b..5865ed5182 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -485,6 +485,15 @@ Item onTriggered: Cura.MachineManager.copyValueToExtruders(contextMenu.key) } + MenuItem + { + //: Settings context menu action + text: catalog.i18nc("@action:menu", "Copy all values to all extruders") + visible: machineExtruderCount.properties.value > 1 + enabled: contextMenu.provider != undefined + onTriggered: Cura.MachineManager.copyAllValuesToExtruders() + } + MenuSeparator { visible: machineExtruderCount.properties.value > 1 From 18fba5b52938809632c71a610d97e8d85260f556 Mon Sep 17 00:00:00 2001 From: Guillem Date: Mon, 19 Mar 2018 14:21:45 +0100 Subject: [PATCH 03/17] Avoid replacing machine_settings and not settable_per_extruder settings --- cura/Settings/MachineManager.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 557fd97b43..2550d1da40 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -553,14 +553,15 @@ class MachineManager(QObject): ## Copy the value of all settings of the current extruder to all other extruders as well as the global container. @pyqtSlot() def copyAllValuesToExtruders(self): - for key in self._active_container_stack.getAllKeys(): - new_value = self._active_container_stack.getProperty(key, "value") - extruder_stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())] + for key in self._active_container_stack.getAllKeys() - set([machine_setting.key for machine_setting in self._active_container_stack.getProperty("machine_settings", "children")]): + if self._active_container_stack.getProperty(key, "settable_per_extruder"): + new_value = self._active_container_stack.getProperty(key, "value") + extruder_stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())] - # check in which stack the value has to be replaced - for extruder_stack in extruder_stacks: - if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value: - extruder_stack.userChanges.setProperty(key, "value", new_value) # TODO: nested property access, should be improved + # check in which stack the value has to be replaced + for extruder_stack in extruder_stacks: + if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value: + extruder_stack.userChanges.setProperty(key, "value", new_value) # TODO: nested property access, should be improved @pyqtProperty(str, notify = activeVariantChanged) def activeVariantName(self) -> str: From faf8ed3ba654fb72a8ec614d29228890d02fa3d1 Mon Sep 17 00:00:00 2001 From: Guillem Date: Mon, 19 Mar 2018 14:57:31 +0100 Subject: [PATCH 04/17] Replace only user changed values removed machine_settings and settable_per_extruder_check. Not needed. --- cura/Settings/MachineManager.py | 15 +++++++-------- resources/qml/Settings/SettingView.qml | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 2550d1da40..549eeadeb4 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -553,15 +553,14 @@ class MachineManager(QObject): ## Copy the value of all settings of the current extruder to all other extruders as well as the global container. @pyqtSlot() def copyAllValuesToExtruders(self): - for key in self._active_container_stack.getAllKeys() - set([machine_setting.key for machine_setting in self._active_container_stack.getProperty("machine_settings", "children")]): - if self._active_container_stack.getProperty(key, "settable_per_extruder"): - new_value = self._active_container_stack.getProperty(key, "value") - extruder_stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())] + for key in self._active_container_stack.userChanges.getAllKeys(): + new_value = self._active_container_stack.getProperty(key, "value") + extruder_stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())] - # check in which stack the value has to be replaced - for extruder_stack in extruder_stacks: - if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value: - extruder_stack.userChanges.setProperty(key, "value", new_value) # TODO: nested property access, should be improved + # check in which stack the value has to be replaced + for extruder_stack in extruder_stacks: + if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value: + extruder_stack.userChanges.setProperty(key, "value", new_value) # TODO: nested property access, should be improved @pyqtProperty(str, notify = activeVariantChanged) def activeVariantName(self) -> str: diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 5865ed5182..67dd7622a3 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -488,7 +488,7 @@ Item MenuItem { //: Settings context menu action - text: catalog.i18nc("@action:menu", "Copy all values to all extruders") + text: catalog.i18nc("@action:menu", "Copy all changed values to all extruders") visible: machineExtruderCount.properties.value > 1 enabled: contextMenu.provider != undefined onTriggered: Cura.MachineManager.copyAllValuesToExtruders() From 01ec20f5ced559283db2637d69a40adceca18ef8 Mon Sep 17 00:00:00 2001 From: Guillem Date: Thu, 22 Mar 2018 11:39:42 +0100 Subject: [PATCH 05/17] Fixed docs, removed todo, changed way to get extruder stacks, slightly faster --- cura/Settings/MachineManager.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 549eeadeb4..ef3a7189a5 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -550,17 +550,18 @@ class MachineManager(QObject): if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value: extruder_stack.userChanges.setProperty(key, "value", new_value) # TODO: nested property access, should be improved - ## Copy the value of all settings of the current extruder to all other extruders as well as the global container. + ## Copy the value of all manually changed settings of the current extruder to all other extruders. @pyqtSlot() def copyAllValuesToExtruders(self): - for key in self._active_container_stack.userChanges.getAllKeys(): - new_value = self._active_container_stack.getProperty(key, "value") - extruder_stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())] + extruder_stacks = list(self._global_container_stack.extruders.values()) + for extruder_stack in extruder_stacks: + if extruder_stack != self._active_container_stack: + for key in self._active_container_stack.userChanges.getAllKeys(): + new_value = self._active_container_stack.getProperty(key, "value") - # check in which stack the value has to be replaced - for extruder_stack in extruder_stacks: - if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value: - extruder_stack.userChanges.setProperty(key, "value", new_value) # TODO: nested property access, should be improved + # check if the value has to be replaced + if extruder_stack.getProperty(key, "value") != new_value: + extruder_stack.userChanges.setProperty(key, "value", new_value) @pyqtProperty(str, notify = activeVariantChanged) def activeVariantName(self) -> str: From 0787f0b2ba4a311c6b39be8e0d8b8f886ce6528c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 22 Mar 2018 14:46:14 +0100 Subject: [PATCH 06/17] Fix autoslice check so it doesn't slice if there is no need CURA-5130 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index e55abe59a2..401ed71347 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -119,6 +119,7 @@ class CuraEngineBackend(QObject, Backend): self._postponed_scene_change_sources = [] # scene change is postponed (by a tool) self._slice_start_time = None + self._is_disabled = False Preferences.getInstance().addPreference("general/auto_slice", True) @@ -405,6 +406,7 @@ class CuraEngineBackend(QObject, Backend): # - decorator isBlockSlicing is found (used in g-code reader) def determineAutoSlicing(self): enable_timer = True + self._is_disabled = False if not Preferences.getInstance().getValue("general/auto_slice"): enable_timer = False @@ -412,6 +414,7 @@ class CuraEngineBackend(QObject, Backend): if node.callDecoration("isBlockSlicing"): enable_timer = False self.backendStateChange.emit(BackendState.Disabled) + self._is_disabled = True gcode_list = node.callDecoration("getGCodeList") if gcode_list is not None: self._scene.gcode_dict[node.callDecoration("getBuildPlateNumber")] = gcode_list @@ -524,6 +527,9 @@ class CuraEngineBackend(QObject, Backend): ## Convenient function: mark everything to slice, emit state and clear layer data def needsSlicing(self): + self.determineAutoSlicing() + if self._is_disabled: + return self.stopSlicing() self.markSliceAll() self.processingProgress.emit(0.0) From f332b833644c45212c182477b6dbecf3aaf563b8 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 22 Mar 2018 14:50:12 +0100 Subject: [PATCH 07/17] Fix typo and remove unused imports CURA-5135 --- plugins/PluginBrowser/PluginBrowser.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index c8a5e1e545..bb4d5fb395 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -1,11 +1,10 @@ # Copyright (c) 2017 Ultimaker B.V. # PluginBrowser is released under the terms of the LGPLv3 or higher. -from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal, pyqtSlot +from PyQt5.QtCore import QUrl, QObject, pyqtProperty, pyqtSignal, pyqtSlot from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply from UM.Application import Application -from UM.Qt.ListModel import ListModel from UM.Logger import Logger from UM.PluginRegistry import PluginRegistry from UM.Qt.Bindings.PluginsModel import PluginsModel @@ -20,7 +19,6 @@ import os import tempfile import platform import zipfile -import shutil from cura.CuraApplication import CuraApplication @@ -44,7 +42,7 @@ class PluginBrowser(QObject, Extension): self._plugins_metadata = [] self._plugins_model = None - # Can be 'installed' or 'availble' + # Can be 'installed' or 'available' self._view = "available" self._restart_required = False From fecbf82551fc512838110ed8e8a1bc118275af09 Mon Sep 17 00:00:00 2001 From: Guillem Date: Thu, 22 Mar 2018 15:49:30 +0100 Subject: [PATCH 08/17] Replace all user changed values Removed check to change the values only if they were different --- cura/Settings/MachineManager.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index ef3a7189a5..12e70841f7 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -560,8 +560,7 @@ class MachineManager(QObject): new_value = self._active_container_stack.getProperty(key, "value") # check if the value has to be replaced - if extruder_stack.getProperty(key, "value") != new_value: - extruder_stack.userChanges.setProperty(key, "value", new_value) + extruder_stack.userChanges.setProperty(key, "value", new_value) @pyqtProperty(str, notify = activeVariantChanged) def activeVariantName(self) -> str: From 283cbed1ad7a81abf571776649d9b30cb6d68353 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 22 Mar 2018 16:02:09 +0100 Subject: [PATCH 09/17] CURA-5130 move the part that determines if it should slice --- plugins/CuraEngineBackend/CuraEngineBackend.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 401ed71347..9873d91c05 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -527,9 +527,6 @@ class CuraEngineBackend(QObject, Backend): ## Convenient function: mark everything to slice, emit state and clear layer data def needsSlicing(self): - self.determineAutoSlicing() - if self._is_disabled: - return self.stopSlicing() self.markSliceAll() self.processingProgress.emit(0.0) @@ -551,6 +548,10 @@ class CuraEngineBackend(QObject, Backend): self._change_timer.stop() def _onStackErrorCheckFinished(self): + self.determineAutoSlicing() + if self._is_disabled: + return + if not self._slicing and self._build_plates_to_be_sliced: self.needsSlicing() self._onChanged() From 378cde202c0a484fb79f5b2e804fdd1d30aeaa4c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 22 Mar 2018 16:33:30 +0100 Subject: [PATCH 10/17] Correct documentation Contributes to issue CURA-5128. --- plugins/GCodeGzReader/GCodeGzReader.py | 2 +- plugins/GCodeGzReader/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/GCodeGzReader/GCodeGzReader.py b/plugins/GCodeGzReader/GCodeGzReader.py index 52df7f074f..ec473fb299 100644 --- a/plugins/GCodeGzReader/GCodeGzReader.py +++ b/plugins/GCodeGzReader/GCodeGzReader.py @@ -12,7 +12,7 @@ from UM.Mesh.MeshReader import MeshReader #The class we're extending/implementin from UM.PluginRegistry import PluginRegistry from UM.Scene.SceneNode import SceneNode #For typing. -## A file writer that writes gzipped g-code. +## A file reader that reads gzipped g-code. # # If you're zipping g-code, you might as well use gzip! class GCodeGzReader(MeshReader): diff --git a/plugins/GCodeGzReader/__init__.py b/plugins/GCodeGzReader/__init__.py index 67424a7d45..98965c00aa 100644 --- a/plugins/GCodeGzReader/__init__.py +++ b/plugins/GCodeGzReader/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Aleph Objects, Inc. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from . import GCodeGzReader From 4430a15a2fc7141b13256bb73289c578dbd8533d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 22 Mar 2018 16:34:11 +0100 Subject: [PATCH 11/17] Remove needlessly specific super call There is only one parent. Contributes to issue CURA-5128. --- plugins/GCodeGzReader/GCodeGzReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/GCodeGzReader/GCodeGzReader.py b/plugins/GCodeGzReader/GCodeGzReader.py index ec473fb299..9d671a70bf 100644 --- a/plugins/GCodeGzReader/GCodeGzReader.py +++ b/plugins/GCodeGzReader/GCodeGzReader.py @@ -18,7 +18,7 @@ from UM.Scene.SceneNode import SceneNode #For typing. class GCodeGzReader(MeshReader): def __init__(self): - super(GCodeGzReader, self).__init__() + super().__init__() self._supported_extensions = [".gcode.gz"] def read(self, file_name): From 30b75c79886b63c6e3ad5a8f9ec1cc39ab32bd95 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Thu, 22 Mar 2018 17:05:07 +0100 Subject: [PATCH 12/17] CURA-5140 Show confirmation rather than switching to monitor tab --- .../ClusterUM3OutputDevice.py | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 72f5260249..f3667fc2f3 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -127,10 +127,6 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._sending_job.send("") #No specifically selected printer. is_job_sent = self._sending_job.send(None) - # Notify the UI that a switch to the print monitor should happen - if is_job_sent: - Application.getInstance().getController().setActiveStage("MonitorStage") - def _spawnPrinterSelectionDialog(self): if self._printer_selection_dialog is None: path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "PrintWindow.qml") @@ -242,6 +238,19 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): if new_progress > self._progress_message.getProgress(): self._progress_message.show() # Ensure that the message is visible. self._progress_message.setProgress(bytes_sent / bytes_total * 100) + + # If successfully sent: + if bytes_sent == bytes_total: + # Show a confirmation to the user so they know the job was sucessful and provide the option to switch to the + # monitor tab. + self._success_message = Message( + i18n_catalog.i18nc("@info:status", "Print job was successfully sent to the printer."), + lifetime=5, dismissable=True, + title=i18n_catalog.i18nc("@info:title", "Data Sent")) + self._success_message.addAction("View", i18n_catalog.i18nc("@action:button", "View in Montior"), icon=None, + description="") + self._success_message.actionTriggered.connect(self._successMessageActionTriggered) + self._success_message.show() else: self._progress_message.setProgress(0) self._progress_message.hide() @@ -260,6 +269,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._latest_reply_handler.disconnect() self._latest_reply_handler = None + def _successMessageActionTriggered(self, message_id: Optional[str]=None, action_id: Optional[str]=None) -> None: + if action_id == "View": + Application.getInstance().getController().setActiveStage("MonitorStage") @pyqtSlot() def openPrintJobControlPanel(self) -> None: From 3eb50cf37e8fbcbb7b50fd2c744d04c801eddc4b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 22 Mar 2018 17:30:15 +0100 Subject: [PATCH 13/17] Only list configurations if we're still connected Otherwise there are no available configurations, so no syncing. --- .../qml/Menus/ConfigurationMenu/ConfigurationListView.qml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml index 331d78ead9..7aaf87b4df 100644 --- a/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml +++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml @@ -21,7 +21,10 @@ Column { // FIXME For now the model should be removed and then created again, otherwise changes in the printer don't automatically update the UI configurationList.model = [] - configurationList.model = outputDevice.uniqueConfigurations + if(outputDevice) + { + configurationList.model = outputDevice.uniqueConfigurations + } } Label From 749846e09c19b207ce66e6aa332cd6c219a4432a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Mar 2018 09:49:47 +0100 Subject: [PATCH 14/17] Shorten 'Save to Removable Drive' translation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wechseldatenträger was a bit too long to fit on that button. Fixes #2643. --- resources/i18n/de_DE/cura.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index 250e3e5e1b..f398d1ec4e 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -194,7 +194,7 @@ msgstr "Vorbereiten" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" -msgstr "Speichern auf Wechseldatenträger" +msgstr "Speichern auf Datenträger" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:24 #, python-brace-format From e8491b4a8364680294b6c2e341f2fc2a234d3eec Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 23 Mar 2018 11:10:21 +0100 Subject: [PATCH 15/17] CURA-5135 Easy version This is the easy fix. When a plugin is downloading, the other plugins' download buttons are not possible to be clicked. This avoids having to write any new logic. It does detract a bit from the user experience though. The complicated version requires re-writing a big part of the plugin browser code to enable the queueing of downloads and stuff. That's sort of how it "should" be but is a lot more work. --- plugins/PluginBrowser/PluginEntry.qml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/plugins/PluginBrowser/PluginEntry.qml b/plugins/PluginBrowser/PluginEntry.qml index eff9eb8943..fab8f43e07 100644 --- a/plugins/PluginBrowser/PluginEntry.qml +++ b/plugins/PluginBrowser/PluginEntry.qml @@ -129,6 +129,28 @@ Component { return catalog.i18nc("@action:button", "Install"); } } + enabled: + { + if ( manager.isDownloading ) + { + return pluginList.activePlugin == model ? true : false + } + else + { + return true + } + } + opacity: + { + if ( pluginList.activePlugin == model ) + { + return 1.0 + } + else + { + manager.isDownloading ? 0.5 : 1.0 + } + } visible: model.external && ((model.status !== "installed") || model.can_upgrade) style: ButtonStyle { background: Rectangle { From d859f71d6eb8248ed9297e3fef2f749389189b23 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 23 Mar 2018 11:41:34 +0100 Subject: [PATCH 16/17] Fix: The Print simulation view was broken because of constant refresheing scene CURA-5142 --- plugins/SimulationView/SimulationView.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 3697e38661..85849efb2f 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -74,7 +74,7 @@ class SimulationView(View): self._global_container_stack = None self._proxy = SimulationViewProxy() - self._controller.getScene().sceneChanged.connect(self._onSceneChanged) + self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged) self._resetSettings() self._legend_items = None @@ -160,10 +160,10 @@ class SimulationView(View): def _onSceneChanged(self, node): if node.getMeshData() is None: self.resetLayerData() - else: - self.setActivity(False) - self.calculateMaxLayers() - self.calculateMaxPathsOnLayer(self._current_layer_num) + + self.setActivity(False) + self.calculateMaxLayers() + self.calculateMaxPathsOnLayer(self._current_layer_num) def isBusy(self): return self._busy From 8a36f1e0744c6fbd85efd76ace60315bcc850056 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Mar 2018 14:23:10 +0100 Subject: [PATCH 17/17] Make opacity depend on enabled Simplifies the code a bit. Contributes to issue CURA-5128. --- plugins/PluginBrowser/PluginEntry.qml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/plugins/PluginBrowser/PluginEntry.qml b/plugins/PluginBrowser/PluginEntry.qml index fab8f43e07..9dbcb96e79 100644 --- a/plugins/PluginBrowser/PluginEntry.qml +++ b/plugins/PluginBrowser/PluginEntry.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ultimaker B.V. +// Copyright (c) 2018 Ultimaker B.V. // PluginBrowser is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -140,17 +140,7 @@ Component { return true } } - opacity: - { - if ( pluginList.activePlugin == model ) - { - return 1.0 - } - else - { - manager.isDownloading ? 0.5 : 1.0 - } - } + opacity: enabled ? 1.0 : 0.5 visible: model.external && ((model.status !== "installed") || model.can_upgrade) style: ButtonStyle { background: Rectangle {