WIP: Refactor ProfileMenu.qml

This commit is contained in:
Lipu Fei 2018-02-13 21:33:43 +01:00
parent 8f8de0454f
commit cd53ae0639
6 changed files with 83 additions and 55 deletions

View file

@ -388,6 +388,8 @@ class CuraApplication(QtApplication):
self.getCuraSceneController().setActiveBuildPlate(0) # Initialize self.getCuraSceneController().setActiveBuildPlate(0) # Initialize
self._new_quality_profile_model = None
CuraApplication.Created = True CuraApplication.Created = True
@pyqtSlot(str, result = str) @pyqtSlot(str, result = str)
@ -896,6 +898,11 @@ class CuraApplication(QtApplication):
def getPrintInformation(self): def getPrintInformation(self):
return self._print_information 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
## Registers objects for the QML engine to use. ## Registers objects for the QML engine to use.
# #
# \param engine The QML engine. # \param engine The QML engine.
@ -928,7 +935,7 @@ class CuraApplication(QtApplication):
qmlRegisterType(GenericMaterialsModel, "Cura", 1, 0, "GenericMaterialsModel") qmlRegisterType(GenericMaterialsModel, "Cura", 1, 0, "GenericMaterialsModel")
qmlRegisterType(BrandMaterialsModel, "Cura", 1, 0, "BrandMaterialsModel") qmlRegisterType(BrandMaterialsModel, "Cura", 1, 0, "BrandMaterialsModel")
qmlRegisterType(NewQualityProfilesModel, "Cura", 1, 0, "NewQualityProfilesModel") qmlRegisterSingletonType(NewQualityProfilesModel, "Cura", 1, 0, "NewQualityProfilesModel", self.getNewQualityProfileModel)
qmlRegisterType(NozzleModel, "Cura", 1, 0, "NozzleModel") qmlRegisterType(NozzleModel, "Cura", 1, 0, "NozzleModel")
qmlRegisterType(MaterialsModel, "Cura", 1, 0, "MaterialsModel") qmlRegisterType(MaterialsModel, "Cura", 1, 0, "MaterialsModel")

View file

@ -1,13 +1,18 @@
from typing import Optional from typing import Optional
from PyQt5.Qt import QObject from PyQt5.Qt import QObject, pyqtSlot
from cura.Machines.ContainerNode import ContainerNode from cura.Machines.ContainerNode import ContainerNode
class ContainerGroup(QObject): class ContainerGroup(QObject):
def __init__(self, parent = None): def __init__(self, name: str, parent = None):
super().__init__(parent) super().__init__(parent)
self.name = name
self.node_for_global = None # type: Optional[ContainerNode] self.node_for_global = None # type: Optional[ContainerNode]
self.nodes_for_extruders = dict() self.nodes_for_extruders = dict()
@pyqtSlot(result = str)
def getName(self) -> str:
return self.name

View file

@ -55,9 +55,8 @@ class QualityChangesGroup:
class QualityGroup(ContainerGroup): class QualityGroup(ContainerGroup):
def __init__(self, name, quality_type, parent = None): def __init__(self, name: str, quality_type: str, parent = None):
super().__init__(parent) super().__init__(name, parent)
self.name = name
self.quality_type = quality_type self.quality_type = quality_type
self.is_available = False self.is_available = False

View file

