ConfigurationMenu.qml 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. // Copyright (c) 2018 Ultimaker B.V.
  2. // Cura is released under the terms of the LGPLv3 or higher.
  3. import QtQuick 2.10
  4. import QtQuick.Controls 2.3
  5. import QtQuick.Controls.Styles 2.2
  6. import QtQuick.Layouts 1.3
  7. import UM 1.2 as UM
  8. import Cura 1.0 as Cura
  9. /**
  10. * Menu that allows you to select the configuration of the current printer, such
  11. * as the nozzle sizes and materials in each extruder.
  12. */
  13. Cura.ExpandablePopup
  14. {
  15. id: base
  16. property var extrudersModel: CuraApplication.getExtrudersModel()
  17. UM.I18nCatalog
  18. {
  19. id: catalog
  20. name: "cura"
  21. }
  22. enum ConfigurationMethod
  23. {
  24. Auto,
  25. Custom
  26. }
  27. contentPadding: UM.Theme.getSize("default_lining").width
  28. enabled: Cura.MachineManager.activeMachine ? Cura.MachineManager.activeMachine.hasMaterials || Cura.MachineManager.activeMachine.hasVariants || Cura.MachineManager.activeMachine.hasVariantBuildplates : false; //Only let it drop down if there is any configuration that you could change.
  29. headerItem: Item
  30. {
  31. // Horizontal list that shows the extruders and their materials
  32. RowLayout
  33. {
  34. anchors.top: parent.top
  35. anchors.bottom: parent.bottom
  36. anchors.left: parent.left
  37. width: parent.width - UM.Theme.getSize("standard_arrow").width
  38. visible: Cura.MachineManager.activeMachine ? Cura.MachineManager.activeMachine.hasMaterials : false
  39. Repeater
  40. {
  41. model: extrudersModel
  42. delegate: Item
  43. {
  44. Layout.preferredWidth: Math.round(parent.width / extrudersModel.count)
  45. Layout.maximumWidth: Math.round(parent.width / extrudersModel.count)
  46. Layout.fillHeight: true
  47. // Extruder icon. Shows extruder index and has the same color as the active material.
  48. Cura.ExtruderIcon
  49. {
  50. id: extruderIcon
  51. materialColor: model.color
  52. extruderEnabled: model.enabled
  53. anchors.verticalCenter: parent.verticalCenter
  54. }
  55. Column
  56. {
  57. opacity: model.enabled ? 1 : UM.Theme.getColor("extruder_disabled").a
  58. spacing: 0
  59. visible: width > 0
  60. anchors
  61. {
  62. left: extruderIcon.right
  63. leftMargin: UM.Theme.getSize("default_margin").width
  64. verticalCenter: parent.verticalCenter
  65. right: parent.right
  66. rightMargin: UM.Theme.getSize("default_margin").width
  67. }
  68. // Label for the brand of the material
  69. Label
  70. {
  71. id: materialBrandColorTypeLabel
  72. text: model.material_brand == model.color_name ? model.color_name + " " + model.material_type : model.material_brand + " " + model.color_name + " " + model.material_type
  73. elide: Text.ElideRight
  74. font: UM.Theme.getFont("default")
  75. color: UM.Theme.getColor("text")
  76. renderType: Text.NativeRendering
  77. width: parent.width
  78. visible: !truncated
  79. }
  80. Label
  81. {
  82. id: materialColorTypeLabel
  83. text: model.color_name + " " + model.material_type
  84. elide: Text.ElideRight
  85. font: UM.Theme.getFont("default")
  86. color: UM.Theme.getColor("text")
  87. renderType: Text.NativeRendering
  88. width: parent.width
  89. visible: !materialBrandColorTypeLabel.visible && !truncated
  90. }
  91. Label
  92. {
  93. id: materialTypeLabel
  94. text: model.material_type
  95. elide: Text.ElideRight
  96. font: UM.Theme.getFont("default")
  97. color: UM.Theme.getColor("text")
  98. renderType: Text.NativeRendering
  99. width: parent.width
  100. visible: !materialBrandColorTypeLabel.visible && !materialColorTypeLabel.visible
  101. }
  102. // Label that shows the name of the variant
  103. Label
  104. {
  105. id: variantLabel
  106. visible: Cura.MachineManager.activeMachine ? Cura.MachineManager.activeMachine.hasVariants : false
  107. text: model.variant
  108. elide: Text.ElideRight
  109. font: UM.Theme.getFont("default_bold")
  110. color: UM.Theme.getColor("text")
  111. renderType: Text.NativeRendering
  112. Layout.preferredWidth: parent.width
  113. }
  114. }
  115. }
  116. }
  117. }
  118. // Placeholder text if there is a configuration to select but no materials (so we can't show the materials per extruder).
  119. Label
  120. {
  121. text: catalog.i18nc("@label", "Select configuration")
  122. elide: Text.ElideRight
  123. font: UM.Theme.getFont("medium")
  124. color: UM.Theme.getColor("text")
  125. renderType: Text.NativeRendering
  126. visible: Cura.MachineManager.activeMachine ? !Cura.MachineManager.activeMachine.hasMaterials && (Cura.MachineManager.activeMachine.hasVariants || Cura.MachineManager.activeMachine.hasVariantBuildplates) : false
  127. anchors
  128. {
  129. left: parent.left
  130. leftMargin: UM.Theme.getSize("default_margin").width
  131. verticalCenter: parent.verticalCenter
  132. }
  133. }
  134. }
  135. contentItem: Column
  136. {
  137. id: popupItem
  138. width: UM.Theme.getSize("configuration_selector").width
  139. height: implicitHeight // Required because ExpandableComponent will try to use this to determine the size of the background of the pop-up.
  140. padding: UM.Theme.getSize("default_margin").height
  141. spacing: UM.Theme.getSize("default_margin").height
  142. property bool is_connected: false // If current machine is connected to a printer. Only evaluated upon making popup visible.
  143. property int configuration_method: ConfigurationMenu.ConfigurationMethod.Custom // Type of configuration being used. Only evaluated upon making popup visible.
  144. property int manual_selected_method: -1 // It stores the configuration method selected by the user. By default the selected method is
  145. onVisibleChanged:
  146. {
  147. is_connected = Cura.MachineManager.activeMachine.hasRemoteConnection && Cura.MachineManager.printerConnected && Cura.MachineManager.printerOutputDevices[0].uniqueConfigurations.length > 0 //Re-evaluate.
  148. // If the printer is not connected or does not have configurations, we switch always to the custom mode. If is connected instead, the auto mode
  149. // or the previous state is selected
  150. configuration_method = is_connected ? (manual_selected_method == -1 ? ConfigurationMenu.ConfigurationMethod.Auto : manual_selected_method) : ConfigurationMenu.ConfigurationMethod.Custom
  151. }
  152. Item
  153. {
  154. width: parent.width - 2 * parent.padding
  155. height:
  156. {
  157. var height = 0
  158. if (autoConfiguration.visible)
  159. {
  160. height += autoConfiguration.height
  161. }
  162. if (customConfiguration.visible)
  163. {
  164. height += customConfiguration.height
  165. }
  166. return height
  167. }
  168. AutoConfiguration
  169. {
  170. id: autoConfiguration
  171. visible: popupItem.configuration_method == ConfigurationMenu.ConfigurationMethod.Auto
  172. }
  173. CustomConfiguration
  174. {
  175. id: customConfiguration
  176. visible: popupItem.configuration_method == ConfigurationMenu.ConfigurationMethod.Custom
  177. }
  178. }
  179. Rectangle
  180. {
  181. id: separator
  182. visible: buttonBar.visible
  183. x: -parent.padding
  184. width: parent.width
  185. height: UM.Theme.getSize("default_lining").height
  186. color: UM.Theme.getColor("lining")
  187. }
  188. //Allow switching between custom and auto.
  189. Item
  190. {
  191. id: buttonBar
  192. visible: popupItem.is_connected //Switching only makes sense if the "auto" part is possible.
  193. width: parent.width - 2 * parent.padding
  194. height: childrenRect.height
  195. Cura.SecondaryButton
  196. {
  197. id: goToCustom
  198. visible: popupItem.configuration_method == ConfigurationMenu.ConfigurationMethod.Auto
  199. text: catalog.i18nc("@label", "Custom")
  200. anchors.right: parent.right
  201. iconSource: UM.Theme.getIcon("ChevronSingleRight")
  202. isIconOnRightSide: true
  203. onClicked:
  204. {
  205. popupItem.configuration_method = ConfigurationMenu.ConfigurationMethod.Custom
  206. popupItem.manual_selected_method = popupItem.configuration_method
  207. }
  208. }
  209. Cura.SecondaryButton
  210. {
  211. id: goToAuto
  212. visible: popupItem.configuration_method == ConfigurationMenu.ConfigurationMethod.Custom
  213. text: catalog.i18nc("@label", "Configurations")
  214. iconSource: UM.Theme.getIcon("ChevronSingleLeft")
  215. onClicked:
  216. {
  217. popupItem.configuration_method = ConfigurationMenu.ConfigurationMethod.Auto
  218. popupItem.manual_selected_method = popupItem.configuration_method
  219. }
  220. }
  221. }
  222. }
  223. Connections
  224. {
  225. target: Cura.MachineManager
  226. function onGlobalContainerChanged() { popupItem.manual_selected_method = -1 } // When switching printers, reset the value of the manual selected method
  227. }
  228. }