diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e5fe813bbd..f88467d651 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -224,7 +224,7 @@ class CuraApplication(QtApplication): self._quality_management_model = None self._discovered_printer_model = DiscoveredPrintersModel(self, parent = self) - self._first_start_machine_actions_model = FirstStartMachineActionsModel(self, parent = self) + self._first_start_machine_actions_model = None self._welcome_pages_model = WelcomePagesModel(self, parent = self) self._add_printer_pages_model = AddPrinterPagesModel(self, parent = self) self._whats_new_pages_model = WhatsNewPagesModel(self, parent = self) @@ -878,6 +878,10 @@ class CuraApplication(QtApplication): @pyqtSlot(result = QObject) def getFirstStartMachineActionsModel(self, *args) -> "FirstStartMachineActionsModel": + if self._first_start_machine_actions_model is None: + self._first_start_machine_actions_model = FirstStartMachineActionsModel(self, parent = self) + if self.started: + self._first_start_machine_actions_model.initialize() return self._first_start_machine_actions_model @pyqtSlot(result = QObject) diff --git a/cura/Machines/Models/FirstStartMachineActionsModel.py b/cura/Machines/Models/FirstStartMachineActionsModel.py index ce0e9bf856..92caed7b12 100644 --- a/cura/Machines/Models/FirstStartMachineActionsModel.py +++ b/cura/Machines/Models/FirstStartMachineActionsModel.py @@ -33,11 +33,11 @@ class FirstStartMachineActionsModel(ListModel): self._current_action_index = 0 self._application = application - self._application.initializationFinished.connect(self._initialize) + self._application.initializationFinished.connect(self.initialize) self._previous_global_stack = None - def _initialize(self) -> None: + def initialize(self) -> None: self._application.getMachineManager().globalContainerChanged.connect(self._update) self._update() diff --git a/cura/Machines/Models/IntentCategoryModel.py b/cura/Machines/Models/IntentCategoryModel.py index add70f4c1a..0ff52b325a 100644 --- a/cura/Machines/Models/IntentCategoryModel.py +++ b/cura/Machines/Models/IntentCategoryModel.py @@ -1,7 +1,7 @@ #Copyright (c) 2019 Ultimaker B.V. #Cura is released under the terms of the LGPLv3 or higher. -from PyQt5.QtCore import Qt +from PyQt5.QtCore import Qt, QTimer import collections from typing import TYPE_CHECKING, Optional, Dict @@ -69,6 +69,11 @@ class IntentCategoryModel(ListModel): extruder_manager = application.getExtruderManager() extruder_manager.extrudersChanged.connect(self.update) + self._update_timer = QTimer() + self._update_timer.setInterval(500) + self._update_timer.setSingleShot(True) + self._update_timer.timeout.connect(self._update) + self.update() ## Updates the list of intents if an intent profile was added or removed. @@ -76,8 +81,11 @@ class IntentCategoryModel(ListModel): if container.getMetaDataEntry("type") == "intent": self.update() + def update(self): + self._update_timer.start() + ## Updates the list of intents. - def update(self) -> None: + def _update(self) -> None: available_categories = IntentManager.getInstance().currentAvailableIntentCategories() result = [] for category in available_categories: diff --git a/cura/Settings/SettingInheritanceManager.py b/cura/Settings/SettingInheritanceManager.py index 12b541c3d8..8be0813d0a 100644 --- a/cura/Settings/SettingInheritanceManager.py +++ b/cura/Settings/SettingInheritanceManager.py @@ -88,8 +88,8 @@ class SettingInheritanceManager(QObject): self.settingsWithIntheritanceChanged.emit() @pyqtSlot() - def forceUpdate(self) -> None: - self._update() + def scheduleUpdate(self) -> None: + self._update_timer.start() def _onActiveExtruderChanged(self) -> None: new_active_stack = ExtruderManager.getInstance().getActiveExtruderStack() diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index d15742a101..3059e4aa1d 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -2795,7 +2795,7 @@ msgstr "Selecteer eventuele upgrades die op deze Ultimaker Original zijn uitgevo #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:41 msgctxt "@label" msgid "Heated Build Plate (official kit or self-built)" -msgstr "Verwarmd Platform (officiƫle kit of eigenbouw)" +msgstr "Verwarmd Platform (officiƫle kit of zelf gebouwd)" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119 msgctxt "@label:MonitorStatus" diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml index a180ad6324..22c4039063 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml @@ -19,12 +19,6 @@ Item property bool settingsEnabled: Cura.ExtruderManager.activeExtruderStackId || extrudersEnabledCount.properties.value == 1 property real padding: UM.Theme.getSize("thick_margin").width - UM.I18nCatalog - { - id: catalog - name: "cura" - } - Column { spacing: UM.Theme.getSize("wide_margin").height diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index c851b7c042..e1b3f5a098 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -23,17 +23,16 @@ Item property alias contents: controlContainer.children property alias hovered: mouse.containsMouse - property var showRevertButton: true - property var showInheritButton: true - property var showLinkedSettingIcon: true - property var doDepthIndentation: true - property var doQualityUserSettingEmphasis: true + property bool showRevertButton: true + property bool showInheritButton: true + property bool showLinkedSettingIcon: true + property bool doDepthIndentation: true + property bool doQualityUserSettingEmphasis: true property var settingKey: definition.key //Used to detect each individual setting more easily in Squish GUI tests. // Create properties to put property provider stuff in (bindings break in qt 5.5.1 otherwise) property var state: propertyProvider.properties.state - // There is no resolve property if there is only one stack. - property var resolve: Cura.MachineManager.activeStackId !== Cura.MachineManager.activeMachine.id ? propertyProvider.properties.resolve : "None" + property var resolve: propertyProvider.properties.resolve property var stackLevels: propertyProvider.stackLevels property var stackLevel: stackLevels[0] // A list of stack levels that will trigger to show the revert button @@ -57,7 +56,8 @@ Item signal showTooltip(string text) signal hideTooltip() signal showAllHiddenInheritedSettings(string category_id) - property string tooltipText: + + function createTooltipText() { var affects = settingDefinitionsModel.getRequiredBy(definition.key, "value") var affected_by = settingDefinitionsModel.getRequires(definition.key, "value") @@ -128,7 +128,7 @@ Item onTriggered: { - base.showTooltip(base.tooltipText) + base.showTooltip(base.createTooltipText()) } } @@ -149,7 +149,7 @@ Item color: UM.Theme.getColor("setting_control_text") opacity: (definition.visible) ? 1 : 0.5 // emphasize the setting if it has a value in the user or quality profile - font: base.doQualityUserSettingEmphasis && base.stackLevel != undefined && base.stackLevel <= 1 ? UM.Theme.getFont("default_italic") : UM.Theme.getFont("default") + font: base.doQualityUserSettingEmphasis && base.stackLevel !== undefined && base.stackLevel <= 1 ? UM.Theme.getFont("default_italic") : UM.Theme.getFont("default") } Row @@ -170,10 +170,11 @@ Item { id: linkedSettingIcon; - visible: Cura.MachineManager.activeStack != Cura.MachineManager.activeMachine && (!definition.settable_per_extruder || String(globalPropertyProvider.properties.limit_to_extruder) != "-1") && base.showLinkedSettingIcon + visible: (!definition.settable_per_extruder || String(globalPropertyProvider.properties.limit_to_extruder) != "-1") && base.showLinkedSettingIcon - height: parent.height; - width: height; + anchors.top: parent.top + anchors.bottom: parent.bottom + width: height color: UM.Theme.getColor("setting_control_button") hoverColor: UM.Theme.getColor("setting_control_button") @@ -184,14 +185,14 @@ Item { hoverTimer.stop() var tooltipText = catalog.i18nc("@label", "This setting is always shared between all extruders. Changing it here will change the value for all extruders.") - if ((resolve != "None") && (stackLevel != 0)) + if ((resolve !== "None") && (stackLevel !== 0)) { // We come here if a setting has a resolve and the setting is not manually edited. tooltipText += " " + catalog.i18nc("@label", "The value is resolved from per-extruder values ") + "[" + Cura.ExtruderManager.getInstanceExtruderValues(definition.key) + "]." } base.showTooltip(tooltipText) } - onExited: base.showTooltip(base.tooltipText) + onExited: base.showTooltip(base.createTooltipText()) } UM.SimpleButton @@ -200,7 +201,8 @@ Item visible: base.resetButtonVisible - height: parent.height + anchors.top: parent.top + anchors.bottom: parent.bottom width: height color: UM.Theme.getColor("setting_control_button") @@ -227,7 +229,7 @@ Item hoverTimer.stop() base.showTooltip(catalog.i18nc("@label", "This setting has a value that is different from the profile.\n\nClick to restore the value of the profile.")) } - onExited: base.showTooltip(base.tooltipText) + onExited: base.showTooltip(base.createTooltipText()) } UM.SimpleButton @@ -278,7 +280,8 @@ Item return Cura.SettingInheritanceManager.getOverridesForExtruder(definition.key, String(globalPropertyProvider.properties.limit_to_extruder)).indexOf(definition.key) >= 0 } - height: parent.height + anchors.top: parent.top + anchors.bottom: parent.bottom width: height onClicked: @@ -296,7 +299,7 @@ Item break } } - if ((last_entry == 4 || last_entry == 11) && base.stackLevel == 0 && base.stackLevels.length == 2) + if ((last_entry === 4 || last_entry === 11) && base.stackLevel === 0 && base.stackLevels.length === 2) { // Special case of the inherit reset. If only the definition (4th or 11th) container) and the first // entry (user container) are set, we can simply remove the container. @@ -320,7 +323,7 @@ Item iconSource: UM.Theme.getIcon("formula") onEntered: { hoverTimer.stop(); base.showTooltip(catalog.i18nc("@label", "This setting is normally calculated, but it currently has an absolute value set.\n\nClick to restore the calculated value.")) } - onExited: base.showTooltip(base.tooltipText) + onExited: base.showTooltip(base.createTooltipText()) } } diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index c2f23a6f1d..5aea939728 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -228,7 +228,7 @@ Item model: UM.SettingDefinitionsModel { id: definitionsModel - containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: "" + containerId: Cura.MachineManager.activeMachine !== null ? Cura.MachineManager.activeMachine.definition.id: "" visibilityHandler: UM.SettingPreferenceVisibilityHandler { } exclude: ["machine_settings", "command_line_settings", "infill_mesh", "infill_mesh_order", "cutting_mesh", "support_mesh", "anti_overhang_mesh"] // TODO: infill_mesh settigns are excluded hardcoded, but should be based on the fact that settable_globally, settable_per_meshgroup and settable_per_extruder are false. expanded: CuraApplication.expandedCategories @@ -241,43 +241,41 @@ Item CuraApplication.setExpandedCategories(expanded) } } - onVisibilityChanged: Cura.SettingInheritanceManager.forceUpdate() + onVisibilityChanged: Cura.SettingInheritanceManager.scheduleUpdate() } - property var indexWithFocus: -1 - + property int indexWithFocus: -1 + property string activeMachineId: Cura.MachineManager.activeMachine !== null ? Cura.MachineManager.activeMachine.id : "" delegate: Loader { id: delegate width: scrollView.width - height: provider.properties.enabled == "True" ? UM.Theme.getSize("section").height : - contents.spacing + height: provider.properties.enabled === "True" ? UM.Theme.getSize("section").height : - contents.spacing Behavior on height { NumberAnimation { duration: 100 } } - opacity: provider.properties.enabled == "True" ? 1 : 0 + opacity: provider.properties.enabled === "True" ? 1 : 0 Behavior on opacity { NumberAnimation { duration: 100 } } enabled: { if (!Cura.ExtruderManager.activeExtruderStackId && machineExtruderCount.properties.value > 1) { // disable all controls on the global tab, except categories - return model.type == "category" + return model.type === "category" } - return provider.properties.enabled == "True" + return provider.properties.enabled === "True" } property var definition: model property var settingDefinitionsModel: definitionsModel property var propertyProvider: provider property var globalPropertyProvider: inheritStackProvider - property var externalResetHandler: false - - property string activeMachineId: Cura.MachineManager.activeMachine !== null ? Cura.MachineManager.activeMachine.id : "" + property bool externalResetHandler: false //Qt5.4.2 and earlier has a bug where this causes a crash: https://bugreports.qt.io/browse/QTBUG-35989 //In addition, while it works for 5.5 and higher, the ordering of the actual combo box drop down changes, //causing nasty issues when selecting different options. So disable asynchronous loading of enum type completely. - asynchronous: model.type != "enum" && model.type != "extruder" && model.type != "optional_extruder" - active: model.type != undefined + asynchronous: model.type !== "enum" && model.type !== "extruder" && model.type !== "optional_extruder" + active: model.type !== undefined source: { @@ -313,7 +311,7 @@ Item { target: provider property: "containerStackId" - when: model.settable_per_extruder || (inheritStackProvider.properties.limit_to_extruder != null && inheritStackProvider.properties.limit_to_extruder >= 0); + when: model.settable_per_extruder || (inheritStackProvider.properties.limit_to_extruder !== null && inheritStackProvider.properties.limit_to_extruder >= 0); value: { // Associate this binding with Cura.MachineManager.activeMachine.id in the beginning so this @@ -324,9 +322,9 @@ Item if (!model.settable_per_extruder) { //Not settable per extruder or there only is global, so we must pick global. - return delegate.activeMachineId + return contents.activeMachineId } - if (inheritStackProvider.properties.limit_to_extruder != null && inheritStackProvider.properties.limit_to_extruder >= 0) + if (inheritStackProvider.properties.limit_to_extruder !== null && inheritStackProvider.properties.limit_to_extruder >= 0) { //We have limit_to_extruder, so pick that stack. return Cura.ExtruderManager.extruderIds[String(inheritStackProvider.properties.limit_to_extruder)]; @@ -337,7 +335,7 @@ Item return Cura.ExtruderManager.activeExtruderStackId; } //No extruder tab is selected. Pick the global stack. Shouldn't happen any more since we removed the global tab. - return delegate.activeMachineId + return contents.activeMachineId } } @@ -346,7 +344,7 @@ Item UM.SettingPropertyProvider { id: inheritStackProvider - containerStackId: Cura.MachineManager.activeMachine !== null ? Cura.MachineManager.activeMachine.id: "" + containerStackId: contents.activeMachineId key: model.key watchedProperties: [ "limit_to_extruder" ] } @@ -355,11 +353,11 @@ Item { id: provider - containerStackId: delegate.activeMachineId + containerStackId: contents.activeMachineId key: model.key ? model.key : "" watchedProperties: [ "value", "enabled", "state", "validationState", "settable_per_extruder", "resolve" ] storeIndex: 0 - removeUnusedValue: model.resolve == undefined + removeUnusedValue: model.resolve === undefined } Connections @@ -421,8 +419,6 @@ Item } } - UM.I18nCatalog { id: catalog; name: "cura"; } - NumberAnimation { id: animateContentY target: contents @@ -465,7 +461,7 @@ Item //: Settings context menu action text: catalog.i18nc("@action:menu", "Copy value to all extruders") visible: machineExtruderCount.properties.value > 1 - enabled: contextMenu.provider != undefined && contextMenu.provider.properties.settable_per_extruder != "False" + enabled: contextMenu.provider !== undefined && contextMenu.provider.properties.settable_per_extruder !== "False" onTriggered: Cura.MachineManager.copyValueToExtruders(contextMenu.key) } @@ -474,7 +470,7 @@ Item //: Settings context menu action text: catalog.i18nc("@action:menu", "Copy all changed values to all extruders") visible: machineExtruderCount.properties.value > 1 - enabled: contextMenu.provider != undefined + enabled: contextMenu.provider !== undefined onTriggered: Cura.MachineManager.copyAllValuesToExtruders() }