Merge branch '3.0' of github.com:Ultimaker/Cura into 3.0

Contributes to issue CURA-4357.
This commit is contained in:
Ghostkeeper 2017-09-22 12:58:20 +02:00
commit 2020e355a2
No known key found for this signature in database
GPG Key ID: C5F96EE2BC0F7E75
2 changed files with 132 additions and 143 deletions

View File

@ -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)

View File

@ -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")