CURA-4606 added first Profile management page

This commit is contained in:
Jack Ha 2018-02-19 15:03:04 +01:00
parent 2d5f65a954
commit 3ff9cb6b1e
9 changed files with 260 additions and 718 deletions

View file

@ -1,98 +0,0 @@
// Copyright (c) 2016 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.1
import QtQuick.Controls 1.1
import UM 1.2 as UM
import Cura 1.0 as Cura
Tab
{
id: base
property string extruderId: "";
property string extruderDefinition: "";
property string quality: "";
property string material: "";
TableView
{
anchors.fill: parent
anchors.margins: UM.Theme.getSize("default_margin").width
Component
{
id: itemDelegate
UM.TooltipArea
{
property var setting: qualitySettings.getItem(styleData.row)
height: childrenRect.height
width: (parent != null) ? parent.width : 0
text: (styleData.value.substr(0,1) == "=") ? styleData.value : ""
Label
{
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
anchors.right: parent.right
text: (styleData.value.substr(0,1) == "=") ? catalog.i18nc("@info:status", "Calculated") : styleData.value
font.strikeout: styleData.column == 1 && quality == Cura.MachineManager.globalQualityId && setting.user_value != ""
font.italic: setting.profile_value_source == "quality_changes" || (quality == Cura.MachineManager.globalQualityId && setting.user_value != "")
opacity: font.strikeout ? 0.5 : 1
color: styleData.textColor
elide: Text.ElideRight
}
}
}
TableViewColumn
{
role: "label"
title: catalog.i18nc("@title:column", "Setting")
width: (parent.width * 0.4) | 0
delegate: itemDelegate
}
TableViewColumn
{
role: "profile_value"
title: catalog.i18nc("@title:column", "Profile")
width: (parent.width * 0.18) | 0
delegate: itemDelegate
}
TableViewColumn
{
role: "user_value"
title: catalog.i18nc("@title:column", "Current");
visible: quality == Cura.MachineManager.globalQualityId
width: (parent.width * 0.18) | 0
delegate: itemDelegate
}
TableViewColumn
{
role: "unit"
title: catalog.i18nc("@title:column", "Unit")
width: (parent.width * 0.14) | 0
delegate: itemDelegate
}
section.property: "category"
section.delegate: Label
{
text: section
font.bold: true
}
model: Cura.QualitySettingsModel
{
id: qualitySettings
extruderId: base.extruderId
extruderDefinition: base.extruderDefinition
quality: base.quality != null ? base.quality : ""
material: base.material != null ? base.material : ""
}
SystemPalette { id: palette }
}
}

View file

