Per Object Settings qml for icon buttons

This commit is contained in:
Nino van Hooff 2019-09-06 16:08:57 +02:00
parent 3052438177
commit 760234f69b

View file

@ -4,22 +4,67 @@
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2 import QtQuick.Controls.Styles 1.2
import QtQuick.Window 2.2
import UM 1.2 as UM import UM 1.2 as UM
import Cura 1.0 as Cura import Cura 1.0 as Cura
import ".." import ".."
Item {
id: base;
UM.I18nCatalog { id: catalog; name: "cura"; } Item
{
width: childrenRect.width; id: base
height: childrenRect.height; width: childrenRect.width
height: childrenRect.height
property var all_categories_except_support: [ "machine_settings", "resolution", "shell", "infill", "material", "speed", property var all_categories_except_support: [ "machine_settings", "resolution", "shell", "infill", "material", "speed",
"travel", "cooling", "platform_adhesion", "dual", "meshfix", "blackmagic", "experimental"] "travel", "cooling", "platform_adhesion", "dual", "meshfix", "blackmagic", "experimental"]
readonly property var normal_mesh_type: ""
readonly property var support_mesh_type: "support_mesh"
readonly property var cutting_mesh_type: "cutting_mesh"
readonly property var infill_mesh_type: "infill_mesh"
readonly property var anti_overhang_mesh_type: "anti_overhang_mesh"
property var current_mesh_type: normal_mesh_type
function setOverhangsMeshType(){
if(infillOnlyCheckbox.checked)
{
setMeshType(infill_mesh_type)
}
else
{
setMeshType(cutting_mesh_type)
}
}
function setMeshType(type) {
current_mesh_type = type
// update the active object
if(UM.ActiveTool.properties.getValue("MeshType") !== type)
{
UM.ActiveTool.setProperty("MeshType", type)
}
// set checked state of mesh type buttons
normalButton.checked = current_mesh_type === normal_mesh_type
supportMeshButton.checked = current_mesh_type === support_mesh_type
overhangMeshButton.checked = current_mesh_type === infill_mesh_type || current_mesh_type === cutting_mesh_type
antiOverhangMeshButton.checked = current_mesh_type === anti_overhang_mesh_type
// update active type label
for (var button in meshTypeButtons.children)
{
if(meshTypeButtons.children[button].checked){
meshTypeLabel.text = catalog.i18nc("@label","Mesh Type") + ": " + meshTypeButtons.children[button].text
break
}
}
}
UM.I18nCatalog { id: catalog; name: "uranium"}
Column Column
{ {
id: items id: items
@ -28,123 +73,154 @@ Item {
spacing: UM.Theme.getSize("default_margin").height spacing: UM.Theme.getSize("default_margin").height
Row Component.onCompleted: setMeshType(UM.ActiveTool.properties.getValue("MeshType"))
Row // Mesh type buttons
{
id: meshTypeButtons
spacing: UM.Theme.getSize("default_margin").width
Button
{
id: normalButton
text: catalog.i18nc("@label", "Normal model")
iconSource: UM.Theme.getIcon("pos_normal");
property bool needBorder: true
checkable: true
onClicked: base.setMeshType(normal_mesh_type);
style: UM.Theme.styles.tool_button;
z: 4
}
Button
{
id: supportMeshButton
text: catalog.i18nc("@label", "Print as support")
iconSource: UM.Theme.getIcon("pos_print_as_support");
property bool needBorder: true
checkable:true
onClicked: base.setMeshType(support_mesh_type)
style: UM.Theme.styles.tool_button;
z: 3
}
Button
{
id: overhangMeshButton
text: catalog.i18nc("@label", "Modify settings for overlays")
iconSource: UM.Theme.getIcon("pos_modify_overlaps");
property bool needBorder: true
checkable:true
onClicked: base.setMeshType(infill_mesh_type)
style: UM.Theme.styles.tool_button;
z: 2
}
Button
{
id: antiOverhangMeshButton
text: catalog.i18nc("@label", "Don't support overlaps")
iconSource: UM.Theme.getIcon("pos_modify_dont_support_overlap");
property bool needBorder: true
checkable: true
onClicked: base.setMeshType(anti_overhang_mesh_type)
style: UM.Theme.styles.tool_button;
z: 1
}
}
Row // Selected mesh type label
{ {
spacing: UM.Theme.getSize("default_margin").width spacing: UM.Theme.getSize("default_margin").width
Label Label
{ {
text: catalog.i18nc("@label","Mesh Type") id: meshTypeLabel
font: UM.Theme.getFont("default") font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text") color: UM.Theme.getColor("text")
height: UM.Theme.getSize("setting").height height: UM.Theme.getSize("setting").height
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
} }
UM.SettingPropertyProvider
{
id: meshTypePropertyProvider
containerStack: Cura.MachineManager.activeMachine
watchedProperties: [ "enabled" ]
} }
ComboBox Row // Infill-only checkbox (visible for overhang mesh button)
{ {
id: meshTypeSelection spacing: UM.Theme.getSize("default_margin").width
style: UM.Theme.styles.combobox
onActivated: {
UM.ActiveTool.setProperty("MeshType", model.get(index).type)
}
model: ListModel
{
id: meshTypeModel
Component.onCompleted: meshTypeSelection.populateModel()
}
function populateModel()
{
meshTypeModel.append({
type: "",
text: catalog.i18nc("@label", "Normal model")
});
meshTypePropertyProvider.key = "support_mesh";
if(meshTypePropertyProvider.properties.enabled == "True")
{
meshTypeModel.append({
type: "support_mesh",
text: catalog.i18nc("@label", "Print as support")
});
}
meshTypePropertyProvider.key = "anti_overhang_mesh";
if(meshTypePropertyProvider.properties.enabled == "True")
{
meshTypeModel.append({
type: "anti_overhang_mesh",
text: catalog.i18nc("@label", "Don't support overlap with other models")
});
}
meshTypePropertyProvider.key = "cutting_mesh";
if(meshTypePropertyProvider.properties.enabled == "True")
{
meshTypeModel.append({
type: "cutting_mesh",
text: catalog.i18nc("@label", "Modify settings for overlap with other models")
});
}
meshTypePropertyProvider.key = "infill_mesh";
if(meshTypePropertyProvider.properties.enabled == "True")
{
meshTypeModel.append({
type: "infill_mesh",
text: catalog.i18nc("@label", "Modify settings for infill of other models")
});
}
meshTypeSelection.updateCurrentIndex(); CheckBox
} {
id: infillOnlyCheckbox
function updateCurrentIndex() text: catalog.i18nc("@action:checkbox","Infill only");
{
var mesh_type = UM.ActiveTool.properties.getValue("MeshType"); style: UM.Theme.styles.checkbox;
meshTypeSelection.currentIndex = -1;
for(var index=0; index < meshTypeSelection.model.count; index++) checked: base.current_mesh_type === base.infill_mesh_type
{ onClicked: base.setOverhangsMeshType()
if(meshTypeSelection.model.get(index).type == mesh_type)
{
meshTypeSelection.currentIndex = index;
return;
}
}
meshTypeSelection.currentIndex = 0;
} }
} }
Connections Row
{ {
target: Cura.MachineManager spacing: UM.Theme.getSize("default_margin").width
onGlobalContainerChanged:
Button
{ {
meshTypeSelection.model.clear(); id: customiseSettingsButton;
meshTypeSelection.populateModel(); height: UM.Theme.getSize("setting_control").height;
visible: currentSettings.visible
text: catalog.i18nc("@action:button", "Select settings");
style: ButtonStyle
{
background: Rectangle
{
width: control.width;
height: control.height;
border.width: UM.Theme.getSize("default_lining").width;
border.color: control.pressed ? UM.Theme.getColor("action_button_active_border") :
control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border")
color: control.pressed ? UM.Theme.getColor("action_button_active") :
control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
}
label: Label
{
text: control.text;
color: UM.Theme.getColor("setting_control_text");
font: UM.Theme.getFont("default")
anchors.centerIn: parent
} }
} }
Connections onClicked:
{ {
target: UM.Selection settingPickDialog.visible = true;
onSelectionChanged: meshTypeSelection.updateCurrentIndex() if (meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh")
{
settingPickDialog.additional_excluded_settings = base.all_categories_except_support;
}
else
{
settingPickDialog.additional_excluded_settings = []
}
}
}
} }
} }
Column Column // Settings Dialog
{ {
// This is to ensure that the panel is first increasing in size up to 200 and then shows a scrollbar. // This is to ensure that the panel is first increasing in size up to 200 and then shows a scrollbar.
// It kinda looks ugly otherwise (big panel, no content on it) // It kinda looks ugly otherwise (big panel, no content on it)
id: currentSettings id: currentSettings
property int maximumHeight: 200 * screenScaleFactor property int maximumHeight: 200 * screenScaleFactor
height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("default_lining").height), maximumHeight) height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("default_lining").height), maximumHeight)
visible: meshTypeSelection.model.get(meshTypeSelection.currentIndex).type != "anti_overhang_mesh" visible: current_mesh_type != "anti_overhang_mesh"
ScrollView ScrollView
{ {
@ -174,7 +250,7 @@ Item {
{ {
var excluded_settings = [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ]; var excluded_settings = [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ];
if(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh") if(current_mesh_type == "support_mesh")
{ {
excluded_settings = excluded_settings.concat(base.all_categories_except_support); excluded_settings = excluded_settings.concat(base.all_categories_except_support);
} }
@ -337,52 +413,8 @@ Item {
} }
} }
Button UM.Dialog
{ {
id: customiseSettingsButton;
height: UM.Theme.getSize("setting_control").height;
visible: currentSettings.visible
text: catalog.i18nc("@action:button", "Select settings");
style: ButtonStyle
{
background: Rectangle
{
width: control.width;
height: control.height;
border.width: UM.Theme.getSize("default_lining").width;
border.color: control.pressed ? UM.Theme.getColor("action_button_active_border") :
control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border")
color: control.pressed ? UM.Theme.getColor("action_button_active") :
control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
}
label: Label
{
text: control.text;
color: UM.Theme.getColor("setting_control_text");
font: UM.Theme.getFont("default")
anchors.centerIn: parent
}
}
onClicked:
{
settingPickDialog.visible = true;
if (meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh")
{
settingPickDialog.additional_excluded_settings = base.all_categories_except_support;
}
else
{
settingPickDialog.additional_excluded_settings = []
}
}
}
}
UM.Dialog {
id: settingPickDialog id: settingPickDialog
title: catalog.i18nc("@title:window", "Select Settings to Customize for this model") title: catalog.i18nc("@title:window", "Select Settings to Customize for this model")
@ -583,4 +615,5 @@ Item {
Cura.SettingUnknown { } Cura.SettingUnknown { }
} }
} }