SettingExtruder.qml 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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. textFormat: Text.PlainText
  129. renderType: Text.NativeRendering
  130. font: UM.Theme.getFont("default")
  131. color: enabled ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text")
  132. elide: Text.ElideLeft
  133. verticalAlignment: Text.AlignVCenter
  134. background: Rectangle
  135. {
  136. id: swatch
  137. height: Math.round(UM.Theme.getSize("setting_control").height / 2)
  138. width: height
  139. anchors.right: parent.right
  140. anchors.verticalCenter: parent.verticalCenter
  141. anchors.margins: Math.round(UM.Theme.getSize("default_margin").width / 4)
  142. border.width: UM.Theme.getSize("default_lining").width
  143. border.color: enabled ? UM.Theme.getColor("setting_control_border") : UM.Theme.getColor("setting_control_disabled_border")
  144. radius: Math.round(width / 2)
  145. color: control.color
  146. }
  147. }
  148. popup: Popup {
  149. y: control.height - UM.Theme.getSize("default_lining").height
  150. width: control.width
  151. implicitHeight: contentItem.implicitHeight + 2 * UM.Theme.getSize("default_lining").width
  152. padding: UM.Theme.getSize("default_lining").width
  153. contentItem: ListView {
  154. clip: true
  155. implicitHeight: contentHeight
  156. model: control.popup.visible ? control.delegateModel : null
  157. currentIndex: control.highlightedIndex
  158. ScrollIndicator.vertical: ScrollIndicator { }
  159. }
  160. background: Rectangle {
  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: 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. renderType: Text.NativeRendering
  177. color:
  178. {
  179. if (model.enabled) {
  180. UM.Theme.getColor("setting_control_text")
  181. } else {
  182. UM.Theme.getColor("action_button_disabled_text");
  183. }
  184. }
  185. font: UM.Theme.getFont("default")
  186. elide: Text.ElideRight
  187. verticalAlignment: Text.AlignVCenter
  188. rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
  189. background: Rectangle
  190. {
  191. id: swatch
  192. height: Math.round(UM.Theme.getSize("setting_control").height / 2)
  193. width: height
  194. anchors.right: parent.right
  195. anchors.verticalCenter: parent.verticalCenter
  196. anchors.margins: Math.round(UM.Theme.getSize("default_margin").width / 4)
  197. border.width: UM.Theme.getSize("default_lining").width
  198. border.color: enabled ? UM.Theme.getColor("setting_control_border") : UM.Theme.getColor("setting_control_disabled_border")
  199. radius: Math.round(width / 2)
  200. color: control.model.getItem(index).color
  201. }
  202. }
  203. background: Rectangle
  204. {
  205. color: parent.highlighted ? UM.Theme.getColor("setting_control_highlight") : "transparent"
  206. border.color: parent.highlighted ? UM.Theme.getColor("setting_control_border_highlight") : "transparent"
  207. }
  208. }
  209. }
  210. }