Merge branch 'master' into feature-backup-manager

This commit is contained in:
ChrisTerBeke 2018-05-22 17:05:40 +02:00
commit dd581b59e4
7 changed files with 249 additions and 213 deletions

View File

@ -8,13 +8,14 @@ import shutil
import zipfile import zipfile
import tempfile import tempfile
from PyQt5.QtCore import pyqtSlot, QObject, pyqtSignal from PyQt5.QtCore import pyqtSlot, QObject, pyqtSignal, QUrl
from UM.Application import Application from UM.Application import Application
from UM.Logger import Logger from UM.Logger import Logger
from UM.Resources import Resources from UM.Resources import Resources
from UM.Version import Version from UM.Version import Version
class CuraPackageManager(QObject): class CuraPackageManager(QObject):
Version = 1 Version = 1
@ -184,6 +185,12 @@ class CuraPackageManager(QObject):
def isPackageInstalled(self, package_id: str) -> bool: def isPackageInstalled(self, package_id: str) -> bool:
return self.getInstalledPackageInfo(package_id) is not None return self.getInstalledPackageInfo(package_id) is not None
# This is called by drag-and-dropping curapackage files.
@pyqtSlot(QUrl)
def installPackageViaDragAndDrop(self, file_url: str) -> None:
filename = QUrl(file_url).toLocalFile()
return self.installPackage(filename)
# Schedules the given package file to be installed upon the next start. # Schedules the given package file to be installed upon the next start.
@pyqtSlot(str) @pyqtSlot(str)
def installPackage(self, filename: str) -> None: def installPackage(self, filename: str) -> None:

View File

@ -10,7 +10,6 @@ Item
{ {
height: UM.Theme.getSize("toolbox_installed_tile").height height: UM.Theme.getSize("toolbox_installed_tile").height
width: parent.width width: parent.width
property bool canUpdate: false
property bool isEnabled: true property bool isEnabled: true
Rectangle Rectangle
@ -109,7 +108,6 @@ Item
{ {
target: toolbox target: toolbox
onEnabledChanged: isEnabled = toolbox.isEnabled(model.id) onEnabledChanged: isEnabled = toolbox.isEnabled(model.id)
onMetadataChanged: canUpdate = toolbox.canUpdate(model.id)
} }
} }
} }

View File

@ -8,6 +8,8 @@ import UM 1.1 as UM
Column Column
{ {
property bool canUpdate: false
property bool canDowngrade: false
width: UM.Theme.getSize("toolbox_action_button").width width: UM.Theme.getSize("toolbox_action_button").width
spacing: UM.Theme.getSize("narrow_margin").height spacing: UM.Theme.getSize("narrow_margin").height
@ -36,7 +38,7 @@ Column
Button Button
{ {
id: removeButton id: removeButton
text: catalog.i18nc("@action:button", "Uninstall") text: canDowngrade ? catalog.i18nc("@action:button", "Downgrade") : catalog.i18nc("@action:button", "Uninstall")
visible: !model.is_bundled visible: !model.is_bundled
enabled: !toolbox.isDownloading enabled: !toolbox.isDownloading
style: ButtonStyle style: ButtonStyle
@ -72,5 +74,14 @@ Column
} }
} }
onClicked: toolbox.uninstall(model.id) onClicked: toolbox.uninstall(model.id)
Connections
{
target: toolbox
onMetadataChanged:
{
canUpdate = toolbox.canUpdate(model.id)
canDowngrade = toolbox.canDowngrade(model.id)
}
}
} }
} }

View File

@ -318,6 +318,20 @@ class Toolbox(QObject, Extension):
remote_version = Version(remote_package["package_version"]) remote_version = Version(remote_package["package_version"])
return remote_version > local_version return remote_version > local_version
@pyqtSlot(str, result=bool)
def canDowngrade(self, package_id: str) -> bool:
local_package = self._package_manager.getInstalledPackageInfo(package_id)
if local_package is None:
return False
remote_package = self.getRemotePackage(package_id)
if remote_package is None:
return False
local_version = Version(local_package["package_version"])
remote_version = Version(remote_package["package_version"])
return remote_version < local_version
@pyqtSlot(str, result = bool) @pyqtSlot(str, result = bool)
def isInstalled(self, package_id: str) -> bool: def isInstalled(self, package_id: str) -> bool:
return self._package_manager.isPackageInstalled(package_id) return self._package_manager.isPackageInstalled(package_id)

View File

