Browse Source

Merge remote-tracking branch 'origin/master' into CURA-7813_fix_crash_globalstack

Jelle Spijker 4 years ago
parent
commit
c798c7b99e

+ 10 - 5
cura/UI/WelcomePagesModel.py

@@ -239,9 +239,6 @@ class WelcomePagesModel(ListModel):
                           {"id": "user_agreement",
                            "page_url": self._getBuiltinWelcomePagePath("UserAgreementContent.qml"),
                            },
-                          {"id": "whats_new",
-                           "page_url": self._getBuiltinWelcomePagePath("WhatsNewContent.qml"),
-                           },
                           {"id": "data_collections",
                            "page_url": self._getBuiltinWelcomePagePath("DataCollectionsContent.qml"),
                            },
@@ -259,13 +256,21 @@ class WelcomePagesModel(ListModel):
                            },
                           {"id": "add_cloud_printers",
                            "page_url": self._getBuiltinWelcomePagePath("AddCloudPrintersView.qml"),
-                           "is_final_page": True,  # If we end up in this page, the next button will close the dialog
-                           "next_page_button_text": self._catalog.i18nc("@action:button", "Finish"),
+                           "next_page_button_text": self._catalog.i18nc("@action:button", "Next"),
+                           "next_page_id": "whats_new",
                            },
                           {"id": "machine_actions",
                            "page_url": self._getBuiltinWelcomePagePath("FirstStartMachineActionsContent.qml"),
                            "should_show_function": self.shouldShowMachineActions,
                            },
+                          {"id": "whats_new",
+                           "page_url": self._getBuiltinWelcomePagePath("WhatsNewContent.qml"),
+                           "next_page_button_text": self._catalog.i18nc("@action:button", "Skip"),
+                           },
+                          {"id": "changelog",
+                           "page_url": self._getBuiltinWelcomePagePath("ChangelogContent.qml"),
+                           "next_page_button_text": self._catalog.i18nc("@action:button", "Finish"),
+                           },
                           ]
 
         pages_to_show = all_pages_list

+ 77 - 2
cura/UI/WhatsNewPagesModel.py

@@ -1,8 +1,12 @@
-# Copyright (c) 2019 Ultimaker B.V.
+# Copyright (c) 2021 Ultimaker B.V.
 # Cura is released under the terms of the LGPLv3 or higher.
-
 from .WelcomePagesModel import WelcomePagesModel
 
+import os
+from typing import Optional, Dict, List, Tuple
+from PyQt5.QtCore import pyqtProperty, pyqtSlot
+from UM.Logger import Logger
+from UM.Resources import Resources
 
 #
 # This Qt ListModel is more or less the same the WelcomePagesModel, except that this model is only for showing the
@@ -10,13 +14,84 @@ from .WelcomePagesModel import WelcomePagesModel
 #
 class WhatsNewPagesModel(WelcomePagesModel):
 
+    image_formats = [".png", ".jpg", ".jpeg", ".gif", ".svg"]
+    text_formats = [".txt", ".htm", ".html"]
+    image_key = "image"
+    text_key = "text"
+
+    @staticmethod
+    def _collectOrdinalFiles(resource_type: int, include: List[str]) -> Tuple[Dict[int, str], int]:
+        result = {}  #type: Dict[int, str]
+        highest = -1
+        try:
+            folder_path = Resources.getPath(resource_type, "whats_new")
+            for _, _, files in os.walk(folder_path):
+                for filename in files:
+                    basename = os.path.basename(filename)
+                    base, ext = os.path.splitext(basename)
+                    if ext not in include or not base.isdigit():
+                        continue
+                    page_no = int(base)
+                    highest = max(highest, page_no)
+                    result[page_no] = os.path.join(folder_path, filename)
+        except FileNotFoundError:
+            Logger.logException("w", "Could not find 'whats_new' folder for resource-type {0}".format(resource_type))
+        return result, highest
+
+    @staticmethod
+    def _loadText(filename: str) -> str:
+        result = ""
+        try:
+            with open(filename, "r", encoding="utf-8") as file:
+                result = file.read()
+        except OSError:
+            Logger.logException("w", "Could not open {0}".format(filename))
+        return result
+
     def initialize(self) -> None:
         self._pages = []
         self._pages.append({"id": "whats_new",
                             "page_url": self._getBuiltinWelcomePagePath("WhatsNewContent.qml"),
+                            "next_page_button_text": self._catalog.i18nc("@action:button", "Skip"),
+                            "next_page_id": "changelog"
+                            })
+        self._pages.append({"id": "changelog",
+                            "page_url": self._getBuiltinWelcomePagePath("ChangelogContent.qml"),
                             "next_page_button_text": self._catalog.i18nc("@action:button", "Close"),
                             })
         self.setItems(self._pages)
 