@ -1,356 +0,0 @@
// Copyright (c) 2016 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.1
import QtQuick.Controls 1.1
import QtQuick.Dialogs 1.2
import UM 1.2 as UM
import Cura 1.0 as Cura
UM.ManagementPage
{
id: base;
title: catalog.i18nc("@title:tab", "Profiles");
property var extrudersModel: Cura.ExtrudersModel{}
model: Cura.QualityAndUserProfilesModel { }
section.property: "readOnly"
section.delegate: Rectangle
{
height: childrenRect.height;
Label
{
anchors.left: parent.left;
anchors.leftMargin: UM.Theme.getSize("default_lining").width;
text: section == "true" ? catalog.i18nc("@label", "Protected profiles") : catalog.i18nc("@label", "Custom profiles")
font.bold: true
}
}
activeId: Cura.MachineManager.activeQualityId
activeIndex: {
for(var i = 0; i < model.rowCount(); i++) {
if (model.getItem(i).id == Cura.MachineManager.activeQualityId) {
return i;
}
}
return -1;
}
function canCreateProfile() {
return base.currentItem && (base.currentItem.id == Cura.MachineManager.activeQualityId) && Cura.MachineManager.hasUserSettings;
}
buttons: [
Button
{
text: catalog.i18nc("@action:button", "Activate");
iconName: "list-activate";
enabled: base.currentItem != null ? base.currentItem.id != Cura.MachineManager.activeQualityId : false;
onClicked:
{
Cura.MachineManager.setActiveQuality(base.currentItem.id)
currentItem = base.model.getItem(base.objectList.currentIndex) // Refresh the current item.
}
},
// Create button
Button
{
text: catalog.i18nc("@label", "Create")
enabled: base.canCreateProfile() && !Cura.MachineManager.stacksHaveErrors
visible: base.canCreateProfile()
iconName: "list-add";
onClicked:
{
newNameDialog.object = base.currentItem != null ? Cura.ContainerManager.makeUniqueName(base.currentItem.name) : "";
newNameDialog.open();
newNameDialog.selectText();
}
},
// Duplicate button
Button
{
text: catalog.i18nc("@label", "Duplicate")
enabled: ! base.canCreateProfile()
visible: ! base.canCreateProfile()
iconName: "list-add";
onClicked:
{
newDuplicateNameDialog.object = Cura.ContainerManager.makeUniqueName(base.currentItem.name);
newDuplicateNameDialog.open();
newDuplicateNameDialog.selectText();
}
},
Button
{
text: catalog.i18nc("@action:button", "Remove");
iconName: "list-remove";
enabled: base.currentItem != null ? !base.currentItem.readOnly && !Cura.ContainerManager.isContainerUsed(base.currentItem.id) : false;
onClicked: confirmDialog.open();
},
Button
{
text: catalog.i18nc("@action:button", "Rename");
iconName: "edit-rename";
enabled: base.currentItem != null ? !base.currentItem.readOnly : false;
onClicked:
{
renameDialog.open();
renameDialog.selectText();
}
},
Button
{
text: catalog.i18nc("@action:button", "Import");
iconName: "document-import";
onClicked: importDialog.open();
},
Button
{
text: catalog.i18nc("@action:button", "Export")
iconName: "document-export"
onClicked: exportDialog.open()
enabled: currentItem != null && !base.currentItem.readOnly
}
]
scrollviewCaption: catalog.i18nc("@label %1 is printer name","Printer: %1").arg(Cura.MachineManager.activeMachineName)
signal createProfile()
onCreateProfile:
{
newNameDialog.object = base.currentItem != null ? Cura.ContainerManager.makeUniqueName(base.currentItem.name) : "";
newNameDialog.open();
newNameDialog.selectText();
}
signal selectContainer(string name)
onSelectContainer:
{
objectList.currentIndex = objectList.model.find("name", name);
}
Item {
visible: base.currentItem != null
anchors.fill: parent
Label {
id: profileName
text: base.currentItem ? base.currentItem.name: ""
font: UM.Theme.getFont("large")
width: parent.width
elide: Text.ElideRight
}
Flow {
id: currentSettingsActions
visible: currentItem && currentItem.id == Cura.MachineManager.activeQualityId
anchors.left: parent.left
anchors.right: parent.right
anchors.top: profileName.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height
Button
{
text: {
return catalog.i18nc("@action:button", "Update profile with current settings/overrides");
}
enabled: Cura.MachineManager.hasUserSettings && !Cura.MachineManager.isReadOnly(Cura.MachineManager.activeQualityId)
onClicked: Cura.ContainerManager.updateQualityChanges()
}
Button
{
text: catalog.i18nc("@action:button", "Discard current changes");
enabled: Cura.MachineManager.hasUserSettings
onClicked: Cura.ContainerManager.clearUserContainers();
}
}
Column {
id: profileNotices
anchors.top: currentSettingsActions.visible ? currentSettingsActions.bottom : currentSettingsActions.anchors.top
anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.left: parent.left
anchors.right: parent.right
spacing: UM.Theme.getSize("default_margin").height
Label {
id: defaultsMessage
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.")
wrapMode: Text.WordWrap
width: parent.width
}
Label {
id: noCurrentSettingsMessage
visible: currentItem && currentItem.id == Cura.MachineManager.activeQualityId && !Cura.MachineManager.hasUserSettings
text: catalog.i18nc("@action:label", "Your current settings match the selected profile.")
wrapMode: Text.WordWrap
width: parent.width
}
}
TabView
{
anchors.left: parent.left
anchors.top: profileNotices.visible ? profileNotices.bottom : profileNotices.anchors.top
anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.right: parent.right
anchors.bottom: parent.bottom
currentIndex: Cura.ExtruderManager.extruderCount > 0 ? Cura.ExtruderManager.activeExtruderIndex + 1 : 0
ProfileTab
{
title: catalog.i18nc("@title:tab", "Global Settings");
quality: base.currentItem != null ? base.currentItem.id : "";
material: Cura.MachineManager.allActiveMaterialIds[Cura.MachineManager.activeMachineId]
}
Repeater
{
model: base.extrudersModel
ProfileTab
{
title: model.name;
extruderId: model.id;
extruderDefinition: model.definition;
quality: base.currentItem != null ? base.currentItem.id : "";
material: Cura.MachineManager.allActiveMaterialIds[model.id]
}
}
}
}
Item
{
UM.I18nCatalog { id: catalog; name: "cura"; }
UM.ConfirmRemoveDialog
{
id: confirmDialog
object: base.currentItem != null ? base.currentItem.name : ""
onYes:
{
var name = base.currentItem.name;
Cura.ContainerManager.removeQualityChanges(name)
if(Cura.MachineManager.activeQualityName == name)
{
Cura.MachineManager.setActiveQuality(base.model.getItem(0).name)
}
objectList.currentIndex = -1 //Reset selection.
}
}
UM.RenameDialog
{
title: catalog.i18nc("@title:window", "Rename Profile")
id: renameDialog;
object: base.currentItem != null ? base.currentItem.name : ""
onAccepted:
{
Cura.ContainerManager.renameQualityChanges(base.currentItem.name, newName)
objectList.currentIndex = -1 //Reset selection.
}
}
// Dialog to request a name when creating a new profile
UM.RenameDialog
{
title: catalog.i18nc("@title:window", "Create Profile")
id: newNameDialog;
object: "<new name>";
onAccepted:
{
var selectedContainer = Cura.ContainerManager.createQualityChanges(newName);
base.selectContainer(selectedContainer);
objectList.currentIndex = -1 //Reset selection.
}
}
// Dialog to request a name when duplicating a new profile
UM.RenameDialog
{
title: catalog.i18nc("@title:window", "Duplicate Profile")
id: newDuplicateNameDialog;
object: "<new name>";
onAccepted:
{
var selectedContainer = Cura.ContainerManager.duplicateQualityOrQualityChanges(base.currentItem.name, newName);
base.selectContainer(selectedContainer);
objectList.currentIndex = -1 //Reset selection.
}
}
MessageDialog
{
id: messageDialog
title: catalog.i18nc("@window:title", "Import Profile");
standardButtons: StandardButton.Ok
modality: Qt.ApplicationModal
}
FileDialog
{
id: importDialog;
title: catalog.i18nc("@title:window", "Import Profile");
selectExisting: true;
nameFilters: base.model.getFileNameFilters("profile_reader")
folder: CuraApplication.getDefaultPath("dialog_profile_path")
onAccepted:
{
var result = Cura.ContainerManager.importProfile(fileUrl);
messageDialog.text = result.message
if(result.status == "ok")
{
messageDialog.icon = StandardIcon.Information
}
else if(result.status == "duplicate")
{
messageDialog.icon = StandardIcon.Warning
}
else
{
messageDialog.icon = StandardIcon.Critical
}
messageDialog.open()
CuraApplication.setDefaultPath("dialog_profile_path", folder)
}
}
FileDialog
{
id: exportDialog;
title: catalog.i18nc("@title:window", "Export Profile");
selectExisting: false;
nameFilters: base.model.getFileNameFilters("profile_writer")
folder: CuraApplication.getDefaultPath("dialog_profile_path")
onAccepted:
{
var containers = Cura.ContainerManager.findInstanceContainers({"type": "quality_changes", "name": base.currentItem.name})
var result = Cura.ContainerManager.exportProfile(containers, fileUrl, selectedNameFilter)
if(result && result.status == "error")
{
messageDialog.icon = StandardIcon.Critical
messageDialog.text = result.message
messageDialog.open()
}
// else pop-up Message thing from python code
CuraApplication.setDefaultPath("dialog_profile_path", folder)
}
}
}
}

