mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-08 07:27:29 -06:00
Merge branch 'STAR-322_cloud-connection' of github.com:Ultimaker/Cura into STAR-322_cloud-connection
This commit is contained in:
commit
4fddf1b7c7
41 changed files with 535 additions and 1658 deletions
|
@ -479,6 +479,8 @@ class BuildVolume(SceneNode):
|
||||||
maximum = Vector(max_w - bed_adhesion_size - 1, max_h - self._raft_thickness - self._extra_z_clearance, max_d - disallowed_area_size + bed_adhesion_size - 1)
|
maximum = Vector(max_w - bed_adhesion_size - 1, max_h - self._raft_thickness - self._extra_z_clearance, max_d - disallowed_area_size + bed_adhesion_size - 1)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self._application.getController().getScene()._maximum_bounds = scale_to_max_bounds
|
||||||
|
|
||||||
self.updateNodeBoundaryCheck()
|
self.updateNodeBoundaryCheck()
|
||||||
|
|
||||||
def getBoundingBox(self) -> AxisAlignedBox:
|
def getBoundingBox(self) -> AxisAlignedBox:
|
||||||
|
|
|
@ -36,18 +36,14 @@ else:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
CuraDebugMode = False # [CodeStyle: Reflecting imported value]
|
CuraDebugMode = False # [CodeStyle: Reflecting imported value]
|
||||||
|
|
||||||
# List of exceptions that should be considered "fatal" and abort the program.
|
# List of exceptions that should not be considered "fatal" and abort the program.
|
||||||
# These are primarily some exception types that we simply cannot really recover from
|
# These are primarily some exception types that we simply skip
|
||||||
# (MemoryError and SystemError) and exceptions that indicate grave errors in the
|
skip_exception_types = [
|
||||||
# code that cause the Python interpreter to fail (SyntaxError, ImportError).
|
SystemExit,
|
||||||
fatal_exception_types = [
|
KeyboardInterrupt,
|
||||||
MemoryError,
|
GeneratorExit
|
||||||
SyntaxError,
|
|
||||||
ImportError,
|
|
||||||
SystemError,
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
class CrashHandler:
|
class CrashHandler:
|
||||||
crash_url = "https://stats.ultimaker.com/api/cura"
|
crash_url = "https://stats.ultimaker.com/api/cura"
|
||||||
|
|
||||||
|
@ -70,7 +66,7 @@ class CrashHandler:
|
||||||
# If Cura has fully started, we only show fatal errors.
|
# If Cura has fully started, we only show fatal errors.
|
||||||
# If Cura has not fully started yet, we always show the early crash dialog. Otherwise, Cura will just crash
|
# If Cura has not fully started yet, we always show the early crash dialog. Otherwise, Cura will just crash
|
||||||
# without any information.
|
# without any information.
|
||||||
if has_started and exception_type not in fatal_exception_types:
|
if has_started and exception_type in skip_exception_types:
|
||||||
return
|
return
|
||||||
|
|
||||||
if not has_started:
|
if not has_started:
|
||||||
|
@ -387,7 +383,7 @@ class CrashHandler:
|
||||||
Application.getInstance().callLater(self._show)
|
Application.getInstance().callLater(self._show)
|
||||||
|
|
||||||
def _show(self):
|
def _show(self):
|
||||||
# When the exception is not in the fatal_exception_types list, the dialog is not created, so we don't need to show it
|
# When the exception is in the skip_exception_types list, the dialog is not created, so we don't need to show it
|
||||||
if self.dialog:
|
if self.dialog:
|
||||||
self.dialog.exec_()
|
self.dialog.exec_()
|
||||||
os._exit(1)
|
os._exit(1)
|
||||||
|
|
|
@ -181,7 +181,6 @@ class CuraApplication(QtApplication):
|
||||||
# Variables set from CLI
|
# Variables set from CLI
|
||||||
self._files_to_open = []
|
self._files_to_open = []
|
||||||
self._use_single_instance = False
|
self._use_single_instance = False
|
||||||
self._trigger_early_crash = False # For debug only
|
|
||||||
|
|
||||||
self._single_instance = None
|
self._single_instance = None
|
||||||
|
|
||||||
|
@ -292,7 +291,10 @@ class CuraApplication(QtApplication):
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
self._use_single_instance = self._cli_args.single_instance
|
self._use_single_instance = self._cli_args.single_instance
|
||||||
self._trigger_early_crash = self._cli_args.trigger_early_crash
|
# FOR TESTING ONLY
|
||||||
|
if self._cli_args.trigger_early_crash:
|
||||||
|
assert not "This crash is triggered by the trigger_early_crash command line argument."
|
||||||
|
|
||||||
for filename in self._cli_args.file:
|
for filename in self._cli_args.file:
|
||||||
self._files_to_open.append(os.path.abspath(filename))
|
self._files_to_open.append(os.path.abspath(filename))
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ class ConfigurationModel(QObject):
|
||||||
|
|
||||||
@pyqtProperty(str, fset = setBuildplateConfiguration, notify = configurationChanged)
|
@pyqtProperty(str, fset = setBuildplateConfiguration, notify = configurationChanged)
|
||||||
def buildplateConfiguration(self) -> str:
|
def buildplateConfiguration(self) -> str:
|
||||||
return self._buildplate_configuration
|
return self._buildplate_configuration.capitalize()
|
||||||
|
|
||||||
## This method is intended to indicate whether the configuration is valid or not.
|
## This method is intended to indicate whether the configuration is valid or not.
|
||||||
# The method checks if the mandatory fields are or not set
|
# The method checks if the mandatory fields are or not set
|
||||||
|
|
|
@ -187,7 +187,10 @@ class ConvexHullDecorator(SceneNodeDecorator):
|
||||||
for child in self._node.getChildren():
|
for child in self._node.getChildren():
|
||||||
child_hull = child.callDecoration("_compute2DConvexHull")
|
child_hull = child.callDecoration("_compute2DConvexHull")
|
||||||
if child_hull:
|
if child_hull:
|
||||||
|
try:
|
||||||
points = numpy.append(points, child_hull.getPoints(), axis = 0)
|
points = numpy.append(points, child_hull.getPoints(), axis = 0)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
if points.size < 3:
|
if points.size < 3:
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -17,12 +17,6 @@ parser.add_argument("--debug",
|
||||||
default = False,
|
default = False,
|
||||||
help = "Turn on the debug mode by setting this option."
|
help = "Turn on the debug mode by setting this option."
|
||||||
)
|
)
|
||||||
parser.add_argument("--trigger-early-crash",
|
|
||||||
dest = "trigger_early_crash",
|
|
||||||
action = "store_true",
|
|
||||||
default = False,
|
|
||||||
help = "FOR TESTING ONLY. Trigger an early crash to show the crash dialog."
|
|
||||||
)
|
|
||||||
known_args = vars(parser.parse_known_args()[0])
|
known_args = vars(parser.parse_known_args()[0])
|
||||||
|
|
||||||
if not known_args["debug"]:
|
if not known_args["debug"]:
|
||||||
|
|
|
@ -16,6 +16,7 @@ Cura.ExpandableComponent
|
||||||
id: base
|
id: base
|
||||||
|
|
||||||
width: UM.Theme.getSize("layerview_menu_size").width
|
width: UM.Theme.getSize("layerview_menu_size").width
|
||||||
|
contentHeaderTitle: catalog.i18nc("@label", "Color scheme")
|
||||||
|
|
||||||
Connections
|
Connections
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,110 +0,0 @@
|
||||||
// Copyright (c) 2018 Ultimaker B.V.
|
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
|
||||||
|
|
||||||
import QtQuick 2.3
|
|
||||||
import QtQuick.Controls 1.4
|
|
||||||
import QtQuick.Controls.Styles 1.3
|
|
||||||
import UM 1.3 as UM
|
|
||||||
import Cura 1.0 as Cura
|
|
||||||
|
|
||||||
Component {
|
|
||||||
Rectangle {
|
|
||||||
id: base;
|
|
||||||
property var shadowRadius: UM.Theme.getSize("monitor_shadow_radius").width;
|
|
||||||
property var cornerRadius: UM.Theme.getSize("monitor_corner_radius").width;
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("main_background");
|
|
||||||
visible: OutputDevice != null;
|
|
||||||
|
|
||||||
UM.I18nCatalog {
|
|
||||||
id: catalog;
|
|
||||||
name: "cura";
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: printingLabel;
|
|
||||||
anchors {
|
|
||||||
left: parent.left;
|
|
||||||
leftMargin: 4 * UM.Theme.getSize("default_margin").width;
|
|
||||||
margins: 2 * UM.Theme.getSize("default_margin").width;
|
|
||||||
right: parent.right;
|
|
||||||
top: parent.top;
|
|
||||||
}
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
elide: Text.ElideRight;
|
|
||||||
font: UM.Theme.getFont("large");
|
|
||||||
text: catalog.i18nc("@label", "Printing");
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: managePrintersLabel;
|
|
||||||
anchors {
|
|
||||||
bottom: printingLabel.bottom;
|
|
||||||
right: printerScrollView.right;
|
|
||||||
rightMargin: 4 * UM.Theme.getSize("default_margin").width;
|
|
||||||
}
|
|
||||||
color: UM.Theme.getColor("primary"); // "Cura Blue"
|
|
||||||
font: UM.Theme.getFont("default");
|
|
||||||
linkColor: UM.Theme.getColor("primary"); // "Cura Blue"
|
|
||||||
text: catalog.i18nc("@label link to connect manager", "Manage printers");
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: managePrintersLabel;
|
|
||||||
hoverEnabled: true;
|
|
||||||
onClicked: Cura.MachineManager.printerOutputDevices[0].openPrinterControlPanel();
|
|
||||||
onEntered: managePrintersLabel.font.underline = true;
|
|
||||||
onExited: managePrintersLabel.font.underline = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skeleton loading
|
|
||||||
Column {
|
|
||||||
id: skeletonLoader;
|
|
||||||
anchors {
|
|
||||||
left: parent.left;
|
|
||||||
leftMargin: UM.Theme.getSize("wide_margin").width;
|
|
||||||
right: parent.right;
|
|
||||||
rightMargin: UM.Theme.getSize("wide_margin").width;
|
|
||||||
top: printingLabel.bottom;
|
|
||||||
topMargin: UM.Theme.getSize("default_margin").height;
|
|
||||||
}
|
|
||||||
spacing: UM.Theme.getSize("default_margin").height - 10;
|
|
||||||
visible: printerList.count === 0;
|
|
||||||
|
|
||||||
PrinterCard {
|
|
||||||
printer: null;
|
|
||||||
}
|
|
||||||
PrinterCard {
|
|
||||||
printer: null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actual content
|
|
||||||
ScrollView {
|
|
||||||
id: printerScrollView;
|
|
||||||
anchors {
|
|
||||||
bottom: parent.bottom;
|
|
||||||
left: parent.left;
|
|
||||||
right: parent.right;
|
|
||||||
top: printingLabel.bottom;
|
|
||||||
topMargin: UM.Theme.getSize("default_margin").height;
|
|
||||||
}
|
|
||||||
style: UM.Theme.styles.scrollview;
|
|
||||||
|
|
||||||
ListView {
|
|
||||||
id: printerList;
|
|
||||||
property var currentIndex: -1;
|
|
||||||
anchors {
|
|
||||||
fill: parent;
|
|
||||||
leftMargin: UM.Theme.getSize("wide_margin").width;
|
|
||||||
rightMargin: UM.Theme.getSize("wide_margin").width;
|
|
||||||
}
|
|
||||||
delegate: PrinterCard {
|
|
||||||
printer: modelData;
|
|
||||||
}
|
|
||||||
model: OutputDevice.printers;
|
|
||||||
spacing: UM.Theme.getSize("default_margin").height - 10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -57,7 +57,7 @@ Cura.MachineAction
|
||||||
spacing: UM.Theme.getSize("default_margin").height
|
spacing: UM.Theme.getSize("default_margin").height
|
||||||
|
|
||||||
SystemPalette { id: palette }
|
SystemPalette { id: palette }
|
||||||
UM.I18nCatalog { id: catalog; name: "cura" }
|
UM.I18nCatalog { id: catalog; name:"cura" }
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
id: pageTitle
|
id: pageTitle
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
// Copyright (c) 2018 Ultimaker B.V.
|
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
|
||||||
|
|
||||||
import QtQuick 2.3
|
|
||||||
import QtQuick.Controls 2.0
|
|
||||||
import UM 1.3 as UM
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
color: UM.Theme.getColor("monitor_lining_light"); // TODO: Maybe theme separately? Maybe not.
|
|
||||||
height: UM.Theme.getSize("default_lining").height;
|
|
||||||
width: parent.width;
|
|
||||||
}
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
// Copyright (c) 2018 Ultimaker B.V.
|
||||||
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
|
import QtQuick 2.3
|
||||||
|
import QtQuick.Controls 1.4
|
||||||
|
import QtQuick.Layouts 1.3
|
||||||
|
import QtQuick.Dialogs 1.2
|
||||||
|
import UM 1.3 as UM
|
||||||
|
|
||||||
|
UM.Dialog
|
||||||
|
{
|
||||||
|
id: overrideConfirmationDialog
|
||||||
|
|
||||||
|
property var printer: null
|
||||||
|
|
||||||
|
minimumWidth: screenScaleFactor * 640;
|
||||||
|
minimumHeight: screenScaleFactor * 320;
|
||||||
|
width: minimumWidth
|
||||||
|
height: minimumHeight
|
||||||
|
title: catalog.i18nc("@title:window", "Configuration Changes")
|
||||||
|
rightButtons:
|
||||||
|
[
|
||||||
|
Button
|
||||||
|
{
|
||||||
|
id: overrideButton
|
||||||
|
anchors.margins: UM.Theme.getSize("default_margin").width
|
||||||
|
text: catalog.i18nc("@action:button", "Override")
|
||||||
|
onClicked:
|
||||||
|
{
|
||||||
|
OutputDevice.forceSendJob(printer.activePrintJob.key)
|
||||||
|
overrideConfirmationDialog.close()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Button
|
||||||
|
{
|
||||||
|
id: cancelButton
|
||||||
|
anchors.margins: UM.Theme.getSize("default_margin").width
|
||||||
|
text: catalog.i18nc("@action:button", "Cancel")
|
||||||
|
onClicked:
|
||||||
|
{
|
||||||
|
overrideConfirmationDialog.reject()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
Label
|
||||||
|
{
|
||||||
|
anchors
|
||||||
|
{
|
||||||
|
fill: parent
|
||||||
|
margins: 36 * screenScaleFactor // TODO: Theme!
|
||||||
|
bottomMargin: 56 * screenScaleFactor // TODO: Theme!
|
||||||
|
}
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
text:
|
||||||
|
{
|
||||||
|
if (!printer.activePrintJob)
|
||||||
|
{
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
var topLine
|
||||||
|
if (materialsAreKnown(printer.activePrintJob))
|
||||||
|
{
|
||||||
|
topLine = catalog.i18ncp("@label", "The assigned printer, %1, requires the following configuration change:", "The assigned printer, %1, requires the following configuration changes:").arg(printer.name)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
topLine = catalog.i18nc("@label", "The printer %1 is assigned, but the job contains an unknown material configuration.").arg(printer.name)
|
||||||
|
}
|
||||||
|
var result = "<p>" + topLine +"</p>\n\n"
|
||||||
|
for (var i = 0; i < printer.activePrintJob.configurationChanges.length; i++)
|
||||||
|
{
|
||||||
|
var change = printer.activePrintJob.configurationChanges[i]
|
||||||
|
var text
|
||||||
|
switch (change.typeOfChange)
|
||||||
|
{
|
||||||
|
case "material_change":
|
||||||
|
text = catalog.i18nc("@label", "Change material %1 from %2 to %3.").arg(change.index + 1).arg(change.originName).arg(change.targetName)
|
||||||
|
break
|
||||||
|
case "material_insert":
|
||||||
|
text = catalog.i18nc("@label", "Load %3 as material %1 (This cannot be overridden).").arg(change.index + 1).arg(change.targetName)
|
||||||
|
break
|
||||||
|
case "print_core_change":
|
||||||
|
text = catalog.i18nc("@label", "Change print core %1 from %2 to %3.").arg(change.index + 1).arg(change.originName).arg(change.targetName)
|
||||||
|
break
|
||||||
|
case "buildplate_change":
|
||||||
|
text = catalog.i18nc("@label", "Change build plate to %1 (This cannot be overridden).").arg(formatBuildPlateType(change.target_name))
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
text = "unknown"
|
||||||
|
}
|
||||||
|
result += "<p><b>" + text + "</b></p>"
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Utils
|
||||||
|
function formatPrintJobName(name)
|
||||||
|
{
|
||||||
|
var extensions = [ ".gcode.gz", ".gz", ".gcode", ".ufp" ]
|
||||||
|
for (var i = 0; i < extensions.length; i++)
|
||||||
|
{
|
||||||
|
var extension = extensions[i]
|
||||||
|
if (name.slice(-extension.length) === extension)
|
||||||
|
{
|
||||||
|
name = name.substring(0, name.length - extension.length)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
function materialsAreKnown(job)
|
||||||
|
{
|
||||||
|
var conf0 = job.configuration[0]
|
||||||
|
if (conf0 && !conf0.material.material)
|
||||||
|
{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
var conf1 = job.configuration[1]
|
||||||
|
if (conf1 && !conf1.material.material)
|
||||||
|
{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
function formatBuildPlateType(buildPlateType)
|
||||||
|
{
|
||||||
|
var translationText = ""
|
||||||
|
switch (buildPlateType) {
|
||||||
|
case "glass":
|
||||||
|
translationText = catalog.i18nc("@label", "Glass")
|
||||||
|
break
|
||||||
|
case "aluminum":
|
||||||
|
translationText = catalog.i18nc("@label", "Aluminum")
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
translationText = null
|
||||||
|
}
|
||||||
|
return translationText
|
||||||
|
}
|
||||||
|
}
|
|
@ -26,6 +26,7 @@ Item
|
||||||
|
|
||||||
ExpandableCard
|
ExpandableCard
|
||||||
{
|
{
|
||||||
|
borderColor: printJob.configurationChanges.length !== 0 ? "#f5a623" : "#EAEAEC" // TODO: Theme!
|
||||||
headerItem: Row
|
headerItem: Row
|
||||||
{
|
{
|
||||||
height: 48 * screenScaleFactor // TODO: Theme!
|
height: 48 * screenScaleFactor // TODO: Theme!
|
||||||
|
|
|
@ -23,7 +23,7 @@ Item
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
opacity:
|
opacity:
|
||||||
{
|
{
|
||||||
if (printJob && (printJob.state == "error" || !printJob.isActive))
|
if (printJob && (printJob.state == "error" || printJob.configurationChanges.length > 0 || !printJob.isActive))
|
||||||
{
|
{
|
||||||
return 0.5
|
return 0.5
|
||||||
}
|
}
|
||||||
|
@ -60,6 +60,14 @@ Item
|
||||||
height: 0.5 * printJobPreview.height
|
height: 0.5 * printJobPreview.height
|
||||||
source:
|
source:
|
||||||
{
|
{
|
||||||
|
if (!printJob)
|
||||||
|
{
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if (printJob.configurationChanges.length > 0)
|
||||||
|
{
|
||||||
|
return "../svg/warning-icon.svg"
|
||||||
|
}
|
||||||
switch(printJob.state)
|
switch(printJob.state)
|
||||||
{
|
{
|
||||||
case "error":
|
case "error":
|
||||||
|
@ -75,6 +83,7 @@ Item
|
||||||
default:
|
default:
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
return ""
|
||||||
}
|
}
|
||||||
sourceSize
|
sourceSize
|
||||||
{
|
{
|
||||||
|
|
|
@ -55,7 +55,7 @@ Item
|
||||||
left: progressBar.right
|
left: progressBar.right
|
||||||
leftMargin: 18 * screenScaleFactor // TODO: Theme!
|
leftMargin: 18 * screenScaleFactor // TODO: Theme!
|
||||||
}
|
}
|
||||||
text: Math.round(printJob.progress * 100) + "%"
|
text: printJob ? Math.round(printJob.progress * 100) + "%" : "0%"
|
||||||
color: printJob && printJob.isActive ? "#374355" : "#babac1" // TODO: Theme!
|
color: printJob && printJob.isActive ? "#374355" : "#babac1" // TODO: Theme!
|
||||||
width: contentWidth
|
width: contentWidth
|
||||||
font: UM.Theme.getFont("medium") // 14pt, regular
|
font: UM.Theme.getFont("medium") // 14pt, regular
|
||||||
|
@ -88,6 +88,8 @@ Item
|
||||||
return catalog.i18nc("@label:status", "Aborted")
|
return catalog.i18nc("@label:status", "Aborted")
|
||||||
}
|
}
|
||||||
return catalog.i18nc("@label:status", "Finished")
|
return catalog.i18nc("@label:status", "Finished")
|
||||||
|
case "finished":
|
||||||
|
return catalog.i18nc("@label:status", "Finished")
|
||||||
case "sent_to_printer":
|
case "sent_to_printer":
|
||||||
return catalog.i18nc("@label:status", "Preparing...")
|
return catalog.i18nc("@label:status", "Preparing...")
|
||||||
case "pre_print":
|
case "pre_print":
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
import QtQuick 2.3
|
import QtQuick 2.3
|
||||||
import QtQuick.Controls 2.0
|
import QtQuick.Controls 2.0
|
||||||
|
import QtQuick.Dialogs 1.1
|
||||||
import UM 1.3 as UM
|
import UM 1.3 as UM
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -66,7 +67,7 @@ Item
|
||||||
{
|
{
|
||||||
verticalCenter: parent.verticalCenter
|
verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
width: 216 * screenScaleFactor // TODO: Theme!
|
width: 180 * screenScaleFactor // TODO: Theme!
|
||||||
height: printerNameLabel.height + printerFamilyPill.height + 6 * screenScaleFactor // TODO: Theme!
|
height: printerNameLabel.height + printerFamilyPill.height + 6 * screenScaleFactor // TODO: Theme!
|
||||||
|
|
||||||
Label
|
Label
|
||||||
|
@ -150,7 +151,7 @@ Item
|
||||||
}
|
}
|
||||||
border
|
border
|
||||||
{
|
{
|
||||||
color: "#EAEAEC" // TODO: Theme!
|
color: printer.activePrintJob && printer.activePrintJob.configurationChanges.length > 0 ? "#f5a623" : "#EAEAEC" // TODO: Theme!
|
||||||
width: borderSize // TODO: Remove once themed
|
width: borderSize // TODO: Remove once themed
|
||||||
}
|
}
|
||||||
color: "white" // TODO: Theme!
|
color: "white" // TODO: Theme!
|
||||||
|
@ -185,14 +186,15 @@ Item
|
||||||
}
|
}
|
||||||
if (printer && printer.state == "unreachable")
|
if (printer && printer.state == "unreachable")
|
||||||
{
|
{
|
||||||
return catalog.i18nc("@label:status", "Unreachable")
|
return catalog.i18nc("@label:status", "Unavailable")
|
||||||
}
|
}
|
||||||
if (printer && printer.state == "idle")
|
if (printer && !printer.activePrintJob && printer.state == "idle")
|
||||||
{
|
{
|
||||||
return catalog.i18nc("@label:status", "Idle")
|
return catalog.i18nc("@label:status", "Idle")
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
visible: text !== ""
|
||||||
}
|
}
|
||||||
|
|
||||||
Item
|
Item
|
||||||
|
@ -218,7 +220,7 @@ Item
|
||||||
{
|
{
|
||||||
verticalCenter: parent.verticalCenter
|
verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
width: 216 * screenScaleFactor // TODO: Theme!
|
width: 180 * screenScaleFactor // TODO: Theme!
|
||||||
height: printerNameLabel.height + printerFamilyPill.height + 6 * screenScaleFactor // TODO: Theme!
|
height: printerNameLabel.height + printerFamilyPill.height + 6 * screenScaleFactor // TODO: Theme!
|
||||||
visible: printer.activePrintJob
|
visible: printer.activePrintJob
|
||||||
|
|
||||||
|
@ -247,7 +249,7 @@ Item
|
||||||
}
|
}
|
||||||
color: printer.activePrintJob && printer.activePrintJob.isActive ? "#53657d" : "#babac1" // TODO: Theme!
|
color: printer.activePrintJob && printer.activePrintJob.isActive ? "#53657d" : "#babac1" // TODO: Theme!
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
font: UM.Theme.getFont("very_small") // 12pt, regular
|
font: UM.Theme.getFont("default") // 12pt, regular
|
||||||
text: printer.activePrintJob ? printer.activePrintJob.owner : "Anonymous" // TODO: I18N
|
text: printer.activePrintJob ? printer.activePrintJob.owner : "Anonymous" // TODO: I18N
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
|
||||||
|
@ -264,8 +266,67 @@ Item
|
||||||
verticalCenter: parent.verticalCenter
|
verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
printJob: printer.activePrintJob
|
printJob: printer.activePrintJob
|
||||||
visible: printer.activePrintJob
|
visible: printer.activePrintJob && printer.activePrintJob.configurationChanges.length === 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Label
|
||||||
|
{
|
||||||
|
anchors
|
||||||
|
{
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
font: UM.Theme.getFont("default")
|
||||||
|
text: "Requires configuration changes"
|
||||||
|
visible: printer.activePrintJob && printer.activePrintJob.configurationChanges.length > 0
|
||||||
|
|
||||||
|
// FIXED-LINE-HEIGHT:
|
||||||
|
height: 18 * screenScaleFactor // TODO: Theme!
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Button
|
||||||
|
{
|
||||||
|
id: detailsButton
|
||||||
|
anchors
|
||||||
|
{
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
right: parent.right
|
||||||
|
rightMargin: 18 * screenScaleFactor // TODO: Theme!
|
||||||
|
}
|
||||||
|
background: Rectangle
|
||||||
|
{
|
||||||
|
color: "#d8d8d8" // TODO: Theme!
|
||||||
|
radius: 2 * screenScaleFactor // Todo: Theme!
|
||||||
|
Rectangle
|
||||||
|
{
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.bottomMargin: 2 * screenScaleFactor // TODO: Theme!
|
||||||
|
color: detailsButton.hovered ? "#e4e4e4" : "#f0f0f0" // TODO: Theme!
|
||||||
|
radius: 2 * screenScaleFactor // Todo: Theme!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contentItem: Label
|
||||||
|
{
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.bottomMargin: 2 * screenScaleFactor // TODO: Theme!
|
||||||
|
color: "#1e66d7" // TODO: Theme!
|
||||||
|
font: UM.Theme.getFont("medium") // 14pt, regular
|
||||||
|
text: "Details" // TODO: I18NC!
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
height: 18 * screenScaleFactor // TODO: Theme!
|
||||||
|
}
|
||||||
|
implicitHeight: 32 * screenScaleFactor // TODO: Theme!
|
||||||
|
implicitWidth: 96 * screenScaleFactor // TODO: Theme!
|
||||||
|
visible: printer.activePrintJob && printer.activePrintJob.configurationChanges.length > 0
|
||||||
|
onClicked: overrideConfirmationDialog.open()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MonitorConfigOverrideDialog
|
||||||
|
{
|
||||||
|
id: overrideConfirmationDialog
|
||||||
|
printer: base.printer
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -8,6 +8,7 @@ import UM 1.3 as UM
|
||||||
import Cura 1.0 as Cura
|
import Cura 1.0 as Cura
|
||||||
import QtGraphicalEffects 1.0
|
import QtGraphicalEffects 1.0
|
||||||
|
|
||||||
|
// Root component for the monitor tab (stage)
|
||||||
Component
|
Component
|
||||||
{
|
{
|
||||||
Item
|
Item
|
||||||
|
@ -130,7 +131,7 @@ Component
|
||||||
verticalCenter: externalLinkIcon.verticalCenter
|
verticalCenter: externalLinkIcon.verticalCenter
|
||||||
}
|
}
|
||||||
color: UM.Theme.getColor("primary")
|
color: UM.Theme.getColor("primary")
|
||||||
font: UM.Theme.getFont("default")
|
font: UM.Theme.getFont("default") // 12pt, regular
|
||||||
linkColor: UM.Theme.getColor("primary")
|
linkColor: UM.Theme.getColor("primary")
|
||||||
text: catalog.i18nc("@label link to connect manager", "Manage queue in Cura Connect")
|
text: catalog.i18nc("@label link to connect manager", "Manage queue in Cura Connect")
|
||||||
}
|
}
|
|
@ -1,121 +0,0 @@
|
||||||
// Copyright (c) 2018 Ultimaker B.V.
|
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
|
||||||
|
|
||||||
import QtQuick 2.2
|
|
||||||
import QtQuick.Controls 1.4
|
|
||||||
import QtQuick.Controls.Styles 1.4
|
|
||||||
import UM 1.2 as UM
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: extruderInfo;
|
|
||||||
property var printCoreConfiguration: null;
|
|
||||||
height: childrenRect.height;
|
|
||||||
width: Math.round(parent.width / 2);
|
|
||||||
|
|
||||||
// Extruder circle
|
|
||||||
Item {
|
|
||||||
id: extruderCircle;
|
|
||||||
height: UM.Theme.getSize("monitor_extruder_circle").height;
|
|
||||||
width: UM.Theme.getSize("monitor_extruder_circle").width;
|
|
||||||
|
|
||||||
// Loading skeleton
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("monitor_skeleton_fill");
|
|
||||||
radius: Math.round(width / 2);
|
|
||||||
visible: !printCoreConfiguration;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actual content
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent;
|
|
||||||
border.width: UM.Theme.getSize("monitor_thick_lining").width;
|
|
||||||
border.color: UM.Theme.getColor("monitor_lining_heavy");
|
|
||||||
color: "transparent";
|
|
||||||
opacity: {
|
|
||||||
if (printCoreConfiguration == null || printCoreConfiguration.activeMaterial == null || printCoreConfiguration.hotendID == null) {
|
|
||||||
return 0.5;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
radius: Math.round(width / 2);
|
|
||||||
visible: printCoreConfiguration;
|
|
||||||
|
|
||||||
Label {
|
|
||||||
anchors.centerIn: parent;
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
font: UM.Theme.getFont("default_bold");
|
|
||||||
text: printCoreConfiguration ? printCoreConfiguration.position + 1 : 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Print core and material labels
|
|
||||||
Item {
|
|
||||||
id: materialLabel
|
|
||||||
anchors {
|
|
||||||
left: extruderCircle.right;
|
|
||||||
leftMargin: UM.Theme.getSize("default_margin").width;
|
|
||||||
right: parent.right;
|
|
||||||
top: parent.top;
|
|
||||||
}
|
|
||||||
height: UM.Theme.getSize("monitor_text_line").height;
|
|
||||||
|
|
||||||
// Loading skeleton
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("monitor_skeleton_fill");
|
|
||||||
visible: !extruderInfo.printCoreConfiguration;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actual content
|
|
||||||
Label {
|
|
||||||
anchors.fill: parent;
|
|
||||||
elide: Text.ElideRight;
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
font: UM.Theme.getFont("default");
|
|
||||||
text: {
|
|
||||||
if (printCoreConfiguration && printCoreConfiguration.activeMaterial != undefined) {
|
|
||||||
return printCoreConfiguration.activeMaterial.name;
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
visible: extruderInfo.printCoreConfiguration;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: printCoreLabel;
|
|
||||||
anchors {
|
|
||||||
left: extruderCircle.right;
|
|
||||||
leftMargin: UM.Theme.getSize("default_margin").width;
|
|
||||||
right: parent.right;
|
|
||||||
top: materialLabel.bottom;
|
|
||||||
topMargin: Math.floor(UM.Theme.getSize("default_margin").height/4);
|
|
||||||
}
|
|
||||||
height: UM.Theme.getSize("monitor_text_line").height;
|
|
||||||
|
|
||||||
// Loading skeleton
|
|
||||||
Rectangle {
|
|
||||||
color: UM.Theme.getColor("monitor_skeleton_fill");
|
|
||||||
height: parent.height;
|
|
||||||
visible: !extruderInfo.printCoreConfiguration;
|
|
||||||
width: Math.round(parent.width / 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actual content
|
|
||||||
Label {
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
elide: Text.ElideRight;
|
|
||||||
font: UM.Theme.getFont("default");
|
|
||||||
opacity: 0.6;
|
|
||||||
text: {
|
|
||||||
if (printCoreConfiguration != undefined && printCoreConfiguration.hotendID != undefined) {
|
|
||||||
return printCoreConfiguration.hotendID;
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
visible: extruderInfo.printCoreConfiguration;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -182,7 +182,7 @@ Item {
|
||||||
abortConfirmationDialog.visible = true;
|
abortConfirmationDialog.visible = true;
|
||||||
popup.close();
|
popup.close();
|
||||||
}
|
}
|
||||||
text: printJob.state == "aborting" ? catalog.i18nc("@label", "Aborting...") : catalog.i18nc("@label", "Abort");
|
text: printJob && printJob.state == "aborting" ? catalog.i18nc("@label", "Aborting...") : catalog.i18nc("@label", "Abort");
|
||||||
visible: {
|
visible: {
|
||||||
if (!printJob) {
|
if (!printJob) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -1,505 +0,0 @@
|
||||||
// Copyright (c) 2018 Ultimaker B.V.
|
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
|
||||||
|
|
||||||
import QtQuick 2.2
|
|
||||||
import QtQuick.Dialogs 1.1
|
|
||||||
import QtQuick.Controls 2.0
|
|
||||||
import QtQuick.Controls.Styles 1.4
|
|
||||||
import QtGraphicalEffects 1.0
|
|
||||||
import QtQuick.Layouts 1.1
|
|
||||||
import QtQuick.Dialogs 1.1
|
|
||||||
import UM 1.3 as UM
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: root;
|
|
||||||
property var shadowRadius: UM.Theme.getSize("monitor_shadow_radius").width;
|
|
||||||
property var shadowOffset: 2 * screenScaleFactor;
|
|
||||||
property var debug: false;
|
|
||||||
property var printJob: null;
|
|
||||||
width: parent.width; // Bubbles downward
|
|
||||||
height: childrenRect.height + shadowRadius * 2; // Bubbles upward
|
|
||||||
|
|
||||||
UM.I18nCatalog {
|
|
||||||
id: catalog;
|
|
||||||
name: "cura";
|
|
||||||
}
|
|
||||||
|
|
||||||
// The actual card (white block)
|
|
||||||
Rectangle {
|
|
||||||
// 5px margin, but shifted 2px vertically because of the shadow
|
|
||||||
anchors {
|
|
||||||
bottomMargin: root.shadowRadius + root.shadowOffset;
|
|
||||||
leftMargin: root.shadowRadius;
|
|
||||||
rightMargin: root.shadowRadius;
|
|
||||||
topMargin: root.shadowRadius - root.shadowOffset;
|
|
||||||
}
|
|
||||||
color: UM.Theme.getColor("monitor_card_background");
|
|
||||||
height: childrenRect.height;
|
|
||||||
layer.enabled: true
|
|
||||||
layer.effect: DropShadow {
|
|
||||||
radius: root.shadowRadius
|
|
||||||
verticalOffset: 2 * screenScaleFactor
|
|
||||||
color: "#3F000000" // 25% shadow
|
|
||||||
}
|
|
||||||
width: parent.width - shadowRadius * 2;
|
|
||||||
|
|
||||||
Column {
|
|
||||||
height: childrenRect.height;
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
// Main content
|
|
||||||
Item {
|
|
||||||
id: mainContent;
|
|
||||||
height: 200 * screenScaleFactor; // TODO: Theme!
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
// Left content
|
|
||||||
Item {
|
|
||||||
anchors {
|
|
||||||
bottom: parent.bottom;
|
|
||||||
left: parent.left;
|
|
||||||
margins: UM.Theme.getSize("wide_margin").width;
|
|
||||||
right: parent.horizontalCenter;
|
|
||||||
top: parent.top;
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: printJobName;
|
|
||||||
width: parent.width;
|
|
||||||
height: UM.Theme.getSize("monitor_text_line").height;
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
color: UM.Theme.getColor("monitor_skeleton_fill");
|
|
||||||
height: parent.height;
|
|
||||||
visible: !printJob;
|
|
||||||
width: Math.round(parent.width / 3);
|
|
||||||
}
|
|
||||||
Label {
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
elide: Text.ElideRight;
|
|
||||||
font: UM.Theme.getFont("default_bold");
|
|
||||||
text: printJob && printJob.name ? printJob.name : ""; // Supress QML warnings
|
|
||||||
visible: printJob;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: printJobOwnerName;
|
|
||||||
anchors {
|
|
||||||
top: printJobName.bottom;
|
|
||||||
topMargin: Math.floor(UM.Theme.getSize("default_margin").height / 2);
|
|
||||||
}
|
|
||||||
height: UM.Theme.getSize("monitor_text_line").height;
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
color: UM.Theme.getColor("monitor_skeleton_fill");
|
|
||||||
height: parent.height;
|
|
||||||
visible: !printJob;
|
|
||||||
width: Math.round(parent.width / 2);
|
|
||||||
}
|
|
||||||
Label {
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
elide: Text.ElideRight;
|
|
||||||
font: UM.Theme.getFont("default");
|
|
||||||
text: printJob ? printJob.owner : ""; // Supress QML warnings
|
|
||||||
visible: printJob;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: printJobPreview;
|
|
||||||
property var useUltibot: false;
|
|
||||||
anchors {
|
|
||||||
bottom: parent.bottom;
|
|
||||||
horizontalCenter: parent.horizontalCenter;
|
|
||||||
top: printJobOwnerName.bottom;
|
|
||||||
topMargin: UM.Theme.getSize("default_margin").height;
|
|
||||||
}
|
|
||||||
width: height;
|
|
||||||
|
|
||||||
// Skeleton
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("monitor_skeleton_fill");
|
|
||||||
radius: UM.Theme.getSize("default_margin").width;
|
|
||||||
visible: !printJob;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actual content
|
|
||||||
Image {
|
|
||||||
id: previewImage;
|
|
||||||
anchors.fill: parent;
|
|
||||||
opacity: printJob && printJob.state == "error" ? 0.5 : 1.0;
|
|
||||||
source: printJob ? printJob.previewImageUrl : "";
|
|
||||||
visible: printJob;
|
|
||||||
}
|
|
||||||
|
|
||||||
UM.RecolorImage {
|
|
||||||
id: ultiBotImage;
|
|
||||||
|
|
||||||
anchors.centerIn: printJobPreview;
|
|
||||||
color: UM.Theme.getColor("monitor_placeholder_image");
|
|
||||||
height: printJobPreview.height;
|
|
||||||
source: "../svg/ultibot.svg";
|
|
||||||
sourceSize {
|
|
||||||
height: height;
|
|
||||||
width: width;
|
|
||||||
}
|
|
||||||
/* Since print jobs ALWAYS have an image url, we have to check if that image URL errors or
|
|
||||||
not in order to determine if we show the placeholder (ultibot) image instead. */
|
|
||||||
visible: printJob && previewImage.status == Image.Error;
|
|
||||||
width: printJobPreview.width;
|
|
||||||
}
|
|
||||||
|
|
||||||
UM.RecolorImage {
|
|
||||||
id: statusImage;
|
|
||||||
anchors.centerIn: printJobPreview;
|
|
||||||
color: UM.Theme.getColor("monitor_image_overlay");
|
|
||||||
height: 0.5 * printJobPreview.height;
|
|
||||||
source: printJob && printJob.state == "error" ? "../svg/aborted-icon.svg" : "";
|
|
||||||
sourceSize {
|
|
||||||
height: height;
|
|
||||||
width: width;
|
|
||||||
}
|
|
||||||
visible: source != "";
|
|
||||||
width: 0.5 * printJobPreview.width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: totalTimeLabel;
|
|
||||||
anchors {
|
|
||||||
bottom: parent.bottom;
|
|
||||||
right: parent.right;
|
|
||||||
}
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
elide: Text.ElideRight;
|
|
||||||
font: UM.Theme.getFont("default");
|
|
||||||
text: printJob ? OutputDevice.formatDuration(printJob.timeTotal) : "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Divider
|
|
||||||
Rectangle {
|
|
||||||
anchors {
|
|
||||||
horizontalCenter: parent.horizontalCenter;
|
|
||||||
verticalCenter: parent.verticalCenter;
|
|
||||||
}
|
|
||||||
color: !printJob ? UM.Theme.getColor("monitor_skeleton_fill") : UM.Theme.getColor("monitor_lining_light");
|
|
||||||
height: parent.height - 2 * UM.Theme.getSize("default_margin").height;
|
|
||||||
width: UM.Theme.getSize("default_lining").width;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Right content
|
|
||||||
Item {
|
|
||||||
anchors {
|
|
||||||
bottom: parent.bottom;
|
|
||||||
left: parent.horizontalCenter;
|
|
||||||
margins: UM.Theme.getSize("wide_margin").width;
|
|
||||||
right: parent.right;
|
|
||||||
top: parent.top;
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: targetPrinterLabel;
|
|
||||||
height: UM.Theme.getSize("monitor_text_line").height;
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
visible: !printJob;
|
|
||||||
color: UM.Theme.getColor("monitor_skeleton_fill");
|
|
||||||
anchors.fill: parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
elide: Text.ElideRight;
|
|
||||||
font: UM.Theme.getFont("default_bold");
|
|
||||||
text: {
|
|
||||||
if (printJob !== null) {
|
|
||||||
if (printJob.assignedPrinter == null) {
|
|
||||||
if (printJob.state == "error") {
|
|
||||||
return catalog.i18nc("@label", "Waiting for: Unavailable printer");
|
|
||||||
}
|
|
||||||
return catalog.i18nc("@label", "Waiting for: First available");
|
|
||||||
} else {
|
|
||||||
return catalog.i18nc("@label", "Waiting for: ") + printJob.assignedPrinter.name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
visible: printJob;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PrinterInfoBlock {
|
|
||||||
anchors.bottom: parent.bottom;
|
|
||||||
printer: root.printJon && root.printJob.assignedPrinter;
|
|
||||||
printJob: root.printJob;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PrintJobContextMenu {
|
|
||||||
id: contextButton;
|
|
||||||
anchors {
|
|
||||||
right: mainContent.right;
|
|
||||||
rightMargin: UM.Theme.getSize("default_margin").width * 3 + root.shadowRadius;
|
|
||||||
top: mainContent.top;
|
|
||||||
topMargin: UM.Theme.getSize("default_margin").height;
|
|
||||||
}
|
|
||||||
printJob: root.printJob;
|
|
||||||
visible: root.printJob;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: configChangesBox;
|
|
||||||
height: childrenRect.height;
|
|
||||||
visible: printJob && printJob.configurationChanges.length !== 0;
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
// Config change toggle
|
|
||||||
Rectangle {
|
|
||||||
id: configChangeToggle;
|
|
||||||
color: {
|
|
||||||
if (configChangeToggleArea.containsMouse) {
|
|
||||||
return UM.Theme.getColor("viewport_background"); // TODO: Theme!
|
|
||||||
} else {
|
|
||||||
return "transparent";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
width: parent.width;
|
|
||||||
height: UM.Theme.getSize("default_margin").height * 4; // TODO: Theme!
|
|
||||||
anchors {
|
|
||||||
left: parent.left;
|
|
||||||
right: parent.right;
|
|
||||||
top: parent.top;
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
color: !printJob ? UM.Theme.getColor("monitor_skeleton_fill") : UM.Theme.getColor("monitor_lining_light");
|
|
||||||
height: UM.Theme.getSize("default_lining").height;
|
|
||||||
width: parent.width;
|
|
||||||
}
|
|
||||||
|
|
||||||
UM.RecolorImage {
|
|
||||||
anchors {
|
|
||||||
right: configChangeToggleLabel.left;
|
|
||||||
rightMargin: UM.Theme.getSize("default_margin").width;
|
|
||||||
verticalCenter: parent.verticalCenter;
|
|
||||||
}
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
height: 23 * screenScaleFactor; // TODO: Theme!
|
|
||||||
source: "../svg/warning-icon.svg";
|
|
||||||
sourceSize {
|
|
||||||
height: height;
|
|
||||||
width: width;
|
|
||||||
}
|
|
||||||
width: 23 * screenScaleFactor; // TODO: Theme!
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: configChangeToggleLabel;
|
|
||||||
anchors {
|
|
||||||
horizontalCenter: parent.horizontalCenter;
|
|
||||||
verticalCenter: parent.verticalCenter;
|
|
||||||
}
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
font: UM.Theme.getFont("default");
|
|
||||||
text: catalog.i18nc("@label", "Configuration change");
|
|
||||||
}
|
|
||||||
|
|
||||||
UM.RecolorImage {
|
|
||||||
anchors {
|
|
||||||
left: configChangeToggleLabel.right;
|
|
||||||
leftMargin: UM.Theme.getSize("default_margin").width;
|
|
||||||
verticalCenter: parent.verticalCenter;
|
|
||||||
}
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
height: 15 * screenScaleFactor; // TODO: Theme!
|
|
||||||
source: {
|
|
||||||
if (configChangeDetails.visible) {
|
|
||||||
return UM.Theme.getIcon("arrow_top");
|
|
||||||
} else {
|
|
||||||
return UM.Theme.getIcon("arrow_bottom");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sourceSize {
|
|
||||||
width: width;
|
|
||||||
height: height;
|
|
||||||
}
|
|
||||||
width: 15 * screenScaleFactor; // TODO: Theme!
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
id: configChangeToggleArea;
|
|
||||||
anchors.fill: parent;
|
|
||||||
hoverEnabled: true;
|
|
||||||
onClicked: {
|
|
||||||
configChangeDetails.visible = !configChangeDetails.visible;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Config change details
|
|
||||||
Item {
|
|
||||||
id: configChangeDetails;
|
|
||||||
anchors.top: configChangeToggle.bottom;
|
|
||||||
Behavior on height { NumberAnimation { duration: 100 } }
|
|
||||||
// In case of really massive multi-line configuration changes
|
|
||||||
height: visible ? Math.max(UM.Theme.getSize("monitor_config_override_box").height, childrenRect.height) : 0;
|
|
||||||
visible: false;
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
Item {
|
|
||||||
anchors {
|
|
||||||
bottomMargin: UM.Theme.getSize("wide_margin").height;
|
|
||||||
fill: parent;
|
|
||||||
leftMargin: UM.Theme.getSize("wide_margin").height * 4;
|
|
||||||
rightMargin: UM.Theme.getSize("wide_margin").height * 4;
|
|
||||||
topMargin: UM.Theme.getSize("wide_margin").height;
|
|
||||||
}
|
|
||||||
clip: true;
|
|
||||||
|
|
||||||
Label {
|
|
||||||
anchors.fill: parent;
|
|
||||||
elide: Text.ElideRight;
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
font: UM.Theme.getFont("default");
|
|
||||||
text: {
|
|
||||||
if (!printJob || printJob.configurationChanges.length === 0) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
var topLine;
|
|
||||||
if (materialsAreKnown(printJob)) {
|
|
||||||
topLine = catalog.i18nc("@label", "The assigned printer, %1, requires the following configuration change(s):").arg(printJob.assignedPrinter.name);
|
|
||||||
} else {
|
|
||||||
topLine = catalog.i18nc("@label", "The printer %1 is assigned, but the job contains an unknown material configuration.").arg(printJob.assignedPrinter.name);
|
|
||||||
}
|
|
||||||
var result = "<p>" + topLine +"</p>";
|
|
||||||
for (var i = 0; i < printJob.configurationChanges.length; i++) {
|
|
||||||
var change = printJob.configurationChanges[i];
|
|
||||||
var text;
|
|
||||||
switch (change.typeOfChange) {
|
|
||||||
case "material_change":
|
|
||||||
text = catalog.i18nc("@label", "Change material %1 from %2 to %3.").arg(change.index + 1).arg(change.originName).arg(change.targetName);
|
|
||||||
break;
|
|
||||||
case "material_insert":
|
|
||||||
text = catalog.i18nc("@label", "Load %3 as material %1 (This cannot be overridden).").arg(change.index + 1).arg(change.targetName);
|
|
||||||
break;
|
|
||||||
case "print_core_change":
|
|
||||||
text = catalog.i18nc("@label", "Change print core %1 from %2 to %3.").arg(change.index + 1).arg(change.originName).arg(change.targetName);
|
|
||||||
break;
|
|
||||||
case "buildplate_change":
|
|
||||||
text = catalog.i18nc("@label", "Change build plate to %1 (This cannot be overridden).").arg(formatBuildPlateType(change.target_name));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
text = "";
|
|
||||||
}
|
|
||||||
result += "<p><b>" + text + "</b></p>";
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
wrapMode: Text.WordWrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
anchors {
|
|
||||||
bottom: parent.bottom;
|
|
||||||
left: parent.left;
|
|
||||||
}
|
|
||||||
background: Rectangle {
|
|
||||||
border {
|
|
||||||
color: UM.Theme.getColor("monitor_lining_heavy");
|
|
||||||
width: UM.Theme.getSize("default_lining").width;
|
|
||||||
}
|
|
||||||
color: parent.hovered ? UM.Theme.getColor("monitor_card_background_inactive") : UM.Theme.getColor("monitor_card_background");
|
|
||||||
implicitHeight: UM.Theme.getSize("default_margin").height * 3;
|
|
||||||
implicitWidth: UM.Theme.getSize("default_margin").height * 8;
|
|
||||||
}
|
|
||||||
contentItem: Label {
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
font: UM.Theme.getFont("medium");
|
|
||||||
horizontalAlignment: Text.AlignHCenter;
|
|
||||||
text: parent.text;
|
|
||||||
verticalAlignment: Text.AlignVCenter;
|
|
||||||
}
|
|
||||||
onClicked: {
|
|
||||||
overrideConfirmationDialog.visible = true;
|
|
||||||
}
|
|
||||||
text: catalog.i18nc("@label", "Override");
|
|
||||||
visible: {
|
|
||||||
if (printJob && printJob.configurationChanges) {
|
|
||||||
var length = printJob.configurationChanges.length;
|
|
||||||
for (var i = 0; i < length; i++) {
|
|
||||||
var typeOfChange = printJob.configurationChanges[i].typeOfChange;
|
|
||||||
if (typeOfChange === "material_insert" || typeOfChange === "buildplate_change") {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MessageDialog {
|
|
||||||
id: overrideConfirmationDialog;
|
|
||||||
Component.onCompleted: visible = false;
|
|
||||||
icon: StandardIcon.Warning;
|
|
||||||
onYes: OutputDevice.forceSendJob(printJob.key);
|
|
||||||
standardButtons: StandardButton.Yes | StandardButton.No;
|
|
||||||
text: {
|
|
||||||
if (!printJob) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
var printJobName = formatPrintJobName(printJob.name);
|
|
||||||
var confirmText = catalog.i18nc("@label", "Starting a print job with an incompatible configuration could damage your 3D printer. Are you sure you want to override the configuration and print %1?").arg(printJobName);
|
|
||||||
return confirmText;
|
|
||||||
}
|
|
||||||
title: catalog.i18nc("@window:title", "Override configuration configuration and start print");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Utils
|
|
||||||
function formatPrintJobName(name) {
|
|
||||||
var extensions = [ ".gz", ".gcode", ".ufp" ];
|
|
||||||
for (var i = 0; i < extensions.length; i++) {
|
|
||||||
var extension = extensions[i];
|
|
||||||
if (name.slice(-extension.length) === extension) {
|
|
||||||
name = name.substring(0, name.length - extension.length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
function materialsAreKnown(job) {
|
|
||||||
var conf0 = job.configuration[0];
|
|
||||||
if (conf0 && !conf0.material.material) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
var conf1 = job.configuration[1];
|
|
||||||
if (conf1 && !conf1.material.material) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
function formatBuildPlateType(buildPlateType) {
|
|
||||||
var translationText = "";
|
|
||||||
switch (buildPlateType) {
|
|
||||||
case "glass":
|
|
||||||
translationText = catalog.i18nc("@label", "Glass");
|
|
||||||
break;
|
|
||||||
case "aluminum":
|
|
||||||
translationText = catalog.i18nc("@label", "Aluminum");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
translationText = null;
|
|
||||||
}
|
|
||||||
return translationText;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,75 +0,0 @@
|
||||||
// Copyright (c) 2018 Ultimaker B.V.
|
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
|
||||||
|
|
||||||
import QtQuick 2.3
|
|
||||||
import QtQuick.Dialogs 1.1
|
|
||||||
import QtQuick.Controls 2.0
|
|
||||||
import QtQuick.Controls.Styles 1.3
|
|
||||||
import QtGraphicalEffects 1.0
|
|
||||||
import QtQuick.Controls 1.4 as LegacyControls
|
|
||||||
import UM 1.3 as UM
|
|
||||||
|
|
||||||
// Includes print job name, owner, and preview
|
|
||||||
|
|
||||||
Item {
|
|
||||||
property var job: null;
|
|
||||||
property var useUltibot: false;
|
|
||||||
height: 100 * screenScaleFactor;
|
|
||||||
width: height;
|
|
||||||
|
|
||||||
// Skeleton
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("monitor_skeleton_fill");
|
|
||||||
radius: UM.Theme.getSize("default_margin").width;
|
|
||||||
visible: !job;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actual content
|
|
||||||
Image {
|
|
||||||
id: previewImage;
|
|
||||||
visible: job;
|
|
||||||
source: job ? job.previewImageUrl : "";
|
|
||||||
opacity: {
|
|
||||||
if (job == null) {
|
|
||||||
return 1.0;
|
|
||||||
}
|
|
||||||
var states = ["wait_cleanup", "wait_user_action", "error", "paused"];
|
|
||||||
if (states.indexOf(job.state) !== -1) {
|
|
||||||
return 0.5;
|
|
||||||
}
|
|
||||||
return 1.0;
|
|
||||||
}
|
|
||||||
anchors.fill: parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
UM.RecolorImage {
|
|
||||||
id: ultibotImage;
|
|
||||||
anchors.centerIn: parent;
|
|
||||||
color: UM.Theme.getColor("monitor_placeholder_image"); // TODO: Theme!
|
|
||||||
height: parent.height;
|
|
||||||
source: "../svg/ultibot.svg";
|
|
||||||
sourceSize {
|
|
||||||
height: height;
|
|
||||||
width: width;
|
|
||||||
}
|
|
||||||
/* Since print jobs ALWAYS have an image url, we have to check if that image URL errors or
|
|
||||||
not in order to determine if we show the placeholder (ultibot) image instead. */
|
|
||||||
visible: job && previewImage.status == Image.Error;
|
|
||||||
width: parent.width;
|
|
||||||
}
|
|
||||||
|
|
||||||
UM.RecolorImage {
|
|
||||||
id: statusImage;
|
|
||||||
anchors.centerIn: parent;
|
|
||||||
color: "black"; // TODO: Theme!
|
|
||||||
height: Math.round(0.5 * parent.height);
|
|
||||||
source: job && job.state == "error" ? "../svg/aborted-icon.svg" : "";
|
|
||||||
sourceSize {
|
|
||||||
height: height;
|
|
||||||
width: width;
|
|
||||||
}
|
|
||||||
visible: source != "";
|
|
||||||
width: Math.round(0.5 * parent.width);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,59 +0,0 @@
|
||||||
// Copyright (c) 2018 Ultimaker B.V.
|
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
|
||||||
|
|
||||||
import QtQuick 2.3
|
|
||||||
import QtQuick.Controls 2.0
|
|
||||||
import UM 1.3 as UM
|
|
||||||
|
|
||||||
Column {
|
|
||||||
property var job: null;
|
|
||||||
height: childrenRect.height;
|
|
||||||
spacing: Math.floor( UM.Theme.getSize("default_margin").height / 2); // TODO: Use explicit theme size
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: jobName;
|
|
||||||
height: UM.Theme.getSize("monitor_text_line").height;
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
// Skeleton loading
|
|
||||||
Rectangle {
|
|
||||||
color: UM.Theme.getColor("monitor_skeleton_fill");
|
|
||||||
height: parent.height;
|
|
||||||
visible: !job;
|
|
||||||
width: Math.round(parent.width / 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
elide: Text.ElideRight;
|
|
||||||
font: UM.Theme.getFont("default_bold");
|
|
||||||
text: job && job.name ? job.name : "";
|
|
||||||
visible: job;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: ownerName;
|
|
||||||
height: UM.Theme.getSize("monitor_text_line").height;
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
// Skeleton loading
|
|
||||||
Rectangle {
|
|
||||||
color: UM.Theme.getColor("monitor_skeleton_fill");
|
|
||||||
height: parent.height;
|
|
||||||
visible: !job;
|
|
||||||
width: Math.round(parent.width / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("text")
|
|
||||||
elide: Text.ElideRight;
|
|
||||||
font: UM.Theme.getFont("default");
|
|
||||||
text: job ? job.owner : "";
|
|
||||||
visible: job;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,241 +0,0 @@
|
||||||
// Copyright (c) 2018 Ultimaker B.V.
|
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
|
||||||
|
|
||||||
import QtQuick 2.3
|
|
||||||
import QtQuick.Dialogs 1.1
|
|
||||||
import QtQuick.Controls 2.0
|
|
||||||
import QtQuick.Controls.Styles 1.3
|
|
||||||
import QtGraphicalEffects 1.0
|
|
||||||
import UM 1.3 as UM
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: root;
|
|
||||||
property var shadowRadius: UM.Theme.getSize("monitor_shadow_radius").width;
|
|
||||||
property var shadowOffset: UM.Theme.getSize("monitor_shadow_offset").width;
|
|
||||||
property var printer: null;
|
|
||||||
property var collapsed: true;
|
|
||||||
height: childrenRect.height + shadowRadius * 2; // Bubbles upward
|
|
||||||
width: parent.width; // Bubbles downward
|
|
||||||
|
|
||||||
// The actual card (white block)
|
|
||||||
Rectangle {
|
|
||||||
// 5px margin, but shifted 2px vertically because of the shadow
|
|
||||||
anchors {
|
|
||||||
bottomMargin: root.shadowRadius + root.shadowOffset;
|
|
||||||
leftMargin: root.shadowRadius;
|
|
||||||
rightMargin: root.shadowRadius;
|
|
||||||
topMargin: root.shadowRadius - root.shadowOffset;
|
|
||||||
}
|
|
||||||
color: {
|
|
||||||
if (!printer) {
|
|
||||||
return UM.Theme.getColor("monitor_card_background_inactive");
|
|
||||||
}
|
|
||||||
if (printer.state == "disabled") {
|
|
||||||
return UM.Theme.getColor("monitor_card_background_inactive");
|
|
||||||
} else {
|
|
||||||
return UM.Theme.getColor("monitor_card_background");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
height: childrenRect.height;
|
|
||||||
layer.effect: DropShadow {
|
|
||||||
radius: root.shadowRadius;
|
|
||||||
verticalOffset: root.shadowOffset;
|
|
||||||
color: "#3F000000"; // 25% shadow
|
|
||||||
}
|
|
||||||
layer.enabled: true
|
|
||||||
width: parent.width - 2 * shadowRadius;
|
|
||||||
|
|
||||||
Column {
|
|
||||||
id: cardContents;
|
|
||||||
height: childrenRect.height;
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
// Main card
|
|
||||||
Item {
|
|
||||||
id: mainCard;
|
|
||||||
anchors {
|
|
||||||
left: parent.left;
|
|
||||||
leftMargin: UM.Theme.getSize("default_margin").width;
|
|
||||||
right: parent.right;
|
|
||||||
rightMargin: UM.Theme.getSize("default_margin").width;
|
|
||||||
}
|
|
||||||
height: 60 * screenScaleFactor + 2 * UM.Theme.getSize("default_margin").height;
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
// Machine icon
|
|
||||||
Item {
|
|
||||||
id: machineIcon;
|
|
||||||
anchors.verticalCenter: parent.verticalCenter;
|
|
||||||
height: parent.height - 2 * UM.Theme.getSize("default_margin").width;
|
|
||||||
width: height;
|
|
||||||
|
|
||||||
// Skeleton
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("monitor_skeleton_fill_dark");
|
|
||||||
radius: UM.Theme.getSize("default_margin").width;
|
|
||||||
visible: !printer;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Content
|
|
||||||
UM.RecolorImage {
|
|
||||||
anchors.centerIn: parent;
|
|
||||||
color: {
|
|
||||||
if (printer && printer.activePrintJob != undefined) {
|
|
||||||
return UM.Theme.getColor("monitor_printer_icon");
|
|
||||||
}
|
|
||||||
return UM.Theme.getColor("monitor_printer_icon_inactive");
|
|
||||||
}
|
|
||||||
height: sourceSize.height;
|
|
||||||
source: {
|
|
||||||
if (!printer) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
switch(printer.type) {
|
|
||||||
case "Ultimaker 3":
|
|
||||||
return "../svg/UM3-icon.svg";
|
|
||||||
case "Ultimaker 3 Extended":
|
|
||||||
return "../svg/UM3x-icon.svg";
|
|
||||||
case "Ultimaker S5":
|
|
||||||
return "../svg/UMs5-icon.svg";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
visible: printer;
|
|
||||||
width: sourceSize.width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Printer info
|
|
||||||
Item {
|
|
||||||
id: printerInfo;
|
|
||||||
anchors {
|
|
||||||
left: machineIcon.right;
|
|
||||||
leftMargin: UM.Theme.getSize("wide_margin").width;
|
|
||||||
right: collapseIcon.left;
|
|
||||||
verticalCenter: machineIcon.verticalCenter;
|
|
||||||
}
|
|
||||||
height: childrenRect.height;
|
|
||||||
|
|
||||||
// Machine name
|
|
||||||
Item {
|
|
||||||
id: machineNameLabel;
|
|
||||||
height: UM.Theme.getSize("monitor_text_line").height;
|
|
||||||
width: {
|
|
||||||
var percent = printer ? 0.75 : 0.3;
|
|
||||||
return Math.round(parent.width * percent);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skeleton
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("monitor_skeleton_fill_dark");
|
|
||||||
visible: !printer;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actual content
|
|
||||||
Label {
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
elide: Text.ElideRight;
|
|
||||||
font: UM.Theme.getFont("default_bold");
|
|
||||||
text: printer ? printer.name : "";
|
|
||||||
visible: printer;
|
|
||||||
width: parent.width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Job name
|
|
||||||
Item {
|
|
||||||
id: activeJobLabel;
|
|
||||||
anchors {
|
|
||||||
top: machineNameLabel.bottom;
|
|
||||||
topMargin: Math.round(UM.Theme.getSize("default_margin").height / 2);
|
|
||||||
}
|
|
||||||
height: UM.Theme.getSize("monitor_text_line").height;
|
|
||||||
width: Math.round(parent.width * 0.75);
|
|
||||||
|
|
||||||
// Skeleton
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("monitor_skeleton_fill_dark");
|
|
||||||
visible: !printer;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actual content
|
|
||||||
Label {
|
|
||||||
anchors.fill: parent;
|
|
||||||
color: UM.Theme.getColor("monitor_text_inactive");
|
|
||||||
elide: Text.ElideRight;
|
|
||||||
font: UM.Theme.getFont("default");
|
|
||||||
text: {
|
|
||||||
if (!printer) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
if (printer.state == "disabled") {
|
|
||||||
return catalog.i18nc("@label", "Not available");
|
|
||||||
} else if (printer.state == "unreachable") {
|
|
||||||
return catalog.i18nc("@label", "Unreachable");
|
|
||||||
}
|
|
||||||
if (printer.activePrintJob != null && printer.activePrintJob.name) {
|
|
||||||
return printer.activePrintJob.name;
|
|
||||||
}
|
|
||||||
return catalog.i18nc("@label", "Available");
|
|
||||||
}
|
|
||||||
visible: printer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collapse icon
|
|
||||||
UM.RecolorImage {
|
|
||||||
id: collapseIcon;
|
|
||||||
anchors {
|
|
||||||
right: parent.right;
|
|
||||||
rightMargin: UM.Theme.getSize("default_margin").width;
|
|
||||||
verticalCenter: parent.verticalCenter;
|
|
||||||
}
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
height: 15 * screenScaleFactor; // TODO: Theme!
|
|
||||||
source: root.collapsed ? UM.Theme.getIcon("arrow_left") : UM.Theme.getIcon("arrow_bottom");
|
|
||||||
sourceSize {
|
|
||||||
height: height;
|
|
||||||
width: width;
|
|
||||||
}
|
|
||||||
visible: printer;
|
|
||||||
width: 15 * screenScaleFactor; // TODO: Theme!
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent;
|
|
||||||
enabled: printer;
|
|
||||||
onClicked: {
|
|
||||||
if (model && root.collapsed) {
|
|
||||||
printerList.currentIndex = model.index;
|
|
||||||
} else {
|
|
||||||
printerList.currentIndex = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: printerList;
|
|
||||||
onCurrentIndexChanged: {
|
|
||||||
root.collapsed = printerList.currentIndex != model.index;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Detailed card
|
|
||||||
PrinterCardDetails {
|
|
||||||
collapsed: root.collapsed;
|
|
||||||
printer: root.printer;
|
|
||||||
visible: root.printer;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Progress bar
|
|
||||||
PrinterCardProgressBar {
|
|
||||||
visible: printer && printer.activePrintJob != null;
|
|
||||||
width: parent.width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,75 +0,0 @@
|
||||||
// Copyright (c) 2018 Ultimaker B.V.
|
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
|
||||||
|
|
||||||
import QtQuick 2.3
|
|
||||||
import QtQuick.Dialogs 1.1
|
|
||||||
import QtQuick.Controls 2.0
|
|
||||||
import QtQuick.Controls.Styles 1.3
|
|
||||||
import QtGraphicalEffects 1.0
|
|
||||||
import QtQuick.Controls 1.4 as LegacyControls
|
|
||||||
import UM 1.3 as UM
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: root;
|
|
||||||
property var printer: null;
|
|
||||||
property var printJob: printer ? printer.activePrintJob : null;
|
|
||||||
property var collapsed: true;
|
|
||||||
Behavior on height { NumberAnimation { duration: 100 } }
|
|
||||||
Behavior on opacity { NumberAnimation { duration: 100 } }
|
|
||||||
height: collapsed ? 0 : childrenRect.height;
|
|
||||||
opacity: collapsed ? 0 : 1;
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
Column {
|
|
||||||
id: contentColumn;
|
|
||||||
anchors {
|
|
||||||
left: parent.left;
|
|
||||||
leftMargin: UM.Theme.getSize("default_margin").width;
|
|
||||||
right: parent.right;
|
|
||||||
rightMargin: UM.Theme.getSize("default_margin").width;
|
|
||||||
}
|
|
||||||
height: childrenRect.height + UM.Theme.getSize("default_margin").height;
|
|
||||||
spacing: UM.Theme.getSize("default_margin").height;
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
HorizontalLine {}
|
|
||||||
|
|
||||||
PrinterInfoBlock {
|
|
||||||
printer: root.printer;
|
|
||||||
printJob: root.printer ? root.printer.activePrintJob : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
HorizontalLine {}
|
|
||||||
|
|
||||||
Row {
|
|
||||||
height: childrenRect.height;
|
|
||||||
visible: root.printJob;
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
PrintJobTitle {
|
|
||||||
job: root.printer ? root.printer.activePrintJob : null;
|
|
||||||
}
|
|
||||||
PrintJobContextMenu {
|
|
||||||
id: contextButton;
|
|
||||||
anchors {
|
|
||||||
right: parent.right;
|
|
||||||
rightMargin: UM.Theme.getSize("wide_margin").width;
|
|
||||||
}
|
|
||||||
printJob: root.printer ? root.printer.activePrintJob : null;
|
|
||||||
visible: printJob;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PrintJobPreview {
|
|
||||||
anchors.horizontalCenter: parent.horizontalCenter;
|
|
||||||
job: root.printer && root.printer.activePrintJob ? root.printer.activePrintJob : null;
|
|
||||||
visible: root.printJob;
|
|
||||||
}
|
|
||||||
|
|
||||||
CameraButton {
|
|
||||||
id: showCameraButton;
|
|
||||||
iconSource: "../svg/camera-icon.svg";
|
|
||||||
visible: root.printer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,108 +0,0 @@
|
||||||
// Copyright (c) 2018 Ultimaker B.V.
|
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
|
||||||
|
|
||||||
import QtQuick 2.3
|
|
||||||
import QtQuick.Controls.Styles 1.3
|
|
||||||
import QtQuick.Controls 1.4
|
|
||||||
import UM 1.3 as UM
|
|
||||||
|
|
||||||
ProgressBar {
|
|
||||||
property var progress: {
|
|
||||||
if (!printer || printer.activePrintJob == null) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
var result = printer.activePrintJob.timeElapsed / printer.activePrintJob.timeTotal;
|
|
||||||
if (result > 1.0) {
|
|
||||||
result = 1.0;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
style: ProgressBarStyle {
|
|
||||||
property var remainingTime: {
|
|
||||||
if (!printer || printer.activePrintJob == null) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* Sometimes total minus elapsed is less than 0. Use Math.max() to prevent remaining
|
|
||||||
time from ever being less than 0. Negative durations cause strange behavior such
|
|
||||||
as displaying "-1h -1m". */
|
|
||||||
return Math.max(printer.activePrintJob.timeTotal - printer.activePrintJob.timeElapsed, 0);
|
|
||||||
}
|
|
||||||
property var progressText: {
|
|
||||||
if (printer === null ) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
switch (printer.activePrintJob.state) {
|
|
||||||
case "wait_cleanup":
|
|
||||||
if (printer.activePrintJob.timeTotal > printer.activePrintJob.timeElapsed) {
|
|
||||||
return catalog.i18nc("@label:status", "Aborted");
|
|
||||||
}
|
|
||||||
return catalog.i18nc("@label:status", "Finished");
|
|
||||||
case "pre_print":
|
|
||||||
case "sent_to_printer":
|
|
||||||
return catalog.i18nc("@label:status", "Preparing");
|
|
||||||
case "aborted":
|
|
||||||
return catalog.i18nc("@label:status", "Aborted");
|
|
||||||
case "wait_user_action":
|
|
||||||
return catalog.i18nc("@label:status", "Aborted");
|
|
||||||
case "pausing":
|
|
||||||
return catalog.i18nc("@label:status", "Pausing");
|
|
||||||
case "paused":
|
|
||||||
return OutputDevice.formatDuration( remainingTime );
|
|
||||||
case "resuming":
|
|
||||||
return catalog.i18nc("@label:status", "Resuming");
|
|
||||||
case "queued":
|
|
||||||
return catalog.i18nc("@label:status", "Action required");
|
|
||||||
default:
|
|
||||||
return OutputDevice.formatDuration( remainingTime );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
background: Rectangle {
|
|
||||||
color: UM.Theme.getColor("monitor_progress_background");
|
|
||||||
implicitHeight: visible ? 24 : 0;
|
|
||||||
implicitWidth: 100;
|
|
||||||
}
|
|
||||||
progress: Rectangle {
|
|
||||||
id: progressItem;
|
|
||||||
color: {
|
|
||||||
if (! printer || !printer.activePrintJob) {
|
|
||||||
return "black";
|
|
||||||
}
|
|
||||||
var state = printer.activePrintJob.state
|
|
||||||
var inactiveStates = [
|
|
||||||
"pausing",
|
|
||||||
"paused",
|
|
||||||
"resuming",
|
|
||||||
"wait_cleanup"
|
|
||||||
];
|
|
||||||
if (inactiveStates.indexOf(state) > -1 && remainingTime > 0) {
|
|
||||||
return UM.Theme.getColor("monitor_progress_fill_inactive");
|
|
||||||
} else {
|
|
||||||
return UM.Theme.getColor("monitor_progress_fill");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: progressLabel;
|
|
||||||
anchors {
|
|
||||||
left: parent.left;
|
|
||||||
leftMargin: getTextOffset();
|
|
||||||
}
|
|
||||||
text: progressText;
|
|
||||||
anchors.verticalCenter: parent.verticalCenter;
|
|
||||||
color: progressItem.width + progressLabel.width < control.width ? UM.Theme.getColor("text") : UM.Theme.getColor("monitor_progress_fill_text");
|
|
||||||
width: contentWidth;
|
|
||||||
font: UM.Theme.getFont("default");
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTextOffset() {
|
|
||||||
if (progressItem.width + progressLabel.width + 16 < control.width) {
|
|
||||||
return progressItem.width + UM.Theme.getSize("default_margin").width;
|
|
||||||
} else {
|
|
||||||
return progressItem.width - progressLabel.width - UM.Theme.getSize("default_margin").width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
value: progress;
|
|
||||||
width: parent.width;
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
// Copyright (c) 2018 Ultimaker B.V.
|
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
|
||||||
|
|
||||||
import QtQuick 2.2
|
|
||||||
import QtQuick.Controls 1.4
|
|
||||||
import UM 1.2 as UM
|
|
||||||
|
|
||||||
Item {
|
|
||||||
property alias text: familyNameLabel.text;
|
|
||||||
property var padding: 3 * screenScaleFactor; // TODO: Theme!
|
|
||||||
implicitHeight: familyNameLabel.contentHeight + 2 * padding; // Apply the padding to top and bottom.
|
|
||||||
implicitWidth: Math.max(48 * screenScaleFactor, familyNameLabel.contentWidth + implicitHeight); // The extra height is added to ensure the radius doesn't cut something off.
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: background;
|
|
||||||
anchors {
|
|
||||||
horizontalCenter: parent.horizontalCenter;
|
|
||||||
right: parent.right;
|
|
||||||
}
|
|
||||||
color: familyNameLabel.text.length < 1 ? UM.Theme.getColor("monitor_skeleton_fill") : UM.Theme.getColor("monitor_pill_background");
|
|
||||||
height: parent.height;
|
|
||||||
radius: 0.5 * height;
|
|
||||||
width: parent.width;
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: familyNameLabel;
|
|
||||||
anchors.centerIn: parent;
|
|
||||||
color: UM.Theme.getColor("text");
|
|
||||||
text: "";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,83 +0,0 @@
|
||||||
// Copyright (c) 2018 Ultimaker B.V.
|
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
|
||||||
|
|
||||||
import QtQuick 2.3
|
|
||||||
import QtQuick.Dialogs 1.1
|
|
||||||
import QtQuick.Controls 2.0
|
|
||||||
import QtQuick.Controls.Styles 1.3
|
|
||||||
import QtGraphicalEffects 1.0
|
|
||||||
import QtQuick.Controls 1.4 as LegacyControls
|
|
||||||
import UM 1.3 as UM
|
|
||||||
|
|
||||||
// Includes printer type pill and extuder configurations
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: root;
|
|
||||||
property var printer: null;
|
|
||||||
property var printJob: null;
|
|
||||||
width: parent.width;
|
|
||||||
height: childrenRect.height;
|
|
||||||
|
|
||||||
// Printer family pills
|
|
||||||
Row {
|
|
||||||
id: printerFamilyPills;
|
|
||||||
anchors {
|
|
||||||
left: parent.left;
|
|
||||||
right: parent.right;
|
|
||||||
}
|
|
||||||
height: childrenRect.height;
|
|
||||||
spacing: Math.round(0.5 * UM.Theme.getSize("default_margin").width);
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
id: compatiblePills;
|
|
||||||
delegate: PrinterFamilyPill {
|
|
||||||
text: modelData;
|
|
||||||
}
|
|
||||||
model: printJob ? printJob.compatibleMachineFamilies : [];
|
|
||||||
visible: printJob;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
PrinterFamilyPill {
|
|
||||||
text: printer ? printer.type : "";
|
|
||||||
visible: !compatiblePills.visible && printer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extruder info
|
|
||||||
Row {
|
|
||||||
id: extrudersInfo;
|
|
||||||
anchors {
|
|
||||||
left: parent.left;
|
|
||||||
right: parent.right;
|
|
||||||
rightMargin: UM.Theme.getSize("default_margin").width;
|
|
||||||
top: printerFamilyPills.bottom;
|
|
||||||
topMargin: UM.Theme.getSize("default_margin").height;
|
|
||||||
}
|
|
||||||
height: childrenRect.height;
|
|
||||||
spacing: UM.Theme.getSize("default_margin").width;
|
|
||||||
width: parent.width;
|
|
||||||
|
|
||||||
PrintCoreConfiguration {
|
|
||||||
width: Math.round(parent.width / 2) * screenScaleFactor;
|
|
||||||
printCoreConfiguration: getExtruderConfig(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
PrintCoreConfiguration {
|
|
||||||
width: Math.round(parent.width / 2) * screenScaleFactor;
|
|
||||||
printCoreConfiguration: getExtruderConfig(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getExtruderConfig( i ) {
|
|
||||||
if (root.printJob) {
|
|
||||||
// Use more-specific print job if possible
|
|
||||||
return root.printJob.configuration.extruderConfigurations[i];
|
|
||||||
}
|
|
||||||
if (root.printer) {
|
|
||||||
return root.printer.printerConfiguration.extruderConfigurations[i];
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -96,9 +96,7 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
|
||||||
|
|
||||||
# We use the Cura Connect monitor tab to get most functionality right away.
|
# We use the Cura Connect monitor tab to get most functionality right away.
|
||||||
self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||||
"../../resources/qml/ClusterMonitorItem.qml")
|
"../../resources/qml/MonitorStage.qml")
|
||||||
self._control_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
|
||||||
"../../resources/qml/ClusterControlItem.qml")
|
|
||||||
|
|
||||||
# Trigger the printersChanged signal when the private signal is triggered.
|
# Trigger the printersChanged signal when the private signal is triggered.
|
||||||
self.printersChanged.connect(self._clusterPrintersChanged)
|
self.printersChanged.connect(self._clusterPrintersChanged)
|
||||||
|
|
|
@ -62,7 +62,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
||||||
self._print_jobs = [] # type: List[UM3PrintJobOutputModel]
|
self._print_jobs = [] # type: List[UM3PrintJobOutputModel]
|
||||||
self._received_print_jobs = False # type: bool
|
self._received_print_jobs = False # type: bool
|
||||||
|
|
||||||
self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../resources/qml/ClusterMonitorItem.qml")
|
self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../resources/qml/MonitorStage.qml")
|
||||||
|
|
||||||
# trigger the printersChanged signal when the private signal is triggered
|
# trigger the printersChanged signal when the private signal is triggered
|
||||||
self.printersChanged.connect(self._clusterPrintersChanged)
|
self.printersChanged.connect(self._clusterPrintersChanged)
|
||||||
|
@ -552,16 +552,6 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
||||||
def _createMaterialOutputModel(self, material_data: Dict[str, Any]) -> "MaterialOutputModel":
|
def _createMaterialOutputModel(self, material_data: Dict[str, Any]) -> "MaterialOutputModel":
|
||||||
material_manager = CuraApplication.getInstance().getMaterialManager()
|
material_manager = CuraApplication.getInstance().getMaterialManager()
|
||||||
material_group_list = material_manager.getMaterialGroupListByGUID(material_data["guid"])
|
material_group_list = material_manager.getMaterialGroupListByGUID(material_data["guid"])
|
||||||
# This can happen if the connected machine has no material in one or more extruders (if GUID is empty), or the
|
|
||||||
# material is unknown to Cura, so we should return an "empty" or "unknown" material model.
|
|
||||||
if material_group_list is None:
|
|
||||||
material_name = "Empty" if len(material_data["guid"]) == 0 else "Unknown"
|
|
||||||
return MaterialOutputModel(guid = material_data["guid"],
|
|
||||||
type = material_data.get("type", ""),
|
|
||||||
color = material_data.get("color", ""),
|
|
||||||
brand = material_data.get("brand", ""),
|
|
||||||
name = material_data.get("name", material_name)
|
|
||||||
)
|
|
||||||
|
|
||||||
# Sort the material groups by "is_read_only = True" first, and then the name alphabetically.
|
# Sort the material groups by "is_read_only = True" first, and then the name alphabetically.
|
||||||
read_only_material_group_list = list(filter(lambda x: x.is_read_only, material_group_list))
|
read_only_material_group_list = list(filter(lambda x: x.is_read_only, material_group_list))
|
||||||
|
|
|
@ -123,17 +123,6 @@ UM.MainWindow
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the new fancy pattern
|
|
||||||
Image
|
|
||||||
{
|
|
||||||
id: backgroundPattern
|
|
||||||
anchors.fill: parent
|
|
||||||
fillMode: Image.Tile
|
|
||||||
source: UM.Theme.getImage("header_pattern")
|
|
||||||
horizontalAlignment: Image.AlignLeft
|
|
||||||
verticalAlignment: Image.AlignTop
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindowHeader
|
MainWindowHeader
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright (c) 2018 Ultimaker B.V.
|
||||||
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.7
|
import QtQuick 2.7
|
||||||
import QtQuick.Controls 2.3
|
import QtQuick.Controls 2.3
|
||||||
|
|
||||||
|
@ -34,12 +37,18 @@ Item
|
||||||
|
|
||||||
property alias enabled: mouseArea.enabled
|
property alias enabled: mouseArea.enabled
|
||||||
|
|
||||||
|
// Text to show when this component is disabled
|
||||||
|
property alias disabledText: disabledLabel.text
|
||||||
|
|
||||||
// Defines the alignment of the content with respect of the headerItem, by default to the right
|
// Defines the alignment of the content with respect of the headerItem, by default to the right
|
||||||
property int contentAlignment: ExpandableComponent.ContentAlignment.AlignRight
|
property int contentAlignment: ExpandableComponent.ContentAlignment.AlignRight
|
||||||
|
|
||||||
// How much spacing is needed around the contentItem
|
// How much spacing is needed around the contentItem
|
||||||
property alias contentPadding: content.padding
|
property alias contentPadding: content.padding
|
||||||
|
|
||||||
|
// Adds a title to the content item
|
||||||
|
property alias contentHeaderTitle: contentHeader.headerTitle
|
||||||
|
|
||||||
// How much spacing is needed for the contentItem by Y coordinate
|
// How much spacing is needed for the contentItem by Y coordinate
|
||||||
property var contentSpacingY: UM.Theme.getSize("narrow_margin").width
|
property var contentSpacingY: UM.Theme.getSize("narrow_margin").width
|
||||||
|
|
||||||
|
@ -55,7 +64,7 @@ Item
|
||||||
property alias iconSize: collapseButton.height
|
property alias iconSize: collapseButton.height
|
||||||
|
|
||||||
// Is the "drawer" open?
|
// Is the "drawer" open?
|
||||||
readonly property alias expanded: content.visible
|
readonly property alias expanded: contentContainer.visible
|
||||||
|
|
||||||
// What should the radius of the header be. This is also influenced by the headerCornerSide
|
// What should the radius of the header be. This is also influenced by the headerCornerSide
|
||||||
property alias headerRadius: background.radius
|
property alias headerRadius: background.radius
|
||||||
|
@ -71,7 +80,15 @@ Item
|
||||||
|
|
||||||
function toggleContent()
|
function toggleContent()
|
||||||
{
|
{
|
||||||
content.visible = !content.visible
|
contentContainer.visible = !expanded
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add this binding since the background color is not updated otherwise
|
||||||
|
Binding
|
||||||
|
{
|
||||||
|
target: background
|
||||||
|
property: "color"
|
||||||
|
value: enabled ? (expanded ? headerActiveColor : headerBackgroundColor) : UM.Theme.getColor("disabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
implicitHeight: 100 * screenScaleFactor
|
implicitHeight: 100 * screenScaleFactor
|
||||||
|
@ -82,9 +99,29 @@ Item
|
||||||
id: background
|
id: background
|
||||||
property real padding: UM.Theme.getSize("default_margin").width
|
property real padding: UM.Theme.getSize("default_margin").width
|
||||||
|
|
||||||
color: headerBackgroundColor
|
color: base.enabled ? (base.expanded ? headerActiveColor : headerBackgroundColor) : UM.Theme.getColor("disabled")
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Label
|
||||||
|
{
|
||||||
|
id: disabledLabel
|
||||||
|
visible: !base.enabled
|
||||||
|
anchors.fill: parent
|
||||||
|
leftPadding: background.padding
|
||||||
|
rightPadding: background.padding
|
||||||
|
text: ""
|
||||||
|
font: UM.Theme.getFont("default")
|
||||||
|
renderType: Text.NativeRendering
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
color: UM.Theme.getColor("text")
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
}
|
||||||
|
|
||||||
|
Item
|
||||||
|
{
|
||||||
|
anchors.fill: parent
|
||||||
|
visible: base.enabled
|
||||||
|
|
||||||
Loader
|
Loader
|
||||||
{
|
{
|
||||||
id: headerItemLoader
|
id: headerItemLoader
|
||||||
|
@ -108,11 +145,12 @@ Item
|
||||||
margins: background.padding
|
margins: background.padding
|
||||||
}
|
}
|
||||||
source: UM.Theme.getIcon("pencil")
|
source: UM.Theme.getIcon("pencil")
|
||||||
visible: source != "" && base.enabled
|
visible: source != ""
|
||||||
width: UM.Theme.getSize("standard_arrow").width
|
width: UM.Theme.getSize("standard_arrow").width
|
||||||
height: UM.Theme.getSize("standard_arrow").height
|
height: UM.Theme.getSize("standard_arrow").height
|
||||||
color: UM.Theme.getColor("small_button_text")
|
color: UM.Theme.getColor("small_button_text")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
MouseArea
|
MouseArea
|
||||||
{
|
{
|
||||||
|
@ -121,7 +159,7 @@ Item
|
||||||
onClicked: toggleContent()
|
onClicked: toggleContent()
|
||||||
hoverEnabled: true
|
hoverEnabled: true
|
||||||
onEntered: background.color = headerHoverColor
|
onEntered: background.color = headerHoverColor
|
||||||
onExited: background.color = expanded ? headerActiveColor : headerBackgroundColor
|
onExited: background.color = base.enabled ? (base.expanded ? headerActiveColor : headerBackgroundColor) : UM.Theme.getColor("disabled")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,10 +177,13 @@ Item
|
||||||
z: background.z - 1
|
z: background.z - 1
|
||||||
}
|
}
|
||||||
|
|
||||||
Control
|
Cura.RoundedRectangle
|
||||||
{
|
{
|
||||||
id: content
|
id: contentContainer
|
||||||
|
|
||||||
visible: false
|
visible: false
|
||||||
|
width: childrenRect.width
|
||||||
|
height: childrenRect.height
|
||||||
|
|
||||||
// Ensure that the content is located directly below the headerItem
|
// Ensure that the content is located directly below the headerItem
|
||||||
y: background.height + base.shadowOffset + base.contentSpacingY
|
y: background.height + base.shadowOffset + base.contentSpacingY
|
||||||
|
@ -150,17 +191,33 @@ Item
|
||||||
// Make the content aligned with the rest, using the property contentAlignment to decide whether is right or left.
|
// Make the content aligned with the rest, using the property contentAlignment to decide whether is right or left.
|
||||||
// In case of right alignment, the 3x padding is due to left, right and padding between the button & text.
|
// In case of right alignment, the 3x padding is due to left, right and padding between the button & text.
|
||||||
x: contentAlignment == ExpandableComponent.ContentAlignment.AlignRight ? -width + collapseButton.width + headerItemLoader.width + 3 * background.padding : 0
|
x: contentAlignment == ExpandableComponent.ContentAlignment.AlignRight ? -width + collapseButton.width + headerItemLoader.width + 3 * background.padding : 0
|
||||||
padding: UM.Theme.getSize("default_margin").width
|
|
||||||
|
|
||||||
background: Cura.RoundedRectangle
|
cornerSide: Cura.RoundedRectangle.Direction.All
|
||||||
{
|
|
||||||
cornerSide: Cura.RoundedRectangle.Direction.Down
|
|
||||||
color: contentBackgroundColor
|
color: contentBackgroundColor
|
||||||
border.width: UM.Theme.getSize("default_lining").width
|
border.width: UM.Theme.getSize("default_lining").width
|
||||||
border.color: UM.Theme.getColor("lining")
|
border.color: UM.Theme.getColor("lining")
|
||||||
radius: UM.Theme.getSize("default_radius").width
|
radius: UM.Theme.getSize("default_radius").width
|
||||||
|
|
||||||
|
ExpandableComponentHeader
|
||||||
|
{
|
||||||
|
id: contentHeader
|
||||||
|
headerTitle: ""
|
||||||
|
anchors
|
||||||
|
{
|
||||||
|
top: parent.top
|
||||||
|
right: parent.right
|
||||||
|
left: parent.left
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Control
|
||||||
|
{
|
||||||
|
id: content
|
||||||
|
|
||||||
|
anchors.top: contentHeader.bottom
|
||||||
|
padding: UM.Theme.getSize("default_margin").width
|
||||||
|
|
||||||
contentItem: Item {}
|
contentItem: Item {}
|
||||||
|
|
||||||
onContentItemChanged:
|
onContentItemChanged:
|
||||||
|
@ -171,6 +228,7 @@ Item
|
||||||
content.height = contentItem.height + 2 * content.padding
|
content.height = contentItem.height + 2 * content.padding
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// DO NOT MOVE UP IN THE CODE: This connection has to be here, after the definition of the content item.
|
// DO NOT MOVE UP IN THE CODE: This connection has to be here, after the definition of the content item.
|
||||||
// Apparently the order in which these are handled matters and so the height is correctly updated if this is here.
|
// Apparently the order in which these are handled matters and so the height is correctly updated if this is here.
|
||||||
|
@ -179,6 +237,10 @@ Item
|
||||||
// Since it could be that the content is dynamically populated, we should also take these changes into account.
|
// Since it could be that the content is dynamically populated, we should also take these changes into account.
|
||||||
target: content.contentItem
|
target: content.contentItem
|
||||||
onWidthChanged: content.width = content.contentItem.width + 2 * content.padding
|
onWidthChanged: content.width = content.contentItem.width + 2 * content.padding
|
||||||
onHeightChanged: content.height = content.contentItem.height + 2 * content.padding
|
onHeightChanged:
|
||||||
|
{
|
||||||
|
content.height = content.contentItem.height + 2 * content.padding
|
||||||
|
contentContainer.height = contentHeader.height + content.height
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
68
resources/qml/ExpandableComponentHeader.qml
Normal file
68
resources/qml/ExpandableComponentHeader.qml
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
// Copyright (c) 2018 Ultimaker B.V.
|
||||||
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
|
import QtQuick 2.7
|
||||||
|
import QtQuick.Controls 2.3
|
||||||
|
|
||||||
|
import UM 1.2 as UM
|
||||||
|
import Cura 1.0 as Cura
|
||||||
|
|
||||||
|
// Header of the popup
|
||||||
|
Cura.RoundedRectangle
|
||||||
|
{
|
||||||
|
id: header
|
||||||
|
|
||||||
|
property alias headerTitle: headerLabel.text
|
||||||
|
|
||||||
|
height: UM.Theme.getSize("expandable_component_content_header").height
|
||||||
|
color: UM.Theme.getColor("secondary")
|
||||||
|
cornerSide: Cura.RoundedRectangle.Direction.Up
|
||||||
|
border.width: UM.Theme.getSize("default_lining").width
|
||||||
|
border.color: UM.Theme.getColor("lining")
|
||||||
|
radius: UM.Theme.getSize("default_radius").width
|
||||||
|
|
||||||
|
Label
|
||||||
|
{
|
||||||
|
id: headerLabel
|
||||||
|
text: ""
|
||||||
|
font: UM.Theme.getFont("default")
|
||||||
|
renderType: Text.NativeRendering
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
color: UM.Theme.getColor("small_button_text")
|
||||||
|
height: parent.height
|
||||||
|
|
||||||
|
anchors
|
||||||
|
{
|
||||||
|
topMargin: UM.Theme.getSize("default_margin").height
|
||||||
|
left: parent.left
|
||||||
|
leftMargin: UM.Theme.getSize("default_margin").height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button
|
||||||
|
{
|
||||||
|
id: closeButton
|
||||||
|
width: UM.Theme.getSize("message_close").width
|
||||||
|
height: UM.Theme.getSize("message_close").height
|
||||||
|
hoverEnabled: true
|
||||||
|
|
||||||
|
anchors
|
||||||
|
{
|
||||||
|
right: parent.right
|
||||||
|
rightMargin: UM.Theme.getSize("default_margin").width
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: UM.RecolorImage
|
||||||
|
{
|
||||||
|
anchors.fill: parent
|
||||||
|
sourceSize.width: width
|
||||||
|
color: closeButton.hovered ? UM.Theme.getColor("small_button_text_hover") : UM.Theme.getColor("small_button_text")
|
||||||
|
source: UM.Theme.getIcon("cross1")
|
||||||
|
}
|
||||||
|
|
||||||
|
background: Item {}
|
||||||
|
|
||||||
|
onClicked: toggleContent() // Will hide the popup item
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright (c) 2018 Ultimaker B.V.
|
||||||
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.7
|
import QtQuick 2.7
|
||||||
import QtQuick.Controls 2.3
|
import QtQuick.Controls 2.3
|
||||||
|
|
||||||
|
@ -34,6 +37,9 @@ Item
|
||||||
|
|
||||||
property alias enabled: mouseArea.enabled
|
property alias enabled: mouseArea.enabled
|
||||||
|
|
||||||
|
// Text to show when this component is disabled
|
||||||
|
property alias disabledText: disabledLabel.text
|
||||||
|
|
||||||
// Defines the alignment of the content with respect of the headerItem, by default to the right
|
// Defines the alignment of the content with respect of the headerItem, by default to the right
|
||||||
property int contentAlignment: ExpandablePopup.ContentAlignment.AlignRight
|
property int contentAlignment: ExpandablePopup.ContentAlignment.AlignRight
|
||||||
|
|
||||||
|
@ -83,6 +89,14 @@ Item
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add this binding since the background color is not updated otherwise
|
||||||
|
Binding
|
||||||
|
{
|
||||||
|
target: background
|
||||||
|
property: "color"
|
||||||
|
value: enabled ? headerBackgroundColor : UM.Theme.getColor("disabled")
|
||||||
|
}
|
||||||
|
|
||||||
implicitHeight: 100 * screenScaleFactor
|
implicitHeight: 100 * screenScaleFactor
|
||||||
implicitWidth: 400 * screenScaleFactor
|
implicitWidth: 400 * screenScaleFactor
|
||||||
|
|
||||||
|
@ -91,9 +105,27 @@ Item
|
||||||
id: background
|
id: background
|
||||||
property real padding: UM.Theme.getSize("default_margin").width
|
property real padding: UM.Theme.getSize("default_margin").width
|
||||||
|
|
||||||
color: headerBackgroundColor
|
color: base.enabled ? headerBackgroundColor : UM.Theme.getColor("disabled")
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Label
|
||||||
|
{
|
||||||
|
id: disabledLabel
|
||||||
|
visible: !base.enabled
|
||||||
|
leftPadding: background.padding
|
||||||
|
text: ""
|
||||||
|
font: UM.Theme.getFont("default")
|
||||||
|
renderType: Text.NativeRendering
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
color: UM.Theme.getColor("text")
|
||||||
|
height: parent.height
|
||||||
|
}
|
||||||
|
|
||||||
|
Item
|
||||||
|
{
|
||||||
|
anchors.fill: parent
|
||||||
|
visible: base.enabled
|
||||||
|
|
||||||
Loader
|
Loader
|
||||||
{
|
{
|
||||||
id: headerItemLoader
|
id: headerItemLoader
|
||||||
|
@ -128,11 +160,12 @@ Item
|
||||||
margins: background.padding
|
margins: background.padding
|
||||||
}
|
}
|
||||||
source: expanded ? UM.Theme.getIcon("arrow_bottom") : UM.Theme.getIcon("arrow_left")
|
source: expanded ? UM.Theme.getIcon("arrow_bottom") : UM.Theme.getIcon("arrow_left")
|
||||||
visible: source != "" && base.enabled
|
visible: source != ""
|
||||||
width: UM.Theme.getSize("standard_arrow").width
|
width: UM.Theme.getSize("standard_arrow").width
|
||||||
height: UM.Theme.getSize("standard_arrow").height
|
height: UM.Theme.getSize("standard_arrow").height
|
||||||
color: UM.Theme.getColor("small_button_text")
|
color: UM.Theme.getColor("small_button_text")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
MouseArea
|
MouseArea
|
||||||
{
|
{
|
||||||
|
@ -141,7 +174,7 @@ Item
|
||||||
onClicked: toggleContent()
|
onClicked: toggleContent()
|
||||||
hoverEnabled: true
|
hoverEnabled: true
|
||||||
onEntered: background.color = headerHoverColor
|
onEntered: background.color = headerHoverColor
|
||||||
onExited: background.color = headerBackgroundColor
|
onExited: background.color = base.enabled ? headerBackgroundColor : UM.Theme.getColor("disabled")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ Button
|
||||||
id: contentColumn
|
id: contentColumn
|
||||||
width: parent.width
|
width: parent.width
|
||||||
padding: UM.Theme.getSize("wide_margin").width
|
padding: UM.Theme.getSize("wide_margin").width
|
||||||
spacing: Math.round(UM.Theme.getSize("default_margin").height / 2)
|
spacing: UM.Theme.getSize("narrow_margin").height
|
||||||
|
|
||||||
Row
|
Row
|
||||||
{
|
{
|
||||||
|
|
|
@ -12,7 +12,7 @@ Column
|
||||||
id: base
|
id: base
|
||||||
property var outputDevice: null
|
property var outputDevice: null
|
||||||
height: childrenRect.height + 2 * padding
|
height: childrenRect.height + 2 * padding
|
||||||
spacing: Math.round(UM.Theme.getSize("default_margin").height / 2)
|
spacing: UM.Theme.getSize("narrow_margin").height
|
||||||
|
|
||||||
function forceModelUpdate()
|
function forceModelUpdate()
|
||||||
{
|
{
|
||||||
|
@ -55,7 +55,7 @@ Column
|
||||||
ListView
|
ListView
|
||||||
{
|
{
|
||||||
id: configurationList
|
id: configurationList
|
||||||
spacing: Math.round(UM.Theme.getSize("default_margin").height / 2)
|
spacing: UM.Theme.getSize("narrow_margin").height
|
||||||
width: container.width - ((height > container.maximumHeight) ? container.ScrollBar.vertical.background.width : 0) //Make room for scroll bar if there is any.
|
width: container.width - ((height > container.maximumHeight) ? container.ScrollBar.vertical.background.width : 0) //Make room for scroll bar if there is any.
|
||||||
contentHeight: childrenRect.height
|
contentHeight: childrenRect.height
|
||||||
height: childrenRect.height
|
height: childrenRect.height
|
||||||
|
@ -64,7 +64,7 @@ Column
|
||||||
section.criteria: ViewSection.FullString
|
section.criteria: ViewSection.FullString
|
||||||
section.delegate: Item
|
section.delegate: Item
|
||||||
{
|
{
|
||||||
height: printerTypeLabel.height + UM.Theme.getSize("default_margin").height * 2 //Causes a default margin above the label and a default margin below the label.
|
height: printerTypeLabel.height + UM.Theme.getSize("wide_margin").height //Causes a default margin above the label and a default margin below the label.
|
||||||
Cura.PrinterTypeLabel
|
Cura.PrinterTypeLabel
|
||||||
{
|
{
|
||||||
id: printerTypeLabel
|
id: printerTypeLabel
|
||||||
|
|
|
@ -11,10 +11,12 @@ Cura.ExpandableComponent
|
||||||
{
|
{
|
||||||
id: printSetupSelector
|
id: printSetupSelector
|
||||||
|
|
||||||
property string enabledText: catalog.i18nc("@label:Should be short", "On")
|
property bool preSlicedData: PrintInformation.preSliced
|
||||||
property string disabledText: catalog.i18nc("@label:Should be short", "Off")
|
|
||||||
|
|
||||||
contentPadding: UM.Theme.getSize("default_lining").width
|
contentPadding: UM.Theme.getSize("default_lining").width
|
||||||
|
contentHeaderTitle: catalog.i18nc("@label", "Print settings")
|
||||||
|
enabled: !preSlicedData
|
||||||
|
disabledText: catalog.i18nc("@label shown when we load a Gcode file", "Print setup disabled. G code file can not be modified.")
|
||||||
|
|
||||||
UM.I18nCatalog
|
UM.I18nCatalog
|
||||||
{
|
{
|
||||||
|
@ -22,10 +24,7 @@ Cura.ExpandableComponent
|
||||||
name: "cura"
|
name: "cura"
|
||||||
}
|
}
|
||||||
|
|
||||||
headerItem: PrintSetupSelectorHeader
|
headerItem: PrintSetupSelectorHeader {}
|
||||||
{
|
|
||||||
anchors.fill: parent
|
|
||||||
}
|
|
||||||
|
|
||||||
Cura.ExtrudersModel
|
Cura.ExtrudersModel
|
||||||
{
|
{
|
||||||
|
|
|
@ -12,7 +12,7 @@ import "Custom"
|
||||||
|
|
||||||
Item
|
Item
|
||||||
{
|
{
|
||||||
id: popup
|
id: content
|
||||||
|
|
||||||
width: UM.Theme.getSize("print_setup_widget").width - 2 * UM.Theme.getSize("default_margin").width
|
width: UM.Theme.getSize("print_setup_widget").width - 2 * UM.Theme.getSize("default_margin").width
|
||||||
height: childrenRect.height
|
height: childrenRect.height
|
||||||
|
@ -36,77 +36,6 @@ Item
|
||||||
}
|
}
|
||||||
onCurrentModeIndexChanged: UM.Preferences.setValue("cura/active_mode", currentModeIndex)
|
onCurrentModeIndexChanged: UM.Preferences.setValue("cura/active_mode", currentModeIndex)
|
||||||
|
|
||||||
|
|
||||||
// Header of the popup
|
|
||||||
Rectangle
|
|
||||||
{
|
|
||||||
id: header
|
|
||||||
height: UM.Theme.getSize("print_setup_widget_header").height
|
|
||||||
color: UM.Theme.getColor("secondary")
|
|
||||||
|
|
||||||
anchors
|
|
||||||
{
|
|
||||||
top: parent.top
|
|
||||||
right: parent.right
|
|
||||||
left: parent.left
|
|
||||||
}
|
|
||||||
|
|
||||||
Label
|
|
||||||
{
|
|
||||||
id: headerLabel
|
|
||||||
text: catalog.i18nc("@label", "Print settings")
|
|
||||||
font: UM.Theme.getFont("default")
|
|
||||||
renderType: Text.NativeRendering
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
color: UM.Theme.getColor("text")
|
|
||||||
height: parent.height
|
|
||||||
|
|
||||||
anchors
|
|
||||||
{
|
|
||||||
topMargin: UM.Theme.getSize("default_margin").height
|
|
||||||
left: parent.left
|
|
||||||
leftMargin: UM.Theme.getSize("default_margin").height
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button
|
|
||||||
{
|
|
||||||
id: closeButton
|
|
||||||
width: UM.Theme.getSize("message_close").width
|
|
||||||
height: UM.Theme.getSize("message_close").height
|
|
||||||
|
|
||||||
anchors
|
|
||||||
{
|
|
||||||
right: parent.right
|
|
||||||
rightMargin: UM.Theme.getSize("default_margin").width
|
|
||||||
verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
contentItem: UM.RecolorImage
|
|
||||||
{
|
|
||||||
anchors.fill: parent
|
|
||||||
sourceSize.width: width
|
|
||||||
sourceSize.height: width
|
|
||||||
color: UM.Theme.getColor("message_text")
|
|
||||||
source: UM.Theme.getIcon("cross1")
|
|
||||||
}
|
|
||||||
|
|
||||||
background: Item {}
|
|
||||||
|
|
||||||
onClicked: toggleContent() // Will hide the popup item
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle
|
|
||||||
{
|
|
||||||
id: topSeparator
|
|
||||||
|
|
||||||
anchors.bottom: header.bottom
|
|
||||||
width: parent.width
|
|
||||||
height: UM.Theme.getSize("default_lining").height
|
|
||||||
color: UM.Theme.getColor("lining")
|
|
||||||
}
|
|
||||||
|
|
||||||
Item
|
Item
|
||||||
{
|
{
|
||||||
id: contents
|
id: contents
|
||||||
|
@ -116,7 +45,7 @@ Item
|
||||||
|
|
||||||
anchors
|
anchors
|
||||||
{
|
{
|
||||||
top: header.bottom
|
top: parent.top
|
||||||
left: parent.left
|
left: parent.left
|
||||||
right: parent.right
|
right: parent.right
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,9 @@ import Cura 1.0 as Cura
|
||||||
|
|
||||||
RowLayout
|
RowLayout
|
||||||
{
|
{
|
||||||
|
property string enabledText: catalog.i18nc("@label:Should be short", "On")
|
||||||
|
property string disabledText: catalog.i18nc("@label:Should be short", "Off")
|
||||||
|
|
||||||
Cura.IconWithText
|
Cura.IconWithText
|
||||||
{
|
{
|
||||||
source: UM.Theme.getIcon("category_layer_height")
|
source: UM.Theme.getIcon("category_layer_height")
|
||||||
|
|
|
@ -168,20 +168,23 @@ Item
|
||||||
|
|
||||||
style: ButtonStyle
|
style: ButtonStyle
|
||||||
{
|
{
|
||||||
background: Item {
|
background: Item
|
||||||
UM.RecolorImage {
|
{
|
||||||
|
UM.RecolorImage
|
||||||
|
{
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
width: UM.Theme.getSize("standard_arrow").width
|
width: UM.Theme.getSize("standard_arrow").width
|
||||||
height: UM.Theme.getSize("standard_arrow").height
|
height: UM.Theme.getSize("standard_arrow").height
|
||||||
sourceSize.width: width
|
sourceSize.width: width
|
||||||
sourceSize.height: height
|
sourceSize.height: height
|
||||||
color: control.enabled ? UM.Theme.getColor("setting_category_text") : UM.Theme.getColor("setting_category_disabled_text")
|
color: control.hovered ? UM.Theme.getColor("small_button_text_hover") : UM.Theme.getColor("small_button_text")
|
||||||
source: UM.Theme.getIcon("menu")
|
source: UM.Theme.getIcon("menu")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
label: Label{}
|
label: Label {}
|
||||||
}
|
}
|
||||||
|
|
||||||
menu: SettingVisibilityPresetsMenu
|
menu: SettingVisibilityPresetsMenu
|
||||||
{
|
{
|
||||||
onShowAllSettings:
|
onShowAllSettings:
|
||||||
|
@ -192,6 +195,14 @@ Item
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mouse area that gathers the scroll events to not propagate it to the main view.
|
||||||
|
MouseArea
|
||||||
|
{
|
||||||
|
anchors.fill: scrollView
|
||||||
|
acceptedButtons: Qt.AllButtons
|
||||||
|
onWheel: wheel.accepted = true
|
||||||
|
}
|
||||||
|
|
||||||
ScrollView
|
ScrollView
|
||||||
{
|
{
|
||||||
id: scrollView
|
id: scrollView
|
||||||
|
|
|
@ -9,7 +9,6 @@ UM.SimpleButton
|
||||||
{
|
{
|
||||||
width: UM.Theme.getSize("small_button").width
|
width: UM.Theme.getSize("small_button").width
|
||||||
height: UM.Theme.getSize("small_button").height
|
height: UM.Theme.getSize("small_button").height
|
||||||
hoverBackgroundColor: UM.Theme.getColor("small_button_hover")
|
|
||||||
hoverColor: UM.Theme.getColor("small_button_text_hover")
|
hoverColor: UM.Theme.getColor("small_button_text_hover")
|
||||||
color: UM.Theme.getColor("small_button_text")
|
color: UM.Theme.getColor("small_button_text")
|
||||||
iconMargin: 0.5 * UM.Theme.getSize("wide_lining").width
|
iconMargin: 0.5 * UM.Theme.getSize("wide_lining").width
|
||||||
|
|
|
@ -60,6 +60,7 @@ Cura.ExpandablePopup
|
||||||
{
|
{
|
||||||
left: title.right
|
left: title.right
|
||||||
leftMargin: UM.Theme.getSize("default_margin").width
|
leftMargin: UM.Theme.getSize("default_margin").width
|
||||||
|
right: parent.right
|
||||||
}
|
}
|
||||||
height: parent.height
|
height: parent.height
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
|
|
|
@ -80,7 +80,7 @@
|
||||||
"primary_hover": [48, 182, 231, 255],
|
"primary_hover": [48, 182, 231, 255],
|
||||||
"primary_text": [255, 255, 255, 255],
|
"primary_text": [255, 255, 255, 255],
|
||||||
"border": [127, 127, 127, 255],
|
"border": [127, 127, 127, 255],
|
||||||
"secondary": [245, 245, 245, 255],
|
"secondary": [240, 240, 240, 255],
|
||||||
"secondary_shadow": [216, 216, 216, 255],
|
"secondary_shadow": [216, 216, 216, 255],
|
||||||
|
|
||||||
"primary_button": [38, 113, 231, 255],
|
"primary_button": [38, 113, 231, 255],
|
||||||
|
@ -150,7 +150,7 @@
|
||||||
"small_button_active": [10, 8, 80, 255],
|
"small_button_active": [10, 8, 80, 255],
|
||||||
"small_button_active_hover": [10, 8, 80, 255],
|
"small_button_active_hover": [10, 8, 80, 255],
|
||||||
"small_button_text": [102, 102, 102, 255],
|
"small_button_text": [102, 102, 102, 255],
|
||||||
"small_button_text_hover": [255, 255, 255, 255],
|
"small_button_text_hover": [8, 7, 63, 255],
|
||||||
"small_button_text_active": [255, 255, 255, 255],
|
"small_button_text_active": [255, 255, 255, 255],
|
||||||
"small_button_text_active_hover": [255, 255, 255, 255],
|
"small_button_text_active_hover": [255, 255, 255, 255],
|
||||||
|
|
||||||
|
@ -183,18 +183,18 @@
|
||||||
"scrollbar_handle_hover": [50, 130, 255, 255],
|
"scrollbar_handle_hover": [50, 130, 255, 255],
|
||||||
"scrollbar_handle_down": [50, 130, 255, 255],
|
"scrollbar_handle_down": [50, 130, 255, 255],
|
||||||
|
|
||||||
"setting_category": [245, 245, 245, 255],
|
"setting_category": [240, 240, 240, 255],
|
||||||
"setting_category_disabled": [255, 255, 255, 255],
|
"setting_category_disabled": [255, 255, 255, 255],
|
||||||
"setting_category_hover": [232, 242, 252, 255],
|
"setting_category_hover": [232, 242, 252, 255],
|
||||||
"setting_category_active": [245, 245, 245, 255],
|
"setting_category_active": [240, 240, 240, 255],
|
||||||
"setting_category_active_hover": [232, 242, 252, 255],
|
"setting_category_active_hover": [232, 242, 252, 255],
|
||||||
"setting_category_text": [35, 35, 35, 255],
|
"setting_category_text": [35, 35, 35, 255],
|
||||||
"setting_category_disabled_text": [24, 41, 77, 101],
|
"setting_category_disabled_text": [24, 41, 77, 101],
|
||||||
"setting_category_hover_text": [35, 35, 35, 255],
|
"setting_category_hover_text": [35, 35, 35, 255],
|
||||||
"setting_category_active_text": [35, 35, 35, 255],
|
"setting_category_active_text": [35, 35, 35, 255],
|
||||||
"setting_category_active_hover_text": [35, 35, 35, 255],
|
"setting_category_active_hover_text": [35, 35, 35, 255],
|
||||||
"setting_category_border": [245, 245, 245, 255],
|
"setting_category_border": [240, 240, 240, 255],
|
||||||
"setting_category_disabled_border": [245, 245, 245, 255],
|
"setting_category_disabled_border": [240, 240, 240, 255],
|
||||||
"setting_category_hover_border": [50, 130, 255, 255],
|
"setting_category_hover_border": [50, 130, 255, 255],
|
||||||
"setting_category_active_border": [50, 130, 255, 255],
|
"setting_category_active_border": [50, 130, 255, 255],
|
||||||
"setting_category_active_hover_border": [50, 130, 255, 255],
|
"setting_category_active_hover_border": [50, 130, 255, 255],
|
||||||
|
@ -205,9 +205,8 @@
|
||||||
"setting_control_border": [199, 199, 199, 255],
|
"setting_control_border": [199, 199, 199, 255],
|
||||||
"setting_control_border_highlight": [50, 130, 255, 255],
|
"setting_control_border_highlight": [50, 130, 255, 255],
|
||||||
"setting_control_text": [35, 35, 35, 255],
|
"setting_control_text": [35, 35, 35, 255],
|
||||||
"setting_control_depth_line": [199, 199, 199, 255],
|
"setting_control_button": [102, 102, 102, 255],
|
||||||
"setting_control_button": [199, 199, 199, 255],
|
"setting_control_button_hover": [8, 7, 63, 255],
|
||||||
"setting_control_button_hover": [70, 84, 113, 255],
|
|
||||||
"setting_control_disabled": [245, 245, 245, 255],
|
"setting_control_disabled": [245, 245, 245, 255],
|
||||||
"setting_control_disabled_text": [127, 127, 127, 255],
|
"setting_control_disabled_text": [127, 127, 127, 255],
|
||||||
"setting_control_disabled_border": [127, 127, 127, 255],
|
"setting_control_disabled_border": [127, 127, 127, 255],
|
||||||
|
@ -248,11 +247,13 @@
|
||||||
|
|
||||||
"message_background": [255, 255, 255, 255],
|
"message_background": [255, 255, 255, 255],
|
||||||
"message_shadow": [0, 0, 0, 120],
|
"message_shadow": [0, 0, 0, 120],
|
||||||
"message_border": [127, 127, 127, 255],
|
"message_border": [192, 193, 194, 255],
|
||||||
"message_text": [0, 0, 0, 255],
|
"message_text": [0, 0, 0, 255],
|
||||||
"message_button": [50, 130, 255, 255],
|
"message_close": [102, 102, 102, 255],
|
||||||
"message_button_hover": [50, 130, 255, 255],
|
"message_close_hover": [8, 7, 63, 255],
|
||||||
"message_button_active": [50, 130, 255, 255],
|
"message_button": [38, 113, 231, 255],
|
||||||
|
"message_button_hover": [81, 145, 247, 255],
|
||||||
|
"message_button_active": [38, 113, 231, 255],
|
||||||
"message_button_text": [255, 255, 255, 255],
|
"message_button_text": [255, 255, 255, 255],
|
||||||
"message_button_text_hover": [255, 255, 255, 255],
|
"message_button_text_hover": [255, 255, 255, 255],
|
||||||
"message_button_text_active": [255, 255, 255, 255],
|
"message_button_text_active": [255, 255, 255, 255],
|
||||||
|
@ -274,7 +275,7 @@
|
||||||
"z_axis": [0, 255, 0, 255],
|
"z_axis": [0, 255, 0, 255],
|
||||||
"all_axis": [255, 255, 255, 255],
|
"all_axis": [255, 255, 255, 255],
|
||||||
|
|
||||||
"viewport_background": [245, 245, 245, 255],
|
"viewport_background": [250, 250, 250, 255],
|
||||||
"volume_outline": [50, 130, 255, 255],
|
"volume_outline": [50, 130, 255, 255],
|
||||||
"buildplate": [244, 244, 244, 255],
|
"buildplate": [244, 244, 244, 255],
|
||||||
"buildplate_grid": [129, 131, 134, 255],
|
"buildplate_grid": [129, 131, 134, 255],
|
||||||
|
@ -362,13 +363,14 @@
|
||||||
"print_setup_mode_toggle": [0.0, 2.0],
|
"print_setup_mode_toggle": [0.0, 2.0],
|
||||||
"print_setup_item": [0.0, 2.0],
|
"print_setup_item": [0.0, 2.0],
|
||||||
"print_setup_extruder_box": [0.0, 6.0],
|
"print_setup_extruder_box": [0.0, 6.0],
|
||||||
"print_setup_widget_header": [0.0, 3.0],
|
|
||||||
"print_setup_slider_groove": [0.16, 0.16],
|
"print_setup_slider_groove": [0.16, 0.16],
|
||||||
"print_setup_slider_handle": [1.0, 1.0],
|
"print_setup_slider_handle": [1.0, 1.0],
|
||||||
"print_setup_slider_tickmarks": [0.32, 0.32],
|
"print_setup_slider_tickmarks": [0.32, 0.32],
|
||||||
"print_setup_big_item": [28, 2.5],
|
"print_setup_big_item": [28, 2.5],
|
||||||
"print_setup_icon": [1.2, 1.2],
|
"print_setup_icon": [1.2, 1.2],
|
||||||
|
|
||||||
|
"expandable_component_content_header": [0.0, 3.0],
|
||||||
|
|
||||||
"configuration_selector_mode_tabs": [0.0, 3.0],
|
"configuration_selector_mode_tabs": [0.0, 3.0],
|
||||||
|
|
||||||
"action_panel_widget": [25.0, 0.0],
|
"action_panel_widget": [25.0, 0.0],
|
||||||
|
@ -478,6 +480,8 @@
|
||||||
"message_shadow": [0, 0],
|
"message_shadow": [0, 0],
|
||||||
"message_margin": [0, 1.0],
|
"message_margin": [0, 1.0],
|
||||||
"message_inner_margin": [1.5, 1.5],
|
"message_inner_margin": [1.5, 1.5],
|
||||||
|
"message_radius": [0.25, 0.25],
|
||||||
|
"message_button_radius": [0.15, 0.15],
|
||||||
|
|
||||||
"infill_button_margin": [0.5, 0.5],
|
"infill_button_margin": [0.5, 0.5],
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue