SettingExtruder.qml 7.3 KB

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