+        images, max_image = WhatsNewPagesModel._collectOrdinalFiles(Resources.Images, WhatsNewPagesModel.image_formats)
+        texts, max_text = WhatsNewPagesModel._collectOrdinalFiles(Resources.Texts, WhatsNewPagesModel.text_formats)
+        highest = max(max_image, max_text)
+
+        self._subpages = []  #type: List[Dict[str, Optional[str]]]
+        for n in range(0, highest + 1):
+            self._subpages.append({
+                WhatsNewPagesModel.image_key: None if n not in images else images[n],
+                WhatsNewPagesModel.text_key: None if n not in texts else self._loadText(texts[n])
+            })
+        if len(self._subpages) == 0:
+            self._subpages.append({WhatsNewPagesModel.text_key: "~ There Is Nothing New Under The Sun ~"})
+
+    def _getSubpageItem(self, page: int, item: str) -> Optional[str]:
+        if 0 <= page < self.subpageCount and item in self._subpages[page]:
+            return self._subpages[page][item]
+        else:
+            return None
+
+    @pyqtProperty(int, constant = True)
+    def subpageCount(self) -> int:
+        return len(self._subpages)
+
+    @pyqtSlot(int, result = str)
+    def getSubpageImageSource(self, page: int) -> str:
+        result = self._getSubpageItem(page, WhatsNewPagesModel.image_key)
+        return "file:///" + (result if result else Resources.getPath(Resources.Images, "cura-icon.png"))
+
+    @pyqtSlot(int, result = str)
+    def getSubpageText(self, page: int) -> str:
+        result = self._getSubpageItem(page, WhatsNewPagesModel.text_key)
+        return result if result else "* * *"
 
 __all__ = ["WhatsNewPagesModel"]

+ 8 - 6
plugins/PostProcessingPlugin/scripts/PauseAtHeight.py

@@ -338,11 +338,6 @@ class PauseAtHeight(Script):
                     if current_layer < pause_layer - nbr_negative_layers:
                         continue
 
-                # Get X and Y from the next layer (better position for
-                # the nozzle)
-                next_layer = data[index + 1]
-                x, y = self.getNextXY(next_layer)
-
                 prev_layer = data[index - 1]
                 prev_lines = prev_layer.split("\n")
                 current_e = 0.
@@ -353,6 +348,13 @@ class PauseAtHeight(Script):
                     current_e = self.getValue(prevLine, "E", -1)
                     if current_e >= 0:
                         break
+                # and also find last X,Y
+                for prevLine in reversed(prev_lines):
+                    if prevLine.startswith(("G0", "G1", "G2", "G3")):
+                        if self.getValue(prevLine, "X") is not None and self.getValue(prevLine, "Y") is not None:
+                            x = self.getValue(prevLine, "X")
+                            y = self.getValue(prevLine, "Y")
+                            break
 
                 # Maybe redo the last layer.
                 if redo_layer:
@@ -454,7 +456,7 @@ class PauseAtHeight(Script):
                         prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = 6000) + "\n"
 
                     #Move the head back
-                    prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + "\n"
+                    prepend_gcode += self.putValue(G = 1, Z = current_z, F = 300) + "\n"
                     prepend_gcode += self.putValue(G = 1, X = x, Y = y, F = 9000) + "\n"
                     if retraction_amount != 0:
                         prepend_gcode += self.putValue(G = 1, E = retraction_amount, F = 6000) + "\n"

BIN
resources/images/whats_new/0.png


BIN
resources/images/whats_new/1.png


BIN
resources/images/whats_new/2.png


+ 3 - 3
resources/qml/Actions.qml