@ -974,7 +974,7 @@
"package_type": "material", "package_type": "material",
"display_name": "Ultimaker ABS", "display_name": "Ultimaker ABS",
"description": "Example package for material and quality profiles for Ultimaker materials.", "description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "0.5.0", "package_version": "1.0.0",
"cura_version": 4, "cura_version": 4,
"website": "https://ultimaker.com/products/materials/abs", "website": "https://ultimaker.com/products/materials/abs",
"author": { "author": {

View File

@ -323,6 +323,21 @@ UM.MainWindow
{ {
if (drop.urls.length > 0) if (drop.urls.length > 0)
{ {
// As the drop area also supports plugins, first check if it's a plugin that was dropped.
if (drop.urls.length == 1)
{
var filename = drop.urls[0];
if (filename.endsWith(".curapackage"))
{
// Try to install plugin & close.
CuraApplication.getCuraPackageManager().installPackageViaDragAndDrop(filename);
packageInstallDialog.text = catalog.i18nc("@label", "This package will be installed after restarting.");
packageInstallDialog.icon = StandardIcon.Information;
packageInstallDialog.open();
return;
}
}
openDialog.handleOpenFileUrls(drop.urls); openDialog.handleOpenFileUrls(drop.urls);
} }
} }
@ -789,6 +804,14 @@ UM.MainWindow
} }
} }
MessageDialog
{
id: packageInstallDialog
title: catalog.i18nc("@window:title", "Install Package");
standardButtons: StandardButton.Ok
modality: Qt.ApplicationModal
}
MessageDialog { MessageDialog {
id: infoMultipleFilesWithGcodeDialog id: infoMultipleFilesWithGcodeDialog
title: catalog.i18nc("@title:window", "Open File(s)") title: catalog.i18nc("@title:window", "Open File(s)")

View File

@ -1,4 +1,4 @@
// Copyright (c) 2016 Ultimaker B.V. // Copyright (c) 2018 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.1 import QtQuick 2.1
@ -61,32 +61,34 @@ UM.Dialog
{ {
id: palette id: palette
} }
Column
{
anchors.fill: parent
spacing: 2 * screenScaleFactor
Label Label
{ {
id: titleLabel id: mainHeading
width: parent.width
text: catalog.i18nc("@action:title", "Summary - Cura Project") text: catalog.i18nc("@action:title", "Summary - Cura Project")
font.pointSize: 18 font.pointSize: 18
anchors.top: parent.top
} }
Rectangle ScrollView
{ {
id: separator id: scroll
color: palette.text
width: parent.width width: parent.width
height: 1 anchors
}
Item // Spacer
{ {
height: spacerHeight top: mainHeading.bottom
width: height topMargin: UM.Theme.getSize("default_margin").height
bottom: controls.top
bottomMargin: UM.Theme.getSize("default_margin").height
} }
style: UM.Theme.styles.scrollview
ColumnLayout
{
spacing: UM.Theme.getSize("default_margin").height
Column
{
Label Label
{ {
id: settingsHeading
text: catalog.i18nc("@action:label", "Printer settings") text: catalog.i18nc("@action:label", "Printer settings")
font.bold: true font.bold: true
} }
@ -97,12 +99,12 @@ UM.Dialog
Label Label
{ {
text: catalog.i18nc("@action:label", "Type") text: catalog.i18nc("@action:label", "Type")
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
Label Label
{ {
text: (Cura.MachineManager.activeMachine == null) ? "" : Cura.MachineManager.activeMachine.definition.name text: (Cura.MachineManager.activeMachine == null) ? "" : Cura.MachineManager.activeMachine.definition.name
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
} }
Row Row
@ -112,56 +114,45 @@ UM.Dialog
Label Label
{ {
text: catalog.i18nc("@action:label", Cura.MachineManager.activeMachineNetworkGroupName != "" ? "Printer Group" : "Name") text: catalog.i18nc("@action:label", Cura.MachineManager.activeMachineNetworkGroupName != "" ? "Printer Group" : "Name")
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
Label Label
{ {
text: Cura.MachineManager.activeMachineNetworkGroupName != "" ? Cura.MachineManager.activeMachineNetworkGroupName : Cura.MachineManager.activeMachineName text: Cura.MachineManager.activeMachineNetworkGroupName != "" ? Cura.MachineManager.activeMachineNetworkGroupName : Cura.MachineManager.activeMachineName
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
} }
Column
{
width: parent.width
visible: Cura.MachineManager.hasVariantBuildplates
Item // Spacer
{
height: spacerHeight
width: height
} }
Row Row
{ {
visible: Cura.MachineManager.hasVariantBuildplates
width: parent.width width: parent.width
height: childrenRect.height height: childrenRect.height
Label Label
{ {
text: catalog.i18nc("@action:label", "Build plate") text: catalog.i18nc("@action:label", "Build plate")
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
Label Label
{ {
text: Cura.MachineManager.activeVariantBuildplateName text: Cura.MachineManager.activeVariantBuildplateName
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
} }
}
Repeater Repeater
{ {
width: parent.width
height: childrenRect.height
model: Cura.MachineManager.currentExtruderPositions model: Cura.MachineManager.currentExtruderPositions
delegate: Column delegate: Column
{ {
Item // Spacer height: childrenRect.height
{ width: parent.width
height: spacerHeight
width: height
}
Label Label
{ {
text: catalog.i18nc("@action:label", "Extruder %1").arg(modelData) text: catalog.i18nc("@action:label", "Extruder %1").arg(modelData)
font.bold: true
} }
height: childrenRect.height
width: parent.width
Row Row
{ {
width: parent.width width: parent.width
@ -169,23 +160,20 @@ UM.Dialog
Label Label
{ {
text: catalog.i18nc("@action:label", "%1 & material").arg(Cura.MachineManager.activeDefinitionVariantsName) text: catalog.i18nc("@action:label", "%1 & material").arg(Cura.MachineManager.activeDefinitionVariantsName)
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
Label Label
{ {
text: Cura.MachineManager.activeVariantNames[modelData] + ", " + Cura.MachineManager.getExtruder(modelData).material.name text: Cura.MachineManager.activeVariantNames[modelData] + ", " + Cura.MachineManager.getExtruder(modelData).material.name
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
} }
} }
} }
Column
Item // Spacer
{ {
height: spacerHeight width: parent.width
width: height height: childrenRect.height
}
Label Label
{ {
text: catalog.i18nc("@action:label", "Profile settings") text: catalog.i18nc("@action:label", "Profile settings")
@ -197,12 +185,12 @@ UM.Dialog
Label Label
{ {
text: catalog.i18nc("@action:label", "Not in profile") text: catalog.i18nc("@action:label", "Not in profile")
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
Label Label
{ {
text: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", Cura.MachineManager.numUserSettings).arg(Cura.MachineManager.numUserSettings) text: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", Cura.MachineManager.numUserSettings).arg(Cura.MachineManager.numUserSettings)
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
visible: Cura.MachineManager.numUserSettings visible: Cura.MachineManager.numUserSettings
} }
@ -213,22 +201,20 @@ UM.Dialog
Label Label
{ {
text: catalog.i18nc("@action:label", "Name") text: catalog.i18nc("@action:label", "Name")
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
Label Label
{ {
text: Cura.MachineManager.activeQualityOrQualityChangesName text: Cura.MachineManager.activeQualityOrQualityChangesName
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
} }
}
Item // Spacer Column
{ {
height: spacerHeight width: parent.width
width: height height: childrenRect.height
}
Label Label
{ {
text: catalog.i18nc("@action:label", "Setting visibility") text: catalog.i18nc("@action:label", "Setting visibility")
@ -241,57 +227,54 @@ UM.Dialog
Label Label
{ {
text: catalog.i18nc("@action:label", "Visible settings:") text: catalog.i18nc("@action:label", "Visible settings:")
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
Label Label
{ {
text: catalog.i18nc("@action:label", "%1 out of %2" ).arg(definitionsModel.visibleCount).arg(Cura.MachineManager.totalNumberOfSettings) text: catalog.i18nc("@action:label", "%1 out of %2" ).arg(definitionsModel.visibleCount).arg(Cura.MachineManager.totalNumberOfSettings)
width: (parent.width / 3) | 0 width: Math.floor(scroll.width / 3) | 0
} }
} }
}
Item // Spacer }
}
Item
{ {
height: spacerHeight id: controls
width: height width: parent.width
} height: childrenRect.height
} anchors.bottom: parent.bottom
CheckBox CheckBox
{ {
id: dontShowAgainCheckbox id: dontShowAgainCheckbox
anchors.bottom: cancel_button.top
anchors.bottomMargin: UM.Theme.getSize("default_margin").height
anchors.left: parent.left anchors.left: parent.left
text: catalog.i18nc("@action:label", "Don't show project summary on save again") text: catalog.i18nc("@action:label", "Don't show project summary on save again")
checked: dontShowAgain checked: dontShowAgain
} }
Button Button
{ {
id: cancel_button id: cancel_button
anchors.bottom: parent.bottom anchors
anchors.right: ok_button.left {
anchors.rightMargin: 2 right: ok_button.left
rightMargin: UM.Theme.getSize("default_margin").width
}
text: catalog.i18nc("@action:button","Cancel"); text: catalog.i18nc("@action:button","Cancel");
enabled: true enabled: true
onClicked: close() onClicked: close()
} }
Button Button
{ {
id: ok_button id: ok_button
anchors.bottom: parent.bottom
anchors.right: parent.right anchors.right: parent.right
text: catalog.i18nc("@action:button","Save"); text: catalog.i18nc("@action:button","Save");
enabled: true enabled: true
onClicked: { onClicked:
{
close() close()
yes() yes()
} }
} }
} }
}
} }