Let profiles page use ManagementPage

No idea why it didn't in the first place. This caused a lot of code duplication.

CURA-8949
This commit is contained in:
Jaime van Kessel 2022-02-18 14:20:16 +01:00
parent 742f0b7dbb
commit 9df7ccd5cc

View File

@ -10,35 +10,24 @@ import UM 1.5 as UM
import Cura 1.6 as Cura import Cura 1.6 as Cura
Item UM.ManagementPage
{ {
id: base id: base
property var resetEnabled: false // Keep PreferencesDialog happy
property var extrudersModel: CuraApplication.getExtrudersModel() property var extrudersModel: CuraApplication.getExtrudersModel()
property var qualityManagementModel: CuraApplication.getQualityManagementModel() property var qualityManagementModel: CuraApplication.getQualityManagementModel()
UM.I18nCatalog { id: catalog; name: "cura"; } scrollviewCaption: catalog.i18nc("@label", "Profiles compatible with active printer:") + "<b>" + Cura.MachineManager.activeMachine.name + "</b>"
onHamburgeButtonClicked: menu.popup(content_item, content_item.width - menu.width, hamburger_button.height)
Label
{
id: titleLabel
anchors
{
top: parent.top
left: parent.left
right: parent.right
margins: 5 * screenScaleFactor
}
font.pointSize: 18
text: catalog.i18nc("@title:tab", "Profiles")
}
property var hasCurrentItem: base.currentItem != null property var hasCurrentItem: base.currentItem != null
sectionRole: "section_name"
property var currentItem: property var currentItem:
{ {
var current_index = qualityListView.currentIndex; var current_index = objectList.currentIndex;
return (current_index == -1) ? null : base.qualityManagementModel.getItem(current_index); return (current_index == -1) ? null : base.qualityManagementModel.getItem(current_index);
} }
@ -66,125 +55,29 @@ Item
return isCurrentItemActivated && Cura.MachineManager.hasUserSettings; return isCurrentItemActivated && Cura.MachineManager.hasUserSettings;
} }
Row // Button Row model: qualityManagementModel
buttons: [
Cura.SecondaryButton
{ {
id: buttonRow text: catalog.i18nc("@action:button", "Import")
anchors onClicked:importDialog.open()
{ },
left: parent.left Cura.SecondaryButton
right: parent.right
top: titleLabel.bottom
}
height: childrenRect.height
// Activate button
Button
{
id: activateMenuButton
text: catalog.i18nc("@action:button", "Activate")
icon.name: "list-activate"
enabled: !isCurrentItemActivated && base.currentItem
onClicked:
{
if(base.currentItem.is_read_only)
{
Cura.IntentManager.selectIntent(base.currentItem.intent_category, base.currentItem.quality_type);
}
else
{
Cura.MachineManager.setQualityChangesGroup(base.currentItem.quality_changes_group);
}
}
}
// Create button
Button
{ {
id: createMenuButton id: createMenuButton
text: catalog.i18nc("@label", "Create") text: catalog.i18nc("@action:button", "Create new")
icon.name: "list-add"
enabled: base.canCreateProfile && !Cura.MachineManager.stacksHaveErrors enabled: !Cura.MachineManager.stacksHaveErrors
visible: base.canCreateProfile visible: base.canCreateProfile
onClicked: onClicked:
{ {
createQualityDialog.object = Cura.ContainerManager.makeUniqueName(base.currentItem.name); createQualityDialog.object = Cura.ContainerManager.makeUniqueName(base.currentItem.name)
createQualityDialog.open(); createQualityDialog.open()
createQualityDialog.selectText(); createQualityDialog.selectText()
}
}
// Duplicate button
Button
{
id: duplicateMenuButton
text: catalog.i18nc("@label", "Duplicate")
icon.name: "list-add"
enabled: !base.canCreateProfile
visible: !base.canCreateProfile
onClicked:
{
duplicateQualityDialog.object = Cura.ContainerManager.makeUniqueName(base.currentItem.name);
duplicateQualityDialog.open();
duplicateQualityDialog.selectText();
}
}
// Remove button
Button
{
id: removeMenuButton
text: catalog.i18nc("@action:button", "Remove")
icon.name: "list-remove"
enabled: base.hasCurrentItem && !base.currentItem.is_read_only && !base.isCurrentItemActivated
onClicked:
{
forceActiveFocus();
confirmRemoveQualityDialog.open();
}
}
// Rename button
Button
{
id: renameMenuButton
text: catalog.i18nc("@action:button", "Rename")
icon.name: "edit-rename"
enabled: base.hasCurrentItem && !base.currentItem.is_read_only
onClicked:
{
renameQualityDialog.object = base.currentItem.name;
renameQualityDialog.open();
renameQualityDialog.selectText();
}
}
// Import button
Button
{
id: importMenuButton
text: catalog.i18nc("@action:button", "Import")
icon.name: "document-import"
onClicked:
{
importDialog.open();
}
}
// Export button
Button
{
id: exportMenuButton
text: catalog.i18nc("@action:button", "Export")
icon.name: "document-export"
enabled: base.hasCurrentItem && !base.currentItem.is_read_only
onClicked:
{
exportDialog.open();
}
} }
} }
]
// Click create profile from ... in Profile context menu // Click create profile from ... in Profile context menu
signal createProfile() signal createProfile()
@ -195,24 +88,13 @@ Item
createQualityDialog.selectText(); createQualityDialog.selectText();
} }
// Dialog to request a name when creating a new profile
UM.RenameDialog
{
id: createQualityDialog
title: catalog.i18nc("@title:window", "Create Profile")
object: "<new name>"
explanation: catalog.i18nc("@info", "Please provide a name for this profile.")
onAccepted:
{
base.newQualityNameToSelect = newName; // We want to switch to the new profile once it's created
base.toActivateNewQuality = true;
base.qualityManagementModel.createQualityChanges(newName);
}
}
property string newQualityNameToSelect: "" property string newQualityNameToSelect: ""
property bool toActivateNewQuality: false property bool toActivateNewQuality: false
Item
{
id: content_item
anchors.fill: parent
// This connection makes sure that we will switch to the correct quality after the model gets updated // This connection makes sure that we will switch to the correct quality after the model gets updated
Connections Connections
{ {
@ -248,13 +130,107 @@ Item
} }
} }
} }
qualityListView.currentIndex = newIdx; objectList.currentIndex = newIdx;
// Reset states // Reset states
base.newQualityNameToSelect = ""; base.newQualityNameToSelect = "";
base.toActivateNewQuality = false; base.toActivateNewQuality = false;
} }
} }
UM.MessageDialog
{
id: messageDialog
standardButtons: Dialog.Ok
}
// Dialog to request a name when creating a new profile
UM.RenameDialog
{
id: createQualityDialog
title: catalog.i18nc("@title:window", "Create Profile")
object: "<new name>"
explanation: catalog.i18nc("@info", "Please provide a name for this profile.")
onAccepted:
{
base.newQualityNameToSelect = newName; // We want to switch to the new profile once it's created
base.toActivateNewQuality = true;
base.qualityManagementModel.createQualityChanges(newName);
}
}
Cura.Menu
{
id: menu
Cura.MenuItem
{
text: catalog.i18nc("@action:button", "Activate")
enabled: !isCurrentItemActivated && base.currentItem
onTriggered:
{
if(base.currentItem.is_read_only)
{
Cura.IntentManager.selectIntent(base.currentItem.intent_category, base.currentItem.quality_type)
}
else
{
Cura.MachineManager.setQualityChangesGroup(base.currentItem.quality_changes_group)
}
}
}
Cura.MenuItem
{
text: catalog.i18nc("@action:button", "Remove")
enabled: base.hasCurrentItem && !base.currentItem.is_read_only && !base.isCurrentItemActivated
onTriggered:
{
forceActiveFocus()
confirmRemoveQualityDialog.open()
}
}
Cura.MenuItem
{
text: catalog.i18nc("@action:button", "Rename")
enabled: base.hasCurrentItem && !base.currentItem.is_read_only
onTriggered:
{
renameQualityDialog.object = base.currentItem.name
renameQualityDialog.open()
renameQualityDialog.selectText()
}
}
Cura.MenuItem
{
text: catalog.i18nc("@action:button", "Export")
enabled: base.hasCurrentItem && !base.currentItem.is_read_only
onTriggered: exportDialog.open()
}
}
// Dialog for exporting a quality profile
FileDialog
{
id: exportDialog
title: catalog.i18nc("@title:window", "Export Profile")
selectExisting: false
nameFilters: base.qualityManagementModel.getFileNameFilters("profile_writer")
folder: CuraApplication.getDefaultPath("dialog_profile_path")
onAccepted:
{
var result = Cura.ContainerManager.exportQualityChangesGroup(base.currentItem.quality_changes_group,
fileUrl, selectedNameFilter);
if (result && result.status == "error")
{
messageDialog.title = catalog.i18nc("@title:window", "Export Profile")
messageDialog.text = result.message;
messageDialog.open();
}
// else pop-up Message thing from python code
CuraApplication.setDefaultPath("dialog_profile_path", folder);
}
}
// Dialog to request a name when duplicating a new profile // Dialog to request a name when duplicating a new profile
UM.RenameDialog UM.RenameDialog
@ -317,202 +293,11 @@ Item
} }
} }
// Dialog for exporting a quality profile
FileDialog
{
id: exportDialog
title: catalog.i18nc("@title:window", "Export Profile")
selectExisting: false
nameFilters: base.qualityManagementModel.getFileNameFilters("profile_writer")
folder: CuraApplication.getDefaultPath("dialog_profile_path")
onAccepted:
{
var result = Cura.ContainerManager.exportQualityChangesGroup(base.currentItem.quality_changes_group,
fileUrl, selectedNameFilter);
if (result && result.status == "error")
{
messageDialog.title = catalog.i18nc("@title:window", "Export Profile")
messageDialog.text = result.message;
messageDialog.open();
}
// else pop-up Message thing from python code
CuraApplication.setDefaultPath("dialog_profile_path", folder);
}
}
//Dialogue box for showing the result of importing or exporting profiles.
UM.MessageDialog
{
id: messageDialog
standardButtons: Dialog.Ok
}
Item
{
id: contentsItem
anchors
{
top: titleLabel.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
margins: 5 * screenScaleFactor
bottomMargin: 0
}
clip: true
}
Item
{
anchors
{
top: buttonRow.bottom
topMargin: UM.Theme.getSize("default_margin").height
left: parent.left
right: parent.right
bottom: parent.bottom
}
SystemPalette SystemPalette
{ {
id: palette id: palette
} }
Label
{
id: captionLabel
anchors
{
top: parent.top
left: parent.left
}
visible: text != ""
text: catalog.i18nc("@label %1 is printer name", "Printer: %1").arg(Cura.MachineManager.activeMachine.name)
width: profileBackground.width
elide: Text.ElideRight
}
Rectangle
{
id: profileBackground
anchors
{
top: captionLabel.visible ? captionLabel.bottom : parent.top
topMargin: captionLabel.visible ? UM.Theme.getSize("default_margin").height : 0
bottom: parent.bottom
left: parent.left
}
width: (parent.width * 0.4) | 0
color: palette.light
ListView
{
id: qualityListView
anchors.fill: parent
ScrollBar.vertical: UM.ScrollBar
{
id: profileScrollBar
}
clip: true
model: base.qualityManagementModel
Component.onCompleted:
{
var selectedItemName = Cura.MachineManager.activeQualityOrQualityChangesName;
// Select the required quality name if given
for (var idx = 0; idx < base.qualityManagementModel.count; idx++)
{
var item = base.qualityManagementModel.getItem(idx);
if (item.name == selectedItemName)
{
currentIndex = idx;
break;
}
}
}
section.property: "section_name"
section.delegate: Rectangle
{
height: childrenRect.height
Label
{
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_lining").width
text: section
font.bold: true
}
}
delegate: Rectangle
{
width: profileBackground.width - profileScrollBar.width
height: childrenRect.height
// Added this property to identify custom profiles in automated system tests (Squish)
property bool isReadOnly: model.is_read_only
property bool isCurrentItem: ListView.isCurrentItem
color: isCurrentItem ? palette.highlight : (model.index % 2) ? palette.base : palette.alternateBase
Label
{
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
anchors.right: parent.right
width: Math.floor((parent.width * 0.8))
text: model.name
elide: Text.ElideRight
font.italic:
{
if (model.is_read_only)
{
// For built-in qualities, it needs to match both the intent category and the quality name
return model.name == Cura.MachineManager.activeQualityOrQualityChangesName && model.intent_category == Cura.MachineManager.activeIntentCategory
}
else
{
// For custom qualities, it only needs to match the name
return model.name == Cura.MachineManager.activeQualityOrQualityChangesName
}
}
color: parent.isCurrentItem ? palette.highlightedText : palette.text
}
MouseArea
{
anchors.fill: parent
onClicked:
{
parent.ListView.view.currentIndex = model.index;
}
}
}
}
}
// details panel on the right
Item
{
id: detailsPanel
anchors
{
left: profileBackground.right
leftMargin: UM.Theme.getSize("default_margin").width
top: parent.top
bottom: parent.bottom
right: parent.right
}
Column Column
{ {
id: detailsPanelHeaderColumn id: detailsPanelHeaderColumn
@ -525,23 +310,13 @@ Item
spacing: UM.Theme.getSize("default_margin").height spacing: UM.Theme.getSize("default_margin").height
visible: base.currentItem != null visible: base.currentItem != null
UM.Label
Item // Profile title Label
{
id: profileName
width: parent.width
height: childrenRect.height
Label
{ {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
text: base.currentItemDisplayName text: base.currentItemDisplayName
font: UM.Theme.getFont("large_bold") font: UM.Theme.getFont("large_bold")
elide: Text.ElideRight elide: Text.ElideRight
renderType: Text.NativeRendering
}
} }
Flow Flow
@ -551,14 +326,14 @@ Item
visible: base.hasCurrentItem && base.currentItem.name == Cura.MachineManager.activeQualityOrQualityChangesName && base.currentItem.intent_category == Cura.MachineManager.activeIntentCategory visible: base.hasCurrentItem && base.currentItem.name == Cura.MachineManager.activeQualityOrQualityChangesName && base.currentItem.intent_category == Cura.MachineManager.activeIntentCategory
Button Cura.SecondaryButton
{ {
text: catalog.i18nc("@action:button", "Update profile with current settings/overrides") text: catalog.i18nc("@action:button", "Update profile with current settings/overrides")
enabled: Cura.MachineManager.hasUserSettings && qualityListView.currentItem && !qualityListView.currentItem.is_read_only enabled: Cura.MachineManager.hasUserSettings && objectList.currentIndex && !objectList.currentIndex.is_read_only
onClicked: Cura.ContainerManager.updateQualityChanges() onClicked: Cura.ContainerManager.updateQualityChanges()
} }
Button Cura.SecondaryButton
{ {
text: catalog.i18nc("@action:button", "Discard current changes"); text: catalog.i18nc("@action:button", "Discard current changes");
enabled: Cura.MachineManager.hasUserSettings enabled: Cura.MachineManager.hasUserSettings
@ -566,20 +341,18 @@ Item
} }
} }
Label UM.Label
{ {
id: defaultsMessage id: defaultsMessage
visible: false visible: false
text: catalog.i18nc("@action:label", "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below.") text: catalog.i18nc("@action:label", "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below.")
wrapMode: Text.WordWrap
width: parent.width width: parent.width
} }
Label UM.Label
{ {
id: noCurrentSettingsMessage id: noCurrentSettingsMessage
visible: base.isCurrentItemActivated && !Cura.MachineManager.hasUserSettings visible: base.isCurrentItemActivated && !Cura.MachineManager.hasUserSettings
text: catalog.i18nc("@action:label", "Your current settings match the selected profile.") text: catalog.i18nc("@action:label", "Your current settings match the selected profile.")
wrapMode: Text.WordWrap
width: parent.width width: parent.width
} }
@ -619,4 +392,3 @@ Item
} }
} }
} }
}