SettingOptionalExtruder.qml 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  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. borderColor: control.activeFocus ? UM.Theme.getColor("text_field_border_active") : "transparent"
  112. liningColor:
  113. {
  114. if(!enabled)
  115. {
  116. return UM.Theme.getColor("setting_control_disabled_border");
  117. }
  118. if(control.activeFocus)
  119. {
  120. return UM.Theme.getColor("text_field_border_active");
  121. }
  122. if(base.hovered)
  123. {
  124. return UM.Theme.getColor("text_field_border_hovered");
  125. }
  126. return UM.Theme.getColor("border_field_light");
  127. }
  128. }
  129. contentItem: UM.Label
  130. {
  131. anchors.verticalCenter: parent.verticalCenter
  132. anchors.left: parent.left
  133. anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width
  134. anchors.right: downArrow.left
  135. rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
  136. text: control.currentText
  137. textFormat: Text.PlainText
  138. color: enabled ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text")
  139. elide: Text.ElideRight
  140. background: Rectangle
  141. {
  142. id: swatch
  143. height: UM.Theme.getSize("standard_arrow").width
  144. width: height
  145. radius: Math.round(width / 2)
  146. anchors.right: parent.right
  147. anchors.verticalCenter: parent.verticalCenter
  148. anchors.rightMargin: UM.Theme.getSize("thin_margin").width
  149. color: control.color
  150. }
  151. }
  152. popup: Popup
  153. {
  154. y: control.height - UM.Theme.getSize("default_lining").height
  155. width: control.width
  156. implicitHeight: contentItem.implicitHeight + 2 * UM.Theme.getSize("default_lining").width
  157. padding: UM.Theme.getSize("default_lining").width
  158. contentItem: ListView
  159. {
  160. implicitHeight: contentHeight
  161. ScrollBar.vertical: UM.ScrollBar {}
  162. clip: true
  163. model: control.popup.visible ? control.delegateModel : null
  164. currentIndex: control.highlightedIndex
  165. }
  166. background: Rectangle {
  167. color: UM.Theme.getColor("setting_control")
  168. border.color: UM.Theme.getColor("setting_control_border")
  169. }
  170. }
  171. delegate: ItemDelegate
  172. {
  173. width: control.width - 2 * UM.Theme.getSize("default_lining").width
  174. height: control.height
  175. highlighted: control.highlightedIndex == index
  176. contentItem: UM.Label
  177. {
  178. anchors.fill: parent
  179. anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width
  180. anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width
  181. text: model.name
  182. textFormat: Text.PlainText
  183. color:
  184. {
  185. if (model.enabled) {
  186. UM.Theme.getColor("setting_control_text")
  187. } else {
  188. UM.Theme.getColor("action_button_disabled_text")
  189. }
  190. }
  191. elide: Text.ElideRight
  192. rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
  193. background: Rectangle
  194. {
  195. id: swatch
  196. height: Math.round(parent.height / 2)
  197. width: height
  198. radius: Math.round(width / 2)
  199. anchors.right: parent.right
  200. anchors.verticalCenter: parent.verticalCenter
  201. anchors.rightMargin: UM.Theme.getSize("thin_margin").width
  202. color: control.model.getItem(index).color
  203. }
  204. }
  205. background: Rectangle
  206. {
  207. color: parent.highlighted ? UM.Theme.getColor("setting_control_highlight") : "transparent"
  208. }
  209. }
  210. }
  211. }