CURA-4182 refactor quality slider to use model for updating

This commit is contained in:
ChrisTerBeke 2017-09-22 11:04:46 +02:00
parent ab8bcc4ae3
commit 7f909df84a

View File

@ -40,109 +40,110 @@ Item
// //
// Quality profile // Quality profile
// //
Rectangle Item
{ {
id: qualityRow
Timer { 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 id: qualitySliderChangeTimer
interval: 50 interval: 50
running: false running: false
repeat: false repeat: false
onTriggered: Cura.MachineManager.setActiveQuality(Cura.ProfilesModel.getItem(qualityRowSlider.value).id) onTriggered: Cura.MachineManager.setActiveQuality(Cura.ProfilesModel.getItem(qualitySlider.value).id)
} }
Component.onCompleted: Component.onCompleted: qualityModel.update()
{
qualityRow.updateQualitySliderProperties()
}
Connections Connections
{ {
target: Cura.MachineManager target: Cura.MachineManager
onActiveQualityChanged: onActiveQualityChanged: qualityModel.update()
}
ListModel
{ {
qualityRow.updateQualitySliderProperties() id: qualityModel
}
}
id: qualityRow
property var totalTicks: 0 property var totalTicks: 0
property var availableTotalTicks: 0 property var availableTotalTicks: 0
property var qualitySliderStep: qualityRow.totalTicks != 0 ? (base.width * 0.55) / (qualityRow.totalTicks) : 0 property var qualitySliderStepWidth: qualityModel.totalTicks != 0 ? (base.width * 0.55) / (qualityModel.totalTicks) : 0
property var qualitySliderSelectedValue: 0 property var activeQualityId: 0
property var sliderAvailableMin : 0 property var sliderAvailableMin : 0
property var sliderAvailableMax : 0 property var sliderAvailableMax : 0
property var sliderMarginRight : 0 property var sliderMarginRight : 0
function updateQualitySliderProperties() function update () {
{ qualityModel.clear()
qualityRow.totalTicks = Cura.ProfilesModel.rowCount() - 1 // minus one, because slider starts from 0
qualityModel.totalTicks = Cura.ProfilesModel.rowCount() - 1 // minus one, because slider starts from 0
var availableMin = -1 var availableMin = -1
var availableMax = -1 var availableMax = -1
for (var i = 0; i <= Cura.ProfilesModel.rowCount(); i++) for (var i = 0; i <= Cura.ProfilesModel.rowCount(); i++) {
{ var qualityItem = Cura.ProfilesModel.getItem(i)
//Find slider range, min and max value
if (availableMin == -1 && Cura.ProfilesModel.getItem(i).available) // Add each quality item to the UI quality model
{ qualityModel.append(qualityItem)
// Find slider range, min and max value
if (qualityItem.available && availableMin == -1) {
availableMin = i availableMin = i
availableMax = i availableMax = i
} } else if (qualityItem.available) {
else if(Cura.ProfilesModel.getItem(i).available)
{
availableMax = i availableMax = i
} }
//Find selected value // Find selected value
if(Cura.MachineManager.activeQualityId == Cura.ProfilesModel.getItem(i).id) if(Cura.MachineManager.activeQualityId == qualityItem.id) {
{ qualityModel.activeQualityId = i
qualitySliderSelectedValue = i
} }
} }
if(availableMin !=-1) if (availableMin != -1) {
{ qualityModel.availableTotalTicks = availableMax - availableMin
availableTotalTicks = availableMax - availableMin } else {
} qualityModel.availableTotalTicks = -1
else
{
availableTotalTicks = -1
} }
qualitySliderStep = qualityRow.totalTicks != 0 ? (base.width * 0.55) / (qualityRow.totalTicks) : 0 calculateSliderStepWidth(qualityModel.totalTicks)
calculateSliderMargins(availableMin, availableMax)
qualityModel.sliderAvailableMin = availableMin
qualityModel.sliderAvailableMax = availableMax
}
function calculateSliderStepWidth (totalTicks) {
qualityModel.qualitySliderStepWidth = totalTicks != 0 ? (base.width * 0.55) / (totalTicks) : 0
}
function calculateSliderMargins (availableMin, availableMax) {
if(availableMin == -1) if(availableMin == -1)
{ {
sliderMarginRight = base.width * 0.55 qualityModel.sliderMarginRight = base.width * 0.55
} }
else if (availableMin == 0 && availableMax == 0) else if (availableMin == 0 && availableMax == 0)
{ {
sliderMarginRight = base.width * 0.55 qualityModel.sliderMarginRight = base.width * 0.55
} }
else if(availableMin == availableMax) else if(availableMin == availableMax)
{ {
sliderMarginRight = (qualityRow.totalTicks - availableMin) * qualitySliderStep qualityModel.sliderMarginRight = (qualityModel.totalTicks - availableMin) * qualitySliderStepWidth
} }
else if(availableMin != availableMax) else if(availableMin != availableMax)
{ {
sliderMarginRight = (qualityRow.totalTicks - availableMax) * qualitySliderStep qualityModel.sliderMarginRight = (qualityModel.totalTicks - availableMax) * qualitySliderStepWidth
}
} }
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
Text Text
{ {
@ -159,7 +160,8 @@ Item
anchors.left: speedSlider.left anchors.left: speedSlider.left
Repeater Repeater
{ {
model: qualityRow.totalTicks + 1 model: qualityModel
Text Text
{ {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
@ -167,15 +169,8 @@ Item
anchors.topMargin: UM.Theme.getSize("sidebar_margin").height / 2 anchors.topMargin: UM.Theme.getSize("sidebar_margin").height / 2
color: UM.Theme.getColor("text") color: UM.Theme.getColor("text")
text: Cura.ProfilesModel.getItem(index).layer_height_without_unit text: Cura.ProfilesModel.getItem(index).layer_height_without_unit
width: 1 width: 1
x: x: (index != qualityModel.totalTicks) ? (base.width * 0.55 / qualityModel.totalTicks) * index : (base.width * 0.55 / qualityModel.totalTicks) * index - 15
{
if(index != qualityRow.totalTicks)
return (base.width * 0.55 / qualityRow.totalTicks) * index;
else
return (base.width * 0.55 / qualityRow.totalTicks) * index - 15;
}
} }
} }
} }
@ -197,8 +192,7 @@ Item
width: base.width * 0.55 width: base.width * 0.55
height: 2 height: 2
color: UM.Theme.getColor("quality_slider_unavailable") color: UM.Theme.getColor("quality_slider_unavailable")
//radius: parent.radius anchors.verticalCenter: qualitySlider.verticalCenter
anchors.verticalCenter: qualityRowSlider.verticalCenter
x: 0 x: 0
} }
@ -206,51 +200,52 @@ Item
Repeater Repeater
{ {
id: qualityRepeater id: qualityRepeater
model: qualityRow.totalTicks + 1 model: qualityModel
Rectangle {
Rectangle
{
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: qualityRow.availableTotalTicks != 0 ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable") color: qualityModel.count > 1 ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable")
width: 1 width: 1
height: 6 height: 6
y: 0 y: 0
x: qualityRow.qualitySliderStep * index x: qualityModel.qualitySliderStepWidth * index
} }
} }
Slider Slider
{ {
id: qualitySlider
id: qualityRowSlider
height: UM.Theme.getSize("sidebar_margin").height height: UM.Theme.getSize("sidebar_margin").height
anchors.bottom: speedSlider.bottom anchors.bottom: speedSlider.bottom
enabled: qualityRow.availableTotalTicks != 0 enabled: qualityModel.availableTotalTicks > 0
updateValueWhileDragging : false updateValueWhileDragging : false
minimumValue: qualityRow.sliderAvailableMin minimumValue: qualityModel.sliderAvailableMin
maximumValue: qualityRow.sliderAvailableMax maximumValue: qualityModel.sliderAvailableMax
stepSize: 1 stepSize: 1
value: qualityRow.qualitySliderSelectedValue value: qualityModel.activeQualityId
width: qualityRow.qualitySliderStep * (qualityRow.availableTotalTicks) width: qualityModel.qualitySliderStepWidth * qualityModel.availableTotalTicks
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: qualityRow.sliderMarginRight anchors.rightMargin: qualityModel.sliderMarginRight
style: SliderStyle style: SliderStyle
{ {
//Draw Available line //Draw Available line
groove: Rectangle { groove: Rectangle {
implicitHeight: 2 implicitHeight: 2
anchors.verticalCenter: qualityRowSlider.verticalCenter anchors.verticalCenter: qualitySlider.verticalCenter
color: UM.Theme.getColor("quality_slider_available") color: UM.Theme.getColor("quality_slider_available")
radius: 1 radius: 1
} }
handle: Item { handle: Item {
Rectangle { Rectangle {
id: qualityhandleButton id: qualityhandleButton
anchors.verticalCenter: qualityRowSlider.verticalCenter anchors.verticalCenter: qualitySlider.verticalCenter
anchors.centerIn: parent anchors.centerIn: parent
color: control.enabled ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable") color: control.enabled ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable")
implicitWidth: 10 implicitWidth: 10
@ -261,12 +256,9 @@ Item
} }
onValueChanged: { onValueChanged: {
// Prevent updating during view initializing. Trigger only if the value changed by user
//Prevent updating during view initializing. Trigger only if the value changed by user if (qualitySlider.value != qualityModel.activeQualityId) {
if(qualityRowSlider.value != qualityRow.qualitySliderSelectedValue) qualitySliderChangeTimer.start()
{
//start updating with short delay
qualitySliderChangeTimer.start();
} }
} }
} }
@ -519,7 +511,7 @@ Item
Text { Text {
id: gradualInfillLabel id: gradualInfillLabel
anchors.left: enableGradualInfillCheckBox.right 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") text: catalog.i18nc("@label", "Enable gradual")
font: UM.Theme.getFont("default") font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text") color: UM.Theme.getColor("text")