MachinesPage.qml 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. // Copyright (c) 2016 Ultimaker B.V.
  2. // Cura is released under the terms of the AGPLv3 or higher.
  3. import QtQuick 2.1
  4. import QtQuick.Controls 1.1
  5. import QtQuick.Window 2.1
  6. import UM 1.2 as UM
  7. import Cura 1.0 as Cura
  8. UM.ManagementPage
  9. {
  10. id: base;
  11. title: catalog.i18nc("@title:tab", "Printers");
  12. model: UM.ContainerStacksModel
  13. {
  14. filter: {"type": "machine"}
  15. }
  16. activeId: Cura.MachineManager.activeMachineId
  17. activeIndex: activeMachineIndex()
  18. function activeMachineIndex()
  19. {
  20. for(var i = 0; i < model.rowCount(); i++) {
  21. if (model.getItem(i).id == Cura.MachineManager.activeMachineId) {
  22. return i;
  23. }
  24. }
  25. return -1;
  26. }
  27. buttons: [
  28. Button
  29. {
  30. text: catalog.i18nc("@action:button", "Activate");
  31. iconName: "list-activate";
  32. enabled: base.currentItem != null && base.currentItem.id != Cura.MachineManager.activeMaterialId
  33. onClicked: Cura.MachineManager.setActiveMachine(base.currentItem.id)
  34. },
  35. Button
  36. {
  37. text: catalog.i18nc("@action:button", "Add");
  38. iconName: "list-add";
  39. onClicked: CuraApplication.requestAddPrinter()
  40. },
  41. Button
  42. {
  43. text: catalog.i18nc("@action:button", "Remove");
  44. iconName: "list-remove";
  45. enabled: base.currentItem != null && model.rowCount() > 1
  46. onClicked: confirmDialog.open();
  47. },
  48. Button
  49. {
  50. text: catalog.i18nc("@action:button", "Rename");
  51. iconName: "edit-rename";
  52. enabled: base.currentItem != null
  53. onClicked: renameDialog.open();
  54. }
  55. ]
  56. Item
  57. {
  58. visible: base.currentItem != null
  59. anchors.fill: parent
  60. Text
  61. {
  62. id: machineName
  63. text: base.currentItem && base.currentItem.name ? base.currentItem.name : ""
  64. font: UM.Theme.getFont("large")
  65. width: parent.width
  66. elide: Text.ElideRight
  67. }
  68. Flow
  69. {
  70. id: machineActions
  71. visible: currentItem && currentItem.id == Cura.MachineManager.activeMachineId
  72. anchors.left: parent.left
  73. anchors.right: parent.right
  74. anchors.top: machineName.bottom
  75. anchors.topMargin: UM.Theme.getSize("default_margin").height
  76. Repeater
  77. {
  78. id: machineActionRepeater
  79. model: base.currentItem ? Cura.MachineActionManager.getSupportedActions(Cura.MachineManager.getDefinitionByMachineId(base.currentItem.id)) : null
  80. Item
  81. {
  82. width: childrenRect.width + 2
  83. height: childrenRect.height
  84. Button
  85. {
  86. text: machineActionRepeater.model[index].label
  87. onClicked:
  88. {
  89. actionDialog.content = machineActionRepeater.model[index].displayItem;
  90. machineActionRepeater.model[index].displayItem.reset();
  91. actionDialog.title = machineActionRepeater.model[index].label;
  92. actionDialog.show();
  93. }
  94. }
  95. }
  96. }
  97. }
  98. UM.Dialog
  99. {
  100. id: actionDialog
  101. property var content
  102. minimumWidth: 350 * Screen.devicePixelRatio;
  103. minimumHeight: 350 * Screen.devicePixelRatio;
  104. onContentChanged:
  105. {
  106. contents = content;
  107. content.onCompleted.connect(hide)
  108. content.dialog = actionDialog
  109. }
  110. rightButtons: Button
  111. {
  112. text: catalog.i18nc("@action:button", "Close")
  113. iconName: "dialog-close"
  114. onClicked: actionDialog.reject()
  115. }
  116. }
  117. Grid
  118. {
  119. id: machineInfo
  120. anchors.top: machineActions.visible ? machineActions.bottom : machineActions.anchors.top
  121. anchors.topMargin: UM.Theme.getSize("default_margin").height
  122. anchors.left: parent.left
  123. anchors.right: parent.right
  124. spacing: UM.Theme.getSize("default_margin").height
  125. rowSpacing: UM.Theme.getSize("default_lining").height
  126. columns: 2
  127. visible: base.currentItem
  128. property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0
  129. property var connectedPrinter: printerConnected ? Cura.MachineManager.printerOutputDevices[0] : null
  130. property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands
  131. Text
  132. {
  133. text: catalog.i18nc("@label", "Printer type:")
  134. visible: base.currentItem && "definition_name" in base.currentItem.metadata
  135. }
  136. Text
  137. {
  138. text: (base.currentItem && "definition_name" in base.currentItem.metadata) ? base.currentItem.metadata.definition_name : ""
  139. }
  140. Text
  141. {
  142. text: catalog.i18nc("@label", "Connection:")
  143. visible: base.currentItem && base.currentItem.id == Cura.MachineManager.activeMachineId
  144. }
  145. Text
  146. {
  147. width: parent.width * 0.7
  148. text: machineInfo.printerConnected ? machineInfo.connectedPrinter.connectionText : catalog.i18nc("@info:status", "The printer is not connected.")
  149. visible: base.currentItem && base.currentItem.id == Cura.MachineManager.activeMachineId
  150. wrapMode: Text.WordWrap
  151. }
  152. Text
  153. {
  154. text: catalog.i18nc("@label", "State:")
  155. visible: base.currentItem && base.currentItem.id == Cura.MachineManager.activeMachineId && machineInfo.printerAcceptsCommands
  156. }
  157. Label {
  158. width: parent.width * 0.7
  159. text:
  160. {
  161. if(!machineInfo.printerConnected || !machineInfo.printerAcceptsCommands) {
  162. return "";
  163. }
  164. switch(Cura.MachineManager.printerOutputDevices[0].jobState)
  165. {
  166. case "printing":
  167. return catalog.i18nc("@label:MonitorStatus", "Printing...");
  168. case "paused":
  169. return catalog.i18nc("@label:MonitorStatus", "Paused");
  170. case "pre_print":
  171. return catalog.i18nc("@label:MonitorStatus", "Preparing...");
  172. case "wait_cleanup":
  173. return catalog.i18nc("@label:MonitorStatus", "Waiting for someone to clear the build plate");
  174. case "error":
  175. return printerOutputDevice.errorText;
  176. case "maintenance":
  177. return catalog.i18nc("@label:MonitorStatus", "In maintenance. Please check the printer");
  178. case "abort": // note sure if this jobState actually occurs in the wild
  179. return catalog.i18nc("@label:MonitorStatus", "Aborting print...");
  180. case "ready": // ready to print or getting ready
  181. case "": // ready to print or getting ready
  182. return catalog.i18nc("@label:MonitorStatus", "Waiting for a printjob");
  183. }
  184. }
  185. visible: base.currentItem && base.currentItem.id == Cura.MachineManager.activeMachineId && machineInfo.printerAcceptsCommands
  186. wrapMode: Text.WordWrap
  187. }
  188. }
  189. Column {
  190. id: additionalComponentsColumn
  191. anchors.left: parent.left
  192. anchors.right: parent.right
  193. anchors.top: machineInfo.visible ? machineInfo.bottom : machineInfo.anchors.top
  194. anchors.topMargin: UM.Theme.getSize("default_margin").width
  195. spacing: UM.Theme.getSize("default_margin").width
  196. visible: base.currentItem && base.currentItem.id == Cura.MachineManager.activeMachineId
  197. Component.onCompleted:
  198. {
  199. for (var component in CuraApplication.additionalComponents["machinesDetailPane"]) {
  200. CuraApplication.additionalComponents["machinesDetailPane"][component].parent = additionalComponentsColumn
  201. }
  202. }
  203. }
  204. Connections {
  205. target: Printer
  206. onAdditionalComponentsChanged:
  207. {
  208. if(areaId == "machinesDetailPane") {
  209. for (var component in CuraApplication.additionalComponents["machinesDetailPane"]) {
  210. CuraApplication.additionalComponents["machinesDetailPane"][component].parent = additionalComponentsColumn
  211. }
  212. }
  213. }
  214. }
  215. UM.I18nCatalog { id: catalog; name: "cura"; }
  216. UM.ConfirmRemoveDialog
  217. {
  218. id: confirmDialog;
  219. object: base.currentItem && base.currentItem.name ? base.currentItem.name : "";
  220. onYes:
  221. {
  222. Cura.MachineManager.removeMachine(base.currentItem.id);
  223. if(!base.currentItem)
  224. {
  225. objectList.currentIndex = activeMachineIndex()
  226. }
  227. //Force updating currentItem and the details panel
  228. objectList.onCurrentIndexChanged()
  229. }
  230. }
  231. UM.RenameDialog
  232. {
  233. id: renameDialog;
  234. object: base.currentItem && base.currentItem.name ? base.currentItem.name : "";
  235. property var machine_name_validator: Cura.MachineNameValidator { }
  236. validName: renameDialog.newName.match(renameDialog.machine_name_validator.machineNameRegex) != null;
  237. onAccepted:
  238. {
  239. Cura.MachineManager.renameMachine(base.currentItem.id, newName.trim());
  240. //Force updating currentItem and the details panel
  241. objectList.onCurrentIndexChanged()
  242. }
  243. }
  244. Connections
  245. {
  246. target: Cura.MachineManager
  247. onGlobalContainerChanged:
  248. {
  249. objectList.currentIndex = activeMachineIndex()
  250. objectList.onCurrentIndexChanged()
  251. }
  252. }
  253. }
  254. }