From 0383cea816e35cc8e45f67a32c6f955995badc7d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 12 Oct 2017 10:31:11 +0200 Subject: [PATCH 1/8] Fix code style CURA-4333 --- resources/qml/SidebarSimple.qml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index eef06209ec..fa32516862 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -44,13 +44,11 @@ Item } function checkUserSettings(){ - var skip_keys = ["support_enable" , - "infill_sparse_density", - "gradual_infill_steps", - "adhesion_type", - "support_extruder_nr"] - + "infill_sparse_density", + "gradual_infill_steps", + "adhesion_type", + "support_extruder_nr"] base.hasUserSettings = Cura.MachineManager.hasUserCustomSettings(skip_keys) } @@ -348,15 +346,12 @@ Item anchors.rightMargin: UM.Theme.getSize("default_margin").width width: qualitySlider.width height: qualitySlider.height * 1.5 - //border.width: UM.Theme.getSize("default_lining").width // dispay overlap zone - //border.color: UM.Theme.getColor("lining") color: "transparent" visible: hasUserSettings enabled: hasUserSettings - MouseArea { anchors.fill: parent onClicked: { From 39891551e399b7b275545a9ee72c1c42d63e66c6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 12 Oct 2017 12:42:18 +0200 Subject: [PATCH 2/8] Fix custom profile handling for quality slider CURA-4333 --- cura/CuraApplication.py | 6 ++-- cura/Settings/MachineManager.py | 8 +++--- resources/qml/SidebarSimple.qml | 49 +++++++++++++++++---------------- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 6a4b996080..ff16ba437d 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -413,9 +413,9 @@ class CuraApplication(QtApplication): global_stack.getTop().clear() - #event handler for SidebarSimple, which will update sliders view visibility (like:sliders..) - if Preferences.getInstance().getValue("cura/active_mode") == 0: - self.sidebarSimpleDiscardOrKeepProfileChanges.emit() + # event handler for SidebarSimple, which will update sliders view visibility (like:sliders..) + if Preferences.getInstance().getValue("cura/active_mode") == 0: + self.sidebarSimpleDiscardOrKeepProfileChanges.emit() @pyqtSlot(int) def messageBoxClosed(self, button): diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index dc71fe9ca9..624bc12487 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -417,16 +417,16 @@ class MachineManager(QObject): # \param skip_keys \type{list} List of setting keys which will be not taken into account ("support_enable" , "infill_sparse_density"...) # \return \type{boole} Return true if user containers have any of adjusted settings @pyqtSlot("QVariantList", result = bool) - def hasUserCustomSettings(self, skip_keys = []) -> bool: + def hasUserCustomSettings(self, skip_keys = None) -> bool: + if skip_keys is None: + skip_keys = [] user_setting_keys = [] try: if not self._global_container_stack: return False - allContainers = self._global_container_stack.getContainers() - - for container in allContainers: + for container in self._global_container_stack.getContainers(): meta = container.getMetaData() if meta and meta["type"] and meta["type"] == "user": user_setting_keys.extend(container.getAllKeys()) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index fa32516862..e5a21ba407 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -22,6 +22,13 @@ Item property bool settingsEnabled: ExtruderManager.activeExtruderStackId || machineExtruderCount.properties.value == 1 property bool hasUserSettings; + property var profileChangedCheckSkipKeys: ["support_enable" , + "infill_sparse_density", + "gradual_infill_steps", + "adhesion_type", + "support_extruder_nr"] + property var tickClickedViaProfileSlider: undefined + Component.onCompleted: PrintInformation.enabled = true Component.onDestruction: PrintInformation.enabled = false UM.I18nCatalog { id: catalog; name: "cura" } @@ -39,17 +46,17 @@ Item target: CuraApplication onSidebarSimpleDiscardOrKeepProfileChanges: { - base.hasUserSettings = false + base.checkUserSettings(); } } - function checkUserSettings(){ - var skip_keys = ["support_enable" , - "infill_sparse_density", - "gradual_infill_steps", - "adhesion_type", - "support_extruder_nr"] - base.hasUserSettings = Cura.MachineManager.hasUserCustomSettings(skip_keys) + function checkUserSettings() { + hasUserSettings = Cura.MachineManager.hasUserCustomSettings(profileChangedCheckSkipKeys); + if (!hasUserSettings && tickClickedViaProfileSlider != undefined) + { + Cura.MachineManager.setActiveQuality(Cura.ProfilesModel.getItem(tickClickedViaProfileSlider).id); + } + tickClickedViaProfileSlider = undefined; } ScrollView @@ -289,7 +296,7 @@ Item anchors.bottom: speedSlider.bottom enabled: qualityModel.availableTotalTicks > 0 visible: qualityModel.totalTicks > 0 - updateValueWhileDragging : false + updateValueWhileDragging: false minimumValue: qualityModel.qualitySliderAvailableMin >= 0 ? qualityModel.qualitySliderAvailableMin : 0 maximumValue: qualityModel.qualitySliderAvailableMax >= 0 ? qualityModel.qualitySliderAvailableMax : 0 @@ -340,25 +347,21 @@ Item //If any of settings were changed in custom mode then the Rectangle will //overlap quality slider area. It is used to catch mouse click - Rectangle { - anchors.verticalCenter: parent.verticalCenter - anchors.right: extrudersModelCheckBox.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - width: qualitySlider.width - height: qualitySlider.height * 1.5 - - color: "transparent" + MouseArea { + anchors.fill: qualitySlider visible: hasUserSettings enabled: hasUserSettings - MouseArea { - anchors.fill: parent - onClicked: { - discardOrKeepProfileChangesDialog.show() - } - } + onClicked: { + const offset = qualityModel.qualitySliderStepWidth / 2; + const mousePosition = mouseX + offset; + // save where it was clicked + base.tickClickedViaProfileSlider = Math.floor(mousePosition / qualityModel.qualitySliderStepWidth); + + discardOrKeepProfileChangesDialog.show(); + } } } From 16bd4430e4fe547db63a9b982ce052ae53c3807d Mon Sep 17 00:00:00 2001 From: "A.Sasin" Date: Thu, 12 Oct 2017 21:23:17 +0200 Subject: [PATCH 3/8] Added a pyQtProperty to validate user settings (Might be wrong approach) CURA-4333 --- cura/CuraApplication.py | 6 +++--- cura/Settings/MachineManager.py | 27 ++++++++++++++++++++++++--- resources/qml/SidebarSimple.qml | 21 +++++---------------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ff16ba437d..877c02cc4e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -402,7 +402,7 @@ class CuraApplication(QtApplication): # ALWAYS ask whether to keep or discard the profile self.showDiscardOrKeepProfileChanges.emit() - sidebarSimpleDiscardOrKeepProfileChanges = pyqtSignal() + #sidebarSimpleDiscardOrKeepProfileChanges = pyqtSignal() @pyqtSlot(str) def discardOrKeepProfileChangesClosed(self, option): @@ -414,8 +414,8 @@ class CuraApplication(QtApplication): global_stack.getTop().clear() # event handler for SidebarSimple, which will update sliders view visibility (like:sliders..) - if Preferences.getInstance().getValue("cura/active_mode") == 0: - self.sidebarSimpleDiscardOrKeepProfileChanges.emit() + if str(Preferences.getInstance().getValue("cura/active_mode")) == '0': + self.getMachineManager().hasUserCustomSettings() @pyqtSlot(int) def messageBoxClosed(self, button): diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 624bc12487..e2bea66284 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -414,10 +414,13 @@ class MachineManager(QObject): return False ## Check whether user containers have adjusted settings or not + # The skipped settings are predefined, because they are used on SideBarSimple to escape them while validation # \param skip_keys \type{list} List of setting keys which will be not taken into account ("support_enable" , "infill_sparse_density"...) # \return \type{boole} Return true if user containers have any of adjusted settings - @pyqtSlot("QVariantList", result = bool) - def hasUserCustomSettings(self, skip_keys = None) -> bool: + def hasUserCustomSettings(self) -> bool: + + skip_keys = ["support_enable", "infill_sparse_density", "gradual_infill_steps", "adhesion_type", "support_extruder_nr"] + if skip_keys is None: skip_keys = [] @@ -447,7 +450,25 @@ class MachineManager(QObject): Logger.log("e", "While checking user custom settings occured error. skip_keys: %s", skip_keys ) return False - return len(user_setting_keys) > 0 + if len(user_setting_keys) > 0: + self.userSettingsUpdated = True + else: + self.userSettingsUpdated = False + + self.userCustomSettingsChanged.emit() + + + userSettingsUpdated = False + userCustomSettingsChanged = pyqtSignal() + + @pyqtSlot() + def checkWhetherUserContainersHaveSettings(self): + return self.hasUserCustomSettings() + + #Property to show wheter user settings are updated or not + @pyqtProperty(bool, notify = userCustomSettingsChanged) + def userCustomSettingsProperty(self): + return self.userSettingsUpdated @pyqtProperty(int, notify = activeStackValueChanged) def numUserSettings(self) -> int: diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index e5a21ba407..59bbc38fe6 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -20,13 +20,10 @@ Item property variant minimumPrintTime: PrintInformation.minimumPrintTime; property variant maximumPrintTime: PrintInformation.maximumPrintTime; property bool settingsEnabled: ExtruderManager.activeExtruderStackId || machineExtruderCount.properties.value == 1 - property bool hasUserSettings; - property var profileChangedCheckSkipKeys: ["support_enable" , - "infill_sparse_density", - "gradual_infill_steps", - "adhesion_type", - "support_extruder_nr"] + property bool hasUserSettings: Cura.MachineManager.userCustomSettingsProperty + + property var tickClickedViaProfileSlider: undefined Component.onCompleted: PrintInformation.enabled = true @@ -41,17 +38,9 @@ Item } } - Connections - { - target: CuraApplication - onSidebarSimpleDiscardOrKeepProfileChanges: - { - base.checkUserSettings(); - } - } - function checkUserSettings() { - hasUserSettings = Cura.MachineManager.hasUserCustomSettings(profileChangedCheckSkipKeys); + + Cura.MachineManager.checkWhetherUserContainersHaveSettings() if (!hasUserSettings && tickClickedViaProfileSlider != undefined) { Cura.MachineManager.setActiveQuality(Cura.ProfilesModel.getItem(tickClickedViaProfileSlider).id); From 7f5aed7ead916b95d4585ae35a7ee1c4f12b6005 Mon Sep 17 00:00:00 2001 From: "A.Sasin" Date: Fri, 13 Oct 2017 16:34:49 +0200 Subject: [PATCH 4/8] User pyqtProperty instead of puqtSlot CURA-4333 --- cura/CuraApplication.py | 4 - cura/Settings/MachineManager.py | 67 ++++++----------- resources/qml/SidebarSimple.qml | 128 +++++++------------------------- 3 files changed, 50 insertions(+), 149 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 877c02cc4e..c1ef04bb6f 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -413,10 +413,6 @@ class CuraApplication(QtApplication): global_stack.getTop().clear() - # event handler for SidebarSimple, which will update sliders view visibility (like:sliders..) - if str(Preferences.getInstance().getValue("cura/active_mode")) == '0': - self.getMachineManager().hasUserCustomSettings() - @pyqtSlot(int) def messageBoxClosed(self, button): if self._message_box_callback: diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index e2bea66284..13823b6a9a 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -413,62 +413,41 @@ class MachineManager(QObject): return False - ## Check whether user containers have adjusted settings or not - # The skipped settings are predefined, because they are used on SideBarSimple to escape them while validation - # \param skip_keys \type{list} List of setting keys which will be not taken into account ("support_enable" , "infill_sparse_density"...) - # \return \type{boole} Return true if user containers have any of adjusted settings - def hasUserCustomSettings(self) -> bool: - skip_keys = ["support_enable", "infill_sparse_density", "gradual_infill_steps", "adhesion_type", "support_extruder_nr"] - - if skip_keys is None: - skip_keys = [] + def getAllActiveUserChanges(self, skip_keys = {}) -> bool: user_setting_keys = [] - try: - if not self._global_container_stack: - return False - for container in self._global_container_stack.getContainers(): + if not self._global_container_stack: + return False + + allContainers = self._global_container_stack.getContainers() + + for container in allContainers: + meta = container.getMetaData() + if meta and meta["type"] and meta["type"] == "user": + user_setting_keys.extend(container.getAllKeys()) + + stacks = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) + for stack in stacks: + + for container in stack.getContainers(): meta = container.getMetaData() if meta and meta["type"] and meta["type"] == "user": user_setting_keys.extend(container.getAllKeys()) - stacks = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) - for stack in stacks: + for skip_key in skip_keys: + if skip_key in user_setting_keys: + user_setting_keys.remove(skip_key) - for container in stack.getContainers(): - meta = container.getMetaData() - if meta and meta["type"] and meta["type"] == "user": - user_setting_keys.extend(container.getAllKeys()) - - for skip_key in skip_keys: - if skip_key in user_setting_keys: - user_setting_keys.remove(skip_key) - - except: - Logger.log("e", "While checking user custom settings occured error. skip_keys: %s", skip_keys ) - return False - - if len(user_setting_keys) > 0: - self.userSettingsUpdated = True - else: - self.userSettingsUpdated = False - - self.userCustomSettingsChanged.emit() + return len(user_setting_keys) > 0 - userSettingsUpdated = False - userCustomSettingsChanged = pyqtSignal() + ignore_list = ["support_enable", "infill_sparse_density", "gradual_infill_steps", "adhesion_type", "support_extruder_nr"] - @pyqtSlot() - def checkWhetherUserContainersHaveSettings(self): - return self.hasUserCustomSettings() - - #Property to show wheter user settings are updated or not - @pyqtProperty(bool, notify = userCustomSettingsChanged) - def userCustomSettingsProperty(self): - return self.userSettingsUpdated + @pyqtProperty(bool, notify = activeStackValueChanged) + def allActiveUserSettings(self): + return self.getAllActiveUserChanges(skip_keys = self.ignore_list) @pyqtProperty(int, notify = activeStackValueChanged) def numUserSettings(self) -> int: diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 59bbc38fe6..73e722c068 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -20,34 +20,12 @@ Item property variant minimumPrintTime: PrintInformation.minimumPrintTime; property variant maximumPrintTime: PrintInformation.maximumPrintTime; property bool settingsEnabled: ExtruderManager.activeExtruderStackId || machineExtruderCount.properties.value == 1 - - property bool hasUserSettings: Cura.MachineManager.userCustomSettingsProperty - - - property var tickClickedViaProfileSlider: undefined + property bool hasUserSettings: Cura.MachineManager.allActiveUserSettings Component.onCompleted: PrintInformation.enabled = true Component.onDestruction: PrintInformation.enabled = false UM.I18nCatalog { id: catalog; name: "cura" } - onVisibleChanged: - { - if (visible) - { - base.checkUserSettings() - } - } - - function checkUserSettings() { - - Cura.MachineManager.checkWhetherUserContainersHaveSettings() - if (!hasUserSettings && tickClickedViaProfileSlider != undefined) - { - Cura.MachineManager.setActiveQuality(Cura.ProfilesModel.getItem(tickClickedViaProfileSlider).id); - } - tickClickedViaProfileSlider = undefined; - } - ScrollView { visible: Cura.MachineManager.activeMachineName != "" // If no printers added then the view is invisible @@ -198,7 +176,7 @@ Item { anchors.verticalCenter: parent.verticalCenter anchors.top: parent.top - anchors.topMargin: Math.floor(UM.Theme.getSize("sidebar_margin").height / 2) + anchors.topMargin: parseInt(UM.Theme.getSize("sidebar_margin").height / 2) color: (Cura.MachineManager.activeMachine != null && Cura.ProfilesModel.getItem(index).available) ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable") text: { @@ -217,13 +195,13 @@ Item // Make sure the text aligns correctly with each tick if (qualityModel.totalTicks == 0) { // If there is only one tick, align it centrally - return Math.floor(((base.width * 0.55) - width) / 2) + return parseInt(((base.width * 0.55) - width) / 2) } else if (index == 0) { return (base.width * 0.55 / qualityModel.totalTicks) * index } else if (index == qualityModel.totalTicks) { return (base.width * 0.55 / qualityModel.totalTicks) * index - width } else { - return Math.floor((base.width * 0.55 / qualityModel.totalTicks) * index - (width / 2)) + return parseInt((base.width * 0.55 / qualityModel.totalTicks) * index - (width / 2)) } } } @@ -285,7 +263,7 @@ Item anchors.bottom: speedSlider.bottom enabled: qualityModel.availableTotalTicks > 0 visible: qualityModel.totalTicks > 0 - updateValueWhileDragging: false + updateValueWhileDragging : false minimumValue: qualityModel.qualitySliderAvailableMin >= 0 ? qualityModel.qualitySliderAvailableMin : 0 maximumValue: qualityModel.qualitySliderAvailableMax >= 0 ? qualityModel.qualitySliderAvailableMax : 0 @@ -332,26 +310,6 @@ Item } } } - - - //If any of settings were changed in custom mode then the Rectangle will - //overlap quality slider area. It is used to catch mouse click - MouseArea { - anchors.fill: qualitySlider - - visible: hasUserSettings - enabled: hasUserSettings - - onClicked: { - const offset = qualityModel.qualitySliderStepWidth / 2; - const mousePosition = mouseX + offset; - - // save where it was clicked - base.tickClickedViaProfileSlider = Math.floor(mousePosition / qualityModel.qualitySliderStepWidth); - - discardOrKeepProfileChangesDialog.show(); - } - } } Label @@ -360,13 +318,10 @@ Item anchors.top: speedSlider.bottom anchors.left: parent.left - anchors.right: speedSlider.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width text: catalog.i18nc("@label", "Print Speed") font: UM.Theme.getFont("default") color: UM.Theme.getColor("text") - elide: Text.ElideRight } Label @@ -432,7 +387,7 @@ Item anchors.topMargin: UM.Theme.getSize("sidebar_margin").height * 2 anchors.left: parent.left - width: Math.floor(UM.Theme.getSize("sidebar").width * .45 - UM.Theme.getSize("sidebar_margin").width) + width: UM.Theme.getSize("sidebar").width * .45 - UM.Theme.getSize("sidebar_margin").width Label { @@ -442,7 +397,7 @@ Item color: UM.Theme.getColor("text") anchors.top: parent.top - anchors.topMargin: Math.floor(UM.Theme.getSize("sidebar_margin").height * 1.7) + anchors.topMargin: UM.Theme.getSize("sidebar_margin").height * 1.7 anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width } @@ -453,7 +408,7 @@ Item id: infillCellRight height: infillSlider.height + UM.Theme.getSize("sidebar_margin").height + enableGradualInfillCheckBox.visible * (enableGradualInfillCheckBox.height + UM.Theme.getSize("sidebar_margin").height) - width: Math.floor(UM.Theme.getSize("sidebar").width * .55) + width: UM.Theme.getSize("sidebar").width * .55 anchors.left: infillCellLeft.right anchors.top: infillCellLeft.top @@ -464,10 +419,10 @@ Item //anchors.top: parent.top anchors.left: infillSlider.left - anchors.leftMargin: Math.floor((infillSlider.value / infillSlider.stepSize) * (infillSlider.width / (infillSlider.maximumValue / infillSlider.stepSize)) - 10 * screenScaleFactor) + anchors.leftMargin: (infillSlider.value / infillSlider.stepSize) * (infillSlider.width / (infillSlider.maximumValue / infillSlider.stepSize)) - 10 * screenScaleFactor anchors.right: parent.right - text: Math.floor(infillDensity.properties.value) + "%" + text: parseInt(infillDensity.properties.value) + "%" horizontalAlignment: Text.AlignLeft color: infillSlider.enabled ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable") @@ -477,7 +432,7 @@ Item Binding { target: infillSlider property: "value" - value: Math.floor(infillDensity.properties.value) + value: parseInt(infillDensity.properties.value) } Slider @@ -490,7 +445,7 @@ Item anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width height: UM.Theme.getSize("sidebar_margin").height - width: Math.floor(infillCellRight.width - UM.Theme.getSize("sidebar_margin").width - style.handleWidth) + width: infillCellRight.width - UM.Theme.getSize("sidebar_margin").width - style.handleWidth minimumValue: 0 maximumValue: 100 @@ -498,15 +453,15 @@ Item tickmarksEnabled: true // disable slider when gradual support is enabled - enabled: Math.floor(infillSteps.properties.value) == 0 + enabled: parseInt(infillSteps.properties.value) == 0 // set initial value from stack - value: Math.floor(infillDensity.properties.value) + value: parseInt(infillDensity.properties.value) onValueChanged: { // Don't round the value if it's already the same - if (Math.floor(infillDensity.properties.value) == infillSlider.value) { + if (parseInt(infillDensity.properties.value) == infillSlider.value) { return } @@ -575,7 +530,7 @@ Item anchors.right: parent.right anchors.top: parent.top - anchors.topMargin: Math.floor(UM.Theme.getSize("sidebar_margin").height / 2) + anchors.topMargin: parseInt(UM.Theme.getSize("sidebar_margin").height / 2) // we loop over all density icons and only show the one that has the current density and steps Repeater @@ -586,8 +541,8 @@ Item property int activeIndex: { for (var i = 0; i < infillModel.count; i++) { - var density = Math.floor(infillDensity.properties.value) - var steps = Math.floor(infillSteps.properties.value) + var density = parseInt(infillDensity.properties.value) + var steps = parseInt(infillSteps.properties.value) var infillModelItem = infillModel.get(i) if (density >= infillModelItem.percentageMin @@ -626,13 +581,13 @@ Item property alias _hovered: enableGradualInfillMouseArea.containsMouse anchors.top: infillSlider.bottom - anchors.topMargin: Math.floor(UM.Theme.getSize("sidebar_margin").height / 2) // closer to slider since it belongs to the same category + anchors.topMargin: parseInt(UM.Theme.getSize("sidebar_margin").height / 2) // closer to slider since it belongs to the same category anchors.left: infillCellRight.left style: UM.Theme.styles.checkbox enabled: base.settingsEnabled visible: infillSteps.properties.enabled == "True" - checked: Math.floor(infillSteps.properties.value) > 0 + checked: parseInt(infillSteps.properties.value) > 0 MouseArea { id: enableGradualInfillMouseArea @@ -641,18 +596,18 @@ Item hoverEnabled: true enabled: true - property var previousInfillDensity: Math.floor(infillDensity.properties.value) + property var previousInfillDensity: parseInt(infillDensity.properties.value) onClicked: { // Set to 90% only when enabling gradual infill - if (Math.floor(infillSteps.properties.value) == 0) { - previousInfillDensity = Math.floor(infillDensity.properties.value) + if (parseInt(infillSteps.properties.value) == 0) { + previousInfillDensity = parseInt(infillDensity.properties.value) infillDensity.setPropertyValue("value", String(90)) } else { infillDensity.setPropertyValue("value", String(previousInfillDensity)) } - infillSteps.setPropertyValue("value", (Math.floor(infillSteps.properties.value) == 0) ? 5 : 0) + infillSteps.setPropertyValue("value", (parseInt(infillSteps.properties.value) == 0) ? 5 : 0) } onEntered: { @@ -668,7 +623,7 @@ Item Label { id: gradualInfillLabel anchors.left: enableGradualInfillCheckBox.right - anchors.leftMargin: Math.floor(UM.Theme.getSize("sidebar_margin").width / 2) + anchors.leftMargin: parseInt(UM.Theme.getSize("sidebar_margin").width / 2) text: catalog.i18nc("@label", "Enable gradual") font: UM.Theme.getFont("default") color: UM.Theme.getColor("text") @@ -729,7 +684,7 @@ Item visible: enableSupportCheckBox.visible anchors.top: infillCellRight.bottom - anchors.topMargin: Math.floor(UM.Theme.getSize("sidebar_margin").height * 1.5) + anchors.topMargin: parseInt(UM.Theme.getSize("sidebar_margin").height * 1.5) anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width anchors.verticalCenter: enableSupportCheckBox.verticalCenter @@ -938,7 +893,7 @@ Item { id: tipsCell anchors.top: adhesionCheckBox.visible ? adhesionCheckBox.bottom : (enableSupportCheckBox.visible ? supportExtruderCombobox.bottom : infillCellRight.bottom) - anchors.topMargin: Math.floor(UM.Theme.getSize("sidebar_margin").height * 2) + anchors.topMargin: parseInt(UM.Theme.getSize("sidebar_margin").height * 2) anchors.left: parent.left width: parent.width height: tipsText.contentHeight * tipsText.lineCount @@ -969,35 +924,6 @@ Item storeIndex: 0 } - Binding - { - target: infillDensity - property: "containerStackId" - value: { - - // not settable per extruder or there only is global, so we must pick global - if (machineExtruderCount.properties.value == 1) { - return Cura.MachineManager.activeStackId - } - - // return the ID of the extruder when the infill is limited to an extruder - if (infillInheritStackProvider.properties.limit_to_extruder != null && infillInheritStackProvider.properties.limit_to_extruder >= 0) { - return ExtruderManager.extruderIds[String(infillInheritStackProvider.properties.limit_to_extruder)] - } - - // default to the global stack - return Cura.MachineManager.activeStackId - } - } - - UM.SettingPropertyProvider - { - id: infillInheritStackProvider - containerStackId: Cura.MachineManager.activeMachineId - key: "infill_sparse_density" - watchedProperties: [ "limit_to_extruder" ] - } - UM.SettingPropertyProvider { id: infillDensity From 61cdfcd3e83384bc3123825d61ba2529febb5b9a Mon Sep 17 00:00:00 2001 From: "A.Sasin" Date: Fri, 13 Oct 2017 16:59:29 +0200 Subject: [PATCH 5/8] Added coments and simplified "user" metadata check CURA-4333 --- cura/Settings/MachineManager.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 13823b6a9a..63ebcc8967 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -413,8 +413,10 @@ class MachineManager(QObject): return False - - def getAllActiveUserChanges(self, skip_keys = {}) -> bool: + ## Check whether user containers have adjusted settings or not + # \param skip_keys \type{list} List of setting keys which will be not taken into account ("support_enable" , "infill_sparse_density"...) + # \return \type{boole} Return true if user containers have any of adjusted settings + def hasUserCustomSettings(self, skip_keys = {}) -> bool: user_setting_keys = [] @@ -424,16 +426,16 @@ class MachineManager(QObject): allContainers = self._global_container_stack.getContainers() for container in allContainers: - meta = container.getMetaData() - if meta and meta["type"] and meta["type"] == "user": + meta_type = container.getMetaDataEntry("type", None) + if meta_type == "user": user_setting_keys.extend(container.getAllKeys()) stacks = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) for stack in stacks: for container in stack.getContainers(): - meta = container.getMetaData() - if meta and meta["type"] and meta["type"] == "user": + meta_type = container.getMetaDataEntry("type", None) + if meta_type == "user": user_setting_keys.extend(container.getAllKeys()) for skip_key in skip_keys: @@ -442,12 +444,13 @@ class MachineManager(QObject): return len(user_setting_keys) > 0 - + # These setting keys are used in SettingSimple.qml. They used to validate whether show notification(reset) icon or not + # If a changed setting is in the ignore list then this setting should be skipped and the notification not shown ignore_list = ["support_enable", "infill_sparse_density", "gradual_infill_steps", "adhesion_type", "support_extruder_nr"] @pyqtProperty(bool, notify = activeStackValueChanged) def allActiveUserSettings(self): - return self.getAllActiveUserChanges(skip_keys = self.ignore_list) + return self.hasUserCustomSettings(skip_keys = self.ignore_list) @pyqtProperty(int, notify = activeStackValueChanged) def numUserSettings(self) -> int: From e1234a09aa1c6c5999510704fb7feb43f2e1e0c5 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 16 Oct 2017 11:42:13 +0200 Subject: [PATCH 6/8] Add the missing parseInt()s back CURA-4333 --- resources/qml/SidebarSimple.qml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 8b8e8f09fe..26d7117cf6 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -387,7 +387,7 @@ Item anchors.topMargin: UM.Theme.getSize("sidebar_margin").height * 2 anchors.left: parent.left - width: UM.Theme.getSize("sidebar").width * .45 - UM.Theme.getSize("sidebar_margin").width + width: parseInt(UM.Theme.getSize("sidebar").width * .45 - UM.Theme.getSize("sidebar_margin").width) Label { @@ -397,7 +397,7 @@ Item color: UM.Theme.getColor("text") anchors.top: parent.top - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height * 1.7 + anchors.topMargin: parseInt(UM.Theme.getSize("sidebar_margin").height * 1.7) anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width } @@ -408,7 +408,7 @@ Item id: infillCellRight height: infillSlider.height + UM.Theme.getSize("sidebar_margin").height + enableGradualInfillCheckBox.visible * (enableGradualInfillCheckBox.height + UM.Theme.getSize("sidebar_margin").height) - width: UM.Theme.getSize("sidebar").width * .55 + width: parseInt(UM.Theme.getSize("sidebar").width * .55) anchors.left: infillCellLeft.right anchors.top: infillCellLeft.top @@ -419,7 +419,7 @@ Item //anchors.top: parent.top anchors.left: infillSlider.left - anchors.leftMargin: (infillSlider.value / infillSlider.stepSize) * (infillSlider.width / (infillSlider.maximumValue / infillSlider.stepSize)) - 10 * screenScaleFactor + anchors.leftMargin: parseInt((infillSlider.value / infillSlider.stepSize) * (infillSlider.width / (infillSlider.maximumValue / infillSlider.stepSize)) - 10 * screenScaleFactor) anchors.right: parent.right text: parseInt(infillDensity.properties.value) + "%" @@ -445,7 +445,7 @@ Item anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width height: UM.Theme.getSize("sidebar_margin").height - width: infillCellRight.width - UM.Theme.getSize("sidebar_margin").width - style.handleWidth + width: parseInt(infillCellRight.width - UM.Theme.getSize("sidebar_margin").width - style.handleWidth) minimumValue: 0 maximumValue: 100 From 9b8dc9bf55e351406fdf53d7dd93728970cd35c0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 16 Oct 2017 13:18:09 +0200 Subject: [PATCH 7/8] Move simple-mode settings customization check into a separate file CURA-4333 Simple-mode is a special mode so it makes more sense to put those code in a separate file instead of in the more generic MachineManager. --- cura/CuraApplication.py | 11 ++++- cura/Settings/MachineManager.py | 41 ---------------- cura/Settings/SimpleModeSettingsManager.py | 55 ++++++++++++++++++++++ resources/qml/SidebarSimple.qml | 7 ++- 4 files changed, 68 insertions(+), 46 deletions(-) create mode 100644 cura/Settings/SimpleModeSettingsManager.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c1ef04bb6f..27451c745c 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -51,6 +51,7 @@ from cura.Settings.MaterialsModel import MaterialsModel from cura.Settings.QualityAndUserProfilesModel import QualityAndUserProfilesModel from cura.Settings.SettingInheritanceManager import SettingInheritanceManager from cura.Settings.UserProfilesModel import UserProfilesModel +from cura.Settings.SimpleModeSettingsManager import SimpleModeSettingsManager from . import PlatformPhysics from . import BuildVolume @@ -201,6 +202,7 @@ class CuraApplication(QtApplication): self._machine_manager = None # This is initialized on demand. self._material_manager = None self._setting_inheritance_manager = None + self._simple_mode_settings_manager = None self._additional_components = {} # Components to add to certain areas in the interface @@ -670,7 +672,9 @@ class CuraApplication(QtApplication): qmlRegisterSingletonType(MachineManager, "Cura", 1, 0, "MachineManager", self.getMachineManager) qmlRegisterSingletonType(MaterialManager, "Cura", 1, 0, "MaterialManager", self.getMaterialManager) qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, "SettingInheritanceManager", - self.getSettingInheritanceManager) + self.getSettingInheritanceManager) + qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 2, "SimpleModeSettingsManager", + self.getSimpleModeSettingsManager) qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager) self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) @@ -710,6 +714,11 @@ class CuraApplication(QtApplication): def getMachineActionManager(self, *args): return self._machine_action_manager + def getSimpleModeSettingsManager(self, *args): + if self._simple_mode_settings_manager is None: + self._simple_mode_settings_manager = SimpleModeSettingsManager() + return self._simple_mode_settings_manager + ## Handle Qt events def event(self, event): if event.type() == QEvent.FileOpen: diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index e490568ccc..563965915a 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -39,8 +39,6 @@ if TYPE_CHECKING: from cura.Settings.CuraContainerStack import CuraContainerStack from cura.Settings.GlobalStack import GlobalStack -import os - class MachineManager(QObject): def __init__(self, parent = None): @@ -413,45 +411,6 @@ class MachineManager(QObject): return False - ## Check whether user containers have adjusted settings or not - # \param skip_keys \type{list} List of setting keys which will be not taken into account ("support_enable" , "infill_sparse_density"...) - # \return \type{boole} Return true if user containers have any of adjusted settings - def hasUserCustomSettings(self, skip_keys = {}) -> bool: - - user_setting_keys = [] - - if not self._global_container_stack: - return False - - allContainers = self._global_container_stack.getContainers() - - for container in allContainers: - meta_type = container.getMetaDataEntry("type", None) - if meta_type == "user": - user_setting_keys.extend(container.getAllKeys()) - - stacks = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) - for stack in stacks: - - for container in stack.getContainers(): - meta_type = container.getMetaDataEntry("type", None) - if meta_type == "user": - user_setting_keys.extend(container.getAllKeys()) - - for skip_key in skip_keys: - if skip_key in user_setting_keys: - user_setting_keys.remove(skip_key) - - return len(user_setting_keys) > 0 - - # These setting keys are used in SettingSimple.qml. They used to validate whether show notification(reset) icon or not - # If a changed setting is in the ignore list then this setting should be skipped and the notification not shown - ignore_list = ["support_enable", "infill_sparse_density", "gradual_infill_steps", "adhesion_type", "support_extruder_nr"] - - @pyqtProperty(bool, notify = activeStackValueChanged) - def allActiveUserSettings(self): - return self.hasUserCustomSettings(skip_keys = self.ignore_list) - @pyqtProperty(int, notify = activeStackValueChanged) def numUserSettings(self) -> int: if not self._global_container_stack: diff --git a/cura/Settings/SimpleModeSettingsManager.py b/cura/Settings/SimpleModeSettingsManager.py new file mode 100644 index 0000000000..ffeaff4072 --- /dev/null +++ b/cura/Settings/SimpleModeSettingsManager.py @@ -0,0 +1,55 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty + +from UM.Application import Application + + +class SimpleModeSettingsManager(QObject): + + def __init__(self, parent = None): + super().__init__(parent) + + self._machine_manager = Application.getInstance().getMachineManager() + self._is_profile_customized = False + + self._machine_manager.activeStackValueChanged.connect(self._updateIsProfileCustomized) + + isProfileCustomizedChanged = pyqtSignal() + + @pyqtProperty(bool, notify = isProfileCustomizedChanged) + def isProfileCustomized(self): + return self._is_profile_customized + + def _updateIsProfileCustomized(self): + user_setting_keys = set() + + if not self._machine_manager.activeMachine: + return False + + global_stack = self._machine_manager.activeMachine + + # check user settings in the global stack + user_setting_keys.update(set(global_stack.userChanges.getAllKeys())) + # check user settings in the extruder stacks + if global_stack.extruders: + for extruder_stack in global_stack.extruders.values(): + user_setting_keys.update(set(extruder_stack.userChanges.getAllKeys())) + + for skip_key in self.__ignored_custom_setting_keys: + if skip_key in user_setting_keys: + user_setting_keys.remove(skip_key) + + has_customized_user_settings = len(user_setting_keys) > 0 + + if has_customized_user_settings != self._is_profile_customized: + self._is_profile_customized = has_customized_user_settings + self.isProfileCustomizedChanged.emit() + + # A list of settings that will be ignored when check whether there is any custom settings. + __ignored_custom_setting_keys = ["support_enable", + "infill_sparse_density", + "gradual_infill_steps", + "adhesion_type", + "support_extruder_nr"] diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 26d7117cf6..82e5f421e4 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -7,7 +7,7 @@ import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 import UM 1.2 as UM -import Cura 1.0 as Cura +import Cura 1.2 as Cura Item { @@ -20,7 +20,6 @@ Item property variant minimumPrintTime: PrintInformation.minimumPrintTime; property variant maximumPrintTime: PrintInformation.maximumPrintTime; property bool settingsEnabled: ExtruderManager.activeExtruderStackId || machineExtruderCount.properties.value == 1 - property bool hasUserSettings: Cura.MachineManager.allActiveUserSettings Component.onCompleted: PrintInformation.enabled = true Component.onDestruction: PrintInformation.enabled = false @@ -292,7 +291,7 @@ Item implicitWidth: 10 * screenScaleFactor implicitHeight: implicitWidth radius: implicitWidth / 2 - visible: !hasUserSettings; + visible: !Cura.SimpleModeSettingsManager.isProfileCustomized; } } } @@ -350,7 +349,7 @@ Item { id: customisedSettings - visible: hasUserSettings + visible: Cura.SimpleModeSettingsManager.isProfileCustomized height: speedSlider.height * 0.8 width: speedSlider.height * 0.8 From fae65d7b8305536bd3093517bf659c0b72d337f6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 16 Oct 2017 13:26:26 +0200 Subject: [PATCH 8/8] Minor fixes for customized profile in simple mode CURA-4333 - Update comments - Disable the quality slider when there is a customized profile --- cura/Settings/SimpleModeSettingsManager.py | 3 ++- resources/qml/SidebarSimple.qml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/Settings/SimpleModeSettingsManager.py b/cura/Settings/SimpleModeSettingsManager.py index ffeaff4072..51aeb74d87 100644 --- a/cura/Settings/SimpleModeSettingsManager.py +++ b/cura/Settings/SimpleModeSettingsManager.py @@ -47,7 +47,8 @@ class SimpleModeSettingsManager(QObject): self._is_profile_customized = has_customized_user_settings self.isProfileCustomizedChanged.emit() - # A list of settings that will be ignored when check whether there is any custom settings. + # These are the settings included in the Simple ("Recommended") Mode, so only when the other settings have been + # changed, we consider it as a user customized profile in the Simple ("Recommended") Mode. __ignored_custom_setting_keys = ["support_enable", "infill_sparse_density", "gradual_infill_steps", diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 82e5f421e4..a68e2171f9 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -260,7 +260,7 @@ Item id: qualitySlider height: UM.Theme.getSize("sidebar_margin").height anchors.bottom: speedSlider.bottom - enabled: qualityModel.availableTotalTicks > 0 + enabled: qualityModel.availableTotalTicks > 0 && !Cura.SimpleModeSettingsManager.isProfileCustomized visible: qualityModel.totalTicks > 0 updateValueWhileDragging : false