mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-13 21:36:03 +08:00
Merge branch '3.0' of github.com:Ultimaker/Cura into 3.0
Contributes to issue CURA-4357.
This commit is contained in:
commit
2020e355a2
@ -110,12 +110,11 @@ class ProfilesModel(InstanceContainersModel):
|
||||
# active machine and material, and later yield the right ones.
|
||||
tmp_all_quality_items = OrderedDict()
|
||||
for item in super()._recomputeItems():
|
||||
profile = container_registry.findContainers(id = item["id"])
|
||||
profile = container_registry.findContainers(id=item["id"])
|
||||
quality_type = profile[0].getMetaDataEntry("quality_type") if profile else ""
|
||||
|
||||
if quality_type not in tmp_all_quality_items:
|
||||
tmp_all_quality_items[quality_type] = {"suitable_container": None,
|
||||
"all_containers": []}
|
||||
tmp_all_quality_items[quality_type] = {"suitable_container": None, "all_containers": []}
|
||||
|
||||
tmp_all_quality_items[quality_type]["all_containers"].append(item)
|
||||
if tmp_all_quality_items[quality_type]["suitable_container"] is None and profile[0] in qualities:
|
||||
@ -126,25 +125,14 @@ class ProfilesModel(InstanceContainersModel):
|
||||
for key in reversed(tmp_all_quality_items.keys()):
|
||||
all_quality_items[key] = tmp_all_quality_items[key]
|
||||
|
||||
# First the suitable containers are set in the model
|
||||
containers = []
|
||||
for data_item in all_quality_items.values():
|
||||
suitable_item = data_item["suitable_container"]
|
||||
if suitable_item is None:
|
||||
suitable_item = data_item["all_containers"][0]
|
||||
containers.append(suitable_item)
|
||||
item = data_item["suitable_container"]
|
||||
if item is None:
|
||||
item = data_item["all_containers"][0]
|
||||
|
||||
# Once the suitable containers are collected, the rest of the containers are appended
|
||||
for data_item in all_quality_items.values():
|
||||
for item in data_item["all_containers"]:
|
||||
if item not in containers:
|
||||
containers.append(item)
|
||||
|
||||
# Now all the containers are set
|
||||
for item in containers:
|
||||
profile = container_registry.findContainers(id = item["id"])
|
||||
if not profile:
|
||||
item["layer_height"] = "" #Can't update a profile that is unknown.
|
||||
item["layer_height"] = "" # Can't update a profile that is unknown.
|
||||
item["available"] = False
|
||||
yield item
|
||||
continue
|
||||
@ -152,13 +140,13 @@ class ProfilesModel(InstanceContainersModel):
|
||||
profile = profile[0]
|
||||
item["available"] = profile in qualities
|
||||
|
||||
#Easy case: This profile defines its own layer height.
|
||||
# Easy case: This profile defines its own layer height.
|
||||
if profile.hasProperty("layer_height", "value"):
|
||||
self._setItemLayerHeight(item, profile.getProperty("layer_height", "value"), unit)
|
||||
yield item
|
||||
continue
|
||||
|
||||
#Quality-changes profile that has no value for layer height. Get the corresponding quality profile and ask that profile.
|
||||
# Quality-changes profile that has no value for layer height. Get the corresponding quality profile and ask that profile.
|
||||
quality_type = profile.getMetaDataEntry("quality_type", None)
|
||||
if quality_type:
|
||||
quality_results = machine_manager.determineQualityAndQualityChangesForQualityType(quality_type)
|
||||
|
@ -40,110 +40,108 @@ Item
|
||||
//
|
||||
// Quality profile
|
||||
//
|
||||
Rectangle
|
||||
Item
|
||||
{
|
||||
|
||||
Timer {
|
||||
id: qualitySliderChangeTimer
|
||||
interval: 50
|
||||
running: false
|
||||
repeat: false
|
||||
onTriggered: Cura.MachineManager.setActiveQuality(Cura.ProfilesModel.getItem(qualityRowSlider.value).id)
|
||||
}
|
||||
|
||||
Component.onCompleted:
|
||||
{
|
||||
qualityRow.updateQualitySliderProperties()
|
||||
}
|
||||
|
||||
Connections
|
||||
{
|
||||
target: Cura.MachineManager
|
||||
onActiveQualityChanged:
|
||||
{
|
||||
qualityRow.updateQualitySliderProperties()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
id: qualityRow
|
||||
|
||||
property var totalTicks: 0
|
||||
property var availableTotalTicks: 0
|
||||
property var qualitySliderStep: qualityRow.totalTicks != 0 ? (base.width * 0.55) / (qualityRow.totalTicks) : 0
|
||||
property var qualitySliderSelectedValue: 0
|
||||
|
||||
property var sliderAvailableMin : 0
|
||||
property var sliderAvailableMax : 0
|
||||
property var sliderMarginRight : 0
|
||||
|
||||
function updateQualitySliderProperties()
|
||||
{
|
||||
qualityRow.totalTicks = Cura.ProfilesModel.rowCount() - 1 // minus one, because slider starts from 0
|
||||
|
||||
var availableMin = -1
|
||||
var availableMax = -1
|
||||
|
||||
for (var i = 0; i <= Cura.ProfilesModel.rowCount(); i++)
|
||||
{
|
||||
//Find slider range, min and max value
|
||||
if (availableMin == -1 && Cura.ProfilesModel.getItem(i).available)
|
||||
{
|
||||
availableMin = i
|
||||
availableMax = i
|
||||
}
|
||||
else if(Cura.ProfilesModel.getItem(i).available)
|
||||
{
|
||||
availableMax = i
|
||||
}
|
||||
|
||||
//Find selected value
|
||||
if(Cura.MachineManager.activeQualityId == Cura.ProfilesModel.getItem(i).id)
|
||||
{
|
||||
qualitySliderSelectedValue = i
|
||||
}
|
||||
}
|
||||
|
||||
if(availableMin !=-1)
|
||||
{
|
||||
availableTotalTicks = availableMax - availableMin
|
||||
}
|
||||
else
|
||||
{
|
||||
availableTotalTicks = -1
|
||||
}
|
||||
|
||||
qualitySliderStep = qualityRow.totalTicks != 0 ? (base.width * 0.55) / (qualityRow.totalTicks) : 0
|
||||
|
||||
if(availableMin == -1)
|
||||
{
|
||||
sliderMarginRight = base.width * 0.55
|
||||
}
|
||||
else if (availableMin == 0 && availableMax == 0)
|
||||
{
|
||||
sliderMarginRight = base.width * 0.55
|
||||
}
|
||||
else if(availableMin == availableMax)
|
||||
{
|
||||
sliderMarginRight = (qualityRow.totalTicks - availableMin) * qualitySliderStep
|
||||
}
|
||||
else if(availableMin != availableMax)
|
||||
{
|
||||
sliderMarginRight = (qualityRow.totalTicks - availableMax) * qualitySliderStep
|
||||
}
|
||||
|
||||
|
||||
qualityRow.sliderAvailableMin = availableMin
|
||||
qualityRow.sliderAvailableMax = availableMax
|
||||
}
|
||||
|
||||
height: UM.Theme.getSize("sidebar_margin").height
|
||||
|
||||
anchors.topMargin: UM.Theme.getSize("sidebar_margin").height
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width
|
||||
anchors.right: parent.right
|
||||
|
||||
Timer
|
||||
{
|
||||
id: qualitySliderChangeTimer
|
||||
interval: 50
|
||||
running: false
|
||||
repeat: false
|
||||
onTriggered: Cura.MachineManager.setActiveQuality(Cura.ProfilesModel.getItem(qualitySlider.value).id)
|
||||
}
|
||||
|
||||
Component.onCompleted: qualityModel.update()
|
||||
|
||||
Connections
|
||||
{
|
||||
target: Cura.MachineManager
|
||||
onActiveQualityChanged: qualityModel.update()
|
||||
}
|
||||
|
||||
ListModel
|
||||
{
|
||||
id: qualityModel
|
||||
|
||||
property var totalTicks: 0
|
||||
property var availableTotalTicks: 0
|
||||
property var activeQualityId: 0
|
||||
|
||||
property var qualitySliderStepWidth: 0
|
||||
property var qualitySliderAvailableMin : 0
|
||||
property var qualitySliderAvailableMax : 0
|
||||
property var qualitySliderMarginRight : 0
|
||||
|
||||
function update () {
|
||||
reset()
|
||||
|
||||
var availableMin = -1
|
||||
var availableMax = -1
|
||||
|
||||
for (var i = 0; i <= Cura.ProfilesModel.rowCount(); i++) {
|
||||
var qualityItem = Cura.ProfilesModel.getItem(i)
|
||||
|
||||
// Add each quality item to the UI quality model
|
||||
qualityModel.append(qualityItem)
|
||||
|
||||
// Set selected value
|
||||
if (Cura.MachineManager.activeQualityId == qualityItem.id) {
|
||||
qualityModel.activeQualityId = i
|
||||
}
|
||||
|
||||
// Set min available
|
||||
if (qualityItem.available && availableMin == -1) {
|
||||
availableMin = i
|
||||
}
|
||||
|
||||
// Set max available
|
||||
if (qualityItem.available) {
|
||||
availableMax = i
|
||||
}
|
||||
}
|
||||
|
||||
// Set total available ticks for active slider part
|
||||
if (availableMin != -1) {
|
||||
qualityModel.availableTotalTicks = availableMax - availableMin
|
||||
}
|
||||
|
||||
// Calculate slider values
|
||||
calculateSliderStepWidth(qualityModel.totalTicks)
|
||||
calculateSliderMargins(availableMin, availableMax, qualityModel.totalTicks)
|
||||
|
||||
qualityModel.qualitySliderAvailableMin = availableMin
|
||||
qualityModel.qualitySliderAvailableMax = availableMax
|
||||
}
|
||||
|
||||
function calculateSliderStepWidth (totalTicks) {
|
||||
qualityModel.qualitySliderStepWidth = totalTicks != 0 ? (base.width * 0.55) / (totalTicks) : 0
|
||||
}
|
||||
|
||||
function calculateSliderMargins (availableMin, availableMax, totalTicks) {
|
||||
if (availableMin == -1 || (availableMin == 0 && availableMax == 0)) {
|
||||
qualityModel.qualitySliderMarginRight = base.width * 0.55
|
||||
} else if (availableMin == availableMax) {
|
||||
qualityModel.qualitySliderMarginRight = (totalTicks - availableMin) * qualitySliderStepWidth
|
||||
} else {
|
||||
qualityModel.qualitySliderMarginRight = (totalTicks - availableMax) * qualitySliderStepWidth
|
||||
}
|
||||
}
|
||||
|
||||
function reset () {
|
||||
qualityModel.clear()
|
||||
qualityModel.totalTicks = Cura.ProfilesModel.rowCount() - 1 // minus one, because slider starts from 0
|
||||
qualityModel.availableTotalTicks = -1
|
||||
}
|
||||
}
|
||||
|
||||
Text
|
||||
{
|
||||
id: qualityRowTitle
|
||||
@ -152,29 +150,32 @@ Item
|
||||
color: UM.Theme.getColor("text")
|
||||
}
|
||||
|
||||
//Show titles for the each quality slider ticks
|
||||
// Show titles for the each quality slider ticks
|
||||
Item
|
||||
{
|
||||
y: -5;
|
||||
anchors.left: speedSlider.left
|
||||
Repeater
|
||||
{
|
||||
model: qualityRow.totalTicks + 1
|
||||
model: qualityModel
|
||||
|
||||
Text
|
||||
{
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: UM.Theme.getSize("sidebar_margin").height / 2
|
||||
color: UM.Theme.getColor("text")
|
||||
color: (Cura.MachineManager.activeMachine != null && Cura.ProfilesModel.getItem(index).available) ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable")
|
||||
text: Cura.MachineManager.activeMachine != null ? Cura.ProfilesModel.getItem(index).layer_height_without_unit : ""
|
||||
|
||||
width: 1
|
||||
x:
|
||||
{
|
||||
if(index != qualityRow.totalTicks)
|
||||
return (base.width * 0.55 / qualityRow.totalTicks) * index;
|
||||
else
|
||||
return (base.width * 0.55 / qualityRow.totalTicks) * index - 15;
|
||||
x: {
|
||||
// Make sure the text aligns correctly with each tick
|
||||
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 (base.width * 0.55 / qualityModel.totalTicks) * index - (width / 2)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -197,8 +198,7 @@ Item
|
||||
width: base.width * 0.55
|
||||
height: 2
|
||||
color: UM.Theme.getColor("quality_slider_unavailable")
|
||||
//radius: parent.radius
|
||||
anchors.verticalCenter: qualityRowSlider.verticalCenter
|
||||
anchors.verticalCenter: qualitySlider.verticalCenter
|
||||
x: 0
|
||||
}
|
||||
|
||||
@ -206,51 +206,52 @@ Item
|
||||
Repeater
|
||||
{
|
||||
id: qualityRepeater
|
||||
model: qualityRow.totalTicks + 1
|
||||
Rectangle {
|
||||
model: qualityModel
|
||||
|
||||
Rectangle
|
||||
{
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
color: qualityRow.availableTotalTicks != 0 ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable")
|
||||
color: Cura.ProfilesModel.getItem(index).available ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable")
|
||||
width: 1
|
||||
height: 6
|
||||
y: 0
|
||||
x: qualityRow.qualitySliderStep * index
|
||||
x: qualityModel.qualitySliderStepWidth * index
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Slider
|
||||
{
|
||||
|
||||
id: qualityRowSlider
|
||||
id: qualitySlider
|
||||
height: UM.Theme.getSize("sidebar_margin").height
|
||||
anchors.bottom: speedSlider.bottom
|
||||
enabled: qualityRow.availableTotalTicks != 0
|
||||
enabled: qualityModel.availableTotalTicks > 0
|
||||
updateValueWhileDragging : false
|
||||
|
||||
minimumValue: qualityRow.sliderAvailableMin
|
||||
maximumValue: qualityRow.sliderAvailableMax
|
||||
minimumValue: qualityModel.qualitySliderAvailableMin
|
||||
maximumValue: qualityModel.qualitySliderAvailableMax
|
||||
stepSize: 1
|
||||
|
||||
value: qualityRow.qualitySliderSelectedValue
|
||||
value: qualityModel.activeQualityId
|
||||
|
||||
width: qualityRow.qualitySliderStep * (qualityRow.availableTotalTicks)
|
||||
width: qualityModel.qualitySliderStepWidth * qualityModel.availableTotalTicks
|
||||
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: qualityRow.sliderMarginRight
|
||||
anchors.rightMargin: qualityModel.qualitySliderMarginRight
|
||||
|
||||
style: SliderStyle
|
||||
{
|
||||
//Draw Available line
|
||||
groove: Rectangle {
|
||||
implicitHeight: 2
|
||||
anchors.verticalCenter: qualityRowSlider.verticalCenter
|
||||
anchors.verticalCenter: qualitySlider.verticalCenter
|
||||
color: UM.Theme.getColor("quality_slider_available")
|
||||
radius: 1
|
||||
}
|
||||
handle: Item {
|
||||
Rectangle {
|
||||
id: qualityhandleButton
|
||||
anchors.verticalCenter: qualityRowSlider.verticalCenter
|
||||
anchors.verticalCenter: qualitySlider.verticalCenter
|
||||
anchors.centerIn: parent
|
||||
color: control.enabled ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable")
|
||||
implicitWidth: 10
|
||||
@ -264,7 +265,7 @@ Item
|
||||
if(Cura.MachineManager.activeMachine != null)
|
||||
{
|
||||
//Prevent updating during view initializing. Trigger only if the value changed by user
|
||||
if(qualityRowSlider.value != qualityRow.qualitySliderSelectedValue)
|
||||
if(qualitySlider.value != qualityModel.activeQualityId)
|
||||
{
|
||||
//start updating with short delay
|
||||
qualitySliderChangeTimer.start();
|
||||
@ -521,7 +522,7 @@ Item
|
||||
Text {
|
||||
id: gradualInfillLabel
|
||||
anchors.left: enableGradualInfillCheckBox.right
|
||||
anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width / 2 // FIXME better margin value
|
||||
anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width / 2
|
||||
text: catalog.i18nc("@label", "Enable gradual")
|
||||
font: UM.Theme.getFont("default")
|
||||
color: UM.Theme.getColor("text")
|
||||
|
Loading…
x
Reference in New Issue
Block a user