From c11e0cecc87f768bc08980511b3a9fa810bb3fc9 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sun, 13 Jan 2019 16:58:38 +0100 Subject: [PATCH 01/19] Remove loading gif Instead of an external gif, use the BusyIndicator that exists in the ActionButton. --- plugins/CuraDrive/src/qml/images/loading.gif | Bin 6762 -> 0 bytes plugins/Toolbox/resources/images/loading.gif | Bin 93386 -> 0 bytes plugins/Toolbox/resources/images/loading.svg | 1 - .../resources/qml/ToolboxProgressButton.qml | 13 +------------ resources/qml/ActionButton.qml | 10 ++++++++++ 5 files changed, 11 insertions(+), 13 deletions(-) delete mode 100644 plugins/CuraDrive/src/qml/images/loading.gif delete mode 100644 plugins/Toolbox/resources/images/loading.gif delete mode 100644 plugins/Toolbox/resources/images/loading.svg diff --git a/plugins/CuraDrive/src/qml/images/loading.gif b/plugins/CuraDrive/src/qml/images/loading.gif deleted file mode 100644 index 791dcaa0c93f0666b0738fa04633c291fd544d91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6762 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 F;r|kGDY5_n diff --git a/plugins/Toolbox/resources/images/loading.gif b/plugins/Toolbox/resources/images/loading.gif deleted file mode 100644 index 43cc1ed6d72fbe9b118747d3fc3365c469ef5061..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93386 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 z 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 diff --git a/plugins/Toolbox/resources/images/loading.svg b/plugins/Toolbox/resources/images/loading.svg deleted file mode 100644 index 1ceb4a8d7f..0000000000 --- a/plugins/Toolbox/resources/images/loading.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml b/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml index 933e3a5900..4d4ae92e73 100644 --- a/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml +++ b/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml @@ -62,17 +62,6 @@ Item readyAction() } } - } - - AnimatedImage - { - id: loader - visible: active - source: visible ? "../images/loading.gif" : "" - width: UM.Theme.getSize("toolbox_loader").width - height: UM.Theme.getSize("toolbox_loader").height - anchors.right: button.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.verticalCenter: button.verticalCenter + busy: active } } diff --git a/resources/qml/ActionButton.qml b/resources/qml/ActionButton.qml index fabdcebc64..6406e83efe 100644 --- a/resources/qml/ActionButton.qml +++ b/resources/qml/ActionButton.qml @@ -130,5 +130,15 @@ Button height: parent.height visible: false + + RotationAnimator + { + target: busyIndicator.contentItem + running: busyIndicator.visible && busyIndicator.running + from: 0 + to: 360 + loops: Animation.Infinite + duration: 2500 + } } } \ No newline at end of file From 2435b97ef797b021e7e87b85ba18a4aad7527c92 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 15 Jan 2019 12:12:47 +0100 Subject: [PATCH 02/19] Change the style of the resize bar at the bottom of the print setup panel Make it wider and more visible to the user. Change icon. Keep margins according to the other panels. --- .../PrintSetupSelectorContents.qml | 31 +++++++++++++------ .../themes/cura-light/icons/grip_lines.svg | 4 --- resources/themes/cura-light/icons/resize.svg | 15 +++++++++ resources/themes/cura-light/theme.json | 1 + 4 files changed, 38 insertions(+), 13 deletions(-) delete mode 100644 resources/themes/cura-light/icons/grip_lines.svg create mode 100644 resources/themes/cura-light/icons/resize.svg diff --git a/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml b/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml index 7c82a7324d..83cc59838b 100644 --- a/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml +++ b/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml @@ -104,7 +104,7 @@ Item { id: buttonRow property real padding: UM.Theme.getSize("default_margin").width - height: childrenRect.height + 2 * padding + height: recommendedButton.height + 2 * padding anchors { @@ -149,9 +149,8 @@ Item left: parent.left right: parent.right bottom: parent.bottom - top: recommendedButton.bottom - topMargin: UM.Theme.getSize("default_lining").height } + height: childrenRect.height cursorShape: Qt.SplitVCursor visible: currentModeIndex == PrintSetupSelectorContents.Mode.Custom drag @@ -182,15 +181,29 @@ Item } } - UM.RecolorImage + Rectangle { - width: parent.width * 0.05 - height: parent.height * 0.3 + width: parent.width + height: UM.Theme.getSize("narrow_margin").height + color: UM.Theme.getColor("secondary") - anchors.centerIn: parent + Rectangle + { + anchors.bottom: parent.top + width: parent.width + height: UM.Theme.getSize("default_lining").height + color: UM.Theme.getColor("lining") + } - source: UM.Theme.getIcon("grip_lines") - color: UM.Theme.getColor("lining") + UM.RecolorImage + { + width: UM.Theme.getSize("drag_icon").width + height: UM.Theme.getSize("drag_icon").height + anchors.centerIn: parent + + source: UM.Theme.getIcon("resize") + color: UM.Theme.getColor("small_button_text") + } } } } diff --git a/resources/themes/cura-light/icons/grip_lines.svg b/resources/themes/cura-light/icons/grip_lines.svg deleted file mode 100644 index 253d1fb486..0000000000 --- a/resources/themes/cura-light/icons/grip_lines.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/resources/themes/cura-light/icons/resize.svg b/resources/themes/cura-light/icons/resize.svg new file mode 100644 index 0000000000..d6a16649e1 --- /dev/null +++ b/resources/themes/cura-light/icons/resize.svg @@ -0,0 +1,15 @@ + + + + Group + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index ea1c64e2ac..cd27d16cc6 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -442,6 +442,7 @@ "print_setup_slider_tickmarks": [0.32, 0.32], "print_setup_big_item": [28, 2.5], "print_setup_icon": [1.2, 1.2], + "drag_icon": [1.416, 0.25], "expandable_component_content_header": [0.0, 3.0], From 86b0ac320b486830a2a3fd8d9323a7766d1c3df2 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 16 Jan 2019 08:47:01 +0100 Subject: [PATCH 03/19] Increase the padding with the button Add more padding when the draggable area is visible --- .../qml/PrintSetupSelector/PrintSetupSelectorContents.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml b/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml index 83cc59838b..bf139b219f 100644 --- a/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml +++ b/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml @@ -104,7 +104,7 @@ Item { id: buttonRow property real padding: UM.Theme.getSize("default_margin").width - height: recommendedButton.height + 2 * padding + height: recommendedButton.height + 2 * padding + (draggableArea.visible ? draggableArea.height : 0) anchors { @@ -144,6 +144,7 @@ Item //Invisible area at the bottom with which you can resize the panel. MouseArea { + id: draggableArea anchors { left: parent.left From 13c1a706776a0db9ecf46b4c2af5f84b493d736a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 17 Jan 2019 16:31:40 +0100 Subject: [PATCH 04/19] Fix margin The theme entry didn't exist. Discovered during work on CURA-6086, but for the rest unrelated. --- .../Recommended/RecommendedTroubleshootingGuides.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedTroubleshootingGuides.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedTroubleshootingGuides.qml index 846e343028..e6706421bb 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedTroubleshootingGuides.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedTroubleshootingGuides.qml @@ -13,7 +13,7 @@ Item { id: tipsCell anchors.top: adhesionCheckBox.visible ? adhesionCheckBox.bottom : (enableSupportCheckBox.visible ? supportExtruderCombobox.bottom : infillCellRight.bottom) - anchors.topMargin: Math.round(UM.Theme.getSize("sidebar_margin").height * 2) + anchors.topMargin: Math.round(UM.Theme.getSize("default_margin").height * 2) anchors.left: parent.left width: parent.width height: tipsText.contentHeight * tipsText.lineCount @@ -22,9 +22,9 @@ Item { id: tipsText anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width + anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width + anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.top: parent.top wrapMode: Text.WordWrap text: catalog.i18nc("@label", "Need help improving your prints?
Read the Ultimaker Troubleshooting Guides").arg("https://ultimaker.com/en/troubleshooting") From 4cb7ee5fc765922340fef77230cd083a22644cc5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 17 Jan 2019 17:23:07 +0100 Subject: [PATCH 05/19] Give tabs a height It is used in the profile assistant. I don't know if it should be used, but it is. Contributes to issue CURA-6086. --- resources/themes/cura-light/theme.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index cd27d16cc6..2b42778df4 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -447,7 +447,7 @@ "expandable_component_content_header": [0.0, 3.0], "configuration_selector": [35.0, 4.0], - "configuration_selector_mode_tabs": [0.0, 3.0], + "configuration_selector_mode_tabs": [1.0, 3.0], "action_panel_widget": [26.0, 0.0], "action_panel_information_widget": [20.0, 0.0], From c602c1cf15c274555456cf4ea9612ea64b418455 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 17 Jan 2019 13:50:42 +0100 Subject: [PATCH 06/19] Use MachineManager.activeMachine instead of Application.globalstack CURA-6117 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index ef0898bb04..d5531a2773 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -151,7 +151,7 @@ class CuraEngineBackend(QObject, Backend): if self._multi_build_plate_model: self._multi_build_plate_model.activeBuildPlateChanged.connect(self._onActiveViewChanged) - self._application.globalContainerStackChanged.connect(self._onGlobalStackChanged) + self._application.getMachineManager().globalContainerChanged.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() # extruder enable / disable. Actually wanted to use machine manager here, but the initialization order causes it to crash @@ -821,7 +821,7 @@ class CuraEngineBackend(QObject, Backend): extruder.propertyChanged.disconnect(self._onSettingChanged) extruder.containersChanged.disconnect(self._onChanged) - self._global_container_stack = self._application.getGlobalContainerStack() + self._global_container_stack = self._application.getMachineManager().activeMachine if self._global_container_stack: self._global_container_stack.propertyChanged.connect(self._onSettingChanged) # Note: Only starts slicing when the value changed. From 1369c98ea62dad113fe940b73f4f5cdffb46328f Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 18 Jan 2019 16:02:23 +0100 Subject: [PATCH 07/19] Center extruder numbers on Ubuntu This one is for you @christerbeke --- .../resources/qml/MonitorIconExtruder.qml | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml index 93dbebc8c6..f7d123ada7 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml @@ -19,7 +19,7 @@ Item property int position: 0 // The extruder icon size; NOTE: This shouldn't need to be changed - property int size: 32 // TODO: Theme! + property int size: 32 * screenScaleFactor // TODO: Theme! // THe extruder icon source; NOTE: This shouldn't need to be changed property string iconSource: "../svg/icons/extruder.svg" @@ -35,27 +35,17 @@ Item width: size } - /* - * The label uses some "fancy" math to ensure that if you change the overall - * icon size, the number scales with it. That is to say, the font properties - * are linked to the icon size, NOT the theme. And that's intentional. - */ Label { id: positionLabel - font - { - pointSize: Math.round(size * 0.3125) - weight: Font.Bold - } - height: Math.round(size / 2) * screenScaleFactor + font: UM.Theme.getFont("small") + height: Math.round(size / 2) horizontalAlignment: Text.AlignHCenter text: position + 1 verticalAlignment: Text.AlignVCenter - width: Math.round(size / 2) * screenScaleFactor - x: Math.round(size * 0.25) * screenScaleFactor - y: Math.round(size * 0.15625) * screenScaleFactor - // TODO: Once 'size' is themed, screenScaleFactor won't be needed + width: Math.round(size / 2) + x: Math.round(size * 0.25) + y: Math.round(size * 0.15625) visible: position >= 0 } } \ No newline at end of file From 2e5eb611442b992ca0da60dc22a9e16538c48fa9 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 21 Jan 2019 13:07:16 +0100 Subject: [PATCH 08/19] Add theme colors Contributes to CL-1212 --- .../resources/qml/CameraButton.qml | 41 +++++++++++-------- .../resources/qml/ExpandableCard.qml | 21 +++++----- .../qml/MonitorBuildplateConfiguration.qml | 4 +- .../resources/qml/MonitorCarousel.qml | 12 +++--- .../qml/MonitorExtruderConfiguration.qml | 10 ++--- .../resources/qml/MonitorPrintJobCard.qml | 14 +++---- .../resources/qml/MonitorPrintJobPreview.qml | 2 +- .../qml/MonitorPrintJobProgressBar.qml | 8 ++-- .../resources/qml/MonitorPrinterCard.qml | 6 +-- .../qml/MonitorPrinterConfiguration.qml | 2 +- .../resources/qml/MonitorPrinterPill.qml | 4 +- .../resources/qml/MonitorQueue.qml | 6 +-- .../resources/qml/PrintJobContextMenu.qml | 2 +- resources/themes/cura-light/theme.json | 1 + 14 files changed, 70 insertions(+), 63 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml b/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml index 6f054f9c19..eded3f4db6 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml @@ -9,30 +9,35 @@ import Cura 1.0 as Cura Rectangle { id: base - property var iconSource: null; - color: "#0a0850" // TODO: Theme! - height: width; - radius: Math.round(0.5 * width); - width: 24 * screenScaleFactor; property var enabled: true + property var iconSource: null - UM.RecolorImage { - id: icon; - anchors { - horizontalCenter: parent.horizontalCenter; - verticalCenter: parent.verticalCenter; + color: UM.Theme.getColor("small_button_active") + height: UM.Theme.getSize("small_button").height + radius: Math.round(0.5 * width) + width: UM.Theme.getSize("small_button").width + + UM.RecolorImage + { + id: icon + anchors + { + horizontalCenter: parent.horizontalCenter + verticalCenter: parent.verticalCenter } - color: UM.Theme.getColor("primary_text"); - height: width; - source: iconSource; - width: Math.round(parent.width / 2); + color: UM.Theme.getColor("small_button_text_active") + height: Math.round(parent.height / 2) + source: iconSource + width: Math.round(parent.width / 2) } - MouseArea { - id: clickArea; - anchors.fill: parent; + MouseArea + { + id: clickArea + anchors.fill: parent hoverEnabled: base.enabled - onClicked: { + onClicked: + { if (base.enabled) { if (OutputDevice.activeCameraUrl != "") diff --git a/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml b/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml index d4c123652d..4af505a989 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml @@ -6,21 +6,22 @@ import QtQuick.Controls 2.0 import UM 1.3 as UM import Cura 1.0 as Cura -// TODO: Theme & documentation! -// The expandable component has 3 major sub components: -// * The headerItem Always visible and should hold some info about what happens if the component is expanded -// * The popupItem The content that needs to be shown if the component is expanded. +/** + * The expandable component has 3 major sub components: + * - The headerItem Always visible and should hold some info about what happens if the component is expanded + * - The popupItem The content that needs to be shown if the component is expanded. + */ Item { id: base property bool expanded: false property bool enabled: true - property var borderWidth: 1 - property color borderColor: "#CCCCCC" - property color headerBackgroundColor: "white" - property color headerHoverColor: "#e8f2fc" - property color drawerBackgroundColor: "white" + property var borderWidth: UM.Theme.getSize("default_lining") + property color borderColor: UM.Theme.getColor("wide_lining") + property color headerBackgroundColor: UM.Theme.getColor("main_background") + property color headerHoverColor: UM.Theme.getColor("action_button_hovered") + property color drawerBackgroundColor: UM.Theme.getColor("main_background") property alias headerItem: header.children property alias drawerItem: drawer.children @@ -65,7 +66,7 @@ Item anchors { top: header.bottom - topMargin: -1 + topMargin: UM.Theme.getSize("default_lining") * -1 } border { diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml index 192a5a7f76..8813be7217 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml @@ -49,7 +49,7 @@ Item { id: buildplateIcon anchors.centerIn: parent - color: "#0a0850" // TODO: Theme! (Standard purple) + color: UM.Theme.getColor("small_button_active") height: parent.height source: "../svg/icons/buildplate.svg" width: height @@ -60,7 +60,7 @@ Item Label { id: buildplateLabel - color: "#191919" // TODO: Theme! + color: UM.Theme.getColor("text") elide: Text.ElideRight font: UM.Theme.getFont("default") // 12pt, regular text: buildplate ? buildplate : "" diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml index de24ee5a8c..024f4f61e0 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml @@ -82,9 +82,9 @@ Item onClicked: navigateTo(currentIndex - 1) background: Rectangle { - color: leftButton.hovered ? "#e8f2fc" : "#ffffff" // TODO: Theme! + color: leftButton.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button") border.width: 1 * screenScaleFactor // TODO: Theme! - border.color: "#cccccc" // TODO: Theme! + border.color: UM.Theme.getColor("wide_lining") radius: 2 * screenScaleFactor // TODO: Theme! } contentItem: Item @@ -94,10 +94,10 @@ Item { anchors.centerIn: parent width: 18 // TODO: Theme! - height: width // TODO: Theme! - sourceSize.width: width // TODO: Theme! - sourceSize.height: width // TODO: Theme! - color: "#152950" // TODO: Theme! + height: width + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.getColor("text") source: UM.Theme.getIcon("arrow_left") } } diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml index 17c0fa8651..3fce4cf5ee 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml @@ -36,7 +36,7 @@ Item MonitorIconExtruder { id: extruderIcon - color: "#eeeeee" // TODO: Theme! + color: UM.Theme.getColor("secondary") position: 0 } @@ -48,8 +48,8 @@ Item left: extruderIcon.right leftMargin: 12 * screenScaleFactor // TODO: Theme! } - color: materialLabel.visible > 0 ? "transparent" : "#eeeeee" // TODO: Theme! height: 18 * screenScaleFactor // TODO: Theme! + color: materialLabel.visible > 0 ? "transparent" : UM.Theme.getColor("secondary") width: Math.max(materialLabel.contentWidth, 60 * screenScaleFactor) // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! @@ -57,7 +57,7 @@ Item { id: materialLabel - color: "#191919" // TODO: Theme! + color: UM.Theme.getColor("text") elide: Text.ElideRight font: UM.Theme.getFont("default") // 12pt, regular text: "" @@ -77,8 +77,8 @@ Item left: materialLabelWrapper.left bottom: parent.bottom } - color: printCoreLabel.visible > 0 ? "transparent" : "#eeeeee" // TODO: Theme! height: 18 * screenScaleFactor // TODO: Theme! + color: printCoreLabel.visible > 0 ? "transparent" : UM.Theme.getColor("secondary") width: Math.max(printCoreLabel.contentWidth, 36 * screenScaleFactor) // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! @@ -86,7 +86,7 @@ Item { id: printCoreLabel - color: "#191919" // TODO: Theme! + color: UM.Theme.getColor("text") elide: Text.ElideRight font: UM.Theme.getFont("default_bold") // 12pt, bold text: "" diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml index f2b9c3cff7..b11055f603 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml @@ -49,7 +49,7 @@ Item width: 216 * screenScaleFactor // TODO: Theme! (Should match column size) Rectangle { - color: "#eeeeee" + color: UM.Theme.getColor("secondary") width: Math.round(parent.width / 2) height: parent.height visible: !printJob @@ -57,7 +57,7 @@ Item Label { text: printJob && printJob.name ? printJob.name : "" - color: "#374355" + color: UM.Theme.getColor("text") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular visible: printJob @@ -75,7 +75,7 @@ Item width: 216 * screenScaleFactor // TODO: Theme! (Should match column size) Rectangle { - color: "#eeeeee" + color: UM.Theme.getColor("secondary") width: Math.round(parent.width / 3) height: parent.height visible: !printJob @@ -83,7 +83,7 @@ Item Label { text: printJob ? OutputDevice.formatDuration(printJob.timeTotal) : "" - color: "#374355" + color: UM.Theme.getColor("text") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular visible: printJob @@ -102,7 +102,7 @@ Item Rectangle { - color: "#eeeeee" + color: UM.Theme.getColor("secondary") width: 72 * screenScaleFactor // TODO: Theme! height: parent.height visible: !printJob @@ -112,7 +112,7 @@ Item { id: printerAssignmentLabel anchors.verticalCenter: parent.verticalCenter - color: "#374355" + color: UM.Theme.getColor("text") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular text: { @@ -186,7 +186,7 @@ Item } Label { text: printJob && printJob.owner ? printJob.owner : "" - color: "#374355" // TODO: Theme! + color: UM.Theme.getColor("text") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular anchors.top: printerConfiguration.top diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml index d0bad63258..616a23c1dc 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml @@ -19,7 +19,7 @@ Item Rectangle { anchors.fill: parent - color: printJob ? "transparent" : "#eeeeee" // TODO: Theme! + color: printJob ? "transparent" : UM.Theme.getColor("secondary") radius: 8 // TODO: Theme! Image { diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml index d5d4705a36..5b284fd2e1 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml @@ -34,16 +34,16 @@ Item { background: Rectangle { - color: "#f5f5f5" // TODO: Theme! implicitHeight: visible ? 8 * screenScaleFactor : 0 // TODO: Theme! + color: UM.Theme.getColor("progressbar_background") implicitWidth: 180 * screenScaleFactor // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! } progress: Rectangle { id: progressItem; - color: printJob && printJob.isActive ? "#3282ff" : "#CCCCCC" // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! + color: printJob && printJob.isActive ? UM.Theme.getColor("progressbar_control") : UM.Theme.getColor("progressbar_disabled") } } } @@ -56,7 +56,7 @@ Item leftMargin: 18 * screenScaleFactor // TODO: Theme! } text: printJob ? Math.round(printJob.progress * 100) + "%" : "0%" - color: printJob && printJob.isActive ? "#374355" : "#babac1" // TODO: Theme! + color: printJob && printJob.isActive ? UM.Theme.getColor("text") : UM.Theme.getColor("text_inactive") width: contentWidth font: UM.Theme.getFont("medium") // 14pt, regular @@ -72,7 +72,7 @@ Item left: percentLabel.right leftMargin: 18 * screenScaleFactor // TODO: Theme! } - color: "#374355" // TODO: Theme! + color: UM.Theme.getColor("text") font: UM.Theme.getFont("medium") // 14pt, regular text: { diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml index facfaaaaaf..a312caf124 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml @@ -69,7 +69,7 @@ Item id: printerImage width: 108 * screenScaleFactor // TODO: Theme! height: 108 * screenScaleFactor // TODO: Theme! - color: printer ? "transparent" : "#eeeeee" // TODO: Theme! + color: printer ? "transparent" : UM.Theme.getColor("secondary") radius: 8 // TODO: Theme! Image { @@ -94,8 +94,8 @@ Item { id: printerNameLabel // color: "#414054" // TODO: Theme! - color: printer ? "transparent" : "#eeeeee" // TODO: Theme! height: 18 * screenScaleFactor // TODO: Theme! + color: printer ? "transparent" : UM.Theme.getColor("secondary") width: parent.width radius: 2 * screenScaleFactor // TODO: Theme! @@ -116,8 +116,8 @@ Item Rectangle { - color: "#eeeeee" // TODO: Theme! height: 18 * screenScaleFactor // TODO: Theme! + color: UM.Theme.getColor("secondary") radius: 2 * screenScaleFactor // TODO: Theme! visible: !printer width: 48 * screenScaleFactor // TODO: Theme! diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml index debc8b7959..9c30fec3fc 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml @@ -37,7 +37,7 @@ Item MonitorExtruderConfiguration { - color: modelData && modelData.activeMaterial ? modelData.activeMaterial.color : "#eeeeee" // TODO: Theme! + color: modelData && modelData.activeMaterial ? modelData.activeMaterial.color : UM.Theme.getColor("secondary") material: modelData && modelData.activeMaterial ? modelData.activeMaterial.name : "" position: modelData && typeof(modelData.position) === "number" ? modelData.position : -1 // Use negative one to create empty extruder number printCore: modelData ? modelData.hotendID : "" diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml index 2408089e1e..1d2bb5a923 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml @@ -32,14 +32,14 @@ Item Rectangle { id: background anchors.fill: parent - color: printerNameLabel.visible ? "#e4e4f2" : "#eeeeee"// TODO: Theme! + color: printerNameLabel.visible ? UM.Theme.getColor("printer_type_label_background") : UM.Theme.getColor("secondary") radius: 2 * screenScaleFactor // TODO: Theme! } Label { id: printerNameLabel anchors.centerIn: parent - color: "#535369" // TODO: Theme! + color: UM.Theme.getColor("text") text: tagText font.pointSize: 10 // TODO: Theme! visible: text !== "" diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml index f2dc09de95..2a0e1cab7b 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml @@ -94,7 +94,7 @@ Item Label { text: catalog.i18nc("@label", "Print jobs") - color: "#666666" + color: UM.Theme.getColor("text_scene") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular anchors.verticalCenter: parent.verticalCenter @@ -108,7 +108,7 @@ Item Label { text: catalog.i18nc("@label", "Total print time") - color: "#666666" + color: UM.Theme.getColor("text_scene") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular anchors.verticalCenter: parent.verticalCenter @@ -122,7 +122,7 @@ Item Label { text: catalog.i18nc("@label", "Waiting for") - color: "#666666" + color: UM.Theme.getColor("text_scene") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular anchors.verticalCenter: parent.verticalCenter diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml index 5c5c892dad..0d10fe0e7c 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml @@ -18,7 +18,7 @@ Item { Button { id: button; background: Rectangle { - color: UM.Theme.getColor("viewport_background"); // TODO: Theme! + color: UM.Theme.getColor("viewport_background") height: button.height; opacity: button.down || button.hovered ? 1 : 0; radius: Math.round(0.5 * width); diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 2b42778df4..00ecd99dbc 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -298,6 +298,7 @@ "progressbar_background": [245, 245, 245, 255], "progressbar_control": [50, 130, 255, 255], + "progressbar_disabled": [204, 204, 204, 255], "slider_groove": [223, 223, 223, 255], "slider_groove_fill": [8, 7, 63, 255], From 406ef208020f99fde6306948f4da493233051890 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 21 Jan 2019 14:05:24 +0100 Subject: [PATCH 09/19] Revert "Add theme colors" This reverts commit 2e5eb611442b992ca0da60dc22a9e16538c48fa9. --- .../resources/qml/CameraButton.qml | 41 ++++++++----------- .../resources/qml/ExpandableCard.qml | 21 +++++----- .../qml/MonitorBuildplateConfiguration.qml | 4 +- .../resources/qml/MonitorCarousel.qml | 12 +++--- .../qml/MonitorExtruderConfiguration.qml | 10 ++--- .../resources/qml/MonitorPrintJobCard.qml | 14 +++---- .../resources/qml/MonitorPrintJobPreview.qml | 2 +- .../qml/MonitorPrintJobProgressBar.qml | 8 ++-- .../resources/qml/MonitorPrinterCard.qml | 6 +-- .../qml/MonitorPrinterConfiguration.qml | 2 +- .../resources/qml/MonitorPrinterPill.qml | 4 +- .../resources/qml/MonitorQueue.qml | 6 +-- .../resources/qml/PrintJobContextMenu.qml | 2 +- resources/themes/cura-light/theme.json | 1 - 14 files changed, 63 insertions(+), 70 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml b/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml index eded3f4db6..6f054f9c19 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml @@ -9,35 +9,30 @@ import Cura 1.0 as Cura Rectangle { id: base + property var iconSource: null; + color: "#0a0850" // TODO: Theme! + height: width; + radius: Math.round(0.5 * width); + width: 24 * screenScaleFactor; property var enabled: true - property var iconSource: null - color: UM.Theme.getColor("small_button_active") - height: UM.Theme.getSize("small_button").height - radius: Math.round(0.5 * width) - width: UM.Theme.getSize("small_button").width - - UM.RecolorImage - { - id: icon - anchors - { - horizontalCenter: parent.horizontalCenter - verticalCenter: parent.verticalCenter + UM.RecolorImage { + id: icon; + anchors { + horizontalCenter: parent.horizontalCenter; + verticalCenter: parent.verticalCenter; } - color: UM.Theme.getColor("small_button_text_active") - height: Math.round(parent.height / 2) - source: iconSource - width: Math.round(parent.width / 2) + color: UM.Theme.getColor("primary_text"); + height: width; + source: iconSource; + width: Math.round(parent.width / 2); } - MouseArea - { - id: clickArea - anchors.fill: parent + MouseArea { + id: clickArea; + anchors.fill: parent; hoverEnabled: base.enabled - onClicked: - { + onClicked: { if (base.enabled) { if (OutputDevice.activeCameraUrl != "") diff --git a/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml b/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml index 4af505a989..d4c123652d 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml @@ -6,22 +6,21 @@ import QtQuick.Controls 2.0 import UM 1.3 as UM import Cura 1.0 as Cura -/** - * The expandable component has 3 major sub components: - * - The headerItem Always visible and should hold some info about what happens if the component is expanded - * - The popupItem The content that needs to be shown if the component is expanded. - */ +// TODO: Theme & documentation! +// The expandable component has 3 major sub components: +// * The headerItem Always visible and should hold some info about what happens if the component is expanded +// * The popupItem The content that needs to be shown if the component is expanded. Item { id: base property bool expanded: false property bool enabled: true - property var borderWidth: UM.Theme.getSize("default_lining") - property color borderColor: UM.Theme.getColor("wide_lining") - property color headerBackgroundColor: UM.Theme.getColor("main_background") - property color headerHoverColor: UM.Theme.getColor("action_button_hovered") - property color drawerBackgroundColor: UM.Theme.getColor("main_background") + property var borderWidth: 1 + property color borderColor: "#CCCCCC" + property color headerBackgroundColor: "white" + property color headerHoverColor: "#e8f2fc" + property color drawerBackgroundColor: "white" property alias headerItem: header.children property alias drawerItem: drawer.children @@ -66,7 +65,7 @@ Item anchors { top: header.bottom - topMargin: UM.Theme.getSize("default_lining") * -1 + topMargin: -1 } border { diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml index 8813be7217..192a5a7f76 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml @@ -49,7 +49,7 @@ Item { id: buildplateIcon anchors.centerIn: parent - color: UM.Theme.getColor("small_button_active") + color: "#0a0850" // TODO: Theme! (Standard purple) height: parent.height source: "../svg/icons/buildplate.svg" width: height @@ -60,7 +60,7 @@ Item Label { id: buildplateLabel - color: UM.Theme.getColor("text") + color: "#191919" // TODO: Theme! elide: Text.ElideRight font: UM.Theme.getFont("default") // 12pt, regular text: buildplate ? buildplate : "" diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml index 024f4f61e0..de24ee5a8c 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml @@ -82,9 +82,9 @@ Item onClicked: navigateTo(currentIndex - 1) background: Rectangle { - color: leftButton.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button") + color: leftButton.hovered ? "#e8f2fc" : "#ffffff" // TODO: Theme! border.width: 1 * screenScaleFactor // TODO: Theme! - border.color: UM.Theme.getColor("wide_lining") + border.color: "#cccccc" // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! } contentItem: Item @@ -94,10 +94,10 @@ Item { anchors.centerIn: parent width: 18 // TODO: Theme! - height: width - sourceSize.width: width - sourceSize.height: width - color: UM.Theme.getColor("text") + height: width // TODO: Theme! + sourceSize.width: width // TODO: Theme! + sourceSize.height: width // TODO: Theme! + color: "#152950" // TODO: Theme! source: UM.Theme.getIcon("arrow_left") } } diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml index 3fce4cf5ee..17c0fa8651 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml @@ -36,7 +36,7 @@ Item MonitorIconExtruder { id: extruderIcon - color: UM.Theme.getColor("secondary") + color: "#eeeeee" // TODO: Theme! position: 0 } @@ -48,8 +48,8 @@ Item left: extruderIcon.right leftMargin: 12 * screenScaleFactor // TODO: Theme! } + color: materialLabel.visible > 0 ? "transparent" : "#eeeeee" // TODO: Theme! height: 18 * screenScaleFactor // TODO: Theme! - color: materialLabel.visible > 0 ? "transparent" : UM.Theme.getColor("secondary") width: Math.max(materialLabel.contentWidth, 60 * screenScaleFactor) // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! @@ -57,7 +57,7 @@ Item { id: materialLabel - color: UM.Theme.getColor("text") + color: "#191919" // TODO: Theme! elide: Text.ElideRight font: UM.Theme.getFont("default") // 12pt, regular text: "" @@ -77,8 +77,8 @@ Item left: materialLabelWrapper.left bottom: parent.bottom } + color: printCoreLabel.visible > 0 ? "transparent" : "#eeeeee" // TODO: Theme! height: 18 * screenScaleFactor // TODO: Theme! - color: printCoreLabel.visible > 0 ? "transparent" : UM.Theme.getColor("secondary") width: Math.max(printCoreLabel.contentWidth, 36 * screenScaleFactor) // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! @@ -86,7 +86,7 @@ Item { id: printCoreLabel - color: UM.Theme.getColor("text") + color: "#191919" // TODO: Theme! elide: Text.ElideRight font: UM.Theme.getFont("default_bold") // 12pt, bold text: "" diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml index b11055f603..f2b9c3cff7 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml @@ -49,7 +49,7 @@ Item width: 216 * screenScaleFactor // TODO: Theme! (Should match column size) Rectangle { - color: UM.Theme.getColor("secondary") + color: "#eeeeee" width: Math.round(parent.width / 2) height: parent.height visible: !printJob @@ -57,7 +57,7 @@ Item Label { text: printJob && printJob.name ? printJob.name : "" - color: UM.Theme.getColor("text") + color: "#374355" elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular visible: printJob @@ -75,7 +75,7 @@ Item width: 216 * screenScaleFactor // TODO: Theme! (Should match column size) Rectangle { - color: UM.Theme.getColor("secondary") + color: "#eeeeee" width: Math.round(parent.width / 3) height: parent.height visible: !printJob @@ -83,7 +83,7 @@ Item Label { text: printJob ? OutputDevice.formatDuration(printJob.timeTotal) : "" - color: UM.Theme.getColor("text") + color: "#374355" elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular visible: printJob @@ -102,7 +102,7 @@ Item Rectangle { - color: UM.Theme.getColor("secondary") + color: "#eeeeee" width: 72 * screenScaleFactor // TODO: Theme! height: parent.height visible: !printJob @@ -112,7 +112,7 @@ Item { id: printerAssignmentLabel anchors.verticalCenter: parent.verticalCenter - color: UM.Theme.getColor("text") + color: "#374355" elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular text: { @@ -186,7 +186,7 @@ Item } Label { text: printJob && printJob.owner ? printJob.owner : "" - color: UM.Theme.getColor("text") + color: "#374355" // TODO: Theme! elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular anchors.top: printerConfiguration.top diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml index 616a23c1dc..d0bad63258 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml @@ -19,7 +19,7 @@ Item Rectangle { anchors.fill: parent - color: printJob ? "transparent" : UM.Theme.getColor("secondary") + color: printJob ? "transparent" : "#eeeeee" // TODO: Theme! radius: 8 // TODO: Theme! Image { diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml index 5b284fd2e1..d5d4705a36 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml @@ -34,16 +34,16 @@ Item { background: Rectangle { + color: "#f5f5f5" // TODO: Theme! implicitHeight: visible ? 8 * screenScaleFactor : 0 // TODO: Theme! - color: UM.Theme.getColor("progressbar_background") implicitWidth: 180 * screenScaleFactor // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! } progress: Rectangle { id: progressItem; + color: printJob && printJob.isActive ? "#3282ff" : "#CCCCCC" // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! - color: printJob && printJob.isActive ? UM.Theme.getColor("progressbar_control") : UM.Theme.getColor("progressbar_disabled") } } } @@ -56,7 +56,7 @@ Item leftMargin: 18 * screenScaleFactor // TODO: Theme! } text: printJob ? Math.round(printJob.progress * 100) + "%" : "0%" - color: printJob && printJob.isActive ? UM.Theme.getColor("text") : UM.Theme.getColor("text_inactive") + color: printJob && printJob.isActive ? "#374355" : "#babac1" // TODO: Theme! width: contentWidth font: UM.Theme.getFont("medium") // 14pt, regular @@ -72,7 +72,7 @@ Item left: percentLabel.right leftMargin: 18 * screenScaleFactor // TODO: Theme! } - color: UM.Theme.getColor("text") + color: "#374355" // TODO: Theme! font: UM.Theme.getFont("medium") // 14pt, regular text: { diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml index a312caf124..facfaaaaaf 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml @@ -69,7 +69,7 @@ Item id: printerImage width: 108 * screenScaleFactor // TODO: Theme! height: 108 * screenScaleFactor // TODO: Theme! - color: printer ? "transparent" : UM.Theme.getColor("secondary") + color: printer ? "transparent" : "#eeeeee" // TODO: Theme! radius: 8 // TODO: Theme! Image { @@ -94,8 +94,8 @@ Item { id: printerNameLabel // color: "#414054" // TODO: Theme! + color: printer ? "transparent" : "#eeeeee" // TODO: Theme! height: 18 * screenScaleFactor // TODO: Theme! - color: printer ? "transparent" : UM.Theme.getColor("secondary") width: parent.width radius: 2 * screenScaleFactor // TODO: Theme! @@ -116,8 +116,8 @@ Item Rectangle { + color: "#eeeeee" // TODO: Theme! height: 18 * screenScaleFactor // TODO: Theme! - color: UM.Theme.getColor("secondary") radius: 2 * screenScaleFactor // TODO: Theme! visible: !printer width: 48 * screenScaleFactor // TODO: Theme! diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml index 9c30fec3fc..debc8b7959 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml @@ -37,7 +37,7 @@ Item MonitorExtruderConfiguration { - color: modelData && modelData.activeMaterial ? modelData.activeMaterial.color : UM.Theme.getColor("secondary") + color: modelData && modelData.activeMaterial ? modelData.activeMaterial.color : "#eeeeee" // TODO: Theme! material: modelData && modelData.activeMaterial ? modelData.activeMaterial.name : "" position: modelData && typeof(modelData.position) === "number" ? modelData.position : -1 // Use negative one to create empty extruder number printCore: modelData ? modelData.hotendID : "" diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml index 1d2bb5a923..2408089e1e 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml @@ -32,14 +32,14 @@ Item Rectangle { id: background anchors.fill: parent - color: printerNameLabel.visible ? UM.Theme.getColor("printer_type_label_background") : UM.Theme.getColor("secondary") + color: printerNameLabel.visible ? "#e4e4f2" : "#eeeeee"// TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! } Label { id: printerNameLabel anchors.centerIn: parent - color: UM.Theme.getColor("text") + color: "#535369" // TODO: Theme! text: tagText font.pointSize: 10 // TODO: Theme! visible: text !== "" diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml index 2a0e1cab7b..f2dc09de95 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml @@ -94,7 +94,7 @@ Item Label { text: catalog.i18nc("@label", "Print jobs") - color: UM.Theme.getColor("text_scene") + color: "#666666" elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular anchors.verticalCenter: parent.verticalCenter @@ -108,7 +108,7 @@ Item Label { text: catalog.i18nc("@label", "Total print time") - color: UM.Theme.getColor("text_scene") + color: "#666666" elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular anchors.verticalCenter: parent.verticalCenter @@ -122,7 +122,7 @@ Item Label { text: catalog.i18nc("@label", "Waiting for") - color: UM.Theme.getColor("text_scene") + color: "#666666" elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular anchors.verticalCenter: parent.verticalCenter diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml index 0d10fe0e7c..5c5c892dad 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml @@ -18,7 +18,7 @@ Item { Button { id: button; background: Rectangle { - color: UM.Theme.getColor("viewport_background") + color: UM.Theme.getColor("viewport_background"); // TODO: Theme! height: button.height; opacity: button.down || button.hovered ? 1 : 0; radius: Math.round(0.5 * width); diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 00ecd99dbc..2b42778df4 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -298,7 +298,6 @@ "progressbar_background": [245, 245, 245, 255], "progressbar_control": [50, 130, 255, 255], - "progressbar_disabled": [204, 204, 204, 255], "slider_groove": [223, 223, 223, 255], "slider_groove_fill": [8, 7, 63, 255], From bc9831abd1c4af4bd90ebf8681bbfe1e6d10dc45 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 21 Jan 2019 17:10:41 +0100 Subject: [PATCH 10/19] Add color theming to monitor tab Contributes to CL-1212 --- .../resources/qml/CameraButton.qml | 4 +- .../resources/qml/ExpandableCard.qml | 17 ++++--- .../qml/MonitorBuildplateConfiguration.qml | 6 +-- .../resources/qml/MonitorCarousel.qml | 22 ++++---- .../qml/MonitorExtruderConfiguration.qml | 10 ++-- .../resources/qml/MonitorIconExtruder.qml | 1 + .../resources/qml/MonitorPrintJobCard.qml | 18 +++---- .../resources/qml/MonitorPrintJobPreview.qml | 2 +- .../qml/MonitorPrintJobProgressBar.qml | 10 ++-- .../resources/qml/MonitorPrinterCard.qml | 30 +++++------ .../qml/MonitorPrinterConfiguration.qml | 2 +- .../resources/qml/MonitorPrinterPill.qml | 4 +- .../resources/qml/MonitorQueue.qml | 14 ++--- .../resources/qml/MonitorStage.qml | 21 +------- .../resources/qml/PrintJobContextMenu.qml | 8 +-- .../resources/qml/PrintJobContextMenuItem.qml | 4 +- resources/themes/cura-dark/theme.json | 51 ++++++++++++------- resources/themes/cura-light/theme.json | 51 ++++++++++++------- 18 files changed, 144 insertions(+), 131 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml b/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml index 6f054f9c19..4f90d31f0b 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml @@ -10,7 +10,7 @@ import Cura 1.0 as Cura Rectangle { id: base property var iconSource: null; - color: "#0a0850" // TODO: Theme! + color: UM.Theme.getColor("monitor_icon_primary") height: width; radius: Math.round(0.5 * width); width: 24 * screenScaleFactor; @@ -22,7 +22,7 @@ Rectangle { horizontalCenter: parent.horizontalCenter; verticalCenter: parent.verticalCenter; } - color: UM.Theme.getColor("primary_text"); + color: UM.Theme.getColor("monitor_icon_accent"); height: width; source: iconSource; width: Math.round(parent.width / 2); diff --git a/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml b/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml index d4c123652d..c839e52892 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml @@ -6,10 +6,11 @@ import QtQuick.Controls 2.0 import UM 1.3 as UM import Cura 1.0 as Cura -// TODO: Theme & documentation! -// The expandable component has 3 major sub components: -// * The headerItem Always visible and should hold some info about what happens if the component is expanded -// * The popupItem The content that needs to be shown if the component is expanded. +/** + * The expandable component has 3 major sub components: + * - The headerItem Always visible and should hold some info about what happens if the component is expanded + * - The popupItem The content that needs to be shown if the component is expanded. + */ Item { id: base @@ -17,10 +18,10 @@ Item property bool expanded: false property bool enabled: true property var borderWidth: 1 - property color borderColor: "#CCCCCC" - property color headerBackgroundColor: "white" - property color headerHoverColor: "#e8f2fc" - property color drawerBackgroundColor: "white" + property color borderColor: UM.Theme.getColor("monitor_card_border") + property color headerBackgroundColor: UM.Theme.getColor("monitor_icon_accent") + property color headerHoverColor: UM.Theme.getColor("monitor_card_hover") + property color drawerBackgroundColor: UM.Theme.getColor("monitor_icon_accent") property alias headerItem: header.children property alias drawerItem: drawer.children diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml index 192a5a7f76..d1a0c207c5 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml @@ -41,7 +41,7 @@ Item anchors.centerIn: parent height: parent.height width: height - color: buildplateIcon.visible > 0 ? "transparent" : "#eeeeee" // TODO: Theme! + color: buildplateIcon.visible > 0 ? "transparent" : UM.Theme.getColor("monitor_skeleton_loading") radius: Math.floor(height / 2) } @@ -49,7 +49,7 @@ Item { id: buildplateIcon anchors.centerIn: parent - color: "#0a0850" // TODO: Theme! (Standard purple) + color: UM.Theme.getColor("monitor_icon_primary") height: parent.height source: "../svg/icons/buildplate.svg" width: height @@ -60,7 +60,7 @@ Item Label { id: buildplateLabel - color: "#191919" // TODO: Theme! + color: UM.Theme.getColor("monitor_text_primary") elide: Text.ElideRight font: UM.Theme.getFont("default") // 12pt, regular text: buildplate ? buildplate : "" diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml index de24ee5a8c..0d7a177dd3 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml @@ -49,12 +49,12 @@ Item GradientStop { position: 0.0 - color: "#fff6f6f6" // TODO: Theme! + color: UM.Theme.getColor("monitor_stage_background") } GradientStop { position: 1.0 - color: "#66f6f6f6" // TODO: Theme! + color: UM.Theme.getColor("monitor_stage_background_fade") } } } @@ -82,9 +82,9 @@ Item onClicked: navigateTo(currentIndex - 1) background: Rectangle { - color: leftButton.hovered ? "#e8f2fc" : "#ffffff" // TODO: Theme! + color: leftButton.hovered ? UM.Theme.getColor("monitor_card_hover") : UM.Theme.getColor("monitor_card_background") border.width: 1 * screenScaleFactor // TODO: Theme! - border.color: "#cccccc" // TODO: Theme! + border.color: UM.Theme.getColor("monitor_card_border") radius: 2 * screenScaleFactor // TODO: Theme! } contentItem: Item @@ -97,7 +97,7 @@ Item height: width // TODO: Theme! sourceSize.width: width // TODO: Theme! sourceSize.height: width // TODO: Theme! - color: "#152950" // TODO: Theme! + color: UM.Theme.getColor("monitor_text_primary") source: UM.Theme.getIcon("arrow_left") } } @@ -161,9 +161,9 @@ Item hoverEnabled: true background: Rectangle { - color: rightButton.hovered ? "#e8f2fc" : "#ffffff" // TODO: Theme! + color: rightButton.hovered ? UM.Theme.getColor("monitor_card_hover") : UM.Theme.getColor("monitor_card_background") border.width: 1 * screenScaleFactor // TODO: Theme! - border.color: "#cccccc" // TODO: Theme! + border.color: UM.Theme.getColor("monitor_card_border") radius: 2 * screenScaleFactor // TODO: Theme! } contentItem: Item @@ -176,7 +176,7 @@ Item height: width // TODO: Theme! sourceSize.width: width // TODO: Theme! sourceSize.height: width // TODO: Theme! - color: "#152950" // TODO: Theme! + color: UM.Theme.getColor("monitor_text_primary") source: UM.Theme.getIcon("arrow_right") } } @@ -204,12 +204,12 @@ Item GradientStop { position: 0.0 - color: "#66f6f6f6" // TODO: Theme! + color: UM.Theme.getColor("monitor_stage_background_fade") } GradientStop { position: 1.0 - color: "#fff6f6f6" // TODO: Theme! + color: UM.Theme.getColor("monitor_stage_background") } } } @@ -238,7 +238,7 @@ Item { background: Rectangle { - color: model.index == currentIndex ? "#777777" : "#d8d8d8" // TODO: Theme! + color: model.index == currentIndex ? UM.Theme.getColor("monitor_carousel_dot_current") : UM.Theme.getColor("monitor_carousel_dot") radius: Math.floor(width / 2) width: 12 * screenScaleFactor // TODO: Theme! height: width // TODO: Theme! diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml index 17c0fa8651..4079f23b0a 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml @@ -36,7 +36,7 @@ Item MonitorIconExtruder { id: extruderIcon - color: "#eeeeee" // TODO: Theme! + color: UM.Theme.getColor("monitor_skeleton_loading") position: 0 } @@ -48,7 +48,7 @@ Item left: extruderIcon.right leftMargin: 12 * screenScaleFactor // TODO: Theme! } - color: materialLabel.visible > 0 ? "transparent" : "#eeeeee" // TODO: Theme! + color: materialLabel.visible > 0 ? "transparent" : UM.Theme.getColor("monitor_skeleton_loading") height: 18 * screenScaleFactor // TODO: Theme! width: Math.max(materialLabel.contentWidth, 60 * screenScaleFactor) // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! @@ -57,7 +57,7 @@ Item { id: materialLabel - color: "#191919" // TODO: Theme! + color: UM.Theme.getColor("monitor_text_primary") elide: Text.ElideRight font: UM.Theme.getFont("default") // 12pt, regular text: "" @@ -77,7 +77,7 @@ Item left: materialLabelWrapper.left bottom: parent.bottom } - color: printCoreLabel.visible > 0 ? "transparent" : "#eeeeee" // TODO: Theme! + color: printCoreLabel.visible > 0 ? "transparent" : UM.Theme.getColor("monitor_skeleton_loading") height: 18 * screenScaleFactor // TODO: Theme! width: Math.max(printCoreLabel.contentWidth, 36 * screenScaleFactor) // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! @@ -86,7 +86,7 @@ Item { id: printCoreLabel - color: "#191919" // TODO: Theme! + color: UM.Theme.getColor("monitor_text_primary") elide: Text.ElideRight font: UM.Theme.getFont("default_bold") // 12pt, bold text: "" diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml index f7d123ada7..c3e78317c5 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml @@ -39,6 +39,7 @@ Item { id: positionLabel font: UM.Theme.getFont("small") + color: UM.Theme.getColor("monitor_text_primary") height: Math.round(size / 2) horizontalAlignment: Text.AlignHCenter text: position + 1 diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml index f2b9c3cff7..ab3668a5e4 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml @@ -27,7 +27,7 @@ Item ExpandableCard { enabled: printJob != null - borderColor: printJob.configurationChanges.length !== 0 ? "#f5a623" : "#CCCCCC" // TODO: Theme! + borderColor: printJob && printJob.configurationChanges.length !== 0 ? UM.Theme.getColor("warning") : UM.Theme.getColor("monitor_card_border") headerItem: Row { height: 48 * screenScaleFactor // TODO: Theme! @@ -49,7 +49,7 @@ Item width: 216 * screenScaleFactor // TODO: Theme! (Should match column size) Rectangle { - color: "#eeeeee" + color: UM.Theme.getColor("monitor_skeleton_loading") width: Math.round(parent.width / 2) height: parent.height visible: !printJob @@ -57,7 +57,7 @@ Item Label { text: printJob && printJob.name ? printJob.name : "" - color: "#374355" + color: UM.Theme.getColor("monitor_text_primary") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular visible: printJob @@ -75,7 +75,7 @@ Item width: 216 * screenScaleFactor // TODO: Theme! (Should match column size) Rectangle { - color: "#eeeeee" + color: UM.Theme.getColor("monitor_skeleton_loading") width: Math.round(parent.width / 3) height: parent.height visible: !printJob @@ -83,7 +83,7 @@ Item Label { text: printJob ? OutputDevice.formatDuration(printJob.timeTotal) : "" - color: "#374355" + color: UM.Theme.getColor("monitor_text_primary") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular visible: printJob @@ -102,7 +102,7 @@ Item Rectangle { - color: "#eeeeee" + color: UM.Theme.getColor("monitor_skeleton_loading") width: 72 * screenScaleFactor // TODO: Theme! height: parent.height visible: !printJob @@ -112,7 +112,7 @@ Item { id: printerAssignmentLabel anchors.verticalCenter: parent.verticalCenter - color: "#374355" + color: UM.Theme.getColor("monitor_text_primary") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular text: { @@ -176,7 +176,7 @@ Item { id: printerConfiguration anchors.verticalCenter: parent.verticalCenter - buildplate: "Glass" + buildplate: "Glass" // TODO: I18N configurations: [ base.printJob.configuration.extruderConfigurations[0], @@ -186,7 +186,7 @@ Item } Label { text: printJob && printJob.owner ? printJob.owner : "" - color: "#374355" // TODO: Theme! + color: UM.Theme.getColor("monitor_text_primary") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular anchors.top: printerConfiguration.top diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml index d0bad63258..a392571757 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml @@ -19,7 +19,7 @@ Item Rectangle { anchors.fill: parent - color: printJob ? "transparent" : "#eeeeee" // TODO: Theme! + color: printJob ? "transparent" : UM.Theme.getColor("monitor_skeleton_loading") radius: 8 // TODO: Theme! Image { diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml index d5d4705a36..2ba70268b2 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml @@ -34,15 +34,15 @@ Item { background: Rectangle { - color: "#f5f5f5" // TODO: Theme! - implicitHeight: visible ? 8 * screenScaleFactor : 0 // TODO: Theme! + color: UM.Theme.getColor("monitor_progress_bar_empty") + implicitHeight: visible ? 12 * screenScaleFactor : 0 // TODO: Theme! implicitWidth: 180 * screenScaleFactor // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! } progress: Rectangle { id: progressItem; - color: printJob && printJob.isActive ? "#3282ff" : "#CCCCCC" // TODO: Theme! + color: printJob && printJob.isActive ? UM.Theme.getColor("monitor_progress_bar_fill") : UM.Theme.getColor("monitor_progress_bar_deactive") radius: 2 * screenScaleFactor // TODO: Theme! } } @@ -56,7 +56,7 @@ Item leftMargin: 18 * screenScaleFactor // TODO: Theme! } text: printJob ? Math.round(printJob.progress * 100) + "%" : "0%" - color: printJob && printJob.isActive ? "#374355" : "#babac1" // TODO: Theme! + color: printJob && printJob.isActive ? UM.Theme.getColor("monitor_text_primary") : UM.Theme.getColor("monitor_text_disabled") width: contentWidth font: UM.Theme.getFont("medium") // 14pt, regular @@ -72,7 +72,7 @@ Item left: percentLabel.right leftMargin: 18 * screenScaleFactor // TODO: Theme! } - color: "#374355" // TODO: Theme! + color: UM.Theme.getColor("monitor_text_primary") font: UM.Theme.getFont("medium") // 14pt, regular text: { diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml index facfaaaaaf..93f9dca76d 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml @@ -37,10 +37,10 @@ Item { id: background anchors.fill: parent - color: "#FFFFFF" // TODO: Theme! + color: UM.Theme.getColor("monitor_card_background") border { - color: "#CCCCCC" // TODO: Theme! + color: UM.Theme.getColor("monitor_card_border") width: borderSize // TODO: Remove once themed } radius: 2 * screenScaleFactor // TODO: Theme! @@ -69,7 +69,7 @@ Item id: printerImage width: 108 * screenScaleFactor // TODO: Theme! height: 108 * screenScaleFactor // TODO: Theme! - color: printer ? "transparent" : "#eeeeee" // TODO: Theme! + color: printer ? "transparent" : UM.Theme.getColor("monitor_skeleton_loading") radius: 8 // TODO: Theme! Image { @@ -94,7 +94,7 @@ Item { id: printerNameLabel // color: "#414054" // TODO: Theme! - color: printer ? "transparent" : "#eeeeee" // TODO: Theme! + color: printer ? "transparent" : UM.Theme.getColor("monitor_skeleton_loading") height: 18 * screenScaleFactor // TODO: Theme! width: parent.width radius: 2 * screenScaleFactor // TODO: Theme! @@ -102,7 +102,7 @@ Item Label { text: printer && printer.name ? printer.name : "" - color: "#414054" // TODO: Theme! + color: UM.Theme.getColor("monitor_text_primary") elide: Text.ElideRight font: UM.Theme.getFont("large") // 16pt, bold width: parent.width @@ -116,7 +116,7 @@ Item Rectangle { - color: "#eeeeee" // TODO: Theme! + color: UM.Theme.getColor("monitor_skeleton_loading") height: 18 * screenScaleFactor // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme! visible: !printer @@ -220,7 +220,7 @@ Item } border { - color: printer && printer.activePrintJob && printer.activePrintJob.configurationChanges.length > 0 ? "#f5a623" : "transparent" // TODO: Theme! + color: printer && printer.activePrintJob && printer.activePrintJob.configurationChanges.length > 0 ? UM.Theme.getColor("warning") : "transparent" // TODO: Theme! width: borderSize // TODO: Remove once themed } color: "transparent" // TODO: Theme! @@ -246,7 +246,7 @@ Item { verticalCenter: parent.verticalCenter } - color: printer ? "#414054" : "#aaaaaa" // TODO: Theme! + color: printer ? UM.Theme.getColor("monitor_text_primary") : UM.Theme.getColor("monitor_text_disabled") font: UM.Theme.getFont("large_bold") // 16pt, bold text: { if (!printer) { @@ -299,7 +299,7 @@ Item Label { id: printerJobNameLabel - color: printer && printer.activePrintJob && printer.activePrintJob.isActive ? "#414054" : "#babac1" // TODO: Theme! + color: printer && printer.activePrintJob && printer.activePrintJob.isActive ? UM.Theme.getColor("monitor_text_primary") : UM.Theme.getColor("monitor_text_disabled") elide: Text.ElideRight font: UM.Theme.getFont("large") // 16pt, bold text: printer && printer.activePrintJob ? printer.activePrintJob.name : "Untitled" // TODO: I18N @@ -319,7 +319,7 @@ Item topMargin: 6 * screenScaleFactor // TODO: Theme! left: printerJobNameLabel.left } - color: printer && printer.activePrintJob && printer.activePrintJob.isActive ? "#53657d" : "#babac1" // TODO: Theme! + color: printer && printer.activePrintJob && printer.activePrintJob.isActive ? UM.Theme.getColor("monitor_text_primary") : UM.Theme.getColor("monitor_text_disabled") elide: Text.ElideRight font: UM.Theme.getFont("default") // 12pt, regular text: printer && printer.activePrintJob ? printer.activePrintJob.owner : "Anonymous" // TODO: I18N @@ -348,7 +348,7 @@ Item verticalCenter: parent.verticalCenter } font: UM.Theme.getFont("default") - text: "Requires configuration changes" + text: "Requires configuration changes" // TODO: I18N visible: printer && printer.activePrintJob && printer.activePrintJob.configurationChanges.length > 0 && !printerStatus.visible // FIXED-LINE-HEIGHT: @@ -368,13 +368,13 @@ Item } background: Rectangle { - color: "#d8d8d8" // TODO: Theme! + color: UM.Theme.getColor("monitor_secondary_button_shadow") radius: 2 * screenScaleFactor // Todo: Theme! Rectangle { anchors.fill: parent anchors.bottomMargin: 2 * screenScaleFactor // TODO: Theme! - color: detailsButton.hovered ? "#e4e4e4" : "#f0f0f0" // TODO: Theme! + color: detailsButton.hovered ? UM.Theme.getColor("monitor_secondary_button_hover") : UM.Theme.getColor("monitor_secondary_button") radius: 2 * screenScaleFactor // Todo: Theme! } } @@ -382,9 +382,9 @@ Item { anchors.fill: parent anchors.bottomMargin: 2 * screenScaleFactor // TODO: Theme! - color: "#1e66d7" // TODO: Theme! + color: UM.Theme.getColor("monitor_secondary_button_text") font: UM.Theme.getFont("medium") // 14pt, regular - text: "Details" // TODO: I18NC! + text: catalog.i18nc("@action:button","Details"); verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter height: 18 * screenScaleFactor // TODO: Theme! diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml index debc8b7959..dbe085e18e 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml @@ -37,7 +37,7 @@ Item MonitorExtruderConfiguration { - color: modelData && modelData.activeMaterial ? modelData.activeMaterial.color : "#eeeeee" // TODO: Theme! + color: modelData && modelData.activeMaterial ? modelData.activeMaterial.color : UM.Theme.getColor("monitor_skeleton_loading") material: modelData && modelData.activeMaterial ? modelData.activeMaterial.name : "" position: modelData && typeof(modelData.position) === "number" ? modelData.position : -1 // Use negative one to create empty extruder number printCore: modelData ? modelData.hotendID : "" diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml index 2408089e1e..2aeecd5a92 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml @@ -32,14 +32,14 @@ Item Rectangle { id: background anchors.fill: parent - color: printerNameLabel.visible ? "#e4e4f2" : "#eeeeee"// TODO: Theme! + color: printerNameLabel.visible ? UM.Theme.getColor("monitor_printer_family_tag") : UM.Theme.getColor("monitor_skeleton_loading") radius: 2 * screenScaleFactor // TODO: Theme! } Label { id: printerNameLabel anchors.centerIn: parent - color: "#535369" // TODO: Theme! + color: UM.Theme.getColor("monitor_text_primary") text: tagText font.pointSize: 10 // TODO: Theme! visible: text !== "" diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml index f2dc09de95..c9996849fb 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml @@ -22,7 +22,7 @@ Item left: queuedPrintJobs.left top: parent.top } - color: UM.Theme.getColor("text") + color: UM.Theme.getColor("monitor_text_primary") font: UM.Theme.getFont("large") text: catalog.i18nc("@label", "Queued") } @@ -42,7 +42,7 @@ Item { id: externalLinkIcon anchors.verticalCenter: manageQueueLabel.verticalCenter - color: UM.Theme.getColor("text_link") + color: UM.Theme.getColor("monitor_text_link") source: UM.Theme.getIcon("external_link") width: 16 * screenScaleFactor // TODO: Theme! (Y U NO USE 18 LIKE ALL OTHER ICONS?!) height: 16 * screenScaleFactor // TODO: Theme! (Y U NO USE 18 LIKE ALL OTHER ICONS?!) @@ -56,9 +56,9 @@ Item leftMargin: 6 * screenScaleFactor // TODO: Theme! verticalCenter: externalLinkIcon.verticalCenter } - color: UM.Theme.getColor("text_link") + color: UM.Theme.getColor("monitor_text_link") font: UM.Theme.getFont("default") // 12pt, regular - linkColor: UM.Theme.getColor("text_link") + linkColor: UM.Theme.getColor("monitor_text_link") text: catalog.i18nc("@label link to connect manager", "Manage queue in Cura Connect") renderType: Text.NativeRendering } @@ -94,7 +94,7 @@ Item Label { text: catalog.i18nc("@label", "Print jobs") - color: "#666666" + color: UM.Theme.getColor("monitor_text_primary") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular anchors.verticalCenter: parent.verticalCenter @@ -108,7 +108,7 @@ Item Label { text: catalog.i18nc("@label", "Total print time") - color: "#666666" + color: UM.Theme.getColor("monitor_text_primary") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular anchors.verticalCenter: parent.verticalCenter @@ -122,7 +122,7 @@ Item Label { text: catalog.i18nc("@label", "Waiting for") - color: "#666666" + color: UM.Theme.getColor("monitor_text_primary") elide: Text.ElideRight font: UM.Theme.getFont("medium") // 14pt, regular anchors.verticalCenter: parent.verticalCenter diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml index 8723e6f46e..59cbda7172 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml @@ -11,7 +11,7 @@ import QtGraphicalEffects 1.0 // This is the root component for the monitor stage. Component { - Item + Rectangle { id: monitorFrame @@ -24,6 +24,7 @@ Component } } width: maximumWidth + color: UM.Theme.getColor("monitor_stage_background") // Enable keyboard navigation. NOTE: This is done here so that we can also potentially // forward to the queue items in the future. (Deleting selected print job, etc.) @@ -36,24 +37,6 @@ Component name: "cura" } - LinearGradient - { - anchors.fill: parent - gradient: Gradient - { - GradientStop - { - position: 0.0 - color: "#f6f6f6" // TODO: Theme! - } - GradientStop - { - position: 1.0 - color: "#ffffff" // TODO: Theme! - } - } - } - Item { id: printers diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml index 5c5c892dad..59d7b85862 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml @@ -18,14 +18,14 @@ Item { Button { id: button; background: Rectangle { - color: UM.Theme.getColor("viewport_background"); // TODO: Theme! + color: UM.Theme.getColor("monitor_card_hover"); // TODO: Theme! height: button.height; opacity: button.down || button.hovered ? 1 : 0; radius: Math.round(0.5 * width); width: button.width; } contentItem: Label { - color: UM.Theme.getColor("monitor_context_menu_dots"); + color: UM.Theme.getColor("monitor_text_primary") font.pixelSize: 32 * screenScaleFactor; horizontalAlignment: Text.AlignHCenter; text: button.text; @@ -74,7 +74,7 @@ Item { right: bloop.right; rightMargin: 24 * screenScaleFactor; } - color: UM.Theme.getColor("monitor_context_menu_background"); + color: UM.Theme.getColor("monitor_context_menu") height: 14 * screenScaleFactor; transform: Rotation { angle: 45; @@ -91,7 +91,7 @@ Item { top: parent.top; topMargin: 8 * screenScaleFactor; // Because of the shadow + point } - color: UM.Theme.getColor("monitor_context_menu_background"); + color: UM.Theme.getColor("monitor_context_menu"); width: parent.width; } } diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenuItem.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenuItem.qml index eea8fac3e1..67c82db320 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenuItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenuItem.qml @@ -9,10 +9,10 @@ import UM 1.3 as UM Button { background: Rectangle { opacity: parent.down || parent.hovered ? 1 : 0; - color: UM.Theme.getColor("monitor_context_menu_highlight"); + color: UM.Theme.getColor("monitor_context_menu_hover") } contentItem: Label { - color: enabled ? UM.Theme.getColor("text") : UM.Theme.getColor("text_inactive"); + color: enabled ? UM.Theme.getColor("monitor_text_primary") : UM.Theme.getColor("monitor_text_disabled"); text: parent.text horizontalAlignment: Text.AlignLeft; verticalAlignment: Text.AlignVCenter; diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json index 6b29073475..56369b9508 100644 --- a/resources/themes/cura-dark/theme.json +++ b/resources/themes/cura-dark/theme.json @@ -215,24 +215,39 @@ "toolbox_header_button_text_inactive": [128, 128, 128, 255], "toolbox_header_button_text_hovered": [255, 255, 255, 255], - "monitor_card_background_inactive": [43, 48, 52, 255], - "monitor_card_background": [43, 48, 52, 255], - "monitor_context_menu_background": [80, 84, 87, 255], - "monitor_context_menu_dots": [0, 167, 233, 255], - "monitor_context_menu_highlight": [0, 167, 233, 255], - "monitor_image_overlay": [255, 255, 255, 255], - "monitor_lining_heavy": [255, 255, 255, 255], - "monitor_lining_light": [102, 102, 102, 255], - "monitor_pill_background": [102, 102, 102, 255], + "monitor_printer_family_tag": [86, 86, 106, 255], + "monitor_text_primary": [229, 229, 229, 255], + "monitor_text_disabled": [102, 102, 102, 255], + "monitor_text_link": [103, 160, 252, 255], + "monitor_icon_primary": [229, 229, 229, 255], + "monitor_icon_accent": [51, 53, 54, 255], + + "monitor_secondary_button_hover": [80, 80, 80, 255], + "monitor_secondary_button": [92, 92, 92, 255], + "monitor_secondary_button_text": [250, 250, 250, 255], + "monitor_secondary_button_shadow": [74, 74, 74, 255], + + "monitor_card_border": [102, 102, 102, 255], + "monitor_card_background": [51, 53, 54, 255], + "monitor_card_hover": [84, 89, 95, 255], + + "monitor_stage_background": [30, 36, 39, 255], + "monitor_stage_background_fade": [30, 36, 39, 102], + + "monitor_progress_bar_fill": [50, 130, 255, 255], + "monitor_progress_bar_deactive": [102, 102, 102, 255], + "monitor_progress_bar_empty": [67, 67, 67, 255], + + "monitor_tooltips": [25, 25, 25, 255], + "monitor_context_menu": [67, 67, 67, 255], + "monitor_context_menu_hover": [30, 102, 215, 255], + + "monitor_skeleton_loading": [102, 102, 102, 255], "monitor_placeholder_image": [102, 102, 102, 255], - "monitor_printer_icon": [255, 255, 255, 255], - "monitor_progress_background_text": [102, 102, 102, 255], - "monitor_progress_background": [80, 84, 87, 255], - "monitor_progress_fill_inactive": [216, 216, 216, 255], - "monitor_progress_fill_text": [0, 0, 0, 255], - "monitor_progress_fill": [216, 216, 216, 255], - "monotir_printer_icon_inactive": [154, 154, 154, 255], - "monitor_skeleton_fill": [31, 36, 39, 255], - "monitor_skeleton_fill_dark": [31, 36, 39, 255] + "monitor_image_overlay": [0, 0, 0, 255], + "monitor_shadow": [4, 10, 13, 255], + + "monitor_carousel_dot": [119, 119, 119, 255], + "monitor_carousel_dot_current": [216, 216, 216, 255] } } diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 2b42778df4..607711c2f3 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -399,27 +399,40 @@ "favorites_header_text_hover": [31, 36, 39, 255], "favorites_row_selected": [196, 239, 255, 255], - "monitor_card_background_inactive": [240, 240, 240, 255], + "monitor_printer_family_tag": [228, 228, 242, 255], + "monitor_text_primary": [65, 64, 84, 255], + "monitor_text_disabled": [238, 238, 238, 255], + "monitor_text_link": [50, 130, 255, 255], + "monitor_icon_primary": [10, 8, 80, 255], + "monitor_icon_accent": [255, 255, 255, 255], + + "monitor_secondary_button_hover": [228, 228, 228, 255], + "monitor_secondary_button": [240, 240, 240, 255], + "monitor_secondary_button_text": [30, 102, 215, 255], + "monitor_secondary_button_shadow": [216, 216, 216, 255], + + "monitor_card_border": [192, 193, 194, 255], "monitor_card_background": [255, 255, 255, 255], - "monitor_context_menu_background": [255, 255, 255, 255], - "monitor_context_menu_dots": [154, 154, 154, 255], - "monitor_context_menu_highlight": [245, 245, 245, 255], - "monitor_image_overlay": [0, 0, 0, 255], - "monitor_lining_heavy": [0, 0, 0, 255], - "monitor_lining_light": [230, 230, 230, 255], - "monitor_pill_background": [245, 245, 245, 255], + "monitor_card_hover": [232, 242, 252, 255], + + "monitor_stage_background": [246, 246, 246, 255], + "monitor_stage_background_fade": [246, 246, 246, 102], + + "monitor_progress_bar_fill": [50, 130, 255, 255], + "monitor_progress_bar_deactive": [192, 193, 194, 255], + "monitor_progress_bar_empty": [245, 245, 245, 255], + + "monitor_tooltips": [25, 25, 25, 255], + "monitor_context_menu": [255, 255, 255, 255], + "monitor_context_menu_hover": [245, 245, 245, 255], + + "monitor_skeleton_loading": [238, 238, 238, 255], "monitor_placeholder_image": [230, 230, 230, 255], - "monitor_printer_icon_inactive": [154, 154, 154, 255], - "monitor_printer_icon": [50, 130, 255, 255], - "monitor_progress_background_text": [0,0,0,255], - "monitor_progress_background": [245, 245, 245, 255], - "monitor_progress_fill_inactive": [154, 154, 154, 255], - "monitor_progress_fill_text": [255,255,255,255], - "monitor_progress_fill": [50, 130, 255, 255], - "monitor_shadow": [0, 0, 0, 63], - "monitor_skeleton_fill": [245, 245, 245, 255], - "monitor_skeleton_fill_dark": [216, 216, 216, 255], - "monitor_text_inactive": [154, 154, 154, 255] + "monitor_image_overlay": [0, 0, 0, 255], + "monitor_shadow": [220, 220, 220, 255], + + "monitor_carousel_dot": [216, 216, 216, 255], + "monitor_carousel_dot_current": [119, 119, 119, 255] }, "sizes": { From e212bbfb01b6caa8d20d45c854c809d863a3839e Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 21 Jan 2019 17:13:34 +0100 Subject: [PATCH 11/19] Add some translations which were forgotten --- .../resources/qml/MonitorPrintJobCard.qml | 2 +- .../UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml index ab3668a5e4..34167c6988 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml @@ -176,7 +176,7 @@ Item { id: printerConfiguration anchors.verticalCenter: parent.verticalCenter - buildplate: "Glass" // TODO: I18N + buildplate: catalog.i18nc("@label", "Glass") configurations: [ base.printJob.configuration.extruderConfigurations[0], diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml index 93f9dca76d..28d01a4dc4 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml @@ -302,7 +302,7 @@ Item color: printer && printer.activePrintJob && printer.activePrintJob.isActive ? UM.Theme.getColor("monitor_text_primary") : UM.Theme.getColor("monitor_text_disabled") elide: Text.ElideRight font: UM.Theme.getFont("large") // 16pt, bold - text: printer && printer.activePrintJob ? printer.activePrintJob.name : "Untitled" // TODO: I18N + text: printer && printer.activePrintJob ? printer.activePrintJob.name : catalog.i18nc("@label", "Untitled") width: parent.width // FIXED-LINE-HEIGHT: @@ -322,7 +322,7 @@ Item color: printer && printer.activePrintJob && printer.activePrintJob.isActive ? UM.Theme.getColor("monitor_text_primary") : UM.Theme.getColor("monitor_text_disabled") elide: Text.ElideRight font: UM.Theme.getFont("default") // 12pt, regular - text: printer && printer.activePrintJob ? printer.activePrintJob.owner : "Anonymous" // TODO: I18N + text: printer && printer.activePrintJob ? printer.activePrintJob.owner : catalog.i18nc("@label", "Anonymous") width: parent.width // FIXED-LINE-HEIGHT: @@ -348,7 +348,7 @@ Item verticalCenter: parent.verticalCenter } font: UM.Theme.getFont("default") - text: "Requires configuration changes" // TODO: I18N + text: catalog.i18nc("@label:status", "Requires configuration changes") visible: printer && printer.activePrintJob && printer.activePrintJob.configurationChanges.length > 0 && !printerStatus.visible // FIXED-LINE-HEIGHT: From ccfa6ebb92d60692698b4053849c3d17790da386 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 18 Jan 2019 12:51:51 +0100 Subject: [PATCH 12/19] Set proper maximum values for brim width and line-count. [CURA-6094] --- resources/definitions/fdmprinter.def.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index f39e267354..407923fb4e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4690,6 +4690,7 @@ "default_value": 8.0, "minimum_value": "0.0", "maximum_value_warning": "50.0", + "maximum_value": "0.5 * min(machine_width, machine_depth)", "enabled": "resolveOrValue('adhesion_type') == 'brim'", "settable_per_mesh": false, "settable_per_extruder": true, @@ -4704,6 +4705,7 @@ "default_value": 20, "minimum_value": "0", "maximum_value_warning": "50 / skirt_brim_line_width", + "maximum_value": "0.5 * min(machine_width, machine_depth) / skirt_brim_line_width", "value": "math.ceil(brim_width / (skirt_brim_line_width * initial_layer_line_width_factor / 100.0))", "enabled": "resolveOrValue('adhesion_type') == 'brim'", "settable_per_mesh": false, From aae06fe0fafc708d482253af588bff90b8fd678e Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 18 Jan 2019 12:54:42 +0100 Subject: [PATCH 13/19] Prevent calculations with brim width larger than build-plate. [CURA-6094] --- cura/BuildVolume.py | 6 ++++++ cura/Scene/ConvexHullDecorator.py | 13 +++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index aa1f170707..fb13a32732 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -1043,6 +1043,12 @@ class BuildVolume(SceneNode): else: raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?") + max_length_available = 0.5 * min( + self._global_container_stack.getProperty("machine_width", "value"), + self._global_container_stack.getProperty("machine_depth", "value") + ) + bed_adhesion_size = min(bed_adhesion_size, max_length_available) + support_expansion = 0 support_enabled = self._global_container_stack.getProperty("support_enable", "value") support_offset = self._global_container_stack.getProperty("support_offset", "value") diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index 661106dec7..e37823b400 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -289,16 +289,21 @@ class ConvexHullDecorator(SceneNodeDecorator): # Add extra margin depending on adhesion type adhesion_type = self._global_stack.getProperty("adhesion_type", "value") + max_length_available = 0.5 * min( + self._getSettingProperty("machine_width", "value"), + self._getSettingProperty("machine_depth", "value") + ) + if adhesion_type == "raft": - extra_margin = max(0, self._getSettingProperty("raft_margin", "value")) + extra_margin = min(max_length_available, max(0, self._getSettingProperty("raft_margin", "value"))) elif adhesion_type == "brim": - extra_margin = max(0, self._getSettingProperty("brim_line_count", "value") * self._getSettingProperty("skirt_brim_line_width", "value")) + extra_margin = min(max_length_available, max(0, self._getSettingProperty("brim_line_count", "value") * self._getSettingProperty("skirt_brim_line_width", "value"))) elif adhesion_type == "none": extra_margin = 0 elif adhesion_type == "skirt": - extra_margin = max( + extra_margin = min(max_length_available, max( 0, self._getSettingProperty("skirt_gap", "value") + - self._getSettingProperty("skirt_line_count", "value") * self._getSettingProperty("skirt_brim_line_width", "value")) + self._getSettingProperty("skirt_line_count", "value") * self._getSettingProperty("skirt_brim_line_width", "value"))) else: raise Exception("Unknown bed adhesion type. Did you forget to update the convex hull calculations for your new bed adhesion type?") From 76240bb458dcdfd0aef2c4b30b0ade01ecec607b Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Tue, 22 Jan 2019 11:13:27 +0100 Subject: [PATCH 14/19] Remove unused comment Contributes to CL-1212 --- plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml index 28d01a4dc4..f16be094a3 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml @@ -93,7 +93,6 @@ Item Rectangle { id: printerNameLabel - // color: "#414054" // TODO: Theme! color: printer ? "transparent" : UM.Theme.getColor("monitor_skeleton_loading") height: 18 * screenScaleFactor // TODO: Theme! width: parent.width From 9bc748ffa1a5bd91975696fa2571b9820d470ec5 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 22 Jan 2019 11:48:35 +0100 Subject: [PATCH 15/19] Fix scrolling with configurations CURA-6125 --- resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml index 15d882fdf5..afb3aba82b 100644 --- a/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml +++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml @@ -97,6 +97,7 @@ Item 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. height: childrenRect.height + interactive: false // let the ScrollView process scroll events. section.property: "modelData.printerType" section.criteria: ViewSection.FullString From 283de789c2d3fd79c714d4e81f60bfee975db2cb Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Tue, 22 Jan 2019 12:00:50 +0100 Subject: [PATCH 16/19] Remove comment Contributes to CL-1212 --- .../UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml index 59d7b85862..41cee9c30a 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenu.qml @@ -18,7 +18,7 @@ Item { Button { id: button; background: Rectangle { - color: UM.Theme.getColor("monitor_card_hover"); // TODO: Theme! + color: UM.Theme.getColor("monitor_card_hover") height: button.height; opacity: button.down || button.hovered ? 1 : 0; radius: Math.round(0.5 * width); From 0942bebaf82292763a0757a22cec24f4048369a5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 22 Jan 2019 16:19:29 +0100 Subject: [PATCH 17/19] Move troubleshoot link to help menu --- resources/qml/Actions.qml | 13 +++++-- resources/qml/MainWindow/ApplicationMenu.qml | 1 + .../Recommended/RecommendedPrintSetup.qml | 5 --- .../RecommendedTroubleshootingGuides.qml | 36 ------------------- 4 files changed, 12 insertions(+), 43 deletions(-) delete mode 100644 resources/qml/PrintSetupSelector/Recommended/RecommendedTroubleshootingGuides.qml diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index a1077f5fb7..1389801bca 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -58,6 +58,7 @@ Item property alias showProfileFolder: showProfileFolderAction; property alias documentation: documentationAction; + property alias showTroubleshooting: showTroubleShootingAction property alias reportBug: reportBugAction; property alias about: aboutAction; @@ -69,18 +70,26 @@ Item UM.I18nCatalog{id: catalog; name: "cura"} + + Action + { + id: showTroubleShootingAction + onTriggered: Qt.openUrlExternally("https://ultimaker.com/en/troubleshooting") + text: catalog.i18nc("@action:inmenu", "Show Online Troubleshooting Guide"); + } + Action { id:toggleFullScreenAction shortcut: StandardKey.FullScreen; - text: catalog.i18nc("@action:inmenu","Toggle Full Screen"); + text: catalog.i18nc("@action:inmenu", "Toggle Full Screen"); iconName: "view-fullscreen"; } Action { id: undoAction; - text: catalog.i18nc("@action:inmenu menubar:edit","&Undo"); + text: catalog.i18nc("@action:inmenu menubar:edit", "&Undo"); iconName: "edit-undo"; shortcut: StandardKey.Undo; onTriggered: UM.OperationStack.undo(); diff --git a/resources/qml/MainWindow/ApplicationMenu.qml b/resources/qml/MainWindow/ApplicationMenu.qml index a694b8e403..2f18df8914 100644 --- a/resources/qml/MainWindow/ApplicationMenu.qml +++ b/resources/qml/MainWindow/ApplicationMenu.qml @@ -97,6 +97,7 @@ Item title: catalog.i18nc("@title:menu menubar:toplevel", "&Help") MenuItem { action: Cura.Actions.showProfileFolder } + MenuItem { action: Cura.Actions.showTroubleshooting} MenuItem { action: Cura.Actions.documentation } MenuItem { action: Cura.Actions.reportBug } MenuSeparator { } diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml index 44b3abf7cd..6885f8c041 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml @@ -68,11 +68,6 @@ Item // TODO Create a reusable component with these properties to not define them separately for each component labelColumnWidth: parent.firstColumnWidth } - - RecommendedTroubleshootingGuides - { - width: parent.width - } } UM.SettingPropertyProvider diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedTroubleshootingGuides.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedTroubleshootingGuides.qml deleted file mode 100644 index e6706421bb..0000000000 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedTroubleshootingGuides.qml +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2019 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.10 -import QtQuick.Controls 1.4 -import QtQuick.Controls.Styles 1.4 - -import UM 1.2 as UM -import Cura 1.0 as Cura - - -Item -{ - id: tipsCell - anchors.top: adhesionCheckBox.visible ? adhesionCheckBox.bottom : (enableSupportCheckBox.visible ? supportExtruderCombobox.bottom : infillCellRight.bottom) - anchors.topMargin: Math.round(UM.Theme.getSize("default_margin").height * 2) - anchors.left: parent.left - width: parent.width - height: tipsText.contentHeight * tipsText.lineCount - - Label - { - id: tipsText - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.top: parent.top - wrapMode: Text.WordWrap - text: catalog.i18nc("@label", "Need help improving your prints?
Read the Ultimaker Troubleshooting Guides").arg("https://ultimaker.com/en/troubleshooting") - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - linkColor: UM.Theme.getColor("text_link") - onLinkActivated: Qt.openUrlExternally(link) - } -} \ No newline at end of file From 92eb361ba14aaa5d36a8eddf9d9d7acd0205b0f1 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 23 Jan 2019 09:37:32 +0100 Subject: [PATCH 18/19] Make cloud API error a generic message to not scare the user --- plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py | 2 +- .../src/Cloud/CloudOutputDeviceManager.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py index 9d6c29c0a4..9c1e8e1cdb 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py @@ -119,7 +119,7 @@ class CloudApiClient: except (UnicodeDecodeError, JSONDecodeError, ValueError) as err: error = CloudError(code=type(err).__name__, title=str(err), http_code=str(status_code), id=str(time()), http_status="500") - Logger.logException("e", "Could not parse the stardust response: %s", error) + Logger.logException("e", "Could not parse the stardust response: %s", error.toDict()) return status_code, {"errors": [error.toDict()]} ## Parses the given models and calls the correct callback depending on the result. diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index f9a0a59c81..c9c78caa0f 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -138,10 +138,10 @@ class CloudOutputDeviceManager: ## Handles an API error received from the cloud. # \param errors: The errors received - def _onApiError(self, errors: List[CloudError]) -> None: - text = ". ".join(e.title for e in errors) # TODO: translate errors + def _onApiError(self, errors: List[CloudError] = None) -> None: + Logger.log("w", str(errors)) message = Message( - text = text, + text = self.I18N_CATALOG.i18nc("@info:description", "There was an error connecting to the cloud."), title = self.I18N_CATALOG.i18nc("@info:title", "Error"), lifetime = 10 ) From 551111bd60fcd7d0a199fd2390d5dd7017cd6bb5 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 23 Jan 2019 11:24:28 +0100 Subject: [PATCH 19/19] Close the configuration panel when the user syncs with a configuration --- resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml index 058c1ff4c2..296ae62366 100644 --- a/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml +++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml @@ -218,7 +218,8 @@ Button { if(isValidMaterial) { - Cura.MachineManager.applyRemoteConfiguration(configuration); + toggleContent() + Cura.MachineManager.applyRemoteConfiguration(configuration) } } }