SettingOptionalExtruder.qml 8.6 KB

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