SettingExtruder.qml 7.6 KB

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