SettingExtruder.qml 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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. MouseArea
  63. {
  64. anchors.fill: parent
  65. acceptedButtons: Qt.NoButton
  66. onWheel: wheel.accepted = true;
  67. }
  68. property string color: "#fff"
  69. Binding
  70. {
  71. // We override the color property's value when the ExtruderModel changes. So we need to use an
  72. // explicit binding here otherwise we do not handle value changes after the model changes.
  73. target: control
  74. property: "color"
  75. value: control.currentText != "" ? control.model.getItem(control.currentIndex).color : ""
  76. }
  77. Binding
  78. {
  79. target: control
  80. property: "currentIndex"
  81. value: control.getIndexByPosition(propertyProvider.properties.value)
  82. // Sometimes when the value is already changed, the model is still being built.
  83. // The when clause ensures that the current index is not updated when this happens.
  84. when: control.model.items.length > 0
  85. }
  86. indicator: UM.RecolorImage
  87. {
  88. id: downArrow
  89. x: control.width - width - control.rightPadding
  90. y: control.topPadding + Math.round((control.availableHeight - height) / 2)
  91. source: UM.Theme.getIcon("arrow_bottom")
  92. width: UM.Theme.getSize("standard_arrow").width
  93. height: UM.Theme.getSize("standard_arrow").height
  94. sourceSize.width: width + 5 * screenScaleFactor
  95. sourceSize.height: width + 5 * screenScaleFactor
  96. color: UM.Theme.getColor("setting_control_text");
  97. }
  98. background: Rectangle
  99. {
  100. color:
  101. {
  102. if (!enabled)
  103. {
  104. return UM.Theme.getColor("setting_control_disabled");
  105. }
  106. if (control.hovered || base.activeFocus)
  107. {
  108. return UM.Theme.getColor("setting_control_highlight");
  109. }
  110. return UM.Theme.getColor("setting_control");
  111. }
  112. border.width: UM.Theme.getSize("default_lining").width
  113. border.color:
  114. {
  115. if (!enabled)
  116. {
  117. return UM.Theme.getColor("setting_control_disabled_border")
  118. }
  119. if (control.hovered || control.activeFocus)
  120. {
  121. return UM.Theme.getColor("setting_control_border_highlight")
  122. }
  123. return UM.Theme.getColor("setting_control_border")
  124. }
  125. }
  126. contentItem: 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. renderType: Text.NativeRendering
  135. font: UM.Theme.getFont("default")
  136. color: enabled ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text")
  137. elide: Text.ElideLeft
  138. verticalAlignment: Text.AlignVCenter
  139. background: Rectangle
  140. {
  141. id: swatch
  142. height: Math.round(UM.Theme.getSize("setting_control").height / 2)
  143. width: height
  144. anchors.right: parent.right
  145. anchors.verticalCenter: parent.verticalCenter
  146. anchors.margins: Math.round(UM.Theme.getSize("default_margin").width / 4)
  147. border.width: UM.Theme.getSize("default_lining").width
  148. border.color: enabled ? UM.Theme.getColor("setting_control_border") : UM.Theme.getColor("setting_control_disabled_border")
  149. radius: Math.round(width / 2)
  150. color: control.color
  151. }
  152. }
  153. popup: Popup {
  154. y: control.height - UM.Theme.getSize("default_lining").height
  155. width: control.width
  156. implicitHeight: contentItem.implicitHeight
  157. padding: UM.Theme.getSize("default_lining").width
  158. contentItem: ListView {
  159. clip: true
  160. implicitHeight: contentHeight
  161. model: control.popup.visible ? control.delegateModel : null
  162. currentIndex: control.highlightedIndex
  163. ScrollIndicator.vertical: ScrollIndicator { }
  164. }
  165. background: Rectangle {
  166. color: UM.Theme.getColor("setting_control")
  167. border.color: UM.Theme.getColor("setting_control_border")
  168. }
  169. }
  170. delegate: ItemDelegate
  171. {
  172. width: control.width - 2 * UM.Theme.getSize("default_lining").width
  173. height: control.height
  174. highlighted: control.highlightedIndex == index
  175. contentItem: Label
  176. {
  177. text: model.name
  178. renderType: Text.NativeRendering
  179. color:
  180. {
  181. if (model.enabled) {
  182. UM.Theme.getColor("setting_control_text")
  183. } else {
  184. UM.Theme.getColor("action_button_disabled_text");
  185. }
  186. }
  187. font: UM.Theme.getFont("default")
  188. elide: Text.ElideRight
  189. verticalAlignment: Text.AlignVCenter
  190. rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
  191. background: Rectangle
  192. {
  193. id: swatch
  194. height: Math.round(UM.Theme.getSize("setting_control").height / 2)
  195. width: height
  196. anchors.right: parent.right
  197. anchors.verticalCenter: parent.verticalCenter
  198. anchors.margins: Math.round(UM.Theme.getSize("default_margin").width / 4)
  199. border.width: UM.Theme.getSize("default_lining").width
  200. border.color: enabled ? UM.Theme.getColor("setting_control_border") : UM.Theme.getColor("setting_control_disabled_border")
  201. radius: Math.round(width / 2)
  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. border.color: parent.highlighted ? UM.Theme.getColor("setting_control_border_highlight") : "transparent"
  209. }
  210. }
  211. }
  212. }