Initial work for adding a save dialog for project saving

CURA-1263
This commit is contained in:
Jaime van Kessel 2016-12-08 11:56:42 +01:00
parent bc8a9c30cf
commit 36d743384c
6 changed files with 283 additions and 9 deletions

View file

@ -215,7 +215,8 @@ class CuraApplication(QtApplication):
Preferences.getInstance().addPreference("view/center_on_select", True) Preferences.getInstance().addPreference("view/center_on_select", True)
Preferences.getInstance().addPreference("mesh/scale_to_fit", True) Preferences.getInstance().addPreference("mesh/scale_to_fit", True)
Preferences.getInstance().addPreference("mesh/scale_tiny_meshes", True) Preferences.getInstance().addPreference("mesh/scale_tiny_meshes", True)
Preferences.getInstance().addPreference("cura/dialog_on_project_save", True)
Preferences.getInstance().addPreference("cura/asked_dialog_on_project_save", False)
for key in [ for key in [
"dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin
"dialog_profile_path", "dialog_profile_path",

View file

@ -109,6 +109,10 @@ class MachineManager(QObject):
def printerOutputDevices(self): def printerOutputDevices(self):
return self._printer_output_devices return self._printer_output_devices
@pyqtProperty(int, constant=True)
def totalNumberOfSettings(self):
return len(UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id="fdmprinter")[0].getAllKeys())
def _onHotendIdChanged(self, index, hotend_id): def _onHotendIdChanged(self, index, hotend_id):
if not self._global_container_stack: if not self._global_container_stack:
return return
@ -483,6 +487,15 @@ class MachineManager(QObject):
return "" return ""
@pyqtProperty("QVariantList", notify = activeMaterialChanged)
def activeMaterialNames(self):
result = []
for stack in ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks():
material_container = stack.findContainer(type="material")
if material_container and material_container != self._empty_material_container:
result.append(material_container.getName())
return result
@pyqtProperty(str, notify=activeMaterialChanged) @pyqtProperty(str, notify=activeMaterialChanged)
def activeMaterialId(self): def activeMaterialId(self):
if self._active_container_stack: if self._active_container_stack:

View file

@ -1,3 +1,6 @@
# Copyright (c) 2016 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher.
from PyQt5.QtCore import Qt, QUrl, pyqtSignal, pyqtSlot, QObject, pyqtProperty, QCoreApplication from PyQt5.QtCore import Qt, QUrl, pyqtSignal, pyqtSlot, QObject, pyqtProperty, QCoreApplication
from PyQt5.QtQml import QQmlComponent, QQmlContext from PyQt5.QtQml import QQmlComponent, QQmlContext
from UM.PluginRegistry import PluginRegistry from UM.PluginRegistry import PluginRegistry
@ -11,6 +14,7 @@ import threading
import time import time
i18n_catalog = i18nCatalog("cura") i18n_catalog = i18nCatalog("cura")
class WorkspaceDialog(QObject): class WorkspaceDialog(QObject):
showDialogSignal = pyqtSignal() showDialogSignal = pyqtSignal()

View file

@ -112,7 +112,17 @@ UM.MainWindow
{ {
id: saveWorkspaceMenu id: saveWorkspaceMenu
text: catalog.i18nc("@title:menu menubar:file","Save project") text: catalog.i18nc("@title:menu menubar:file","Save project")
onTriggered: UM.OutputDeviceManager.requestWriteToDevice("local_file", PrintInformation.jobName, { "filter_by_machine": false, "file_type": "workspace" }); onTriggered:
{
if(UM.Preferences.getValue("cura/dialog_on_project_save"))
{
saveWorkspaceDialog.open()
}
else
{
UM.OutputDeviceManager.requestWriteToDevice("local_file", PrintInformation.jobName, { "filter_by_machine": false, "file_type": "workspace" })
}
}
} }
MenuItem { action: Cura.Actions.reloadAll; } MenuItem { action: Cura.Actions.reloadAll; }
@ -500,15 +510,18 @@ UM.MainWindow
onVisibleChanged: onVisibleChanged:
{ {
if(!visible) // When the dialog closes, switch to the General page.
{ // This prevents us from having a heavy page like Setting Visiblity active in the background.
// When the dialog closes, switch to the General page. setPage(0);
// This prevents us from having a heavy page like Setting Visiblity active in the background.
setPage(0);
}
} }
} }
WorkspaceSummaryDialog
{
id: saveWorkspaceDialog
onYes: UM.OutputDeviceManager.requestWriteToDevice("local_file", PrintInformation.jobName, { "filter_by_machine": false, "file_type": "workspace" })
}
Connections Connections
{ {
target: Cura.Actions.preferences target: Cura.Actions.preferences
@ -764,7 +777,7 @@ UM.MainWindow
Connections Connections
{ {
target: Cura.Actions.loadWorkspace target: Cura.Actions.loadWorkspace
onTriggered:openWorkspaceDialog.open() onTriggered: openWorkspaceDialog.open()
} }
EngineLog EngineLog

View file

@ -304,6 +304,20 @@ UM.PreferencesPage
} }
} }
UM.TooltipArea {
width: childrenRect.width
height: childrenRect.height
text: catalog.i18nc("@info:tooltip", "Should a summary be shown when saving a project file?")
CheckBox
{
text: catalog.i18nc("@option:check", "Show summary dialog when saving project")
checked: boolCheck(UM.Preferences.getValue("cura/dialog_on_project_save"))
onCheckedChanged: UM.Preferences.setValue("cura/dialog_on_project_save", checked)
}
}
Item Item
{ {
//: Spacer //: Spacer

View file

@ -0,0 +1,229 @@
// Copyright (c) 2016 Ultimaker B.V.
// Cura is released under the terms of the AGPLv3 or higher.
import QtQuick 2.1
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
import QtQuick.Window 2.1
import UM 1.1 as UM
import Cura 1.0 as Cura
UM.Dialog
{
title: catalog.i18nc("@title:window", "Save Project")
width: 550
minimumWidth: 550
maximumWidth: 550
height: 350
minimumHeight: 350
maximumHeight: 350
property int spacerHeight: 10
property bool dontShowAgain: true
signal yes();
onClosing:
{
UM.Preferences.setValue("cura/asked_dialog_on_project_save", true)
UM.Preferences.setValue("cura/dialog_on_project_save", !dontShowAgainCheckbox.checked)
}
onVisibleChanged:
{
if(visible)
{
if (UM.Preferences.getValue("cura/asked_dialog_on_project_save"))
{
dontShowAgain = true
} else { dontShowAgain = UM.Preferences.setValue("cura/dialog_on_project_save")}
}
}
Item
{
anchors.fill: parent
UM.I18nCatalog
{
id: catalog;
name: "cura";
}
Column
{
anchors.fill: parent
spacing: 2
Label
{
id: titleLabel
text: catalog.i18nc("@action:title", "Summary - Cura Project")
font.pixelSize: 22
}
Rectangle
{
id: separator
color: "black"
width: parent.width
height: 1
}
Item // Spacer
{
height: spacerHeight
width: height
}
Label
{
text: catalog.i18nc("@action:label", "Printer settings")
font.bold: true
}
Row
{
width: parent.width
height: childrenRect.height
Label
{
text: catalog.i18nc("@action:label", "Name")
width: parent.width / 3
}
Label
{
text: Cura.MachineManager.activeMachineName
width: parent.width / 3
}
}
Item // Spacer
{
height: spacerHeight
width: height
}
Label
{
text: catalog.i18nc("@action:label", "Profile settings")
font.bold: true
}
Row
{
width: parent.width
height: childrenRect.height
Label
{
text: catalog.i18nc("@action:label", "Name")
width: parent.width / 3
}
Label
{
text: Cura.MachineManager.activeQualityName
width: parent.width / 3
}
}
Row
{
width: parent.width
height: visible ? childrenRect.height: 0
Label
{
text: catalog.i18nc("@action:label", "Derivative from")
width: parent.width / 3
}
Label
{
text: "TODO" //catalog.i18nc("@action:label", "%1, %2 override(s)" ).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges)
width: parent.width / 3
}
visible: Cura.MachineManager.activeQualityChangesId != "empty_quality_changes"
}
Item // Spacer
{
height: spacerHeight
width: height
}
Label
{
text: catalog.i18nc("@action:label", "Material settings")
font.bold: true
}
Repeater
{
model: Cura.MachineManager.activeMaterialNames
delegate: Row
{
width: parent.width
height: childrenRect.height
Label
{
text: catalog.i18nc("@action:label", "Name")
width: parent.width / 3
}
Label
{
text: modelData
width: parent.width / 3
}
}
}
Item // Spacer
{
height: spacerHeight
width: height
}
Label
{
text: catalog.i18nc("@action:label", "Setting visibility")
font.bold: true
}
Row
{
width: parent.width
height: childrenRect.height
Label
{
text: catalog.i18nc("@action:label", "Visible settings:")
width: parent.width / 3
}
Label
{
text: catalog.i18nc("@action:label", "%1 out of %2" ).arg(manager.numVisibleSettings).arg(Cura.MachineManager.totalNumberOfSettings)
width: parent.width / 3
}
}
CheckBox
{
id: dontShowAgainCheckbox
text: catalog.i18nc("@action:label", "Don't show project summary on save again")
checked: dontShowAgain
}
}
}
rightButtons: [
Button
{
id: cancel_button
text: catalog.i18nc("@action:button","Cancel");
enabled: true
onClicked: close()
},
Button
{
id: ok_button
text: catalog.i18nc("@action:button","Save");
enabled: true
onClicked: {
close(); yes() }
}
]
}