@ -46,6 +46,7 @@ if TYPE_CHECKING:
class MachineManager(QObject): class MachineManager(QObject):
def __init__(self, parent = None): def __init__(self, parent = None):
super().__init__(parent) super().__init__(parent)
@ -132,9 +133,13 @@ class MachineManager(QObject):
if containers: if containers:
containers[0].nameChanged.connect(self._onMaterialNameChanged) containers[0].nameChanged.connect(self._onMaterialNameChanged)
### new ### NEW
self._current_quality_group = None self._current_quality_group = None
### NEW
activeQualityGroupChanged = pyqtSignal()
globalContainerChanged = pyqtSignal() # Emitted whenever the global stack is changed (ie: when changing between printers, changing a global profile, but not when changing a value) globalContainerChanged = pyqtSignal() # Emitted whenever the global stack is changed (ie: when changing between printers, changing a global profile, but not when changing a value)
activeMaterialChanged = pyqtSignal() activeMaterialChanged = pyqtSignal()
activeVariantChanged = pyqtSignal() activeVariantChanged = pyqtSignal()
@ -1494,14 +1499,20 @@ class MachineManager(QObject):
def _setQualityGroup(self, quality_group, empty_quality_changes = True): def _setQualityGroup(self, quality_group, empty_quality_changes = True):
self._current_quality_group = quality_group self._current_quality_group = quality_group
# Set quality and quality_changes for the GlobalStack
self._global_container_stack.quality = quality_group.node_for_global.getContainer() self._global_container_stack.quality = quality_group.node_for_global.getContainer()
if empty_quality_changes: if empty_quality_changes:
self._global_container_stack.qualityChanges = self._empty_quality_changes_container self._global_container_stack.qualityChanges = self._empty_quality_changes_container
# Set quality and quality_changes for each ExtruderStack
for position, node in quality_group.nodes_for_extruders.items(): for position, node in quality_group.nodes_for_extruders.items():
self._global_container_stack.extruders[position].quality = node.getContainer() self._global_container_stack.extruders[position].quality = node.getContainer()
if empty_quality_changes: if empty_quality_changes:
self._global_container_stack.extruders[position].qualityChanges = self._empty_quality_changes_container self._global_container_stack.extruders[position].qualityChanges = self._empty_quality_changes_container
self.activeQualityGroupChanged.emit()
def _setVariantGroup(self, position, container_node): def _setVariantGroup(self, position, container_node):
self._global_container_stack.extruders[position].variant = container_node.getContainer() self._global_container_stack.extruders[position].variant = container_node.getContainer()
@ -1581,8 +1592,13 @@ class MachineManager(QObject):
self._updateQualityWithMaterial() self._updateQualityWithMaterial()
@pyqtSlot("QVariant") @pyqtSlot("QVariant")
def handleQualityGroup(self, quality_group): def setQualityGroup(self, quality_group):
Logger.log("d", "---------------- qg = [%s]", quality_group.name) Logger.log("d", "---------------- qg = [%s]", quality_group.name)
self.blurSettings.emit() self.blurSettings.emit()
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
self._setQualityGroup(quality_group) self._setQualityGroup(quality_group)
@pyqtProperty("QVariant", fset = setQualityGroup, notify = activeQualityGroupChanged)
def activeQualityGroup(self):
return self._current_quality_group

View file

