diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ee94050515..395d6655cb 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -52,8 +52,11 @@ from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyT from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.SettingFunction import SettingFunction from cura.Settings.MachineNameValidator import MachineNameValidator + from cura.Machines.Models.NozzleModel import NozzleModel -from cura.Settings.ProfilesModel import NewQualityProfilesModel, NewCustomQualityProfilesModel +from cura.Machines.Models.QualityProfilesModel import QualityProfilesModel +from cura.Machines.Models.CustomQualityProfilesModel import CustomQualityProfilesModel + from cura.Settings.MaterialsModel import MaterialsModel, BrandMaterialsModel, GenericMaterialsModel, NewMaterialsModel from cura.Settings.SettingInheritanceManager import SettingInheritanceManager from cura.Settings.SimpleModeSettingsManager import SimpleModeSettingsManager @@ -390,8 +393,8 @@ class CuraApplication(QtApplication): self.getCuraSceneController().setActiveBuildPlate(0) # Initialize - self._new_quality_profile_model = None - self._new_custom_quality_profile_model = None + self._quality_profile_model = None + self._custom_quality_profile_model = None CuraApplication.Created = True @@ -896,15 +899,15 @@ class CuraApplication(QtApplication): def getPrintInformation(self): return self._print_information - def getNewQualityProfileModel(self, *args, **kwargs): - if self._new_quality_profile_model is None: - self._new_quality_profile_model = NewQualityProfilesModel(self) - return self._new_quality_profile_model + def getQualityProfileModel(self, *args, **kwargs): + if self._quality_profile_model is None: + self._quality_profile_model = QualityProfilesModel(self) + return self._quality_profile_model - def getNewCustomQualityProfilesModel(self, *args, **kwargs): - if self._new_custom_quality_profile_model is None: - self._new_custom_quality_profile_model = NewCustomQualityProfilesModel(self) - return self._new_custom_quality_profile_model + def getCustomQualityProfilesModel(self, *args, **kwargs): + if self._custom_quality_profile_model is None: + self._custom_quality_profile_model = CustomQualityProfilesModel(self) + return self._custom_quality_profile_model ## Registers objects for the QML engine to use. # @@ -940,8 +943,8 @@ class CuraApplication(QtApplication): # TODO: make this singleton? qmlRegisterType(QualityManagementModel, "Cura", 1, 0, "QualityManagementModel") - qmlRegisterSingletonType(NewQualityProfilesModel, "Cura", 1, 0, "NewQualityProfilesModel", self.getNewQualityProfileModel) - qmlRegisterSingletonType(NewCustomQualityProfilesModel, "Cura", 1, 0, "NewCustomQualityProfilesModel", self.getNewCustomQualityProfilesModel) + qmlRegisterSingletonType(QualityProfilesModel, "Cura", 1, 0, "QualityProfilesModel", self.getQualityProfileModel) + qmlRegisterSingletonType(CustomQualityProfilesModel, "Cura", 1, 0, "CustomQualityProfilesModel", self.getCustomQualityProfilesModel) qmlRegisterType(NozzleModel, "Cura", 1, 0, "NozzleModel") qmlRegisterType(MaterialsModel, "Cura", 1, 0, "MaterialsModel") diff --git a/cura/Machines/Models/CustomQualityProfilesModel.py b/cura/Machines/Models/CustomQualityProfilesModel.py new file mode 100644 index 0000000000..8b6fc2deb6 --- /dev/null +++ b/cura/Machines/Models/CustomQualityProfilesModel.py @@ -0,0 +1,36 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Application import Application +from UM.Logger import Logger + +from cura.Machines.Models.QualityProfilesModel import QualityProfilesModel + + +class CustomQualityProfilesModel(QualityProfilesModel): + + def _update(self): + Logger.log("d", "Updating %s ...", self.__class__.__name__) + + active_global_stack = Application.getInstance().getMachineManager()._global_container_stack + if active_global_stack is None: + self.setItems([]) + Logger.log("d", "No active GlobalStack, set %s as empty.", self.__class__.__name__) + return + + quality_changes_group_dict = self._quality_manager.getQualityChangesGroups(active_global_stack) + + item_list = [] + for key in sorted(quality_changes_group_dict): + quality_changes_group = quality_changes_group_dict[key] + + item = {"id": "TODO", # TODO: probably will be removed + "name": quality_changes_group.name, + "layer_height": "", + "layer_height_without_unit": "", + "available": quality_changes_group.is_available, + "quality_changes_group": quality_changes_group} + + item_list.append(item) + + self.setItems(item_list) diff --git a/cura/Machines/Models/NozzleModel.py b/cura/Machines/Models/NozzleModel.py index 3ad28f3287..271580962a 100644 --- a/cura/Machines/Models/NozzleModel.py +++ b/cura/Machines/Models/NozzleModel.py @@ -1,3 +1,6 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + from PyQt5.QtCore import Qt from UM.Application import Application diff --git a/cura/Machines/Models/QualityManagementModel.py b/cura/Machines/Models/QualityManagementModel.py index fab6a36410..589fec3440 100644 --- a/cura/Machines/Models/QualityManagementModel.py +++ b/cura/Machines/Models/QualityManagementModel.py @@ -1,4 +1,5 @@ - +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import Qt diff --git a/cura/Settings/ProfilesModel.py b/cura/Machines/Models/QualityProfilesModel.py similarity index 68% rename from cura/Settings/ProfilesModel.py rename to cura/Machines/Models/QualityProfilesModel.py index 06b5679d9e..19262bf75a 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Machines/Models/QualityProfilesModel.py @@ -1,135 +1,98 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from collections import OrderedDict -from typing import List, TYPE_CHECKING - -from PyQt5.QtCore import Qt - -from UM.Application import Application -from UM.Logger import Logger -from UM.Qt.ListModel import ListModel -from UM.Settings.ContainerRegistry import ContainerRegistry -from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel - -from cura.QualityManager import QualityManager -from cura.Settings.ExtruderManager import ExtruderManager -from cura.Machines.QualityManager import QualityGroup - -if TYPE_CHECKING: - from cura.Settings.ExtruderStack import ExtruderStack - - -class NewQualityProfilesModel(ListModel): - IdRole = Qt.UserRole + 1 - NameRole = Qt.UserRole + 2 - QualityTypeRole = Qt.UserRole + 3 - LayerHeightRole = Qt.UserRole + 4 - AvailableRole = Qt.UserRole + 5 - QualityGroupRole = Qt.UserRole + 6 - QualityChangesGroupRole = Qt.UserRole + 7 - - def __init__(self, parent = None): - super().__init__(parent) - - self.addRoleName(self.IdRole, "id") - self.addRoleName(self.NameRole, "name") - self.addRoleName(self.QualityTypeRole, "quality_type") - self.addRoleName(self.LayerHeightRole, "layer_height") - self.addRoleName(self.AvailableRole, "available") - self.addRoleName(self.QualityGroupRole, "quality_group") - self.addRoleName(self.QualityChangesGroupRole, "quality_changes_group") - - # connect signals - Application.getInstance().globalContainerStackChanged.connect(self._update) - Application.getInstance().getMachineManager().activeQualityGroupChanged.connect(self._update) - - self._quality_manager = Application.getInstance()._quality_manager - - self._layer_height_unit = "" # This is cached - - def _update(self): - Logger.log("d", "Updating quality profile model ...") - - active_global_stack = Application.getInstance().getMachineManager()._global_container_stack - if active_global_stack is None: - self.setItems([]) - Logger.log("d", "No active GlobalStack, set quality profile model as empty.") - return - - quality_group_dict = self._quality_manager.getQualityGroups(active_global_stack) - - item_list = [] - for key in sorted(quality_group_dict): - quality_group = quality_group_dict[key] - - layer_height = self._fetchLayerHeight(quality_group) - - item = {"id": "TODO", # TODO: probably will be removed - "name": quality_group.name, - "quality_type": quality_group.quality_type, - "layer_height": layer_height + self._layer_height_unit, - "layer_height_without_unit": layer_height, - "available": quality_group.is_available, - "quality_group": quality_group} - - item_list.append(item) - - # Sort items based on layer_height - item_list = sorted(item_list, key = lambda x: float(x["layer_height_without_unit"])) - - self.setItems(item_list) - - def _fetchLayerHeight(self, quality_group: "QualityGroup"): - active_global_stack = Application.getInstance().getMachineManager()._global_container_stack - if not self._layer_height_unit: - unit = active_global_stack.definition.getProperty("layer_height", "unit") - if not unit: - unit = "" - self._layer_height_unit = unit - - default_layer_height = active_global_stack.definition.getProperty("layer_height", "value") - - # Get layer_height from the quality profile for the GlobalStack - container = quality_group.node_for_global.getContainer() - - layer_height = default_layer_height - if container.hasProperty("layer_height", "value"): - layer_height = str(container.getProperty("layer_height", "value")) - else: - # Look for layer_height in the GlobalStack from material -> definition - for idx in range(4): - container = active_global_stack.getContainer(idx) - if container.hasProperty("layer_height", "value"): - layer_height = container.getProperty("layer_height", "value") - break - return str(layer_height) - - -class NewCustomQualityProfilesModel(NewQualityProfilesModel): - - def _update(self): - Logger.log("d", "Updating %s ...", self.__class__.__name__) - - active_global_stack = Application.getInstance().getMachineManager()._global_container_stack - if active_global_stack is None: - self.setItems([]) - Logger.log("d", "No active GlobalStack, set %s as empty.", self.__class__.__name__) - return - - quality_changes_group_dict = self._quality_manager.getQualityChangesGroups(active_global_stack) - - item_list = [] - for key in sorted(quality_changes_group_dict): - quality_changes_group = quality_changes_group_dict[key] - - item = {"id": "TODO", # TODO: probably will be removed - "name": quality_changes_group.name, - "layer_height": "", - "layer_height_without_unit": "", - "available": quality_changes_group.is_available, - "quality_changes_group": quality_changes_group} - - item_list.append(item) - - self.setItems(item_list) +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import Qt + +from UM.Application import Application +from UM.Logger import Logger +from UM.Qt.ListModel import ListModel +from cura.Machines.QualityManager import QualityGroup + + +# +# QML Model for all built-in quality profiles. +# +class QualityProfilesModel(ListModel): + IdRole = Qt.UserRole + 1 + NameRole = Qt.UserRole + 2 + QualityTypeRole = Qt.UserRole + 3 + LayerHeightRole = Qt.UserRole + 4 + AvailableRole = Qt.UserRole + 5 + QualityGroupRole = Qt.UserRole + 6 + QualityChangesGroupRole = Qt.UserRole + 7 + + def __init__(self, parent = None): + super().__init__(parent) + + self.addRoleName(self.IdRole, "id") + self.addRoleName(self.NameRole, "name") + self.addRoleName(self.QualityTypeRole, "quality_type") + self.addRoleName(self.LayerHeightRole, "layer_height") + self.addRoleName(self.AvailableRole, "available") + self.addRoleName(self.QualityGroupRole, "quality_group") + self.addRoleName(self.QualityChangesGroupRole, "quality_changes_group") + + # connect signals + Application.getInstance().globalContainerStackChanged.connect(self._update) + Application.getInstance().getMachineManager().activeQualityGroupChanged.connect(self._update) + + self._quality_manager = Application.getInstance()._quality_manager + + self._layer_height_unit = "" # This is cached + + def _update(self): + Logger.log("d", "Updating quality profile model ...") + + active_global_stack = Application.getInstance().getMachineManager()._global_container_stack + if active_global_stack is None: + self.setItems([]) + Logger.log("d", "No active GlobalStack, set quality profile model as empty.") + return + + quality_group_dict = self._quality_manager.getQualityGroups(active_global_stack) + + item_list = [] + for key in sorted(quality_group_dict): + quality_group = quality_group_dict[key] + + layer_height = self._fetchLayerHeight(quality_group) + + item = {"id": "TODO", # TODO: probably will be removed + "name": quality_group.name, + "quality_type": quality_group.quality_type, + "layer_height": layer_height + self._layer_height_unit, + "layer_height_without_unit": layer_height, + "available": quality_group.is_available, + "quality_group": quality_group} + + item_list.append(item) + + # Sort items based on layer_height + item_list = sorted(item_list, key = lambda x: float(x["layer_height_without_unit"])) + + self.setItems(item_list) + + def _fetchLayerHeight(self, quality_group: "QualityGroup"): + active_global_stack = Application.getInstance().getMachineManager()._global_container_stack + if not self._layer_height_unit: + unit = active_global_stack.definition.getProperty("layer_height", "unit") + if not unit: + unit = "" + self._layer_height_unit = unit + + default_layer_height = active_global_stack.definition.getProperty("layer_height", "value") + + # Get layer_height from the quality profile for the GlobalStack + container = quality_group.node_for_global.getContainer() + + layer_height = default_layer_height + if container.hasProperty("layer_height", "value"): + layer_height = str(container.getProperty("layer_height", "value")) + else: + # Look for layer_height in the GlobalStack from material -> definition + for idx in range(4): + container = active_global_stack.getContainer(idx) + if container.hasProperty("layer_height", "value"): + layer_height = container.getProperty("layer_height", "value") + break + return str(layer_height) diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index 713b4b856e..8d26bfc982 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Ultimaker B.V. +// Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.8 @@ -13,7 +13,7 @@ Menu Instantiator { - model: Cura.NewQualityProfilesModel + model: Cura.QualityProfilesModel MenuItem { @@ -34,18 +34,18 @@ Menu MenuSeparator { id: customSeparator - visible: Cura.NewCustomQualityProfilesModel.rowCount > 0 + visible: Cura.CustomQualityProfilesModel.rowCount > 0 } Instantiator { id: customProfileInstantiator - model: Cura.NewCustomQualityProfilesModel + model: Cura.CustomQualityProfilesModel Connections { - target: Cura.NewCustomQualityProfilesModel - onModelReset: customSeparator.visible = Cura.NewCustomQualityProfilesModel.rowCount() > 0 + target: Cura.CustomQualityProfilesModel + onModelReset: customSeparator.visible = Cura.CustomQualityProfilesModel.rowCount() > 0 } MenuItem diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 33aa98ba9f..c296a72281 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -1,7 +1,7 @@ -// Copyright (c) 2017 Ultimaker B.V. +// Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.7 +import QtQuick 2.8 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4 import QtQuick.Layouts 1.3 @@ -58,7 +58,7 @@ Item running: false repeat: false onTriggered: { - var item = Cura.NewQualityProfilesModel.getItem(qualitySlider.value); + var item = Cura.QualityProfilesModel.getItem(qualitySlider.value); Cura.MachineManager.activeQualityGroup = item.quality_group; } } @@ -105,8 +105,8 @@ Item var availableMin = -1 var availableMax = -1 - for (var i = 0; i < Cura.NewQualityProfilesModel.rowCount(); i++) { - var qualityItem = Cura.NewQualityProfilesModel.getItem(i) + for (var i = 0; i < Cura.QualityProfilesModel.rowCount(); i++) { + var qualityItem = Cura.QualityProfilesModel.getItem(i) // Add each quality item to the UI quality model qualityModel.append(qualityItem) @@ -168,7 +168,7 @@ Item qualityModel.existingQualityProfile = 0 // check, the ticks count cannot be less than zero - qualityModel.totalTicks = Math.max(0, Cura.NewQualityProfilesModel.rowCount() - 1) + qualityModel.totalTicks = Math.max(0, Cura.QualityProfilesModel.rowCount() - 1) } } @@ -194,13 +194,13 @@ Item anchors.verticalCenter: parent.verticalCenter anchors.top: parent.top anchors.topMargin: Math.round(UM.Theme.getSize("sidebar_margin").height / 2) - color: (Cura.MachineManager.activeMachine != null && Cura.NewQualityProfilesModel.getItem(index).available) ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable") + color: (Cura.MachineManager.activeMachine != null && Cura.QualityProfilesModel.getItem(index).available) ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable") text: { var result = "" if(Cura.MachineManager.activeMachine != null) { - result = Cura.NewQualityProfilesModel.getItem(index).layer_height_without_unit + result = Cura.QualityProfilesModel.getItem(index).layer_height_without_unit if(result == undefined) { @@ -265,7 +265,7 @@ Item Rectangle { anchors.verticalCenter: parent.verticalCenter - color: Cura.NewQualityProfilesModel.getItem(index).available ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable") + color: Cura.QualityProfilesModel.getItem(index).available ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable") width: 1 * screenScaleFactor height: 6 * screenScaleFactor y: 0 @@ -411,9 +411,9 @@ Item // if the current profile is user-created, switch to a built-in quality if (Cura.SimpleModeSettingsManager.isProfileUserCreated) { - if (Cura.NewQualityProfilesModel.rowCount() > 0) + if (Cura.QualityProfilesModel.rowCount() > 0) { - var item = Cura.NewQualityProfilesModel.getItem(0); + var item = Cura.QualityProfilesModel.getItem(0); Cura.MachineManager.activeQualityGroup = item.quality_group; } }