diff options
author | Casper Lamboo <c.lamboo@ultimaker.com> | 2022-06-15 19:24:18 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-15 19:24:18 +0300 |
commit | dd76369b9aa062267e323d4e774c59318127cb45 (patch) | |
tree | aca70f2f438f8897266f60e2da6f53c2f9887d9c /resources/qml | |
parent | cd3429491405fa8f3e1e02fb7b62015ac267fba2 (diff) | |
parent | f9dda4040984f14766fc1e8f0cd15a7f1a6b8da4 (diff) |
Merge pull request #12528 from Ultimaker/CURA-8849
[CURA-8849] Improve intent profile selection
Diffstat (limited to 'resources/qml')
8 files changed, 455 insertions, 166 deletions
diff --git a/resources/qml/IconWithText.qml b/resources/qml/IconWithText.qml index cc0834d7ea..24f211ae17 100644 --- a/resources/qml/IconWithText.qml +++ b/resources/qml/IconWithText.qml @@ -22,6 +22,7 @@ Item property alias elide: label.elide property real margin: UM.Theme.getSize("narrow_margin").width property alias wrapMode: label.wrapMode + property real spacing: UM.Theme.getSize("narrow_margin").width // These properties can be used in combination with layouts. readonly property real contentWidth: icon.width + margin + label.contentWidth @@ -61,6 +62,7 @@ Item top: parent.top bottom: parent.bottom rightMargin: 0 + leftMargin: spacing margins: margin } } diff --git a/resources/qml/PrintSetupSelector/Recommended/ProfileWarningReset.qml b/resources/qml/PrintSetupSelector/Recommended/ProfileWarningReset.qml new file mode 100644 index 0000000000..c9abcab1c8 --- /dev/null +++ b/resources/qml/PrintSetupSelector/Recommended/ProfileWarningReset.qml @@ -0,0 +1,108 @@ +import QtQuick 2.10 + +import UM 1.6 as UM +import Cura 1.6 as Cura + +Rectangle +{ + height: visible ? UM.Theme.getSize("action_button_icon").height : 0 + visible: Cura.SimpleModeSettingsManager.isProfileCustomized || Cura.MachineManager.hasCustomQuality + anchors.topMargin: UM.Theme.getSize("default_margin") + anchors.bottomMargin: UM.Theme.getSize("default_margin") + + + Rectangle + { + id: warningIcon + color: UM.Theme.getColor("um_yellow_5") + height: UM.Theme.getSize("action_button_icon").height + width: height + radius: width + anchors + { + left: parent.left + verticalCenter: parent.verticalCenter + } + UM.ColorImage + { + height: UM.Theme.getSize("action_button_icon").height + width: height + source: UM.Theme.getIcon("Warning", "low") + } + } + + UM.Label + { + id: warning + anchors + { + left: warningIcon.right + verticalCenter: parent.verticalCenter + leftMargin: UM.Theme.getSize("thin_margin").width + } + + text: "" + + states: [ + State + { + name: "settings changed and custom quality" + when: Cura.SimpleModeSettingsManager.isProfileCustomized && Cura.MachineManager.hasCustomQuality + PropertyChanges + { + target: warning + text: { + var profile_name = Cura.MachineManager.activeQualityChangesGroup.name + return "<b>%1</b> %2".arg(profile_name).arg(catalog.i18nc("@info", "custom profile is active and you overwrote some settings.")) + } + } + + }, + State + { + name: "custom quality" + when: Cura.MachineManager.hasCustomQuality + PropertyChanges + { + target: warning + text: { + var profile_name = Cura.MachineManager.activeQualityChangesGroup.name + return "<b>%1</b> %2".arg(profile_name).arg(catalog.i18nc("@info", "custom profile is overriding some settings.")) + } + } + }, + State + { + name: "settings changed" + when: Cura.SimpleModeSettingsManager.isProfileCustomized + PropertyChanges + { + target: warning + text: catalog.i18nc("@info", "Some settings were changed.") + } + } + ] + + } + + UM.SimpleButton + { + id: resetToDefaultQualityButton + height: UM.Theme.getSize("action_button_icon").height + width: height + iconSource: UM.Theme.getIcon("ArrowReset") + anchors + { + right: parent.right + verticalCenter: parent.verticalCenter + } + + color: UM.Theme.getColor("accent_1") + + onClicked: + { + Cura.MachineManager.resetToUseDefaultQuality() + } + } + +}
\ No newline at end of file diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml index de8cce6e94..aac8dcecfb 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml @@ -1,10 +1,11 @@ -// Copyright (c) 2018 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. +//Copyright (c) 2022 Ultimaker B.V. +//Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.10 +import QtQuick.Layouts 1.1 -import UM 1.2 as UM -import Cura 1.0 as Cura +import UM 1.6 as UM +import Cura 1.6 as Cura Item { @@ -13,11 +14,11 @@ Item height: childrenRect.height + 2 * padding property bool settingsEnabled: Cura.ExtruderManager.activeExtruderStackId || extrudersEnabledCount.properties.value == 1 - property real padding: UM.Theme.getSize("thick_margin").width + property real padding: UM.Theme.getSize("default_margin").width - Column + ColumnLayout { - spacing: UM.Theme.getSize("wide_margin").height + spacing: UM.Theme.getSize("default_margin").height anchors { @@ -30,11 +31,53 @@ Item // TODO property real firstColumnWidth: Math.round(width / 3) + UM.Label + { + text: catalog.i18nc("@label", "Profiles") + font: UM.Theme.getFont("medium") + } + RecommendedQualityProfileSelector { width: parent.width - // TODO Create a reusable component with these properties to not define them separately for each component - labelColumnWidth: parent.firstColumnWidth + visible: recommendedResolutionSelector.visible + } + + RecommendedResolutionSelector + { + id: recommendedResolutionSelector + Layout.fillWidth: true + width: parent.width + } + + UnsupportedProfileIndication + { + width: parent.width + visible: !recommendedResolutionSelector.visible + } + + + ProfileWarningReset + { + width: parent.width + Layout.fillWidth: true + } + + //Line between the sections. + Rectangle + { + width: parent.width + height: UM.Theme.getSize("default_lining").height + Layout.topMargin: UM.Theme.getSize("narrow_margin").height + Layout.bottomMargin: UM.Theme.getSize("narrow_margin").height + Layout.fillWidth: true + color: UM.Theme.getColor("lining") + } + + UM.Label + { + text: catalog.i18nc("@label", "Print settings") + font: UM.Theme.getFont("medium") } RecommendedInfillDensitySelector @@ -42,6 +85,9 @@ Item width: parent.width // TODO Create a reusable component with these properties to not define them separately for each component labelColumnWidth: parent.firstColumnWidth + Layout.fillWidth: true + Layout.leftMargin: UM.Theme.getSize("default_margin").width + Layout.rightMargin: UM.Theme.getSize("default_margin").width } RecommendedSupportSelector @@ -49,6 +95,7 @@ Item width: parent.width // TODO Create a reusable component with these properties to not define them separately for each component labelColumnWidth: parent.firstColumnWidth + Layout.leftMargin: UM.Theme.getSize("default_margin").width } RecommendedAdhesionSelector @@ -56,6 +103,7 @@ Item width: parent.width // TODO Create a reusable component with these properties to not define them separately for each component labelColumnWidth: parent.firstColumnWidth + Layout.leftMargin: UM.Theme.getSize("default_margin").width } } diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml index 3d0077abb0..6bcca955d1 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml @@ -3,180 +3,46 @@ import QtQuick 2.10 import QtQuick.Controls 2.3 +import QtQuick.Layouts 2.10 import UM 1.5 as UM -import Cura 1.6 as Cura +import Cura 1.7 as Cura import ".." Item { id: qualityRow height: childrenRect.height + visible: intentSelectionRepeater.count > 1 //Only show selector if there's more options than just "default". - property real labelColumnWidth: Math.round(width / 3) - property real settingsColumnWidth: width - labelColumnWidth - - // Here are the elements that are shown in the left column - - Column + RowLayout { - anchors - { - left: parent.left - right: parent.right - } - - spacing: UM.Theme.getSize("default_margin").height - - ButtonGroup - { - id: activeProfileButtonGroup - exclusive: true - onClicked: Cura.IntentManager.selectIntent(button.modelData.intent_category, button.modelData.quality_type) - } - - Item - { - height: childrenRect.height - anchors - { - left: parent.left - right: parent.right - } - Cura.IconWithText - { - id: profileLabel - source: UM.Theme.getIcon("PrintQuality") - text: catalog.i18nc("@label", "Profiles") - font: UM.Theme.getFont("medium") - width: labelColumnWidth - iconSize: UM.Theme.getSize("medium_button_icon").width - } - UM.SimpleButton - { - id: resetToDefaultQualityButton - - visible: Cura.SimpleModeSettingsManager.isProfileCustomized || Cura.MachineManager.hasCustomQuality - height: visible ? UM.Theme.getSize("print_setup_icon").height : 0 - width: height - anchors - { - right: profileLabel.right - rightMargin: UM.Theme.getSize("default_margin").width - leftMargin: UM.Theme.getSize("default_margin").width - verticalCenter: parent.verticalCenter - } - - color: hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button") - iconSource: UM.Theme.getIcon("ArrowReset") - - onClicked: - { - // if the current profile is user-created, switch to a built-in quality - Cura.MachineManager.resetToUseDefaultQuality() - } - onEntered: - { - var tooltipContent = catalog.i18nc("@tooltip","You have modified some profile settings. If you want to change these go to custom mode.") - base.showTooltip(qualityRow, Qt.point(-UM.Theme.getSize("thick_margin").width, 0), tooltipContent) - } - onExited: base.hideTooltip() - } - - Cura.LabelBar - { - id: labelbar - anchors - { - left: profileLabel.right - right: parent.right - verticalCenter: profileLabel.verticalCenter - } - - model: Cura.QualityProfilesDropDownMenuModel - modelKey: "layer_height" - } - } - + id: intentRow + width: parent.width Repeater { - model: Cura.IntentCategoryModel {} - Item - { - anchors - { - left: parent.left - right: parent.right - } - height: intentCategoryLabel.height - - UM.Label - { - id: intentCategoryLabel - text: model.name - width: labelColumnWidth - UM.Theme.getSize("section_icon").width - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("section_icon").width + UM.Theme.getSize("narrow_margin").width - font: UM.Theme.getFont("medium") - elide: Text.ElideRight - } + id: intentSelectionRepeater + model: Cura.IntentSelectionModel {} - Cura.RadioCheckbar - { - anchors - { - left: intentCategoryLabel.right - right: parent.right - } - dataModel: model["qualities"] - buttonGroup: activeProfileButtonGroup - - function checkedFunction(modelItem) - { - if(Cura.MachineManager.hasCustomQuality) - { - // When user created profile is active, no quality tickbox should be active. - return false - } - - if(modelItem === null) - { - return false - } - return Cura.MachineManager.activeQualityType == modelItem.quality_type && Cura.MachineManager.activeIntentCategory == modelItem.intent_category - } - - isCheckedFunction: checkedFunction - } + RecommendedQualityProfileSelectorButton + { + profileName: model.name + icon: model.icon - MouseArea // Intent description tooltip hover area - { - id: intentDescriptionHoverArea - anchors.fill: parent - hoverEnabled: true - enabled: model.description !== undefined - acceptedButtons: Qt.NoButton // react to hover only, don't steal clicks - Timer - { - id: intentTooltipTimer - interval: 500 - running: false - repeat: false - onTriggered: base.showTooltip( - intentCategoryLabel, - Qt.point(-(intentCategoryLabel.x - qualityRow.x) - UM.Theme.getSize("thick_margin").width, 0), - model.description - ) - } + selected: Cura.MachineManager.activeIntentCategory == model.intent_category - onEntered: intentTooltipTimer.start() - onExited: + onClicked: { + var qualityType + if (Cura.MachineManager.intentCategoryHasQuality(model.intent_category, Cura.MachineManager.activeQualityType)) { - base.hideTooltip() - intentTooltipTimer.stop() + qualityType = Cura.MachineManager.activeQualityType + } else { + qualityType = Cura.MachineManager.getDefaultQualityTypeForIntent(model.intent_category) + print(Cura.MachineManager.getDefaultQualityTypeForIntent(model.intent_category)) } + Cura.IntentManager.selectIntent(model.intent_category, qualityType) } } } diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelectorButton.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelectorButton.qml new file mode 100644 index 0000000000..6804e7e5ba --- /dev/null +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelectorButton.qml @@ -0,0 +1,93 @@ +// Copyright (c) 2022 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.10 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 2.10 + +import UM 1.5 as UM +import Cura 1.7 as Cura + + +Rectangle +{ + id: base + height: 60 + Layout.fillWidth: true + color: mouseArea.containsMouse || selected ? UM.Theme.getColor("background_3") : UM.Theme.getColor("background_1") + + property bool selected: false + property string profileName: "" + property string icon: "" + + signal clicked() + + MouseArea + { + id: mouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: base.clicked() + } + + Item + { + width: intentIcon.width + anchors + { + top: parent.top + bottom: qualityLabel.top + horizontalCenter: parent.horizontalCenter + topMargin: UM.Theme.getSize("narrow_margin").height + } + + Item + { + id: intentIcon + width: UM.Theme.getSize("recommended_button_icon").width + height: UM.Theme.getSize("recommended_button_icon").height + UM.ColorImage + { + anchors.fill: parent + anchors.centerIn: parent + visible: icon != "" + source: UM.Theme.getIcon(icon) + color: UM.Theme.getColor("icon") + } + + Rectangle + { + id: circle + anchors.fill: parent + radius: width + anchors.verticalCenter: parent.verticalCenter + visible: icon == "" + border.width: UM.Theme.getSize("thick_lining").width + border.color: UM.Theme.getColor("text") + + UM.Label + { + id: initialLabel + anchors.centerIn: parent + text: profileName.charAt(0).toUpperCase() + font: UM.Theme.getFont("small_bold") + horizontalAlignment: Text.AlignHCenter + } + } + + + } + } + + UM.Label + { + id: qualityLabel + text: profileName + anchors + { + bottom: parent.bottom + horizontalCenter: parent.horizontalCenter + bottomMargin: UM.Theme.getSize("narrow_margin").height + } + } +}
\ No newline at end of file diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedResolutionSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedResolutionSelector.qml new file mode 100644 index 0000000000..6217cfe1cc --- /dev/null +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedResolutionSelector.qml @@ -0,0 +1,84 @@ +// Copyright (c) 2022 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.10 + +import UM 1.6 as UM +import Cura 1.7 as Cura + +Item +{ + id: recommendedResolutionSelector + height: childrenRect.height + + property real labelColumnWidth: Math.round(width / 3) + property string _previousResolution: "" //Internal variable to detect changes. + Component.onCompleted: _previousResolution = Cura.MachineManager.activeQualityType; + + visible: visibilityPreset.count > 0 //Only show if there are quality types to select from. + + Cura.IconWithText + { + id: resolutionTitle + anchors.top: parent.top + anchors.left: parent.left + source: UM.Theme.getIcon("PrintQuality") + text: catalog.i18nc("@label", "Resolution") + width: labelColumnWidth + height: parent.height + spacing: UM.Theme.getSize("thick_margin").width + iconSize: UM.Theme.getSize("medium_button_icon").width + } + + Cura.ComboBox + { + id: visibilityPreset + implicitHeight: UM.Theme.getSize("combobox").height + implicitWidth: UM.Theme.getSize("combobox").width + anchors + { + top: parent.top + right: parent.right + } + + textRole: "display_text" + textFormat: Text.StyledText + + model: Cura.ActiveIntentQualitiesModel{} + + currentIndex: + { + var current_quality_type = Cura.MachineManager.activeQualityType + + var index = 0 + for (var i = 0; i < model.count; i++) + { + if (model.getItem(i).quality_type == current_quality_type) + { + index = i + break + } + } + return index + } + + onActivated: + { + var selected_item = model.getItem(currentIndex) + Cura.IntentManager.selectIntent(selected_item.intent_category, selected_item.quality_type) + } + + Connections + { + target: Cura.IntentManager + function onIntentCategoryChanged() + { + if(recommendedResolutionSelector._previousResolution !== Cura.MachineManager.activeQualityType) + { + visibilityPreset.pulse(); + } + recommendedResolutionSelector._previousResolution = Cura.MachineManager.activeQualityType; + } + } + } +}
\ No newline at end of file diff --git a/resources/qml/PrintSetupSelector/Recommended/UnsupportedProfileIndication.qml b/resources/qml/PrintSetupSelector/Recommended/UnsupportedProfileIndication.qml new file mode 100644 index 0000000000..ff12fa9307 --- /dev/null +++ b/resources/qml/PrintSetupSelector/Recommended/UnsupportedProfileIndication.qml @@ -0,0 +1,54 @@ +//Copyright (c) 2022 Ultimaker B.V. +//Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.15 + +import Cura 1.6 as Cura +import UM 1.6 as UM + +//Message showing the user that the configuration they have selected has no profiles. +Column +{ + spacing: UM.Theme.getSize("default_margin").height + + Row + { + width: parent.width + + spacing: UM.Theme.getSize("thin_margin").width + + UM.StatusIcon + { + width: UM.Theme.getSize("notification_icon").width + status: UM.StatusIcon.Status.ERROR + } + + UM.Label + { + width: parent.width + + font: UM.Theme.getFont("default_bold") + text: catalog.i18nc("@error", "Configuration not supported") + } + } + + UM.Label + { + width: parent.width + + text: catalog.i18nc("@message:text %1 is the name the printer uses for 'nozzle'.", "No profiles are available for the selected material/%1 configuration. Please change your configuration." + ).arg(Cura.MachineManager.activeDefinitionVariantsName) + } + + Cura.TertiaryButton + { + anchors.right: parent.right + + text: catalog.i18nc("@button:label", "Learn more") + textFont: UM.Theme.getFont("default") + iconSource: UM.Theme.getIcon("LinkExternal") + isIconOnRightSide: true + + onClicked: Qt.openUrlExternally("https://support.ultimaker.com/hc/en-us/articles/360012909099") + } +}
\ No newline at end of file diff --git a/resources/qml/Widgets/ComboBox.qml b/resources/qml/Widgets/ComboBox.qml index 988b7c3782..77e6c489e9 100644 --- a/resources/qml/Widgets/ComboBox.qml +++ b/resources/qml/Widgets/ComboBox.qml @@ -17,6 +17,8 @@ ComboBox property var defaultTextOnEmptyModel: catalog.i18nc("@label", "No items to select from") // Text displayed in the combobox when the model is empty property var defaultTextOnEmptyIndex: "" // Text displayed in the combobox when the model has items but no item is selected + property alias textFormat: contentLabel.textFormat + enabled: delegateModel.count > 0 onVisibleChanged: { popup.close() } @@ -52,7 +54,34 @@ ComboBox } ] - background: UM.UnderlineBackground{} + background: UM.UnderlineBackground + { + //Rectangle for highlighting when this combobox needs to pulse. + Rectangle + { + anchors.fill: parent + opacity: 0 + color: UM.Theme.getColor("warning") + + SequentialAnimation on opacity + { + id: pulseAnimation + running: false + loops: 1 + alwaysRunToEnd: true + PropertyAnimation + { + to: 1 + duration: 300 + } + PropertyAnimation + { + to: 0 + duration : 2000 + } + } + } + } indicator: UM.ColorImage { @@ -146,7 +175,7 @@ ComboBox anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width text: delegateItem.text - textFormat: Text.PlainText + textFormat: control.textFormat color: UM.Theme.getColor("setting_control_text") elide: Text.ElideRight wrapMode: Text.NoWrap @@ -162,4 +191,9 @@ ComboBox text: delegateLabel.truncated ? delegateItem.text : "" } } + + function pulse() + { + pulseAnimation.restart(); + } } |