Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Ultimaker/Cura.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKostas Karmas <konskarm@gmail.com>2021-04-20 17:09:54 +0300
committerKostas Karmas <konskarm@gmail.com>2021-04-20 17:09:54 +0300
commit5b74090dce6c4d2f268f869b03a7a39c3c4f20f2 (patch)
tree6f0b6e357219dfff30a11c7f5c8d4e2a56197258 /plugins/DigitalLibrary/resources
parent196c8913311a8c6a2d033620df0b6d70d4d132b4 (diff)
parent0db033a6907b83e92645e4ac7b8f7532388745ca (diff)
Merge branch 'df49' into 4.94.9.0
Diffstat (limited to 'plugins/DigitalLibrary/resources')
-rw-r--r--plugins/DigitalLibrary/resources/images/arrow_down.svg6
-rw-r--r--plugins/DigitalLibrary/resources/images/digital_factory.svg1
-rw-r--r--plugins/DigitalLibrary/resources/images/placeholder.svg3
-rw-r--r--plugins/DigitalLibrary/resources/images/update.svg9
-rw-r--r--plugins/DigitalLibrary/resources/qml/CreateNewProjectPopup.qml159
-rw-r--r--plugins/DigitalLibrary/resources/qml/DigitalFactoryOpenDialog.qml61
-rw-r--r--plugins/DigitalLibrary/resources/qml/DigitalFactorySaveDialog.qml62
-rw-r--r--plugins/DigitalLibrary/resources/qml/LoadMoreProjectsCard.qml129
-rw-r--r--plugins/DigitalLibrary/resources/qml/OpenProjectFilesPage.qml198
-rw-r--r--plugins/DigitalLibrary/resources/qml/ProjectSummaryCard.qml92
-rw-r--r--plugins/DigitalLibrary/resources/qml/SaveProjectFilesPage.qml259
-rw-r--r--plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml202
12 files changed, 1181 insertions, 0 deletions
diff --git a/plugins/DigitalLibrary/resources/images/arrow_down.svg b/plugins/DigitalLibrary/resources/images/arrow_down.svg
new file mode 100644
index 0000000000..d11d6a63fd
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/images/arrow_down.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 25.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Artwork" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<polygon style="fill:#000E1A;" points="19.7,13.3 18.3,11.9 13,17.2 13,3 11,3 11,17.2 5.7,11.9 4.3,13.3 12,21 "/>
+</svg>
diff --git a/plugins/DigitalLibrary/resources/images/digital_factory.svg b/plugins/DigitalLibrary/resources/images/digital_factory.svg
new file mode 100644
index 0000000000..d8c30f62f2
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/images/digital_factory.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 475.96 400.94"><defs><style type="text/css">.cls-1{fill:#061784;}.cls-2{fill:#061884;}.cls-3{fill:#f3f8fe;}.cls-4{fill:#fff;}.cls-5{fill:#dde9fd;}.cls-6{fill:#c5dbfb;}</style></defs><g id="Layer_1" data-name="Layer 1"><path class="cls-1" d="M139,198.79a.75.75,0,0,1-.21,0l-2-.42a1,1,0,1,1,.42-1.95l2,.42A1,1,0,0,1,140,198,1,1,0,0,1,139,198.79Z"/><path class="cls-1" d="M131.07,197.09l-.21,0-4-.86a1,1,0,0,1-.77-1.18,1,1,0,0,1,1.19-.77l4,.85a1,1,0,0,1-.21,2Zm-10-2.14a.75.75,0,0,1-.21,0l-4-.85a1,1,0,0,1,.42-2l4,.86a1,1,0,0,1-.21,2Zm-10-2.13a.76.76,0,0,1-.21,0l-4-.85a1,1,0,0,1,.42-2l4,.86a1,1,0,0,1-.21,2Zm-10-2.14-.21,0-4-.86a1,1,0,1,1,.42-2l4,.86a1,1,0,0,1-.21,2Zm-10-2.14-.21,0-4-.86a1,1,0,1,1,.42-1.95l4,.85a1,1,0,0,1-.21,2Z"/><path class="cls-1" d="M81.3,186.4l-.21,0-2-.42a1,1,0,0,1,.42-2l2,.42a1,1,0,0,1-.21,2Z"/><path class="cls-1" d="M391.69,312.83a1,1,0,0,1-.53-.15l-1.7-1a1,1,0,0,1,1-1.71l1.71,1.05a1,1,0,0,1-.52,1.85Z"/><path class="cls-1" d="M385.22,308.88a1.07,1.07,0,0,1-.52-.14l-3.17-1.94a1,1,0,0,1-.33-1.38,1,1,0,0,1,1.37-.33l3.17,1.94a1,1,0,0,1-.52,1.85ZM377.29,304a1,1,0,0,1-.52-.15L373.6,302a1,1,0,0,1-.33-1.38,1,1,0,0,1,1.37-.33l3.17,1.94a1,1,0,0,1,.34,1.37A1,1,0,0,1,377.29,304Zm-7.93-4.84a1,1,0,0,1-.52-.15l-3.17-1.94a1,1,0,1,1,1.05-1.7l3.17,1.93a1,1,0,0,1-.53,1.86Zm-7.92-4.85a1,1,0,0,1-.52-.14l-3.18-1.94a1,1,0,0,1-.33-1.37,1,1,0,0,1,1.38-.34L362,292.5a1,1,0,0,1,.33,1.38A1,1,0,0,1,361.44,294.35Zm-7.93-4.84a1,1,0,0,1-.52-.15l-3.17-1.93a1,1,0,1,1,1-1.71l3.17,1.94a1,1,0,0,1-.52,1.85Zm-7.93-4.84a1,1,0,0,1-.52-.15l-3.17-1.94a1,1,0,1,1,1-1.7l3.17,1.93a1,1,0,0,1,.33,1.38A1,1,0,0,1,345.58,284.67Z"/><path class="cls-1" d="M337.65,279.83a1,1,0,0,1-.52-.15l-1.71-1a1,1,0,0,1,1.05-1.71l1.7,1a1,1,0,0,1,.33,1.38A1,1,0,0,1,337.65,279.83Z"/><path class="cls-1" d="M180.74,123.92a1,1,0,0,1-.86-.49l-1-1.72a1,1,0,0,1,.35-1.37,1,1,0,0,1,1.37.35l1,1.72a1,1,0,0,1-.35,1.37A1.09,1.09,0,0,1,180.74,123.92Z"/><path class="cls-1" d="M176.42,116.62a1,1,0,0,1-.87-.49l-2.2-3.71a1,1,0,0,1,.35-1.37,1,1,0,0,1,1.37.35l2.2,3.71a1,1,0,0,1-.35,1.37A.93.93,0,0,1,176.42,116.62Zm-5.51-9.29a1,1,0,0,1-.86-.49l-2.2-3.72a1,1,0,1,1,1.72-1l2.2,3.72a1,1,0,0,1-.35,1.37A1,1,0,0,1,170.91,107.33ZM165.41,98a1,1,0,0,1-.86-.49l-2.2-3.72a1,1,0,0,1,.35-1.37,1,1,0,0,1,1.37.35l2.2,3.72a1,1,0,0,1-.35,1.37A1.06,1.06,0,0,1,165.41,98Zm-5.5-9.29a1,1,0,0,1-.87-.49l-2.2-3.72a1,1,0,1,1,1.72-1l2.2,3.72a1,1,0,0,1-.35,1.37A1,1,0,0,1,159.91,88.75Z"/><path class="cls-1" d="M154.4,79.46a1,1,0,0,1-.86-.49l-1-1.73a1,1,0,1,1,1.72-1l1,1.73a1,1,0,0,1-.35,1.37A1,1,0,0,1,154.4,79.46Z"/><path class="cls-1" d="M137.27,275.72a1,1,0,0,1-.51-1.86l1.73-1a1,1,0,1,1,1,1.73l-1.73,1A.93.93,0,0,1,137.27,275.72Z"/><path class="cls-1" d="M93.48,301.24a1,1,0,0,1-.51-1.86l3.5-2a1,1,0,0,1,1,1.73l-3.5,2A1,1,0,0,1,93.48,301.24Zm8.75-5.1a1,1,0,0,1-.5-1.87l3.5-2a1,1,0,0,1,1.37.36,1,1,0,0,1-.36,1.37l-3.5,2A1.06,1.06,0,0,1,102.23,296.14ZM111,291a1,1,0,0,1-.86-.49,1,1,0,0,1,.36-1.37l3.5-2a1,1,0,0,1,1,1.73l-3.5,2A1,1,0,0,1,111,291Zm8.76-5.1a1,1,0,0,1-.5-1.86l3.5-2.05a1,1,0,0,1,1,1.73l-3.51,2A.9.9,0,0,1,119.75,285.93Zm8.76-5.11a1,1,0,0,1-.86-.49A1,1,0,0,1,128,279l3.5-2a1,1,0,0,1,1.37.36,1,1,0,0,1-.36,1.37l-3.51,2A1,1,0,0,1,128.51,280.82Z"/><path class="cls-1" d="M86.49,305.31a1,1,0,0,1-.86-.49,1,1,0,0,1,.36-1.37l1.73-1a1,1,0,0,1,1.36.36,1,1,0,0,1-.36,1.37l-1.73,1A1,1,0,0,1,86.49,305.31Z"/><path class="cls-1" d="M394.66,202.33a1,1,0,0,1-.1-2l1.92-.2a1,1,0,1,1,.21,2l-1.93.2Z"/><path class="cls-1" d="M342.4,207.69a1,1,0,0,1-.1-2l4.18-.43a1,1,0,1,1,.2,2l-4.17.43Zm10.45-1.08a1,1,0,0,1-.1-2l4.18-.43a1,1,0,1,1,.21,2l-4.18.43Zm10.46-1.07a1,1,0,0,1-.11-2l4.18-.43a1,1,0,0,1,1.1.89,1,1,0,0,1-.89,1.1l-4.18.43Zm10.45-1.07a1,1,0,0,1-.1-2l4.17-.43a1,1,0,0,1,1.1.89A1,1,0,0,1,378,204l-4.18.43Zm10.45-1.07a1,1,0,0,1-.1-2l4.18-.43a1,1,0,0,1,1.09.89,1,1,0,0,1-.89,1.1l-4.18.43Z"/><path class="cls-1" d="M334.2,208.53a1,1,0,0,1-.1-2l1.93-.2a1,1,0,1,1,.2,2l-1.92.2Z"/><path class="cls-1" d="M239.41,219h-.07l-4.17-.29,3-3a1.75,1.75,0,1,1,1.29,3.26Z"/><path class="cls-1" d="M302.59,146.94a1,1,0,0,1-.67-.26,1,1,0,0,1-.07-1.41l1.3-1.46a1,1,0,0,1,1.49,1.34l-1.31,1.46A1,1,0,0,1,302.59,146.94Z"/><path class="cls-1" d="M308,140.94a1,1,0,0,1-.67-.26,1,1,0,0,1-.08-1.41l2.72-3a1,1,0,0,1,1.49,1.34l-2.72,3A1,1,0,0,1,308,140.94Zm6.79-7.58a1,1,0,0,1-.67-.25,1,1,0,0,1-.07-1.41l2.72-3a1,1,0,1,1,1.48,1.33l-2.71,3A1,1,0,0,1,314.77,133.36Zm6.8-7.57a1,1,0,0,1-.67-.26,1,1,0,0,1-.08-1.41l2.72-3a1,1,0,0,1,1.49,1.34l-2.72,3A1,1,0,0,1,321.57,125.79Zm6.79-7.57a1,1,0,0,1-.74-1.67l2.72-3a1,1,0,0,1,1.41-.08,1,1,0,0,1,.08,1.42l-2.72,3A1,1,0,0,1,328.36,118.22Zm6.8-7.58a1,1,0,0,1-.74-1.66l2.71-3a1,1,0,0,1,1.42-.08,1,1,0,0,1,.07,1.41l-2.71,3A1,1,0,0,1,335.16,110.64Z"/><path class="cls-1" d="M342,103.07a1,1,0,0,1-.67-.26,1,1,0,0,1-.08-1.41l1.31-1.45a1,1,0,0,1,1.49,1.33l-1.31,1.46A1,1,0,0,1,342,103.07Z"/><g id="_3D-printer" data-name=" 3D-printer"><path class="cls-2" d="M178.4,156.58a2.16,2.16,0,0,1-.78-.15,2,2,0,0,1-1.07-2.62c.08-.18,7.71-18.35,17.43-35.85,13.64-24.56,24.37-35.67,32.81-34,19.06,3.82,12,63,11.13,69.72a2,2,0,0,1-4-.51c3.09-24,3.67-63-7.95-65.29-11.79-2.36-34.32,40.12-45.76,67.45A2,2,0,0,1,178.4,156.58Z"/><path class="cls-2" d="M297.26,166.58a2,2,0,0,1-1.85-1.23C284,138,261.44,95.56,249.65,97.9c-11.62,2.33-11,41.28-8,65.29a2,2,0,1,1-4,.51C236.86,157,229.8,97.8,248.86,94c8.44-1.69,19.18,9.42,32.81,34,9.72,17.5,17.36,35.67,17.43,35.85a2,2,0,0,1-1.07,2.62A2.11,2.11,0,0,1,297.26,166.58Z"/><path class="cls-3" d="M322.94,346.44h0a4.14,4.14,0,0,0,4.14-4.14V157.72a4.15,4.15,0,0,0-4.14-4.14H152.77a4.15,4.15,0,0,0-4.14,4.14v184.6a4.14,4.14,0,0,0,4.14,4.14h8l.29-.3a19.58,19.58,0,0,1,13.2-5h127c9.61,0,15.05,4.95,15.1,5l.29.28Z"/><path class="cls-2" d="M322.94,154.58H152.7a3.15,3.15,0,0,0-3.14,3.14V342.3a3.14,3.14,0,0,0,3.14,3.14h7.65a20.3,20.3,0,0,1,13.91-5.3h127c10.16,0,15.78,5.3,15.78,5.3h5.92a3.14,3.14,0,0,0,3.14-3.14V157.72a3.15,3.15,0,0,0-3.14-3.14m0-2a5.14,5.14,0,0,1,5.14,5.14V342.29h0a5.14,5.14,0,0,1-5.14,5.14h-6.71l-.57-.53c-.05,0-5.25-4.76-14.42-4.76h-127a18.62,18.62,0,0,0-12.51,4.68l-.59.62H152.7a5.14,5.14,0,0,1-5.14-5.14V157.72a5.15,5.15,0,0,1,5.14-5.14H323Z"/><path class="cls-4" d="M303.09,314.43a11.69,11.69,0,0,0,11.68-11.68V174.89a2,2,0,0,0-2-2H162.89a2,2,0,0,0-2,2V302.75a11.68,11.68,0,0,0,11.68,11.68Z"/><path class="cls-3" d="M312.77,173.89H162.89a1,1,0,0,0-1,1V302.75a10.68,10.68,0,0,0,10.68,10.68H303.09a10.69,10.69,0,0,0,10.68-10.68V174.91a1,1,0,0,0-1-1m0-2a3,3,0,0,1,3,3V302.75a12.68,12.68,0,0,1-12.68,12.68H172.56a12.67,12.67,0,0,1-12.68-12.68V174.89a3,3,0,0,1,3-3H312.74Z"/><path class="cls-2" d="M312.77,171.89H162.89a3,3,0,0,0-3,3V302.75a12.67,12.67,0,0,0,12.68,12.68H303.09a12.68,12.68,0,0,0,12.68-12.68V174.91a3,3,0,0,0-3-3m0-2a5,5,0,0,1,5,5V302.75a14.7,14.7,0,0,1-14.68,14.68H172.56a14.69,14.69,0,0,1-14.68-14.68V174.89a5,5,0,0,1,5-5H312.74Z"/><polygon class="cls-5" points="272.82 286.07 255.14 316.68 219.79 316.68 202.12 286.07 219.79 255.46 255.14 255.46 272.82 286.07"/><circle class="cls-2" cx="311.54" cy="322.6" r="1.65"/><circle class="cls-2" cx="163.68" cy="322.6" r="1.65"/><circle class="cls-2" cx="311.61" cy="158.04" r="1.65"/><circle class="cls-2" cx="263.66" cy="158.04" r="1.65"/><circle class="cls-2" cx="213.05" cy="158.04" r="1.65"/><circle class="cls-2" cx="163.75" cy="158.04" r="1.65"/><rect class="cls-2" x="184.64" y="326.52" width="7.01" height="2.47"/><rect class="cls-4" x="212.62" y="309.02" width="50.41" height="26.44" rx="2.34"/><path class="cls-2" d="M260.69,310H215a1.33,1.33,0,0,0-1.33,1.33v21.79a1.31,1.31,0,0,0,1.33,1.31H260.7a1.33,1.33,0,0,0,1.33-1.33V311.35a1.35,1.35,0,0,0-1.34-1.33m3.34,1.33v21.77a3.34,3.34,0,0,1-3.34,3.33H215a3.33,3.33,0,0,1-3.33-3.33V311.35h0A3.33,3.33,0,0,1,215,308h45.74A3.34,3.34,0,0,1,264,311.35Z"/><path class="cls-6" d="M260,312H215.62v20.43H260V312m.66-2a1.35,1.35,0,0,1,1.34,1.33v21.77h0a1.33,1.33,0,0,1-1.34,1.32H214.93a1.31,1.31,0,0,1-1.31-1.33V311.35h0A1.33,1.33,0,0,1,215,310Z"/><path class="cls-2" d="M343.38,347.44H132.26a1,1,0,0,1,0-2H343.38a1,1,0,0,1,0,2Z"/><path class="cls-4" d="M248.68,194.14a3.68,3.68,0,0,0,3.45-2.42l4.4-11.88a3.86,3.86,0,0,0,.23-1.27v-4.76H218.89v4.53a3.49,3.49,0,0,0,.23,1.28l4.37,12a3.66,3.66,0,0,0,3.47,2.47Z"/><path class="cls-2" d="M255.75,174.81H219.89v3.6a2.52,2.52,0,0,0,.17.94l4.38,12a2.65,2.65,0,0,0,2.52,1.79h21.71a2.67,2.67,0,0,0,2.51-1.77l4.4-11.88a2.94,2.94,0,0,0,.17-.93v-3.75m2-2v5.77a5,5,0,0,1-.29,1.62L253,192.06a4.68,4.68,0,0,1-4.39,3.09H227a4.65,4.65,0,0,1-4.4-3.11l-4.38-12a4.47,4.47,0,0,1-.29-1.62v-5.61h39.84Z"/><path class="cls-4" d="M245,196a2.15,2.15,0,0,0,1.56-.67,2.21,2.21,0,0,0,.58-1.59l-.83-13.91a2,2,0,0,0-1.89-1.83H231.33a2,2,0,0,0-2,1.83l-.83,13.9a.53.53,0,0,0,0,.13,2.14,2.14,0,0,0,2.15,2.13Z"/><path class="cls-2" d="M244.42,179H231.31a.93.93,0,0,0-1,.89l-.83,13.9v0a1.14,1.14,0,0,0,1.14,1.14h14.48a1.15,1.15,0,0,0,1.07-1.21l-.82-13.9a1,1,0,0,0-1-.89M244.3,177a3,3,0,0,1,2.94,2.77l.83,13.91v.21a3.13,3.13,0,0,1-3.14,3.11H230.37a3.13,3.13,0,0,1-2.93-3.32l.82-13.91a3,3,0,0,1,3-2.77h13Z"/><path class="cls-4" d="M258.47,178.47a5.1,5.1,0,0,0,0-10.2H217.26a5.1,5.1,0,0,0,0,10.2Z"/><path class="cls-2" d="M258.47,169.27H217.26a4.1,4.1,0,0,0,0,8.2h41.17a4.1,4.1,0,0,0,0-8.2m6.13,4.1a6.09,6.09,0,0,1-6.09,6.1H217.26a6.1,6.1,0,1,1,0-12.2h41.21A6.1,6.1,0,0,1,264.56,173.37Z"/></g><path class="cls-2" d="M50.77,148.17l19.62,11v23.06L50.75,193.56,31.1,182.22v-22.7l19.67-11.35m0-2.3L29.1,158.37v25l21.65,12.5,21.65-12.5V158L50.75,145.87Z"/><polygon class="cls-2" points="52.1 194.88 50.1 194.88 50.1 170.48 29.63 159.76 30.56 157.99 52.1 169.27 52.1 194.88"/><rect class="cls-2" x="49.68" y="163.37" width="22.83" height="2" transform="translate(-71.67 49.81) rotate(-28.82)"/><path class="cls-2" d="M71.1,183.87a1,1,0,0,1-.49-.12L69.3,183a1,1,0,0,1,1-1.75l1.31.72a1,1,0,0,1,.39,1.36A1,1,0,0,1,71.1,183.87Z"/><path class="cls-2" d="M65.44,180.76a1,1,0,0,1-.49-.12l-2.17-1.19a1,1,0,0,1,1-1.76l2.17,1.2a1,1,0,0,1,.39,1.36A1,1,0,0,1,65.44,180.76Zm-6.52-3.58a.91.91,0,0,1-.48-.13l-2.18-1.19a1,1,0,0,1,1-1.75l2.17,1.19a1,1,0,0,1-.48,1.88Z"/><path class="cls-2" d="M52.41,173.59a1,1,0,0,1-.49-.12l-1.82-1v-2.1a1,1,0,0,1,2,0v.91l.79.44a1,1,0,0,1,.39,1.36A1,1,0,0,1,52.41,173.59Z"/><path class="cls-2" d="M51.1,166.12a1,1,0,0,1-1-1v-2.63a1,1,0,0,1,2,0v2.63A1,1,0,0,1,51.1,166.12Zm0-7.88a1,1,0,0,1-1-1v-2.63a1,1,0,0,1,2,0v2.63A1,1,0,0,1,51.1,158.24Z"/><path class="cls-2" d="M51.1,150.37a1,1,0,0,1-1-1v-1.5a1,1,0,0,1,2,0v1.5A1,1,0,0,1,51.1,150.37Z"/><path class="cls-2" d="M30.1,183.87a1,1,0,0,1-.47-1.88l1.33-.7a1,1,0,1,1,.93,1.77l-1.33.7A1,1,0,0,1,30.1,183.87Z"/><path class="cls-2" d="M36,180.77a1,1,0,0,1-.47-1.88l2.3-1.2a1,1,0,0,1,1.35.42,1,1,0,0,1-.43,1.35l-2.29,1.2A1,1,0,0,1,36,180.77Zm6.88-3.6a1,1,0,0,1-.46-1.88l2.29-1.2a1,1,0,0,1,.93,1.77l-2.3,1.2A.92.92,0,0,1,42.89,177.17Z"/><path class="cls-2" d="M49.77,173.57a1,1,0,0,1-.47-1.88l1.33-.7a1,1,0,1,1,.93,1.77l-1.33.7A1,1,0,0,1,49.77,173.57Z"/><path class="cls-2" d="M148,28.2l12.15,7.49V62.43l-22.68,13.1-12.18-7.89V41.31L148,28.2m0-2.33L123.24,40.16V68.73l14.12,9.14L162.1,63.58v-29L148,25.87Z"/><polygon class="cls-2" points="138.76 76.73 136.76 76.73 136.76 48.75 123.9 41.61 124.87 39.86 138.76 47.58 138.76 76.73"/><rect class="cls-2" x="136.14" y="40.87" width="26.08" height="2" transform="translate(-1.69 77.16) rotate(-28.84)"/><path class="cls-2" d="M160.61,64a1,1,0,0,1-.64-.23l-1.15-1a1,1,0,1,1,1.28-1.53l1.15,1a1,1,0,0,1-.64,1.76Z"/><path class="cls-2" d="M155.49,59.71a1,1,0,0,1-.65-.23l-2-1.68a1,1,0,0,1,1.29-1.53l2,1.68a1,1,0,0,1-.64,1.76Z"/><path class="cls-2" d="M149.53,54.69a1,1,0,0,1-.65-.23l-1.49-1.26v-2a1,1,0,1,1,2,0v1l.78.66a1,1,0,0,1-.64,1.76Z"/><path class="cls-2" d="M148.39,46.83a1,1,0,0,1-1-1v-2.7a1,1,0,1,1,2,0v2.7A1,1,0,0,1,148.39,46.83Zm0-8.09a1,1,0,0,1-1-1V35a1,1,0,1,1,2,0v2.7A1,1,0,0,1,148.39,38.74Z"/><path class="cls-2" d="M148.39,30.66a1,1,0,0,1-1-1v-1.5a1,1,0,1,1,2,0v1.5A1,1,0,0,1,148.39,30.66Z"/><path class="cls-2" d="M124.39,69.16a1,1,0,0,1-.55-1.83l1.26-.82a1,1,0,0,1,1.09,1.67l-1.26.82A1,1,0,0,1,124.39,69.16Z"/><path class="cls-2" d="M131,64.89a1,1,0,0,1-.85-.45,1,1,0,0,1,.31-1.39l2.68-1.72A1,1,0,1,1,134.24,63l-2.68,1.73A1.08,1.08,0,0,1,131,64.89Zm8-5.17a1,1,0,0,1-.55-1.84l2.69-1.73a1,1,0,1,1,1.08,1.68l-2.68,1.73A1,1,0,0,1,139.07,59.72Z"/><path class="cls-2" d="M147.12,54.54a1,1,0,0,1-.54-1.84l1.27-.81a1,1,0,1,1,1.07,1.69l-1.27.81A1,1,0,0,1,147.12,54.54Z"/><path class="cls-2" d="M358.21,48.61l20.27,41-19,11-19.1-11,17.86-40.92m-.14-4.82-20.3,46.5,21.65,12.5,21.65-12.5Z"/><rect class="cls-2" x="357.95" y="48.86" width="2" height="53.03" transform="translate(-2.23 11.55) rotate(-1.84)"/><path class="cls-2" d="M379.8,90.87a1,1,0,0,1-.49-.12L378,90a1,1,0,0,1,1-1.75l1.31.73a1,1,0,0,1,.39,1.36A1,1,0,0,1,379.8,90.87Z"/><path class="cls-2" d="M374.22,87.75a1,1,0,0,1-.49-.12l-2.14-1.2a1,1,0,1,1,1-1.74l2.14,1.19a1,1,0,0,1,.39,1.36A1,1,0,0,1,374.22,87.75Zm-6.41-3.57a1,1,0,0,1-.49-.13l-2.14-1.19a1,1,0,1,1,1-1.75l2.14,1.19a1,1,0,0,1-.48,1.88Z"/><path class="cls-2" d="M361.41,80.6a1,1,0,0,1-.49-.12l-1.31-.73a1,1,0,1,1,1-1.75l1.31.73a1,1,0,0,1,.39,1.36A1,1,0,0,1,361.41,80.6Z"/><path class="cls-2" d="M338.8,90.87a1,1,0,0,1-.5-1.86l1.3-.74a1,1,0,1,1,1,1.73l-1.3.74A1,1,0,0,1,338.8,90.87Z"/><path class="cls-2" d="M344.28,87.75a1,1,0,0,1-.5-1.86l2.09-1.19a1,1,0,0,1,1,1.73l-2.09,1.19A1,1,0,0,1,344.28,87.75Zm6.25-3.56a1,1,0,0,1-.5-1.87l2.09-1.19a1,1,0,0,1,1.36.37,1,1,0,0,1-.37,1.37L351,84.06A1.13,1.13,0,0,1,350.53,84.19Z"/><path class="cls-2" d="M356.8,80.61a1,1,0,0,1-.5-1.86l1.3-.74a1,1,0,1,1,1,1.73l-1.3.74A1,1,0,0,1,356.8,80.61Z"/><path class="cls-2" d="M408.7,294.1,425.53,297l.84,33.88-17.62,9.69-17.06-9.38,17-37.11m-1.16-2.23L389.1,332.06l19.65,10.81,19.65-10.81-.91-36.73-20-3.46Z"/><rect class="cls-2" x="392.9" y="317.67" width="49.86" height="2" transform="translate(-27.41 597.77) rotate(-69.41)"/><path class="cls-2" d="M427.22,332.63a1,1,0,0,1-.47-.11l-1.32-.7a1,1,0,0,1,.93-1.77l1.32.7a1,1,0,0,1-.46,1.88Z"/><path class="cls-2" d="M419.8,328.69a1,1,0,0,1-.47-.11L416.28,327a1,1,0,0,1,.94-1.77l3,1.62a1,1,0,0,1-.47,1.88Z"/><path class="cls-2" d="M410.67,323.83a1,1,0,0,1-.47-.11l-1.33-.71a1,1,0,1,1,.94-1.77l1.33.71a1,1,0,0,1-.47,1.88Z"/><path class="cls-2" d="M390,332.63a1,1,0,0,1-.49-1.87l1.3-.73a1,1,0,0,1,1,1.75l-1.3.73A1.11,1.11,0,0,1,390,332.63Z"/><path class="cls-2" d="M397.64,328.34a1,1,0,0,1-.49-1.87l3.16-1.78a1,1,0,1,1,1,1.74l-3.16,1.79A1.11,1.11,0,0,1,397.64,328.34Z"/><path class="cls-2" d="M407.13,323a1,1,0,0,1-.5-1.86l.8-.46v-.92a1,1,0,0,1,2,0v2.09l-1.81,1A1,1,0,0,1,407.13,323Z"/><path class="cls-2" d="M408.43,314.59a1,1,0,0,1-1-1v-3.08a1,1,0,0,1,2,0v3.08A1,1,0,0,1,408.43,314.59Zm0-9.25a1,1,0,0,1-1-1v-3.08a1,1,0,0,1,2,0v3.08A1,1,0,0,1,408.43,305.34Z"/><path class="cls-2" d="M408.43,296.1a1,1,0,0,1-1-1v-1.5a1,1,0,0,1,2,0v1.5A1,1,0,0,1,408.43,296.1Z"/><path class="cls-2" d="M58.67,322.86a1,1,0,0,1,0-2c1,0,2-.05,3-.1a1,1,0,1,1,.1,2c-1,.06-2,.09-3,.11Zm-6-.1h-.05q-1.56-.08-3-.21a1,1,0,0,1-.91-1.08,1,1,0,0,1,1.09-.91c.95.08,1.94.15,2.95.21a1,1,0,0,1,1,1A1,1,0,0,1,52.67,322.76Zm15-.55a1,1,0,0,1-1-.87,1,1,0,0,1,.86-1.12c1-.14,2-.3,2.91-.47a1,1,0,1,1,.37,2c-1,.18-2,.35-3,.49Zm-23.91-.45-.18,0c-1.07-.2-2.08-.42-3-.66a1,1,0,1,1,.5-1.94c.88.23,1.85.45,2.86.64a1,1,0,0,1,.8,1.16A1,1,0,0,1,43.73,321.76Zm32.66-1.62a1,1,0,0,1-.37-1.92,9.85,9.85,0,0,0,2.36-1.29,1,1,0,0,1,1.4.14,1,1,0,0,1-.14,1.41,11.06,11.06,0,0,1-2.88,1.59A1,1,0,0,1,76.39,320.14ZM35.3,318.8a1,1,0,0,1-.61-.21,3.47,3.47,0,0,1-1.59-2.72,2.59,2.59,0,0,1,.19-1,1,1,0,0,1,1.86.73.59.59,0,0,0,0,.25c0,.33.29.73.81,1.14a1,1,0,0,1-.61,1.79Zm42.38-4.6a1,1,0,0,1-.46-.12A16.94,16.94,0,0,0,74.6,313a1,1,0,0,1-.65-1.26,1,1,0,0,1,1.26-.65,20.1,20.1,0,0,1,2.94,1.19,1,1,0,0,1,.42,1.35A1,1,0,0,1,77.68,314.2Zm-38.53-1.08a1,1,0,0,1-.31-1.95c.89-.29,1.9-.56,3-.81a1,1,0,0,1,1.2.76,1,1,0,0,1-.76,1.19c-1,.24-2,.49-2.81.76A.79.79,0,0,1,39.15,313.12Zm29.91-1.37H68.9c-.93-.15-1.92-.28-2.93-.4a1,1,0,0,1-.88-1.1,1,1,0,0,1,1.1-.88c1,.11,2.06.25,3,.4a1,1,0,0,1-.15,2ZM48,311.37a1,1,0,0,1-.11-2c1-.11,2-.2,3-.28a1,1,0,1,1,.14,2c-1,.07-2,.16-3,.27Zm12.14-.44h0c-1,0-2-.06-3-.06H57a1,1,0,1,1,0-2h.15q1.55,0,3,.06a1,1,0,0,1,0,2Z"/><path class="cls-2" d="M57.34,340.87a24.24,24.24,0,1,1,24.24-24.24A24.26,24.26,0,0,1,57.34,340.87Zm0-46.48a22.24,22.24,0,1,0,22.24,22.24A22.26,22.26,0,0,0,57.34,294.39Z"/><path class="cls-2" d="M58.49,340.25a1,1,0,0,1-.67-1.74,6.47,6.47,0,0,0,1.38-2.17,1,1,0,0,1,1.83.82A8.77,8.77,0,0,1,59.17,340,1.05,1.05,0,0,1,58.49,340.25Zm-4.35-2.36a1,1,0,0,1-.91-.58,21.51,21.51,0,0,1-1.08-2.95,1,1,0,0,1,.68-1.25,1,1,0,0,1,1.24.68,18.91,18.91,0,0,0,1,2.68,1,1,0,0,1-.49,1.33A1.06,1.06,0,0,1,54.14,337.89ZM61.83,332a.68.68,0,0,1-.2,0,1,1,0,0,1-.78-1.18c.19-.91.35-1.89.5-2.9a1,1,0,0,1,2,.29c-.15,1.05-.33,2.06-.52,3A1,1,0,0,1,61.83,332Zm-10-2.8a1,1,0,0,1-1-.86c-.14-1-.26-2-.37-3a1,1,0,1,1,2-.2c.1,1,.22,2,.36,2.93A1,1,0,0,1,52,329.2Zm11.07-6.12h-.06a1,1,0,0,1-.94-1.06c.06-1,.1-1.95.13-3a1,1,0,0,1,1-1,1,1,0,0,1,1,1c0,1-.07,2.05-.13,3A1,1,0,0,1,62.94,323.09Zm-11.81-2.85a1,1,0,0,1-1-1q0-1.18,0-2.4v-.64a1,1,0,0,1,1-1,1,1,0,0,1,1,1v.63q0,1.19,0,2.34a1,1,0,0,1-1,1ZM63,314.09a1,1,0,0,1-1-1c-.05-1-.11-2-.19-3a1,1,0,0,1,2-.16q.12,1.49.18,3a1,1,0,0,1-1,1Zm-11.66-2.85h-.08a1,1,0,0,1-.92-1.08c.08-1,.18-2.05.3-3a1,1,0,1,1,2,.24c-.12.94-.21,1.93-.29,2.94A1,1,0,0,1,51.35,311.24Zm10.74-6.1a1,1,0,0,1-1-.83c-.18-1-.38-2-.6-2.88a1,1,0,0,1,2-.47c.23.94.43,2,.62,3a1,1,0,0,1-.82,1.15Zm-9.42-2.8a.9.9,0,0,1-.23,0,1,1,0,0,1-.74-1.21c.26-1.08.55-2.09.86-3a1,1,0,1,1,1.88.66c-.28.83-.55,1.76-.8,2.79A1,1,0,0,1,52.67,302.34Zm6.71-5.74a1,1,0,0,1-.84-.46c-.51-.81-1-1.27-1.44-1.27A1,1,0,0,1,56,294a1,1,0,0,1,.88-1.09h.25c1.14,0,2.2.74,3.12,2.2a1,1,0,0,1-.31,1.38A1,1,0,0,1,59.38,296.6Z"/><path class="cls-2" d="M422.71,170.73c-11,0-19.94-5.8-19.94-12.93s9-12.94,19.94-12.94,19.93,5.8,19.93,12.94S433.7,170.73,422.71,170.73Zm0-23.87c-9.89,0-17.94,4.91-17.94,10.94s8.05,10.93,17.94,10.93,17.93-4.91,17.93-10.93S432.59,146.86,422.71,146.86Z"/><path class="cls-2" d="M422.71,210.73c-11,0-19.94-5.8-19.94-12.94a1,1,0,1,1,2,0c0,6,8.05,10.94,17.94,10.94s17.93-4.91,17.93-10.94a1,1,0,1,1,2,0C442.64,204.93,433.7,210.73,422.71,210.73Z"/><path class="cls-2" d="M403.77,198.79a1,1,0,0,1-1-1,8.81,8.81,0,0,1,.65-3.29,1,1,0,1,1,1.85.74,6.89,6.89,0,0,0-.5,2.55A1,1,0,0,1,403.77,198.79Zm37.78-1.12a1,1,0,0,1-1-.85,7.56,7.56,0,0,0-.86-2.48,1,1,0,0,1,1.75-1,9.34,9.34,0,0,1,1.08,3.16,1,1,0,0,1-.84,1.13Zm-33.5-6.43a1,1,0,0,1-.61-1.79,18.17,18.17,0,0,1,2.67-1.7,1,1,0,0,1,.93,1.77,17.3,17.3,0,0,0-2.38,1.51A1,1,0,0,1,408.05,191.24Zm28.4-.65a1,1,0,0,1-.55-.17,19.08,19.08,0,0,0-2.49-1.38,1,1,0,1,1,.83-1.81,19.64,19.64,0,0,1,2.76,1.52,1,1,0,0,1-.55,1.84Zm-20.26-3a1,1,0,0,1-.22-2,27.52,27.52,0,0,1,3.06-.53,1,1,0,0,1,1.11.87,1,1,0,0,1-.87,1.11,28.7,28.7,0,0,0-2.85.5A.85.85,0,0,1,416.19,187.59Zm11.92-.24h-.18a27.13,27.13,0,0,0-2.87-.39,1,1,0,1,1,.16-2c1,.09,2.07.22,3.08.41a1,1,0,0,1-.19,2Z"/><path class="cls-2" d="M403.77,198.94a1,1,0,0,1-1-1V157.8a1,1,0,1,1,2,0v40.14A1,1,0,0,1,403.77,198.94Z"/><path class="cls-2" d="M441.64,198.39a1,1,0,0,1-1-1V157.25a1,1,0,0,1,2,0v40.14A1,1,0,0,1,441.64,198.39Z"/><path class="cls-2" d="M423.24,197.3a1,1,0,0,1-1-1v-3a1,1,0,1,1,2,0v3A1,1,0,0,1,423.24,197.3Zm0-9a1,1,0,0,1-1-1v-3a1,1,0,1,1,2,0v3A1,1,0,0,1,423.24,188.3Zm0-9a1,1,0,0,1-1-1v-3a1,1,0,1,1,2,0v3A1,1,0,0,1,423.24,179.3Zm0-9a1,1,0,0,1-1-1v-3a1,1,0,1,1,2,0v3A1,1,0,0,1,423.24,170.3Zm0-9a1,1,0,0,1-1-1v-3a1,1,0,1,1,2,0v3A1,1,0,0,1,423.24,161.3Z"/></g></svg> \ No newline at end of file
diff --git a/plugins/DigitalLibrary/resources/images/placeholder.svg b/plugins/DigitalLibrary/resources/images/placeholder.svg
new file mode 100644
index 0000000000..cc674a4b38
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/images/placeholder.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48">
+ <path d="M24,44,7,33.4V14.6L24,4,41,14.6V33.4ZM9,32.3l15,9.3,15-9.3V15.7L24,6.4,9,15.7Z"/>
+</svg>
diff --git a/plugins/DigitalLibrary/resources/images/update.svg b/plugins/DigitalLibrary/resources/images/update.svg
new file mode 100644
index 0000000000..4a1aecab81
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/images/update.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 25.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Artwork" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<path d="M12,19.6L4.4,12L7,9.4V12h2V6H3v2h2.6L3.7,9.9c-1.2,1.2-1.2,3.1,0,4.2l6.2,6.2c1.2,1.2,3.1,1.2,4.2,0l0.6-0.6l-1.4-1.4
+ L12,19.6z"/>
+<path d="M20.3,9.9l-6.2-6.2c-1.2-1.2-3.1-1.2-4.2,0L9.3,4.3l1.4,1.4L12,4.4l7.6,7.6L17,14.6V12h-2v6h6v-2h-2.6l1.9-1.9
+ C21.5,12.9,21.5,11.1,20.3,9.9z"/>
+</svg>
diff --git a/plugins/DigitalLibrary/resources/qml/CreateNewProjectPopup.qml b/plugins/DigitalLibrary/resources/qml/CreateNewProjectPopup.qml
new file mode 100644
index 0000000000..75fb8d5811
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/CreateNewProjectPopup.qml
@@ -0,0 +1,159 @@
+// Copyright (C) 2021 Ultimaker B.V.
+
+import QtQuick 2.10
+import QtQuick.Window 2.2
+import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one
+import QtQuick.Controls 2.3
+import QtQuick.Controls.Styles 1.4
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+import DigitalFactory 1.0 as DF
+
+
+Popup
+{
+ id: base
+
+ padding: UM.Theme.getSize("default_margin").width
+
+ closePolicy: Popup.CloseOnEscape
+ focus: true
+ modal: true
+ background: Cura.RoundedRectangle
+ {
+ cornerSide: Cura.RoundedRectangle.Direction.All
+ border.color: UM.Theme.getColor("lining")
+ border.width: UM.Theme.getSize("default_lining").width
+ radius: UM.Theme.getSize("default_radius").width
+ width: parent.width
+ height: parent.height
+ color: UM.Theme.getColor("main_background")
+ }
+
+ Connections
+ {
+ target: manager
+
+ function onCreatingNewProjectStatusChanged(status)
+ {
+ if (status == DF.RetrievalStatus.Success)
+ {
+ base.close();
+ }
+ }
+ }
+
+ onOpened:
+ {
+ newProjectNameTextField.text = ""
+ newProjectNameTextField.focus = true
+ }
+
+ Label
+ {
+ id: createNewLibraryProjectLabel
+ text: "Create new Library project"
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("small_button_text")
+ anchors
+ {
+ top: parent.top
+ left: parent.left
+ right: parent.right
+ }
+ }
+
+ Label
+ {
+ id: projectNameLabel
+ text: "Project Name"
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ anchors
+ {
+ top: createNewLibraryProjectLabel.bottom
+ topMargin: UM.Theme.getSize("default_margin").width
+ left: parent.left
+ right: parent.right
+ }
+ }
+
+ Cura.TextField
+ {
+ id: newProjectNameTextField
+ width: parent.width
+ anchors
+ {
+ top: projectNameLabel.bottom
+ topMargin: UM.Theme.getSize("thin_margin").width
+ left: parent.left
+ right: parent.right
+ }
+ validator: RegExpValidator
+ {
+ regExp: /^[^\\\/\*\?\|\[\]]{0,96}$/
+ }
+
+ text: PrintInformation.jobName
+ font: UM.Theme.getFont("default")
+ placeholderText: "Enter a name for your new project."
+ onAccepted:
+ {
+ if (verifyProjectCreationButton.enabled)
+ {
+ verifyProjectCreationButton.clicked()
+ }
+ }
+ }
+
+ Label
+ {
+ id: errorWhileCreatingProjectLabel
+ text: manager.projectCreationErrorText
+ width: parent.width
+ wrapMode: Text.WordWrap
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("error")
+ visible: manager.creatingNewProjectStatus == DF.RetrievalStatus.Failed
+ anchors
+ {
+ top: newProjectNameTextField.bottom
+ left: parent.left
+ right: parent.right
+ }
+ }
+
+ Cura.SecondaryButton
+ {
+ id: cancelProjectCreationButton
+
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+
+ text: "Cancel"
+
+ onClicked:
+ {
+ base.close()
+ }
+ busy: false
+ }
+
+ Cura.PrimaryButton
+ {
+ id: verifyProjectCreationButton
+
+ anchors.bottom: parent.bottom
+ anchors.right: parent.right
+ text: "Create"
+ enabled: newProjectNameTextField.text != "" && !busy
+
+ onClicked:
+ {
+ manager.createLibraryProjectAndSetAsPreselected(newProjectNameTextField.text)
+ }
+ busy: manager.creatingNewProjectStatus == DF.RetrievalStatus.InProgress
+ }
+}
diff --git a/plugins/DigitalLibrary/resources/qml/DigitalFactoryOpenDialog.qml b/plugins/DigitalLibrary/resources/qml/DigitalFactoryOpenDialog.qml
new file mode 100644
index 0000000000..58958e0069
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/DigitalFactoryOpenDialog.qml
@@ -0,0 +1,61 @@
+// Copyright (C) 2021 Ultimaker B.V.
+
+import QtQuick 2.10
+import QtQuick.Window 2.2
+import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one
+import QtQuick.Controls 2.3
+import QtQuick.Controls.Styles 1.4
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+import DigitalFactory 1.0 as DF
+
+Window
+{
+ id: digitalFactoryOpenDialogBase
+ title: "Open file from Library"
+
+ modality: Qt.ApplicationModal
+ width: 800 * screenScaleFactor
+ height: 600 * screenScaleFactor
+ minimumWidth: 800 * screenScaleFactor
+ minimumHeight: 600 * screenScaleFactor
+
+ Shortcut
+ {
+ sequence: "Esc"
+ onActivated: digitalFactoryOpenDialogBase.close()
+ }
+ color: UM.Theme.getColor("main_background")
+
+ SelectProjectPage
+ {
+ visible: manager.selectedProjectIndex == -1
+ createNewProjectButtonVisible: false
+ }
+
+ OpenProjectFilesPage
+ {
+ visible: manager.selectedProjectIndex >= 0
+ onOpenFilePressed: digitalFactoryOpenDialogBase.close()
+ }
+
+
+ BusyIndicator
+ {
+ // Shows up while Cura is waiting to receive the user's projects from the digital factory library
+ id: retrievingProjectsBusyIndicator
+
+ anchors {
+ verticalCenter: parent.verticalCenter
+ horizontalCenter: parent.horizontalCenter
+ }
+
+ width: parent.width / 4
+ height: width
+ visible: manager.retrievingProjectsStatus == DF.RetrievalStatus.InProgress
+ running: visible
+ palette.dark: UM.Theme.getColor("text")
+ }
+}
diff --git a/plugins/DigitalLibrary/resources/qml/DigitalFactorySaveDialog.qml b/plugins/DigitalLibrary/resources/qml/DigitalFactorySaveDialog.qml
new file mode 100644
index 0000000000..6d870d0c78
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/DigitalFactorySaveDialog.qml
@@ -0,0 +1,62 @@
+// Copyright (C) 2021 Ultimaker B.V.
+
+import QtQuick 2.10
+import QtQuick.Window 2.2
+import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one
+import QtQuick.Controls 2.3
+import QtQuick.Controls.Styles 1.4
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+import DigitalFactory 1.0 as DF
+
+Window
+{
+ id: digitalFactorySaveDialogBase
+ title: "Save Cura project to Library"
+
+ modality: Qt.ApplicationModal
+ width: 800 * screenScaleFactor
+ height: 600 * screenScaleFactor
+ minimumWidth: 800 * screenScaleFactor
+ minimumHeight: 600 * screenScaleFactor
+
+ Shortcut
+ {
+ sequence: "Esc"
+ onActivated: digitalFactorySaveDialogBase.close()
+ }
+ color: UM.Theme.getColor("main_background")
+
+ SelectProjectPage
+ {
+ visible: manager.selectedProjectIndex == -1
+ createNewProjectButtonVisible: true
+ }
+
+ SaveProjectFilesPage
+ {
+ visible: manager.selectedProjectIndex >= 0
+ onSavePressed: digitalFactorySaveDialogBase.close()
+ onSelectDifferentProjectPressed: manager.clearProjectSelection()
+ }
+
+
+ BusyIndicator
+ {
+ // Shows up while Cura is waiting to receive the user's projects from the digital factory library
+ id: retrievingProjectsBusyIndicator
+
+ anchors {
+ verticalCenter: parent.verticalCenter
+ horizontalCenter: parent.horizontalCenter
+ }
+
+ width: parent.width / 4
+ height: width
+ visible: manager.retrievingProjectsStatus == DF.RetrievalStatus.InProgress
+ running: visible
+ palette.dark: UM.Theme.getColor("text")
+ }
+}
diff --git a/plugins/DigitalLibrary/resources/qml/LoadMoreProjectsCard.qml b/plugins/DigitalLibrary/resources/qml/LoadMoreProjectsCard.qml
new file mode 100644
index 0000000000..45a0c6886d
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/LoadMoreProjectsCard.qml
@@ -0,0 +1,129 @@
+// Copyright (C) 2021 Ultimaker B.V.
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+Cura.RoundedRectangle
+{
+ id: base
+ cornerSide: Cura.RoundedRectangle.Direction.All
+ border.color: UM.Theme.getColor("lining")
+ border.width: UM.Theme.getSize("default_lining").width
+ radius: UM.Theme.getSize("default_radius").width
+ signal clicked()
+ property var hasMoreProjectsToLoad
+ enabled: hasMoreProjectsToLoad
+ color: UM.Theme.getColor("main_background")
+
+ MouseArea
+ {
+ id: cardMouseArea
+ anchors.fill: parent
+ hoverEnabled: true
+ }
+
+ Row
+ {
+ id: projectInformationRow
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+
+ UM.RecolorImage
+ {
+ id: projectImage
+ anchors.verticalCenter: parent.verticalCenter
+ width: UM.Theme.getSize("section").height
+ height: width
+ color: UM.Theme.getColor("text_link")
+ source: "../images/arrow_down.svg"
+ }
+
+ Label
+ {
+ id: displayNameLabel
+ anchors.verticalCenter: parent.verticalCenter
+ text: "Load more projects"
+ color: UM.Theme.getColor("text_link")
+ font: UM.Theme.getFont("medium_bold")
+ }
+ }
+
+ Component.onCompleted:
+ {
+ cardMouseArea.clicked.connect(base.clicked)
+ }
+
+ states:
+ [
+ State
+ {
+ name: "canLoadMoreProjectsAndHovered";
+ when: base.hasMoreProjectsToLoad && cardMouseArea.containsMouse
+ PropertyChanges
+ {
+ target: projectImage
+ color: UM.Theme.getColor("text_link")
+ source: "../images/arrow_down.svg"
+ }
+ PropertyChanges
+ {
+ target: displayNameLabel
+ color: UM.Theme.getColor("text_link")
+ text: "Load more projects"
+ }
+ PropertyChanges
+ {
+ target: base
+ color: UM.Theme.getColor("action_button_hovered")
+ }
+ },
+
+ State
+ {
+ name: "canLoadMoreProjectsAndNotHovered";
+ when: base.hasMoreProjectsToLoad && !cardMouseArea.containsMouse
+ PropertyChanges
+ {
+ target: projectImage
+ color: UM.Theme.getColor("text_link")
+ source: "../images/arrow_down.svg"
+ }
+ PropertyChanges
+ {
+ target: displayNameLabel
+ color: UM.Theme.getColor("text_link")
+ text: "Load more projects"
+ }
+ PropertyChanges
+ {
+ target: base
+ color: UM.Theme.getColor("main_background")
+ }
+ },
+
+ State
+ {
+ name: "noMoreProjectsToLoad"
+ when: !base.hasMoreProjectsToLoad
+ PropertyChanges
+ {
+ target: projectImage
+ color: UM.Theme.getColor("action_button_disabled_text")
+ source: "../images/update.svg"
+ }
+ PropertyChanges
+ {
+ target: displayNameLabel
+ color: UM.Theme.getColor("action_button_disabled_text")
+ text: "No more projects to load"
+ }
+ PropertyChanges
+ {
+ target: base
+ color: UM.Theme.getColor("action_button_disabled")
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/plugins/DigitalLibrary/resources/qml/OpenProjectFilesPage.qml b/plugins/DigitalLibrary/resources/qml/OpenProjectFilesPage.qml
new file mode 100644
index 0000000000..e1918b3da7
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/OpenProjectFilesPage.qml
@@ -0,0 +1,198 @@
+// Copyright (C) 2021 Ultimaker B.V.
+
+import QtQuick 2.10
+import QtQuick.Window 2.2
+import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one
+import QtQuick.Controls 2.3
+import QtQuick.Controls.Styles 1.4
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+import DigitalFactory 1.0 as DF
+
+
+Item
+{
+ id: base
+ width: parent.width
+ height: parent.height
+
+ property var fileModel: manager.digitalFactoryFileModel
+
+ signal openFilePressed()
+ signal selectDifferentProjectPressed()
+
+ anchors
+ {
+ fill: parent
+ margins: UM.Theme.getSize("default_margin").width
+ }
+
+ ProjectSummaryCard
+ {
+ id: projectSummaryCard
+
+ anchors.top: parent.top
+
+ property var selectedItem: manager.digitalFactoryProjectModel.getItem(manager.selectedProjectIndex)
+
+ imageSource: selectedItem.thumbnailUrl || "../images/placeholder.svg"
+ projectNameText: selectedItem.displayName || ""
+ projectUsernameText: selectedItem.username || ""
+ projectLastUpdatedText: "Last updated: " + selectedItem.lastUpdated
+ cardMouseAreaEnabled: false
+ }
+
+ Rectangle
+ {
+ id: projectFilesContent
+ width: parent.width
+ anchors.top: projectSummaryCard.bottom
+ anchors.topMargin: UM.Theme.getSize("default_margin").width
+ anchors.bottom: selectDifferentProjectButton.top
+ anchors.bottomMargin: UM.Theme.getSize("default_margin").width
+
+ color: UM.Theme.getColor("main_background")
+ border.width: UM.Theme.getSize("default_lining").width
+ border.color: UM.Theme.getColor("lining")
+
+
+ Cura.TableView
+ {
+ id: filesTableView
+ anchors.fill: parent
+ model: manager.digitalFactoryFileModel
+ visible: model.count != 0 && manager.retrievingFileStatus != DF.RetrievalStatus.InProgress
+ selectionMode: OldControls.SelectionMode.SingleSelection
+
+ OldControls.TableViewColumn
+ {
+ id: fileNameColumn
+ role: "fileName"
+ title: "Name"
+ width: Math.round(filesTableView.width / 3)
+ }
+
+ OldControls.TableViewColumn
+ {
+ id: usernameColumn
+ role: "username"
+ title: "Uploaded by"
+ width: Math.round(filesTableView.width / 3)
+ }
+
+ OldControls.TableViewColumn
+ {
+ role: "uploadedAt"
+ title: "Uploaded at"
+ }
+
+ Connections
+ {
+ target: filesTableView.selection
+ function onSelectionChanged()
+ {
+ let newSelection = [];
+ filesTableView.selection.forEach(function(rowIndex) { newSelection.push(rowIndex); });
+ manager.setSelectedFileIndices(newSelection);
+ }
+ }
+ }
+
+ Label
+ {
+ id: emptyProjectLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+ text: "Select a project to view its files."
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("setting_category_text")
+
+ Connections
+ {
+ target: manager
+ function onSelectedProjectIndexChanged(newProjectIndex)
+ {
+ emptyProjectLabel.visible = (newProjectIndex == -1)
+ }
+ }
+ }
+
+ Label
+ {
+ id: noFilesInProjectLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+ visible: (manager.digitalFactoryFileModel.count == 0 && !emptyProjectLabel.visible && !retrievingFilesBusyIndicator.visible)
+ text: "No supported files in this project."
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("setting_category_text")
+ }
+
+ BusyIndicator
+ {
+ // Shows up while Cura is waiting to receive the files of a project from the digital factory library
+ id: retrievingFilesBusyIndicator
+
+ anchors
+ {
+ verticalCenter: parent.verticalCenter
+ horizontalCenter: parent.horizontalCenter
+ }
+
+ width: parent.width / 4
+ height: width
+ visible: manager.retrievingFilesStatus == DF.RetrievalStatus.InProgress
+ running: visible
+ palette.dark: UM.Theme.getColor("text")
+ }
+
+ Connections
+ {
+ target: manager.digitalFactoryFileModel
+
+ function onItemsChanged()
+ {
+ // Make sure no files are selected when the file model changes
+ filesTableView.currentRow = -1
+ filesTableView.selection.clear()
+ }
+ }
+ }
+ Cura.SecondaryButton
+ {
+ id: selectDifferentProjectButton
+
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ text: "Change Library project"
+
+ onClicked:
+ {
+ manager.clearProjectSelection()
+ }
+ busy: false
+ }
+
+ Cura.PrimaryButton
+ {
+ id: openFilesButton
+
+ anchors.bottom: parent.bottom
+ anchors.right: parent.right
+ text: "Open"
+ enabled: filesTableView.selection.count > 0
+ onClicked:
+ {
+ manager.openSelectedFiles()
+ }
+ busy: false
+ }
+
+ Component.onCompleted:
+ {
+ openFilesButton.clicked.connect(base.openFilePressed)
+ selectDifferentProjectButton.clicked.connect(base.selectDifferentProjectPressed)
+ }
+} \ No newline at end of file
diff --git a/plugins/DigitalLibrary/resources/qml/ProjectSummaryCard.qml b/plugins/DigitalLibrary/resources/qml/ProjectSummaryCard.qml
new file mode 100644
index 0000000000..4374b2f998
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/ProjectSummaryCard.qml
@@ -0,0 +1,92 @@
+// Copyright (C) 2021 Ultimaker B.V.
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+Cura.RoundedRectangle
+{
+ id: base
+ width: parent.width
+ height: projectImage.height + 2 * UM.Theme.getSize("default_margin").width
+ cornerSide: Cura.RoundedRectangle.Direction.All
+ border.color: UM.Theme.getColor("lining")
+ border.width: UM.Theme.getSize("default_lining").width
+ radius: UM.Theme.getSize("default_radius").width
+ color: UM.Theme.getColor("main_background")
+ signal clicked()
+ property alias imageSource: projectImage.source
+ property alias projectNameText: displayNameLabel.text
+ property alias projectUsernameText: usernameLabel.text
+ property alias projectLastUpdatedText: lastUpdatedLabel.text
+ property alias cardMouseAreaEnabled: cardMouseArea.enabled
+
+ onVisibleChanged: color = UM.Theme.getColor("main_background")
+
+ MouseArea
+ {
+ id: cardMouseArea
+ anchors.fill: parent
+ hoverEnabled: true
+ onEntered: base.color = UM.Theme.getColor("action_button_hovered")
+ onExited: base.color = UM.Theme.getColor("main_background")
+ onClicked: base.clicked()
+ }
+ Row
+ {
+ id: projectInformationRow
+ width: parent.width
+ padding: UM.Theme.getSize("default_margin").width
+ spacing: UM.Theme.getSize("default_margin").width
+
+ Image
+ {
+ id: projectImage
+ anchors.verticalCenter: parent.verticalCenter
+ width: UM.Theme.getSize("toolbox_thumbnail_small").width
+ height: Math.round(width * 3/4)
+ sourceSize.width: width
+ sourceSize.height: height
+ fillMode: Image.PreserveAspectFit
+ mipmap: true
+ }
+ Column
+ {
+ id: projectLabelsColumn
+ height: projectImage.height
+ width: parent.width - x - UM.Theme.getSize("default_margin").width
+ anchors.verticalCenter: parent.verticalCenter
+
+ Label
+ {
+ id: displayNameLabel
+ width: parent.width
+ height: Math.round(parent.height / 3)
+ elide: Text.ElideRight
+ color: UM.Theme.getColor("text")
+ font: UM.Theme.getFont("default_bold")
+ }
+
+ Label
+ {
+ id: usernameLabel
+ width: parent.width
+ height: Math.round(parent.height / 3)
+ elide: Text.ElideRight
+ color: UM.Theme.getColor("small_button_text")
+ font: UM.Theme.getFont("default")
+ }
+
+ Label
+ {
+ id: lastUpdatedLabel
+ width: parent.width
+ height: Math.round(parent.height / 3)
+ elide: Text.ElideRight
+ color: UM.Theme.getColor("small_button_text")
+ font: UM.Theme.getFont("default")
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/plugins/DigitalLibrary/resources/qml/SaveProjectFilesPage.qml b/plugins/DigitalLibrary/resources/qml/SaveProjectFilesPage.qml
new file mode 100644
index 0000000000..03bd655957
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/SaveProjectFilesPage.qml
@@ -0,0 +1,259 @@
+// Copyright (C) 2021 Ultimaker B.V.
+
+import QtQuick 2.10
+import QtQuick.Window 2.2
+import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one
+import QtQuick.Controls 2.3
+import QtQuick.Controls.Styles 1.4
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+import DigitalFactory 1.0 as DF
+
+
+Item
+{
+ id: base
+ width: parent.width
+ height: parent.height
+ property var fileModel: manager.digitalFactoryFileModel
+
+ signal savePressed()
+ signal selectDifferentProjectPressed()
+
+ anchors
+ {
+ fill: parent
+ margins: UM.Theme.getSize("default_margin").width
+ }
+
+ ProjectSummaryCard
+ {
+ id: projectSummaryCard
+
+ anchors.top: parent.top
+
+ property var selectedItem: manager.digitalFactoryProjectModel.getItem(manager.selectedProjectIndex)
+
+ imageSource: selectedItem.thumbnailUrl || "../images/placeholder.svg"
+ projectNameText: selectedItem.displayName || ""
+ projectUsernameText: selectedItem.username || ""
+ projectLastUpdatedText: "Last updated: " + selectedItem.lastUpdated
+ cardMouseAreaEnabled: false
+ }
+
+ Label
+ {
+ id: fileNameLabel
+ anchors.top: projectSummaryCard.bottom
+ anchors.topMargin: UM.Theme.getSize("default_margin").height
+ text: "Cura project name"
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ }
+
+
+ Cura.TextField
+ {
+ id: dfFilenameTextfield
+ width: parent.width
+ anchors.left: parent.left
+ anchors.top: fileNameLabel.bottom
+ anchors.topMargin: UM.Theme.getSize("thin_margin").height
+ validator: RegExpValidator
+ {
+ regExp: /^[^\\\/\*\?\|\[\]]{0,96}$/
+ }
+
+ text: PrintInformation.jobName
+ font: UM.Theme.getFont("medium")
+ placeholderText: "Enter the name of the file."
+ onAccepted: { if (saveButton.enabled) {saveButton.clicked()}}
+ }
+
+
+ Rectangle
+ {
+ id: projectFilesContent
+ width: parent.width
+ anchors.top: dfFilenameTextfield.bottom
+ anchors.topMargin: UM.Theme.getSize("wide_margin").height
+ anchors.bottom: selectDifferentProjectButton.top
+ anchors.bottomMargin: UM.Theme.getSize("default_margin").width
+
+ color: UM.Theme.getColor("main_background")
+ border.width: UM.Theme.getSize("default_lining").width
+ border.color: UM.Theme.getColor("lining")
+
+
+ Cura.TableView
+ {
+ id: filesTableView
+ anchors.fill: parent
+ model: manager.digitalFactoryFileModel
+ visible: model.count != 0 && manager.retrievingFileStatus != DF.RetrievalStatus.InProgress
+ selectionMode: OldControls.SelectionMode.NoSelection
+
+ OldControls.TableViewColumn
+ {
+ id: fileNameColumn
+ role: "fileName"
+ title: "@tableViewColumn:title", "Name"
+ width: Math.round(filesTableView.width / 3)
+ }
+
+ OldControls.TableViewColumn
+ {
+ id: usernameColumn
+ role: "username"
+ title: "Uploaded by"
+ width: Math.round(filesTableView.width / 3)
+ }
+
+ OldControls.TableViewColumn
+ {
+ role: "uploadedAt"
+ title: "Uploaded at"
+ }
+ }
+
+ Label
+ {
+ id: emptyProjectLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+ text: "Select a project to view its files."
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("setting_category_text")
+
+ Connections
+ {
+ target: manager
+ function onSelectedProjectIndexChanged()
+ {
+ emptyProjectLabel.visible = (manager.newProjectIndex == -1)
+ }
+ }
+ }
+
+ Label
+ {
+ id: noFilesInProjectLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+ visible: (manager.digitalFactoryFileModel.count == 0 && !emptyProjectLabel.visible && !retrievingFilesBusyIndicator.visible)
+ text: "No supported files in this project."
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("setting_category_text")
+ }
+
+ BusyIndicator
+ {
+ // Shows up while Cura is waiting to receive the files of a project from the digital factory library
+ id: retrievingFilesBusyIndicator
+
+ anchors
+ {
+ verticalCenter: parent.verticalCenter
+ horizontalCenter: parent.horizontalCenter
+ }
+
+ width: parent.width / 4
+ height: width
+ visible: manager.retrievingFilesStatus == DF.RetrievalStatus.InProgress
+ running: visible
+ palette.dark: UM.Theme.getColor("text")
+ }
+
+ Connections
+ {
+ target: manager.digitalFactoryFileModel
+
+ function onItemsChanged()
+ {
+ // Make sure no files are selected when the file model changes
+ filesTableView.currentRow = -1
+ filesTableView.selection.clear()
+ }
+ }
+ }
+ Cura.SecondaryButton
+ {
+ id: selectDifferentProjectButton
+
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ text: "Change Library project"
+
+ onClicked:
+ {
+ manager.selectedProjectIndex = -1
+ }
+ busy: false
+ }
+
+ Cura.PrimaryButton
+ {
+ id: saveButton
+
+ anchors.bottom: parent.bottom
+ anchors.right: parent.right
+ text: "Save"
+ enabled: (asProjectCheckbox.checked || asSlicedCheckbox.checked) && dfFilenameTextfield.text != ""
+
+ onClicked:
+ {
+ let saveAsFormats = [];
+ if (asProjectCheckbox.checked)
+ {
+ saveAsFormats.push("3mf");
+ }
+ if (asSlicedCheckbox.checked)
+ {
+ saveAsFormats.push("ufp");
+ }
+ manager.saveFileToSelectedProject(dfFilenameTextfield.text, saveAsFormats);
+ }
+ busy: false
+ }
+
+ Row
+ {
+
+ id: saveAsFormatRow
+ anchors.verticalCenter: saveButton.verticalCenter
+ anchors.right: saveButton.left
+ anchors.rightMargin: UM.Theme.getSize("thin_margin").height
+ width: childrenRect.width
+ spacing: UM.Theme.getSize("default_margin").width
+
+ Cura.CheckBox
+ {
+ id: asProjectCheckbox
+ height: UM.Theme.getSize("checkbox").height
+ anchors.verticalCenter: parent.verticalCenter
+ checked: true
+ text: "Save Cura project"
+ font: UM.Theme.getFont("medium")
+ }
+
+ Cura.CheckBox
+ {
+ id: asSlicedCheckbox
+ height: UM.Theme.getSize("checkbox").height
+ anchors.verticalCenter: parent.verticalCenter
+
+ enabled: UM.Backend.state == UM.Backend.Done
+ checked: UM.Backend.state == UM.Backend.Done
+ text: "Save print file"
+ font: UM.Theme.getFont("medium")
+ }
+ }
+
+ Component.onCompleted:
+ {
+ saveButton.clicked.connect(base.savePressed)
+ selectDifferentProjectButton.clicked.connect(base.selectDifferentProjectPressed)
+ }
+}
diff --git a/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml b/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml
new file mode 100644
index 0000000000..2de0e78cc7
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml
@@ -0,0 +1,202 @@
+// Copyright (C) 2021 Ultimaker B.V.
+
+import QtQuick 2.10
+import QtQuick.Window 2.2
+import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one
+import QtQuick.Controls 2.3
+import QtQuick.Controls.Styles 1.4
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+import DigitalFactory 1.0 as DF
+
+
+Item
+{
+ id: base
+
+ width: parent.width
+ height: parent.height
+ property alias createNewProjectButtonVisible: createNewProjectButton.visible
+
+ anchors
+ {
+ top: parent.top
+ bottom: parent.bottom
+ left: parent.left
+ right: parent.right
+ margins: UM.Theme.getSize("default_margin").width
+ }
+
+ Label
+ {
+ id: selectProjectLabel
+
+ text: "Select Project"
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("small_button_text")
+ anchors.top: parent.top
+ anchors.left: parent.left
+ visible: projectListContainer.visible
+ }
+
+ Cura.SecondaryButton
+ {
+ id: createNewProjectButton
+
+ anchors.verticalCenter: selectProjectLabel.verticalCenter
+ anchors.right: parent.right
+ text: "New Library project"
+
+ onClicked:
+ {
+ createNewProjectPopup.open()
+ }
+ busy: manager.creatingNewProjectStatus == DF.RetrievalStatus.InProgress
+ }
+
+ Item
+ {
+ id: noLibraryProjectsContainer
+ anchors
+ {
+ top: parent.top
+ bottom: parent.bottom
+ left: parent.left
+ right: parent.right
+ }
+ visible: manager.digitalFactoryProjectModel.count == 0 && (manager.retrievingProjectsStatus == DF.RetrievalStatus.Success || manager.retrievingProjectsStatus == DF.RetrievalStatus.Failed)
+
+ Column
+ {
+ anchors.centerIn: parent
+ spacing: UM.Theme.getSize("thin_margin").height
+ Image
+ {
+ id: digitalFactoryImage
+ anchors.horizontalCenter: parent.horizontalCenter
+ source: "../images/digital_factory.svg"
+ fillMode: Image.PreserveAspectFit
+ width: parent.width - 2 * UM.Theme.getSize("thick_margin").width
+ sourceSize.width: width
+ sourceSize.height: height
+ }
+
+ Label
+ {
+ id: noLibraryProjectsLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ text: "It appears that you don't have any projects in the Library yet."
+ font: UM.Theme.getFont("medium")
+ }
+
+ Cura.TertiaryButton
+ {
+ id: visitDigitalLibraryButton
+ anchors.horizontalCenter: parent.horizontalCenter
+ text: "Visit Digital Library"
+ onClicked: Qt.openUrlExternally(CuraApplication.ultimakerDigitalFactoryUrl + "/app/library")
+ }
+ }
+ }
+
+ Item
+ {
+ id: projectListContainer
+ anchors
+ {
+ top: selectProjectLabel.bottom
+ topMargin: UM.Theme.getSize("default_margin").height
+ bottom: parent.bottom
+ left: parent.left
+ right: parent.right
+ }
+ visible: manager.digitalFactoryProjectModel.count > 0
+
+ // Use a flickable and a column with a repeater instead of a ListView in a ScrollView, because the ScrollView cannot
+ // have additional children (aside from the view inside it), which wouldn't allow us to add the LoadMoreProjectsCard
+ // in it.
+ Flickable
+ {
+ id: flickableView
+ clip: true
+ contentWidth: parent.width
+ contentHeight: projectsListView.implicitHeight
+ anchors.fill: parent
+
+ ScrollBar.vertical: ScrollBar
+ {
+ // Vertical ScrollBar, styled similarly to the scrollBar in the settings panel
+ id: verticalScrollBar
+ visible: flickableView.contentHeight > flickableView.height
+
+ background: Rectangle
+ {
+ implicitWidth: UM.Theme.getSize("scrollbar").width
+ radius: Math.round(implicitWidth / 2)
+ color: UM.Theme.getColor("scrollbar_background")
+ }
+
+ contentItem: Rectangle
+ {
+ id: scrollViewHandle
+ implicitWidth: UM.Theme.getSize("scrollbar").width
+ radius: Math.round(implicitWidth / 2)
+
+ color: verticalScrollBar.pressed ? UM.Theme.getColor("scrollbar_handle_down") : verticalScrollBar.hovered ? UM.Theme.getColor("scrollbar_handle_hover") : UM.Theme.getColor("scrollbar_handle")
+ Behavior on color { ColorAnimation { duration: 50; } }
+ }
+ }
+
+ Column
+ {
+ id: projectsListView
+ width: verticalScrollBar.visible ? parent.width - verticalScrollBar.width - UM.Theme.getSize("default_margin").width : parent.width
+ anchors.top: parent.top
+ spacing: UM.Theme.getSize("narrow_margin").width
+
+ Repeater
+ {
+ model: manager.digitalFactoryProjectModel
+ delegate: ProjectSummaryCard
+ {
+ id: projectSummaryCard
+ imageSource: model.thumbnailUrl || "../images/placeholder.svg"
+ projectNameText: model.displayName
+ projectUsernameText: model.username
+ projectLastUpdatedText: "Last updated: " + model.lastUpdated
+
+ onClicked:
+ {
+ manager.selectedProjectIndex = index
+ }
+ }
+ }
+
+ LoadMoreProjectsCard
+ {
+ id: loadMoreProjectsCard
+ height: UM.Theme.getSize("toolbox_thumbnail_small").height
+ width: parent.width
+ visible: manager.digitalFactoryProjectModel.count > 0
+ hasMoreProjectsToLoad: manager.hasMoreProjectsToLoad
+
+ onClicked:
+ {
+ manager.loadMoreProjects()
+ }
+ }
+ }
+ }
+ }
+
+ CreateNewProjectPopup
+ {
+ id: createNewProjectPopup
+ width: 400 * screenScaleFactor
+ height: 220 * screenScaleFactor
+ x: Math.round((parent.width - width) / 2)
+ y: Math.round((parent.height - height) / 2)
+ }
+} \ No newline at end of file