diff --git a/resources/bundled_packages/cura.json b/resources/bundled_packages/cura.json
index f1af8a7a90..c39684bc1f 100644
--- a/resources/bundled_packages/cura.json
+++ b/resources/bundled_packages/cura.json
@@ -124,7 +124,7 @@
"package_type": "plugin",
"display_name": "Ultimaker Digital Library",
"description": "Connects to the Digital Library, allowing Cura to open files from and save files to the Digital Library.",
- "package_version": "1.0.0",
+ "package_version": "1.1.0",
"sdk_version": "7.8.0",
"website": "https://ultimaker.com",
"author": {
diff --git a/resources/qml/Account/AccountWidget.qml b/resources/qml/Account/AccountWidget.qml
index ef1622daee..b058ead22f 100644
--- a/resources/qml/Account/AccountWidget.qml
+++ b/resources/qml/Account/AccountWidget.qml
@@ -12,8 +12,8 @@ Item
property var profile: Cura.API.account.userProfile
property var loggedIn: Cura.API.account.isLoggedIn
- height: signInButton.height > accountWidget.height ? signInButton.height : accountWidget.height
- width: signInButton.width > accountWidget.width ? signInButton.width : accountWidget.width
+ height: signInButton.visible ? signInButton.height : accountWidget.height
+ width: signInButton.visible ? signInButton.width : accountWidget.width
Button
{
@@ -32,9 +32,18 @@ Item
background: Rectangle
{
radius: UM.Theme.getSize("action_button_radius").width
- color: signInButton.hovered ? UM.Theme.getColor("primary_text") : UM.Theme.getColor("main_window_header_background")
+ color: UM.Theme.getColor("main_window_header_background")
border.width: UM.Theme.getSize("default_lining").width
border.color: UM.Theme.getColor("primary_text")
+
+ Rectangle
+ {
+ anchors.fill: parent
+ radius: parent.radius
+ color: UM.Theme.getColor("primary_text")
+ opacity: signInButton.hovered ? 0.2 : 0
+ Behavior on opacity { NumberAnimation { duration: 100 } }
+ }
}
contentItem: Label
@@ -42,7 +51,7 @@ Item
id: label
text: signInButton.text
font: UM.Theme.getFont("default")
- color: signInButton.hovered ? UM.Theme.getColor("main_window_header_background") : UM.Theme.getColor("primary_text")
+ color: UM.Theme.getColor("primary_text")
width: contentWidth
verticalAlignment: Text.AlignVCenter
renderType: Text.NativeRendering
@@ -54,7 +63,6 @@ Item
id: accountWidget
anchors.verticalCenter: parent.verticalCenter
- anchors.horizontalCenter: signInButton.horizontalCenter
implicitHeight: Math.round(0.5 * UM.Theme.getSize("main_window_header").height)
implicitWidth: Math.round(0.5 * UM.Theme.getSize("main_window_header").height)
@@ -90,9 +98,19 @@ Item
width: Math.min(accountWidget.width, accountWidget.height)
height: width
radius: width
- color: accountWidget.hovered ? UM.Theme.getColor("primary_text") : "transparent"
- border.width: 1
+ color: UM.Theme.getColor("main_window_header_background")
+ border.width: UM.Theme.getSize("default_lining").width
border.color: UM.Theme.getColor("primary_text")
+
+ Rectangle
+ {
+ id: initialCircleFill
+ anchors.fill: parent
+ radius: parent.radius
+ color: UM.Theme.getColor("primary_text")
+ opacity: accountWidget.hovered ? 0.2 : 0
+ Behavior on opacity { NumberAnimation { duration: 100 } }
+ }
}
Label
@@ -102,7 +120,7 @@ Item
anchors.horizontalCenter: parent.horizontalCenter
text: accountWidget.text
font: UM.Theme.getFont("large_bold")
- color: accountWidget.hovered ? UM.Theme.getColor("main_window_header_background") : UM.Theme.getColor("primary_text")
+ color: UM.Theme.getColor("primary_text")
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
renderType: Text.NativeRendering
@@ -142,7 +160,7 @@ Item
borderColor: UM.Theme.getColor("lining")
borderWidth: UM.Theme.getSize("default_lining").width
- target: Qt.point(width - (signInButton.width / 2), -10)
+ target: Qt.point(width - ((signInButton.visible ? signInButton.width : accountWidget.width) / 2), -10)
arrowSize: UM.Theme.getSize("default_arrow").width
}
diff --git a/resources/qml/ApplicationSwitcher/ApplicationButton.qml b/resources/qml/ApplicationSwitcher/ApplicationButton.qml
new file mode 100644
index 0000000000..bcf780753c
--- /dev/null
+++ b/resources/qml/ApplicationSwitcher/ApplicationButton.qml
@@ -0,0 +1,91 @@
+// Copyright (c) 2021 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.4 as UM
+import Cura 1.1 as Cura
+
+Button
+{
+ id: base
+
+ property alias iconSource: applicationIcon.source
+ property alias displayName: applicationDisplayName.text
+ property alias tooltipText: tooltip.text
+ property bool isExternalLink: false
+ property color borderColor: hovered ? UM.Theme.getColor("primary") : "transparent"
+ property color backgroundColor: hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
+ Behavior on backgroundColor { ColorAnimation { duration: 200; } }
+ Behavior on borderColor { ColorAnimation { duration: 200; } }
+
+ hoverEnabled: true
+ width: UM.Theme.getSize("application_switcher_item").width
+ height: UM.Theme.getSize("application_switcher_item").height
+
+ background: Rectangle
+ {
+ color:backgroundColor
+ border.color: borderColor
+ border.width: UM.Theme.getSize("default_lining").width
+ }
+
+ Cura.ToolTip
+ {
+ id: tooltip
+ tooltipText: base.text
+ visible: base.hovered
+ }
+
+ Column
+ {
+ id: applicationButtonContent
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.verticalCenter: parent.verticalCenter
+
+ UM.RecolorImage
+ {
+ id: applicationIcon
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ color: UM.Theme.getColor("icon")
+ width: UM.Theme.getSize("application_switcher_icon").width
+ height: width
+
+ UM.RecolorImage
+ {
+ id: externalLinkIndicatorIcon
+ visible: base.isExternalLink
+
+ anchors
+ {
+ bottom: parent.bottom
+ bottomMargin: - Math.round(height * 1 / 6)
+ right: parent.right
+ rightMargin: - Math.round(width * 5 / 6)
+ }
+ width: UM.Theme.getSize("icon_indicator").width
+ height: width
+ color: UM.Theme.getColor("icon")
+ source: UM.Theme.getIcon("LinkExternal")
+ }
+ }
+
+ Label
+ {
+ id: applicationDisplayName
+
+ anchors.left: parent.left
+ anchors.right: parent.right
+
+ height: base.height - applicationIcon.height - 2 * UM.Theme.getSize("default_margin").width // Account for the top and bottom margins
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ wrapMode: Text.Wrap
+ elide: Text.ElideRight
+ color: UM.Theme.getColor("text")
+ }
+ }
+}
diff --git a/resources/qml/ApplicationSwitcher/ApplicationSwitcher.qml b/resources/qml/ApplicationSwitcher/ApplicationSwitcher.qml
new file mode 100644
index 0000000000..a8ea2312a5
--- /dev/null
+++ b/resources/qml/ApplicationSwitcher/ApplicationSwitcher.qml
@@ -0,0 +1,61 @@
+// Copyright (c) 2021 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+import QtQuick.Layouts 1.15
+
+import UM 1.4 as UM
+import Cura 1.1 as Cura
+
+Item
+{
+ id: applicationSwitcherWidget
+ width: Math.round(0.5 * UM.Theme.getSize("main_window_header").height)
+ height: width
+
+ Button
+ {
+ id: applicationSwitcherButton
+
+ anchors.fill: parent
+
+ background: Item
+ {
+ Rectangle
+ {
+ anchors.fill: parent
+ radius: UM.Theme.getSize("action_button_radius").width
+ color: UM.Theme.getColor("primary_text")
+ opacity: applicationSwitcherButton.hovered ? 0.2 : 0
+ Behavior on opacity { NumberAnimation { duration: 100; } }
+ }
+
+ UM.RecolorImage
+ {
+ anchors.fill: parent
+ color: UM.Theme.getColor("primary_text")
+
+ source: UM.Theme.getIcon("BlockGrid")
+ }
+ }
+
+ onClicked:
+ {
+ if (applicationSwitcherPopup.opened)
+ {
+ applicationSwitcherPopup.close()
+ } else {
+ applicationSwitcherPopup.open()
+ }
+ }
+ }
+ ApplicationSwitcherPopup
+ {
+ id: applicationSwitcherPopup
+ y: parent.height + UM.Theme.getSize("default_arrow").height
+
+ // Move the x position by the default margin so that the arrow isn't drawn exactly on the corner
+ x: parent.width - width + UM.Theme.getSize("default_margin").width
+ }
+}
\ No newline at end of file
diff --git a/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml b/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml
new file mode 100644
index 0000000000..7d08b766a8
--- /dev/null
+++ b/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml
@@ -0,0 +1,110 @@
+// Copyright (c) 2021 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+import QtQuick.Layouts 1.15
+
+import UM 1.4 as UM
+import Cura 1.1 as Cura
+
+Popup
+{
+ id: applicationSwitcherPopup
+
+ closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent
+
+ opacity: opened ? 1 : 0
+ Behavior on opacity { NumberAnimation { duration: 100 } }
+ padding: UM.Theme.getSize("wide_margin").width
+
+ contentItem: Grid
+ {
+ id: ultimakerPlatformLinksGrid
+ columns: 3
+ spacing: UM.Theme.getSize("default_margin").width
+
+ Repeater
+ {
+ model:
+ [
+ {
+ displayName: catalog.i18nc("@label:button", "My printers"),
+ thumbnail: UM.Theme.getIcon("PrinterTriple", "high"),
+ description: catalog.i18nc("@tooltip:button", "Monitor printers in Ultimaker Digital Factory."),
+ link: "https://digitalfactory.ultimaker.com/app/printers?utm_source=cura&utm_medium=software&utm_campaign=switcher-digital-factory-printers"
+ },
+ {
+ displayName: "Digital Library", //Not translated, since it's a brand name.
+ thumbnail: UM.Theme.getIcon("Library", "high"),
+ description: catalog.i18nc("@tooltip:button", "Create print projects in Digital Library."),
+ link: "https://digitalfactory.ultimaker.com/app/library?utm_source=cura&utm_medium=software&utm_campaign=switcher-library"
+ },
+ {
+ displayName: catalog.i18nc("@label:button", "Print jobs"),
+ thumbnail: UM.Theme.getIcon("FoodBeverages"),
+ description: catalog.i18nc("@tooltip:button", "Monitor print jobs and reprint from your print history."),
+ link: "https://digitalfactory.ultimaker.com/app/print-jobs?utm_source=cura&utm_medium=software&utm_campaign=switcher-digital-factory- printjobs"
+ },
+ {
+ displayName: "Ultimaker Marketplace", //Not translated, since it's a brand name.
+ thumbnail: UM.Theme.getIcon("Shop", "high"),
+ description: catalog.i18nc("@tooltip:button", "Extend Ultimaker Cura with plugins and material profiles."),
+ link: "https://marketplace.ultimaker.com/?utm_source=cura&utm_medium=software&utm_campaign=switcher-marketplace-materials"
+ },
+ {
+ displayName: "Ultimaker Academy", //Not translated, since it's a brand name.
+ thumbnail: UM.Theme.getIcon("Knowledge"),
+ description: catalog.i18nc("@tooltip:button", "Become a 3D printing expert with Ultimaker e-learning."),
+ link: "https://academy.ultimaker.com/?utm_source=cura&utm_medium=software&utm_campaign=switcher-academy"
+ },
+ {
+ displayName: catalog.i18nc("@label:button", "Ultimaker support"),
+ thumbnail: UM.Theme.getIcon("Help", "high"),
+ description: catalog.i18nc("@tooltip:button", "Learn how to get started with Ultimaker Cura."),
+ link: "https://support.ultimaker.com/?utm_source=cura&utm_medium=software&utm_campaign=switcher-support"
+ },
+ {
+ displayName: catalog.i18nc("@label:button", "Ask a question"),
+ thumbnail: UM.Theme.getIcon("Speak", "high"),
+ description: catalog.i18nc("@tooltip:button", "Consult the Ultimaker Community."),
+ link: "https://community.ultimaker.com/?utm_source=cura&utm_medium=software&utm_campaign=switcher-community"
+ },
+ {
+ displayName: catalog.i18nc("@label:button", "Report a bug"),
+ thumbnail: UM.Theme.getIcon("Bug", "high"),
+ description: catalog.i18nc("@tooltip:button", "Let developers know that something is going wrong."),
+ link: "https://github.com/Ultimaker/Cura/issues/new/choose"
+ },
+ {
+ displayName: "Ultimaker.com", //Not translated, since it's a URL.
+ thumbnail: UM.Theme.getIcon("Browser"),
+ description: catalog.i18nc("@tooltip:button", "Visit the Ultimaker website."),
+ link: "https://ultimaker.com/?utm_source=cura&utm_medium=software&utm_campaign=switcher-umwebsite"
+ }
+ ]
+
+ delegate: ApplicationButton
+ {
+ displayName: modelData.displayName
+ iconSource: modelData.thumbnail
+ tooltipText: modelData.description
+ isExternalLink: true
+
+ onClicked: Qt.openUrlExternally(modelData.link)
+ }
+ }
+ }
+
+ background: UM.PointingRectangle
+ {
+ color: UM.Theme.getColor("tool_panel_background")
+ borderColor: UM.Theme.getColor("lining")
+ borderWidth: UM.Theme.getSize("default_lining").width
+
+ // Move the target by the default margin so that the arrow isn't drawn exactly on the corner
+ target: Qt.point(width - UM.Theme.getSize("default_margin").width - (applicationSwitcherButton.width / 2), -10)
+
+ arrowSize: UM.Theme.getSize("default_arrow").width
+ }
+}
\ No newline at end of file
diff --git a/resources/qml/MainWindow/MainWindowHeader.qml b/resources/qml/MainWindow/MainWindowHeader.qml
index c27f3b0a24..815ddff732 100644
--- a/resources/qml/MainWindow/MainWindowHeader.qml
+++ b/resources/qml/MainWindow/MainWindowHeader.qml
@@ -10,6 +10,7 @@ import UM 1.4 as UM
import Cura 1.0 as Cura
import "../Account"
+import "../ApplicationSwitcher"
Item
{
@@ -94,10 +95,21 @@ Item
background: Rectangle
{
+ id: marketplaceButtonBorder
radius: UM.Theme.getSize("action_button_radius").width
- color: marketplaceButton.hovered ? UM.Theme.getColor("primary_text") : UM.Theme.getColor("main_window_header_background")
+ color: UM.Theme.getColor("main_window_header_background")
border.width: UM.Theme.getSize("default_lining").width
border.color: UM.Theme.getColor("primary_text")
+
+ Rectangle
+ {
+ id: marketplaceButtonFill
+ anchors.fill: parent
+ radius: parent.radius
+ color: UM.Theme.getColor("primary_text")
+ opacity: marketplaceButton.hovered ? 0.2 : 0
+ Behavior on opacity { NumberAnimation { duration: 100 } }
+ }
}
contentItem: Label
@@ -105,7 +117,7 @@ Item
id: label
text: marketplaceButton.text
font: UM.Theme.getFont("default")
- color: marketplaceButton.hovered ? UM.Theme.getColor("main_window_header_background") : UM.Theme.getColor("primary_text")
+ color: UM.Theme.getColor("primary_text")
width: contentWidth
verticalAlignment: Text.AlignVCenter
renderType: Text.NativeRendering
@@ -113,7 +125,7 @@ Item
anchors
{
- right: accountWidget.left
+ right: applicationSwitcher.left
rightMargin: UM.Theme.getSize("default_margin").width
verticalCenter: parent.verticalCenter
}
@@ -138,6 +150,17 @@ Item
}
}
+ ApplicationSwitcher
+ {
+ id: applicationSwitcher
+ anchors
+ {
+ verticalCenter: parent.verticalCenter
+ right: accountWidget.left
+ rightMargin: UM.Theme.getSize("default_margin").width
+ }
+ }
+
AccountWidget
{
id: accountWidget
diff --git a/resources/texts/change_log.txt b/resources/texts/change_log.txt
index 6dc8835de1..d089d2c16b 100644
--- a/resources/texts/change_log.txt
+++ b/resources/texts/change_log.txt
@@ -98,7 +98,7 @@ When double clicking on a file in the open project dialog in Digital Factory it
- Fixed a bug when the seam was not placed in sharpest corner.
- Fixed the gantry height for S-line printers.
- Fixed a bug where a model is partially below build plate if center selected model is used.
-- Fixed a bug where a tootip arrow appeared when the "Manage printers" button is hovered.
+- Fixed a bug where a tooltip arrow appeared when the "Manage printers" button is hovered.
- Fixed a bug where assemblies were not arranged in the center of the build plate.
* Printer definitions, profiles and materials.
diff --git a/resources/themes/cura-light/icons/default/BlockGrid.svg b/resources/themes/cura-light/icons/default/BlockGrid.svg
new file mode 100644
index 0000000000..207171b8f7
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/BlockGrid.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/default/Browser.svg b/resources/themes/cura-light/icons/default/Browser.svg
new file mode 100644
index 0000000000..01365ec678
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/Browser.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/default/Bug.svg b/resources/themes/cura-light/icons/default/Bug.svg
new file mode 100644
index 0000000000..7ad9bb4f1c
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/Bug.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/default/FoodBeverages.svg b/resources/themes/cura-light/icons/default/FoodBeverages.svg
new file mode 100644
index 0000000000..1e74b33955
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/FoodBeverages.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/default/Help.svg b/resources/themes/cura-light/icons/default/Help.svg
new file mode 100644
index 0000000000..84f94c2703
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/Help.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/default/Knowledge.svg b/resources/themes/cura-light/icons/default/Knowledge.svg
new file mode 100644
index 0000000000..4f8798d5f1
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/Knowledge.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/default/Library.svg b/resources/themes/cura-light/icons/default/Library.svg
new file mode 100644
index 0000000000..beb8c6e593
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/Library.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/default/Shop.svg b/resources/themes/cura-light/icons/default/Shop.svg
new file mode 100644
index 0000000000..bfd5a4bf69
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/Shop.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/default/Speak.svg b/resources/themes/cura-light/icons/default/Speak.svg
new file mode 100644
index 0000000000..8f308643a7
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/Speak.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/high/Bug.svg b/resources/themes/cura-light/icons/high/Bug.svg
new file mode 100644
index 0000000000..a24963cd8e
--- /dev/null
+++ b/resources/themes/cura-light/icons/high/Bug.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/high/Help.svg b/resources/themes/cura-light/icons/high/Help.svg
new file mode 100644
index 0000000000..355b9dd468
--- /dev/null
+++ b/resources/themes/cura-light/icons/high/Help.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/high/Library.svg b/resources/themes/cura-light/icons/high/Library.svg
new file mode 100644
index 0000000000..3ddc018543
--- /dev/null
+++ b/resources/themes/cura-light/icons/high/Library.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/high/PrinterTriple.svg b/resources/themes/cura-light/icons/high/PrinterTriple.svg
new file mode 100644
index 0000000000..65e4936bc2
--- /dev/null
+++ b/resources/themes/cura-light/icons/high/PrinterTriple.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/high/Shop.svg b/resources/themes/cura-light/icons/high/Shop.svg
new file mode 100644
index 0000000000..7662cf4b9b
--- /dev/null
+++ b/resources/themes/cura-light/icons/high/Shop.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/high/Speak.svg b/resources/themes/cura-light/icons/high/Speak.svg
new file mode 100644
index 0000000000..68642bba2b
--- /dev/null
+++ b/resources/themes/cura-light/icons/high/Speak.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json
index d50a748493..daa12b3390 100644
--- a/resources/themes/cura-light/theme.json
+++ b/resources/themes/cura-light/theme.json
@@ -499,6 +499,9 @@
"print_setup_icon": [1.2, 1.2],
"drag_icon": [1.416, 0.25],
+ "application_switcher_item": [8, 9],
+ "application_switcher_icon": [3.75, 3.75],
+
"expandable_component_content_header": [0.0, 3.0],
"configuration_selector": [35.0, 4.0],
@@ -571,6 +574,9 @@
"favorites_button": [2, 2],
"favorites_button_icon": [1.2, 1.2],
+ "icon_indicator_background": [1.5, 1.5],
+ "icon_indicator": [1, 1],
+
"printer_status_icon": [1.0, 1.0],
"printer_sync_icon": [1.2, 1.2],