SaveProjectFilesPage.qml 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. //Copyright (C) 2022 Ultimaker B.V.
  2. //Cura is released under the terms of the LGPLv3 or higher.
  3. import Qt.labs.qmlmodels 1.0
  4. import QtQuick 2.10
  5. import QtQuick.Window 2.2
  6. import QtQuick.Controls 2.3
  7. import UM 1.5 as UM
  8. import Cura 1.6 as Cura
  9. import DigitalFactory 1.0 as DF
  10. Item
  11. {
  12. id: base
  13. width: parent.width
  14. height: parent.height
  15. property var fileModel: manager.digitalFactoryFileModel
  16. signal savePressed()
  17. signal selectDifferentProjectPressed()
  18. anchors
  19. {
  20. fill: parent
  21. margins: UM.Theme.getSize("default_margin").width
  22. }
  23. ProjectSummaryCard
  24. {
  25. id: projectSummaryCard
  26. anchors.top: parent.top
  27. property var selectedItem: manager.digitalFactoryProjectModel.getItem(manager.selectedProjectIndex)
  28. imageSource: selectedItem.thumbnailUrl || "../images/placeholder.svg"
  29. projectNameText: selectedItem.displayName || ""
  30. projectUsernameText: selectedItem.username || ""
  31. projectLastUpdatedText: "Last updated: " + selectedItem.lastUpdated
  32. cardMouseAreaEnabled: false
  33. }
  34. Label
  35. {
  36. id: fileNameLabel
  37. anchors.top: projectSummaryCard.bottom
  38. anchors.topMargin: UM.Theme.getSize("default_margin").height
  39. text: "Cura project name"
  40. font: UM.Theme.getFont("medium")
  41. color: UM.Theme.getColor("text")
  42. }
  43. Cura.TextField
  44. {
  45. id: dfFilenameTextfield
  46. width: parent.width
  47. anchors.left: parent.left
  48. anchors.top: fileNameLabel.bottom
  49. anchors.topMargin: UM.Theme.getSize("thin_margin").height
  50. validator: RegExpValidator
  51. {
  52. regExp: /^[\w\-\. ()]{0,255}$/
  53. }
  54. text: PrintInformation.jobName
  55. font: fontMetrics.font
  56. height: fontMetrics.height + 2 * UM.Theme.getSize("thin_margin").height
  57. placeholderText: "Enter the name of the file."
  58. onAccepted: { if (saveButton.enabled) {saveButton.clicked()}}
  59. }
  60. FontMetrics
  61. {
  62. id: fontMetrics
  63. font: UM.Theme.getFont("medium")
  64. }
  65. Rectangle
  66. {
  67. id: projectFilesContent
  68. width: parent.width
  69. anchors.top: dfFilenameTextfield.bottom
  70. anchors.topMargin: UM.Theme.getSize("wide_margin").height
  71. anchors.bottom: selectDifferentProjectButton.top
  72. anchors.bottomMargin: UM.Theme.getSize("default_margin").width
  73. color: UM.Theme.getColor("main_background")
  74. border.width: UM.Theme.getSize("default_lining").width
  75. border.color: UM.Theme.getColor("lining")
  76. //We can't use Cura's TableView here, since in Cura >= 5.0 this uses QtQuick.TableView, while in Cura < 5.0 this uses QtControls1.TableView.
  77. //So we have to define our own. Once support for 4.13 and earlier is dropped, we can switch to Cura.TableView.
  78. Table
  79. {
  80. id: filesTableView
  81. anchors.fill: parent
  82. anchors.margins: parent.border.width
  83. allowSelection: false
  84. columnHeaders: ["Name", "Uploaded by", "Uploaded at"]
  85. model: TableModel
  86. {
  87. TableModelColumn { display: "fileName" }
  88. TableModelColumn { display: "username" }
  89. TableModelColumn { display: "uploadedAt" }
  90. rows: manager.digitalFactoryFileModel.items
  91. }
  92. }
  93. Label
  94. {
  95. id: emptyProjectLabel
  96. anchors.horizontalCenter: parent.horizontalCenter
  97. anchors.verticalCenter: parent.verticalCenter
  98. text: "Select a project to view its files."
  99. font: UM.Theme.getFont("default")
  100. color: UM.Theme.getColor("setting_category_text")
  101. Connections
  102. {
  103. target: manager
  104. function onSelectedProjectIndexChanged()
  105. {
  106. emptyProjectLabel.visible = (manager.newProjectIndex == -1)
  107. }
  108. }
  109. }
  110. Label
  111. {
  112. id: noFilesInProjectLabel
  113. anchors.horizontalCenter: parent.horizontalCenter
  114. anchors.verticalCenter: parent.verticalCenter
  115. visible: (manager.digitalFactoryFileModel.count == 0 && !emptyProjectLabel.visible && !retrievingFilesBusyIndicator.visible)
  116. text: "No supported files in this project."
  117. font: UM.Theme.getFont("default")
  118. color: UM.Theme.getColor("setting_category_text")
  119. }
  120. BusyIndicator
  121. {
  122. // Shows up while Cura is waiting to receive the files of a project from the digital factory library
  123. id: retrievingFilesBusyIndicator
  124. anchors
  125. {
  126. verticalCenter: parent.verticalCenter
  127. horizontalCenter: parent.horizontalCenter
  128. }
  129. width: parent.width / 4
  130. height: width
  131. visible: manager.retrievingFilesStatus == DF.RetrievalStatus.InProgress
  132. running: visible
  133. palette.dark: UM.Theme.getColor("text")
  134. }
  135. Connections
  136. {
  137. target: manager.digitalFactoryFileModel
  138. function onItemsChanged()
  139. {
  140. // Make sure no files are selected when the file model changes
  141. filesTableView.currentRow = -1;
  142. }
  143. }
  144. }
  145. Cura.SecondaryButton
  146. {
  147. id: selectDifferentProjectButton
  148. anchors.bottom: parent.bottom
  149. anchors.left: parent.left
  150. text: "Change Library project"
  151. onClicked:
  152. {
  153. manager.selectedProjectIndex = -1
  154. }
  155. busy: false
  156. }
  157. Cura.PrimaryButton
  158. {
  159. id: saveButton
  160. anchors.bottom: parent.bottom
  161. anchors.right: parent.right
  162. text: "Save"
  163. enabled: (asProjectCheckbox.checked || asSlicedCheckbox.checked) && dfFilenameTextfield.text.length >= 1 && dfFilenameTextfield.state !== 'invalid'
  164. onClicked:
  165. {
  166. let saveAsFormats = [];
  167. if (asProjectCheckbox.checked)
  168. {
  169. saveAsFormats.push("3mf");
  170. }
  171. if (asSlicedCheckbox.checked)
  172. {
  173. saveAsFormats.push("ufp");
  174. }
  175. manager.saveFileToSelectedProject(dfFilenameTextfield.text, saveAsFormats);
  176. }
  177. busy: false
  178. }
  179. Row
  180. {
  181. id: saveAsFormatRow
  182. anchors.verticalCenter: saveButton.verticalCenter
  183. anchors.right: saveButton.left
  184. anchors.rightMargin: UM.Theme.getSize("thin_margin").height
  185. width: childrenRect.width
  186. spacing: UM.Theme.getSize("default_margin").width
  187. UM.CheckBox
  188. {
  189. id: asProjectCheckbox
  190. height: UM.Theme.getSize("checkbox").height
  191. anchors.verticalCenter: parent.verticalCenter
  192. checked: true
  193. text: "Save Cura project"
  194. font: UM.Theme.getFont("medium")
  195. }
  196. UM.CheckBox
  197. {
  198. id: asSlicedCheckbox
  199. height: UM.Theme.getSize("checkbox").height
  200. anchors.verticalCenter: parent.verticalCenter
  201. enabled: UM.Backend.state == UM.Backend.Done
  202. checked: UM.Backend.state == UM.Backend.Done
  203. text: "Save print file"
  204. font: UM.Theme.getFont("medium")
  205. }
  206. }
  207. Component.onCompleted:
  208. {
  209. saveButton.clicked.connect(base.savePressed)
  210. selectDifferentProjectButton.clicked.connect(base.selectDifferentProjectPressed)
  211. }
  212. }