View file

@ -11,10 +11,8 @@ Tab
{
id: base
property string extruderId: "";
property string extruderDefinition: "";
property string quality: "";
property string material: "";
property string extruderPosition: "";
property var quality: null;
TableView
{
@ -38,8 +36,8 @@ Tab
anchors.leftMargin: UM.Theme.getSize("default_margin").width
anchors.right: parent.right
text: (styleData.value.substr(0,1) == "=") ? catalog.i18nc("@info:status", "Calculated") : styleData.value
font.strikeout: styleData.column == 1 && quality == Cura.MachineManager.globalQualityId && setting.user_value != ""
font.italic: setting.profile_value_source == "quality_changes" || (quality == Cura.MachineManager.globalQualityId && setting.user_value != "")
font.strikeout: styleData.column == 1 && setting.user_value != "" // TODO && quality == Cura.MachineManager.globalQualityId
font.italic: setting.profile_value_source == "quality_changes" || (setting.user_value != "") // TODO: (setting.user_value != "" && quality == Cura.MachineManager.globalQualityId)
opacity: font.strikeout ? 0.5 : 1
color: styleData.textColor
elide: Text.ElideRight
@ -65,7 +63,7 @@ Tab
{
role: "user_value"
title: catalog.i18nc("@title:column", "Current");
visible: quality == Cura.MachineManager.globalQualityId
visible: true // TODO quality == Cura.MachineManager.globalQualityId
width: (parent.width * 0.18) | 0
delegate: itemDelegate
}
@ -87,10 +85,8 @@ Tab
model: Cura.QualitySettingsModel
{
id: qualitySettings
extruderId: base.extruderId
extruderDefinition: base.extruderDefinition
extruderPosition: base.extruderPosition
quality: base.quality != null ? base.quality : ""
material: base.material != null ? base.material : ""
}
SystemPalette { id: palette }

View file

@ -14,6 +14,7 @@ Item
{
id: base
property var resetEnabled: false // Keep PreferencesDialog happy
property var extrudersModel: Cura.ExtrudersModel{}
UM.I18nCatalog { id: catalog; name: "cura"; }
@ -35,6 +36,17 @@ Item
text: catalog.i18nc("@title:tab", "Profiles")
}
property var hasCurrentItem: qualityListView.currentItem != null
property var currentItem: {
var current_index = qualityListView.currentIndex;
return qualitiesModel.getItem(current_index);
}
property var isCurrentItemActivated: {
// TODO
}
Row // Button Row
{
id: buttonRow
@ -50,8 +62,7 @@ Item
{
text: catalog.i18nc("@action:button", "Activate")
iconName: "list-activate"
//enabled: base.currentItem != null ? base.currentItem.id != Cura.MachineManager.activeQualityId : false;
enabled: true // TODO
enabled: base.currentItem != null ? base.currentItem.name != Cura.MachineManager.activeQualityOrQualityChangesName : false;
onClicked: {
// TODO
}
@ -259,6 +270,7 @@ Item
}
// details panel on the right
Item
{
id: detailsPanel
@ -283,11 +295,89 @@ Item
height: childrenRect.height
Label {
text: "TODO" // TODO
text: base.currentItem.name // TODO
font: UM.Theme.getFont("large")
}
}
Flow {
id: currentSettingsActions
visible: true // TODO //currentItem && currentItem.id == Cura.MachineManager.activeQualityId
anchors.left: parent.left
anchors.right: parent.right
anchors.top: profileName.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height
Button
{
text: {
return catalog.i18nc("@action:button", "Update profile with current settings/overrides");
}
enabled: Cura.MachineManager.hasUserSettings && !Cura.MachineManager.isReadOnly(Cura.MachineManager.activeQualityId)
onClicked: Cura.ContainerManager.updateQualityChanges()
}
Button
{
text: catalog.i18nc("@action:button", "Discard current changes");
enabled: Cura.MachineManager.hasUserSettings
onClicked: Cura.ContainerManager.clearUserContainers();
}
}
Column {
id: profileNotices
anchors.top: currentSettingsActions.visible ? currentSettingsActions.bottom : currentSettingsActions.anchors.top
anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.left: parent.left
anchors.right: parent.right
spacing: UM.Theme.getSize("default_margin").height
Label {
id: defaultsMessage
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.")
wrapMode: Text.WordWrap
width: parent.width
}
Label {
id: noCurrentSettingsMessage
visible: currentItem && currentItem.id == Cura.MachineManager.activeQualityId && !Cura.MachineManager.hasUserSettings
text: catalog.i18nc("@action:label", "Your current settings match the selected profile.")
wrapMode: Text.WordWrap
width: parent.width
}
}
TabView
{
anchors.left: parent.left
anchors.top: profileNotices.visible ? profileNotices.bottom : profileNotices.anchors.top
anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.right: parent.right
anchors.bottom: parent.bottom
currentIndex: 0
ProfileTab
{
title: catalog.i18nc("@title:tab", "Global Settings");
quality: base.currentItem;
}
Repeater
{
model: base.extrudersModel
ProfileTab
{
title: model.name;
extruderPosition: model.index;
quality: base.currentItem;
}
}
}
}
}
}