SettingExtruder.qml 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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.RecolorImage
  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. sourceSize.width: width + 5 * screenScaleFactor
  93. sourceSize.height: width + 5 * screenScaleFactor
  94. color: UM.Theme.getColor("setting_control_button");
  95. }
  96. background: UM.UnderlineBackground
  97. {
  98. color:
  99. {
  100. if (!enabled)
  101. {
  102. return UM.Theme.getColor("setting_control_disabled")
  103. }
  104. if (control.hovered || base.activeFocus)
  105. {
  106. return UM.Theme.getColor("setting_control_highlight")
  107. }
  108. return UM.Theme.getColor("setting_control")
  109. }
  110. liningColor:
  111. {
  112. if (!enabled)
  113. {
  114. return UM.Theme.getColor("setting_control_disabled_border")
  115. }
  116. if (control.hovered || control.activeFocus)
  117. {
  118. return UM.Theme.getColor("border_main")
  119. }
  120. return UM.Theme.getColor("border_field_light")
  121. }
  122. }
  123. contentItem: UM.Label
  124. {
  125. anchors.verticalCenter: parent.verticalCenter
  126. anchors.left: parent.left
  127. anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width
  128. anchors.right: downArrow.left
  129. rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
  130. text: control.currentText
  131. textFormat: Text.PlainText
  132. color: enabled ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text")
  133. background: Rectangle
  134. {
  135. id: swatch
  136. height: Math.round(parent.height / 2)
  137. width: height
  138. radius: Math.round(width / 2)
  139. anchors.right: parent.right
  140. anchors.verticalCenter: parent.verticalCenter
  141. anchors.rightMargin: UM.Theme.getSize("thin_margin").width
  142. color: control.color
  143. }
  144. }
  145. popup: Popup
  146. {
  147. y: control.height - UM.Theme.getSize("default_lining").height
  148. width: control.width
  149. implicitHeight: contentItem.implicitHeight + 2 * UM.Theme.getSize("default_lining").width
  150. padding: UM.Theme.getSize("default_lining").width
  151. contentItem: ListView
  152. {
  153. implicitHeight: contentHeight
  154. ScrollBar.vertical: UM.ScrollBar {}
  155. clip: true
  156. model: control.popup.visible ? control.delegateModel : null
  157. currentIndex: control.highlightedIndex
  158. }
  159. background: Rectangle
  160. {
  161. color: UM.Theme.getColor("setting_control")
  162. border.color: UM.Theme.getColor("setting_control_border")
  163. }
  164. }
  165. delegate: ItemDelegate
  166. {
  167. width: control.width - 2 * UM.Theme.getSize("default_lining").width
  168. height: control.height
  169. highlighted: control.highlightedIndex == index
  170. contentItem: UM.Label
  171. {
  172. anchors.fill: parent
  173. anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width
  174. anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width
  175. text: model.name
  176. color: model.enabled ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("action_button_disabled_text")
  177. elide: Text.ElideRight
  178. rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
  179. background: Rectangle
  180. {
  181. id: swatch
  182. height: Math.round(parent.height / 2)
  183. width: height
  184. radius: Math.round(width / 2)
  185. anchors.right: parent.right
  186. anchors.verticalCenter: parent.verticalCenter
  187. anchors.rightMargin: UM.Theme.getSize("thin_margin").width
  188. color: control.model.getItem(index).color
  189. }
  190. }
  191. background: Rectangle
  192. {
  193. color: parent.highlighted ? UM.Theme.getColor("setting_control_highlight") : "transparent"
  194. }
  195. }
  196. }
  197. }