SettingOptionalExtruder.qml 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. // Copyright (c) 2022 Ultimaker B.V.
  2. // Cura is released under the terms of the LGPLv3 or higher.
  3. import QtQuick 2.7
  4. import QtQuick.Controls 2.0
  5. import UM 1.5 as UM
  6. import Cura 1.5 as Cura
  7. SettingItem
  8. {
  9. id: base
  10. property var focusItem: control
  11. // Somehow if we directory set control.model to CuraApplication.getExtrudersModelWithOptional()
  12. // and in the Connections.onModelChanged use control.model as a reference, it will complain about
  13. // non-existing properties such as "onModelChanged" and "getItem". I guess if we access the model
  14. // via "control.model", it gives back a generic/abstract model instance. To avoid this, we add
  15. // this extra property to keep the ExtrudersModel and use this in the rest of the code.
  16. property var extrudersWithOptionalModel: CuraApplication.getExtrudersModelWithOptional()
  17. contents: Cura.ComboBox
  18. {
  19. id: control
  20. anchors.fill: parent
  21. model: base.extrudersWithOptionalModel
  22. Connections
  23. {
  24. target: base.extrudersWithOptionalModel
  25. function onModelChanged() { control.color = base.extrudersWithOptionalModel.getItem(control.currentIndex).color }
  26. }
  27. textRole: "name"
  28. onActivated:
  29. {
  30. if (model.getItem(index).enabled)
  31. {
  32. forceActiveFocus();
  33. propertyProvider.setPropertyValue("value", model.getItem(index).index);
  34. }
  35. else
  36. {
  37. if (propertyProvider.properties.value == -1)
  38. {
  39. control.currentIndex = model.count - 1; // we know the last item is "Not overridden"
  40. }
  41. else
  42. {
  43. control.currentIndex = propertyProvider.properties.value; // revert to the old value
  44. }
  45. }
  46. }
  47. onActiveFocusChanged:
  48. {
  49. if(activeFocus)
  50. {
  51. base.focusReceived();
  52. }
  53. }
  54. Keys.onTabPressed:
  55. {
  56. base.setActiveFocusToNextSetting(true)
  57. }
  58. Keys.onBacktabPressed:
  59. {
  60. base.setActiveFocusToNextSetting(false)
  61. }
  62. Binding
  63. {
  64. target: control
  65. property: "currentIndex"
  66. value:
  67. {
  68. if(propertyProvider.properties.value == -1)
  69. {
  70. return control.model.items.length - 1
  71. }
  72. return propertyProvider.properties.value
  73. }
  74. // Sometimes when the value is already changed, the model is still being built.
  75. // The when clause ensures that the current index is not updated when this happens.
  76. when: control.model.items.length > 0
  77. }
  78. property string color: "transparent"
  79. Binding
  80. {
  81. // We override the color property's value when the ExtruderModel changes. So we need to use an
  82. // explicit binding here otherwise we do not handle value changes after the model changes.
  83. target: control
  84. property: "color"
  85. value: control.currentText != "" ? control.model.getItem(control.currentIndex).color : "transparent"
  86. }
  87. indicator: UM.ColorImage
  88. {
  89. id: downArrow
  90. x: control.width - width - control.rightPadding
  91. y: control.topPadding + Math.round((control.availableHeight - height) / 2)
  92. source: UM.Theme.getIcon("ChevronSingleDown")
  93. width: UM.Theme.getSize("standard_arrow").width
  94. height: UM.Theme.getSize("standard_arrow").height
  95. color: UM.Theme.getColor("setting_control_button")
  96. }
  97. background: UM.UnderlineBackground
  98. {
  99. color:
  100. {
  101. if (!enabled)
  102. {
  103. return UM.Theme.getColor("setting_control_disabled")
  104. }
  105. if (control.hovered || base.activeFocus)
  106. {
  107. return UM.Theme.getColor("setting_control_highlight")
  108. }
  109. return UM.Theme.getColor("setting_control")
  110. }
  111. liningColor:
  112. {
  113. if (!enabled)
  114. {
  115. return UM.Theme.getColor("setting_control_disabled_border")
  116. }
  117. if (control.hovered || control.activeFocus)
  118. {
  119. return UM.Theme.getColor("border_main")
  120. }
  121. return UM.Theme.getColor("border_field_light")
  122. }
  123. }
  124. contentItem: UM.Label
  125. {
  126. anchors.verticalCenter: parent.verticalCenter
  127. anchors.left: parent.left
  128. anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width
  129. anchors.right: downArrow.left
  130. rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
  131. text: control.currentText
  132. textFormat: Text.PlainText
  133. color: enabled ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text")
  134. elide: Text.ElideRight
  135. background: Rectangle
  136. {
  137. id: swatch
  138. height: UM.Theme.getSize("standard_arrow").width
  139. width: height
  140. radius: Math.round(width / 2)
  141. anchors.right: parent.right
  142. anchors.verticalCenter: parent.verticalCenter
  143. anchors.rightMargin: UM.Theme.getSize("thin_margin").width
  144. color: control.color
  145. }
  146. }
  147. popup: Popup
  148. {
  149. y: control.height - UM.Theme.getSize("default_lining").height
  150. width: control.width
  151. implicitHeight: contentItem.implicitHeight + 2 * UM.Theme.getSize("default_lining").width
  152. padding: UM.Theme.getSize("default_lining").width
  153. contentItem: ListView
  154. {
  155. implicitHeight: contentHeight
  156. ScrollBar.vertical: UM.ScrollBar {}
  157. clip: true
  158. model: control.popup.visible ? control.delegateModel : null
  159. currentIndex: control.highlightedIndex
  160. }
  161. background: Rectangle {
  162. color: UM.Theme.getColor("setting_control")
  163. border.color: UM.Theme.getColor("setting_control_border")
  164. }
  165. }
  166. delegate: ItemDelegate
  167. {
  168. width: control.width - 2 * UM.Theme.getSize("default_lining").width
  169. height: control.height
  170. highlighted: control.highlightedIndex == index
  171. contentItem: UM.Label
  172. {
  173. anchors.fill: parent
  174. anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width
  175. anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width
  176. text: model.name
  177. textFormat: Text.PlainText
  178. color:
  179. {
  180. if (model.enabled) {
  181. UM.Theme.getColor("setting_control_text")
  182. } else {
  183. UM.Theme.getColor("action_button_disabled_text")
  184. }
  185. }
  186. elide: Text.ElideRight
  187. rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
  188. background: Rectangle
  189. {
  190. id: swatch
  191. height: Math.round(parent.height / 2)
  192. width: height
  193. radius: Math.round(width / 2)
  194. anchors.right: parent.right
  195. anchors.verticalCenter: parent.verticalCenter
  196. anchors.rightMargin: UM.Theme.getSize("thin_margin").width
  197. color: control.model.getItem(index).color
  198. }
  199. }
  200. background: Rectangle
  201. {
  202. color: parent.highlighted ? UM.Theme.getColor("setting_control_highlight") : "transparent"
  203. }
  204. }
  205. }
  206. }