@ -2,25 +2,24 @@
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
from collections import OrderedDict from collections import OrderedDict
from typing import List, TYPE_CHECKING
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from UM.Application import Application 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.ContainerRegistry import ContainerRegistry
from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel
from cura.QualityManager import QualityManager from cura.QualityManager import QualityManager
from cura.Settings.ExtruderManager import ExtruderManager from cura.Settings.ExtruderManager import ExtruderManager
from cura.Machines.QualityManager import QualityGroup
from typing import List, TYPE_CHECKING
if TYPE_CHECKING: if TYPE_CHECKING:
from cura.Settings.ExtruderStack import ExtruderStack from cura.Settings.ExtruderStack import ExtruderStack
from UM.Qt.ListModel import ListModel
class NewQualityProfilesModel(ListModel): class NewQualityProfilesModel(ListModel):
IdRole = Qt.UserRole + 1 IdRole = Qt.UserRole + 1
NameRole = Qt.UserRole + 2 NameRole = Qt.UserRole + 2
@ -39,32 +38,35 @@ class NewQualityProfilesModel(ListModel):
self.addRoleName(self.AvailableRole, "available") self.addRoleName(self.AvailableRole, "available")
self.addRoleName(self.QualityGroupRole, "quality_group") self.addRoleName(self.QualityGroupRole, "quality_group")
# TODO: connect signals # connect signals
Application.getInstance().globalContainerStackChanged.connect(self._update) Application.getInstance().globalContainerStackChanged.connect(self._update)
Application.getInstance().getMachineManager().activeVariantChanged.connect(self._update) Application.getInstance().getMachineManager().activeQualityGroupChanged.connect(self._update)
Application.getInstance().getMachineManager().activeStackChanged.connect(self._update)
Application.getInstance().getMachineManager().activeMaterialChanged.connect(self._update) self._quality_manager = Application.getInstance()._quality_manager
self._layer_height_unit = "" # This is cached
def _update(self): def _update(self):
# TODO: get all available qualities Logger.log("d", "Updating quality profile model ...")
self.items.clear()
quality_manager = Application.getInstance()._quality_manager
active_global_stack = Application.getInstance().getMachineManager()._global_container_stack active_global_stack = Application.getInstance().getMachineManager()._global_container_stack
if active_global_stack is None: if active_global_stack is None:
self.setItems([]) self.setItems([])
Logger.log("d", "No active GlobalStack, set quality profile model as empty.")
return return
quality_group_dict = quality_manager.getQualityGroups(active_global_stack) quality_group_dict = self._quality_manager.getQualityGroups(active_global_stack)
item_list = [] item_list = []
for key in sorted(quality_group_dict): for key in sorted(quality_group_dict):
quality_group = quality_group_dict[key] quality_group = quality_group_dict[key]
item = {"id": "TODO", layer_height = self._fetchLayerHeight(quality_group)
item = {"id": "TODO", # TODO: probably will be removed
"name": quality_group.name, "name": quality_group.name,
"layer_height": "TODO", "layer_height": layer_height + self._layer_height_unit,
"layer_height_without_unit": layer_height,
"available": quality_group.is_available, "available": quality_group.is_available,
"quality_group": quality_group} "quality_group": quality_group}
@ -72,6 +74,31 @@ class NewQualityProfilesModel(ListModel):
self.setItems(item_list) 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
if not quality_group.is_available:
return ""
# Get layer_height from the quality profile for the GlobalStack
container = quality_group.node_for_global.getContainer()
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)
## QML Model for listing the current list of valid quality profiles. ## QML Model for listing the current list of valid quality profiles.

View file

@ -1,8 +1,8 @@
// Copyright (c) 2016 Ultimaker B.V. // Copyright (c) 2016 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.2 import QtQuick 2.8
import QtQuick.Controls 1.1 import QtQuick.Controls 1.4
import UM 1.2 as UM import UM 1.2 as UM
import Cura 1.0 as Cura import Cura 1.0 as Cura
@ -11,25 +11,18 @@ Menu
{ {
id: menu id: menu
// TODO: single instance
Cura.NewQualityProfilesModel
{
id: qualityProfilesModel
}
Instantiator Instantiator
{ {
model: qualityProfilesModel model: Cura.NewQualityProfilesModel
MenuItem MenuItem
{ {
text: (model.layer_height != "") ? model.name + " - " + model.layer_height : model.name text: (model.layer_height != "") ? model.name + " - " + model.layer_height : model.name
checkable: true checkable: true
checked: Cura.MachineManager.activeQualityId == model.id checked: Cura.MachineManager.activeQualityGroup.getName() == model.name
exclusiveGroup: group exclusiveGroup: group
onTriggered: { onTriggered: {
Cura.MachineManager.handleQualityGroup(model.quality_group) Cura.MachineManager.setQualityGroup(model.quality_group)
//Cura.MachineManager.setActiveQuality(model.id)
} }
visible: model.available visible: model.available
} }
@ -82,23 +75,4 @@ Menu
MenuItem { action: Cura.Actions.resetProfile } MenuItem { action: Cura.Actions.resetProfile }
MenuSeparator { } MenuSeparator { }
MenuItem { action: Cura.Actions.manageProfiles } MenuItem { action: Cura.Actions.manageProfiles }
function getFilter(initial_conditions)
{
var result = initial_conditions;
if(Cura.MachineManager.filterQualityByMachine)
{
result.definition = Cura.MachineManager.activeQualityDefinitionId;
if(Cura.MachineManager.hasMaterials)
{
result.material = Cura.MachineManager.activeQualityMaterialId;
}
}
else
{
result.definition = "fdmprinter"
}
return result
}
} }