SettingExtruder.qml 8.3 KB

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