SettingOptionalExtruder.qml 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  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: control.color = getItem(control.currentIndex).color
  18. addOptionalExtruder: true
  19. }
  20. textRole: "name"
  21. onActivated:
  22. {
  23. if (model.getItem(index).enabled)
  24. {
  25. forceActiveFocus();
  26. propertyProvider.setPropertyValue("value", model.getItem(index).index);
  27. } else
  28. {
  29. if (propertyProvider.properties.value == -1)
  30. {
  31. control.currentIndex = model.rowCount() - 1; // we know the last item is "Not overriden"
  32. } else {
  33. control.currentIndex = propertyProvider.properties.value; // revert to the old value
  34. }
  35. }
  36. }
  37. onActiveFocusChanged:
  38. {
  39. if(activeFocus)
  40. {
  41. base.focusReceived();
  42. }
  43. }
  44. Keys.onTabPressed:
  45. {
  46. base.setActiveFocusToNextSetting(true)
  47. }
  48. Keys.onBacktabPressed:
  49. {
  50. base.setActiveFocusToNextSetting(false)
  51. }
  52. Binding
  53. {
  54. target: control
  55. property: "currentIndex"
  56. value:
  57. {
  58. if(propertyProvider.properties.value == -1)
  59. {
  60. return control.model.items.length - 1
  61. }
  62. return propertyProvider.properties.value
  63. }
  64. // Sometimes when the value is already changed, the model is still being built.
  65. // The when clause ensures that the current index is not updated when this happens.
  66. when: control.model.items.length > 0
  67. }
  68. MouseArea
  69. {
  70. anchors.fill: parent
  71. acceptedButtons: Qt.NoButton
  72. onWheel: wheel.accepted = true;
  73. }
  74. property string color: "#fff"
  75. Binding
  76. {
  77. // We override the color property's value when the ExtruderModel changes. So we need to use an
  78. // explicit binding here otherwise we do not handle value changes after the model changes.
  79. target: control
  80. property: "color"
  81. value: control.currentText != "" ? control.model.getItem(control.currentIndex).color : ""
  82. }
  83. indicator: UM.RecolorImage
  84. {
  85. id: downArrow
  86. x: control.width - width - control.rightPadding
  87. y: control.topPadding + Math.round((control.availableHeight - height) / 2)
  88. source: UM.Theme.getIcon("arrow_bottom")
  89. width: UM.Theme.getSize("standard_arrow").width
  90. height: UM.Theme.getSize("standard_arrow").height
  91. sourceSize.width: width + 5 * screenScaleFactor
  92. sourceSize.height: width + 5 * screenScaleFactor
  93. color: UM.Theme.getColor("setting_control_text");
  94. }
  95. background: Rectangle
  96. {
  97. color:
  98. {
  99. if (!enabled)
  100. {
  101. return UM.Theme.getColor("setting_control_disabled");
  102. }
  103. if (control.hovered || control.activeFocus)
  104. {
  105. return UM.Theme.getColor("setting_control_highlight");
  106. }
  107. return UM.Theme.getColor("setting_control");
  108. }
  109. border.width: UM.Theme.getSize("default_lining").width
  110. border.color:
  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("setting_control_border_highlight")
  119. }
  120. return UM.Theme.getColor("setting_control_border")
  121. }
  122. }
  123. contentItem: 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. renderType: Text.NativeRendering
  132. font: UM.Theme.getFont("default")
  133. color: enabled ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text")
  134. elide: Text.ElideRight
  135. verticalAlignment: Text.AlignVCenter
  136. background: Rectangle
  137. {
  138. id: swatch
  139. height: Math.round(UM.Theme.getSize("setting_control").height / 2)
  140. width: height
  141. anchors.right: parent.right
  142. anchors.verticalCenter: parent.verticalCenter
  143. anchors.margins: Math.round(UM.Theme.getSize("default_margin").width / 4)
  144. border.width: UM.Theme.getSize("default_lining").width
  145. border.color: enabled ? UM.Theme.getColor("setting_control_border") : UM.Theme.getColor("setting_control_disabled_border")
  146. radius: Math.round(width / 2)
  147. color: control.color
  148. }
  149. }
  150. popup: Popup {
  151. y: control.height - UM.Theme.getSize("default_lining").height
  152. width: control.width
  153. implicitHeight: contentItem.implicitHeight
  154. padding: UM.Theme.getSize("default_lining").width
  155. contentItem: ListView {
  156. clip: true
  157. implicitHeight: contentHeight
  158. model: control.popup.visible ? control.delegateModel : null
  159. currentIndex: control.highlightedIndex
  160. ScrollIndicator.vertical: ScrollIndicator { }
  161. }
  162. background: Rectangle {
  163. color: UM.Theme.getColor("setting_control")
  164. border.color: UM.Theme.getColor("setting_control_border")
  165. }
  166. }
  167. delegate: ItemDelegate
  168. {
  169. width: control.width - 2 * UM.Theme.getSize("default_lining").width
  170. height: control.height
  171. highlighted: control.highlightedIndex == index
  172. contentItem: Label
  173. {
  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. }