@@ -262,7 +262,7 @@ Item
     Action
     {
         id: deleteSelectionAction;
-        text: catalog.i18ncp("@action:inmenu menubar:edit", "Delete Selected Model", "Delete Selected Models", UM.Selection.selectionCount);
+        text: catalog.i18nc("@action:inmenu menubar:edit", "Delete Selected");
         enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection;
         iconName: "edit-delete";
         shortcut: StandardKey.Delete | "Backspace"
@@ -272,7 +272,7 @@ Item
     Action
     {
         id: centerSelectionAction;
-        text: catalog.i18ncp("@action:inmenu menubar:edit", "Center Selected Model", "Center Selected Models", UM.Selection.selectionCount);
+        text: catalog.i18nc("@action:inmenu menubar:edit", "Center Selected");
         enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection;
         iconName: "align-vertical-center";
         onTriggered: CuraActions.centerSelection();
@@ -281,7 +281,7 @@ Item
     Action
     {
         id: multiplySelectionAction;
-        text: catalog.i18ncp("@action:inmenu menubar:edit", "Multiply Selected Model", "Multiply Selected Models", UM.Selection.selectionCount);
+        text: catalog.i18nc("@action:inmenu menubar:edit", "Multiply Selected");
         enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection;
         iconName: "edit-duplicate";
         shortcut: "Ctrl+M"

+ 2 - 2
resources/qml/TableView.qml

@@ -18,7 +18,7 @@ OldControls.TableView
         Label
         {
             id: tableCellLabel
-            color: UM.Theme.getColor("text")
+            color: styleData.selected ? UM.Theme.getColor("primary_button_text") : UM.Theme.getColor("text")
             elide: Text.ElideRight
             text: styleData.value
             anchors.fill: parent
@@ -29,7 +29,7 @@ OldControls.TableView
 
     rowDelegate: Rectangle
     {
-        color: styleData.selected ? UM.Theme.getColor("secondary") : UM.Theme.getColor("main_background")
+        color: styleData.selected ? UM.Theme.getColor("primary_button") : UM.Theme.getColor("main_background")
         height: UM.Theme.getSize("table_row").height
     }
 

+ 1 - 1
resources/qml/WelcomePages/AddCloudPrintersView.qml

@@ -215,7 +215,7 @@ Item
         id: finishButton
         anchors.right: parent.right
         anchors.bottom: parent.bottom
-        text: catalog.i18nc("@button", "Finish")
+        text: base.currentItem.next_page_button_text
         onClicked:
         {
             discoveredCloudPrintersModel.clear()

+ 59 - 0
resources/qml/WelcomePages/ChangelogContent.qml

@@ -0,0 +1,59 @@
+// 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.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// This component contains the content for the "What's new in Ultimaker Cura" page of the welcome on-boarding process.
+//
+Item
+{
+    UM.I18nCatalog { id: catalog; name: "cura" }
+
+    Label
+    {
+        id: titleLabel
+        anchors.top: parent.top
+        anchors.horizontalCenter: parent.horizontalCenter
+        horizontalAlignment: Text.AlignHCenter
+        text: catalog.i18nc("@label", "Release Notes / 'Changelog'")
+        color: UM.Theme.getColor("primary_button")
+        font: UM.Theme.getFont("huge")
+        renderType: Text.NativeRendering
+    }
+
+    Cura.ScrollableTextArea
+    {
+        id: changelogTextArea
+
+        anchors.top: titleLabel.bottom
+        anchors.bottom: getStartedButton.top
+        anchors.topMargin: UM.Theme.getSize("wide_margin").height
+        anchors.bottomMargin: UM.Theme.getSize("wide_margin").height
+        anchors.left: parent.left
+        anchors.right: parent.right
+
+        ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
+
+        textArea.text: CuraApplication.getTextManager().getChangeLogText()
+        textArea.textFormat: Text.RichText
+        textArea.wrapMode: Text.WordWrap
+        textArea.readOnly: true
+        textArea.font: UM.Theme.getFont("medium")
+        textArea.onLinkActivated: Qt.openUrlExternally(link)
+    }
+
+    Cura.PrimaryButton
+    {
+        id: getStartedButton
+        anchors.right: parent.right
+        anchors.bottom: parent.bottom
+        text: base.currentItem.next_page_button_text
+        onClicked: base.showNextPage()
+    }
+}

Some files were not shown because too many files changed in this diff