SaveProjectFilesPage.qml 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. // Copyright (C) 2021 Ultimaker B.V.
  2. import QtQuick 2.10
  3. import QtQuick.Window 2.2
  4. 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
  5. import QtQuick.Controls 2.3
  6. import QtQuick.Controls.Styles 1.4
  7. import UM 1.2 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: /^[^\\\/\*\?\|\[\]]{0,96}$/
  53. }
  54. text: PrintInformation.jobName
  55. font: UM.Theme.getFont("medium")
  56. placeholderText: "Enter the name of the file."
  57. onAccepted: { if (saveButton.enabled) {saveButton.clicked()}}
  58. }
  59. Rectangle
  60. {
  61. id: projectFilesContent
  62. width: parent.width
  63. anchors.top: dfFilenameTextfield.bottom
  64. anchors.topMargin: UM.Theme.getSize("wide_margin").height
  65. anchors.bottom: selectDifferentProjectButton.top
  66. anchors.bottomMargin: UM.Theme.getSize("default_margin").width
  67. color: UM.Theme.getColor("main_background")
  68. border.width: UM.Theme.getSize("default_lining").width
  69. border.color: UM.Theme.getColor("lining")
  70. Cura.TableView
  71. {
  72. id: filesTableView
  73. anchors.fill: parent
  74. model: manager.digitalFactoryFileModel
  75. visible: model.count != 0 && manager.retrievingFileStatus != DF.RetrievalStatus.InProgress
  76. selectionMode: OldControls.SelectionMode.NoSelection
  77. OldControls.TableViewColumn
  78. {
  79. id: fileNameColumn
  80. role: "fileName"
  81. title: "@tableViewColumn:title", "Name"
  82. width: Math.round(filesTableView.width / 3)
  83. }
  84. OldControls.TableViewColumn
  85. {
  86. id: usernameColumn
  87. role: "username"
  88. title: "Uploaded by"
  89. width: Math.round(filesTableView.width / 3)
  90. }
  91. OldControls.TableViewColumn
  92. {
  93. role: "uploadedAt"
  94. title: "Uploaded at"
  95. }
  96. }
  97. Label
  98. {
  99. id: emptyProjectLabel
  100. anchors.horizontalCenter: parent.horizontalCenter
  101. anchors.verticalCenter: parent.verticalCenter
  102. text: "Select a project to view its files."
  103. font: UM.Theme.getFont("default")
  104. color: UM.Theme.getColor("setting_category_text")
  105. Connections
  106. {
  107. target: manager
  108. function onSelectedProjectIndexChanged()
  109. {
  110. emptyProjectLabel.visible = (manager.newProjectIndex == -1)
  111. }
  112. }
  113. }
  114. Label
  115. {
  116. id: noFilesInProjectLabel
  117. anchors.horizontalCenter: parent.horizontalCenter
  118. anchors.verticalCenter: parent.verticalCenter
  119. visible: (manager.digitalFactoryFileModel.count == 0 && !emptyProjectLabel.visible && !retrievingFilesBusyIndicator.visible)
  120. text: "No supported files in this project."
  121. font: UM.Theme.getFont("default")
  122. color: UM.Theme.getColor("setting_category_text")
  123. }
  124. BusyIndicator
  125. {
  126. // Shows up while Cura is waiting to receive the files of a project from the digital factory library
  127. id: retrievingFilesBusyIndicator
  128. anchors
  129. {
  130. verticalCenter: parent.verticalCenter
  131. horizontalCenter: parent.horizontalCenter
  132. }
  133. width: parent.width / 4
  134. height: width
  135. visible: manager.retrievingFilesStatus == DF.RetrievalStatus.InProgress
  136. running: visible
  137. palette.dark: UM.Theme.getColor("text")
  138. }
  139. Connections
  140. {
  141. target: manager.digitalFactoryFileModel
  142. function onItemsChanged()
  143. {
  144. // Make sure no files are selected when the file model changes
  145. filesTableView.currentRow = -1
  146. filesTableView.selection.clear()
  147. }
  148. }
  149. }
  150. Cura.SecondaryButton
  151. {
  152. id: selectDifferentProjectButton
  153. anchors.bottom: parent.bottom
  154. anchors.left: parent.left
  155. text: "Change Library project"
  156. onClicked:
  157. {
  158. manager.selectedProjectIndex = -1
  159. }
  160. busy: false
  161. }
  162. Cura.PrimaryButton
  163. {
  164. id: saveButton
  165. anchors.bottom: parent.bottom
  166. anchors.right: parent.right
  167. text: "Save"
  168. enabled: (asProjectCheckbox.checked || asSlicedCheckbox.checked) && dfFilenameTextfield.text != ""
  169. onClicked:
  170. {
  171. let saveAsFormats = [];
  172. if (asProjectCheckbox.checked)
  173. {
  174. saveAsFormats.push("3mf");
  175. }
  176. if (asSlicedCheckbox.checked)
  177. {
  178. saveAsFormats.push("ufp");
  179. }
  180. manager.saveFileToSelectedProject(dfFilenameTextfield.text, saveAsFormats);
  181. }
  182. busy: false
  183. }
  184. Row
  185. {
  186. id: saveAsFormatRow
  187. anchors.verticalCenter: saveButton.verticalCenter
  188. anchors.right: saveButton.left
  189. anchors.rightMargin: UM.Theme.getSize("thin_margin").height
  190. width: childrenRect.width
  191. spacing: UM.Theme.getSize("default_margin").width
  192. Cura.CheckBox
  193. {
  194. id: asProjectCheckbox
  195. height: UM.Theme.getSize("checkbox").height
  196. anchors.verticalCenter: parent.verticalCenter
  197. checked: true
  198. text: "Save Cura project"
  199. font: UM.Theme.getFont("medium")
  200. }
  201. Cura.CheckBox
  202. {
  203. id: asSlicedCheckbox
  204. height: UM.Theme.getSize("checkbox").height
  205. anchors.verticalCenter: parent.verticalCenter
  206. enabled: UM.Backend.state == UM.Backend.Done
  207. checked: UM.Backend.state == UM.Backend.Done
  208. text: "Save print file"
  209. font: UM.Theme.getFont("medium")
  210. }
  211. }
  212. Component.onCompleted:
  213. {
  214. saveButton.clicked.connect(base.savePressed)
  215. selectDifferentProjectButton.clicked.connect(base.selectDifferentProjectPressed)
  216. }
  217. }