ComboBox.qml 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. // Copyright (c) 2019 Ultimaker B.V.
  2. // Cura is released under the terms of the LGPLv3 or higher.
  3. import QtQuick 2.10
  4. import QtQuick.Controls 2.3
  5. import UM 1.3 as UM
  6. import Cura 1.1 as Cura
  7. //
  8. // ComboBox with Cura styling.
  9. //
  10. ComboBox
  11. {
  12. id: control
  13. property var defaultTextOnEmptyModel: catalog.i18nc("@label", "No items to select from") // Text displayed in the combobox when the model is empty
  14. property var defaultTextOnEmptyIndex: "" // Text displayed in the combobox when the model has items but no item is selected
  15. enabled: delegateModel.count > 0
  16. onVisibleChanged: { popup.close() }
  17. states: [
  18. State
  19. {
  20. name: "disabled"
  21. when: !control.enabled
  22. PropertyChanges { target: backgroundRectangle.border; color: UM.Theme.getColor("setting_control_disabled_border")}
  23. PropertyChanges { target: backgroundRectangle; color: UM.Theme.getColor("setting_control_disabled")}
  24. PropertyChanges { target: contentLabel; color: UM.Theme.getColor("setting_control_disabled_text")}
  25. },
  26. State
  27. {
  28. name: "highlighted"
  29. when: control.hovered || control.activeFocus
  30. PropertyChanges { target: backgroundRectangle.border; color: UM.Theme.getColor("setting_control_border_highlight") }
  31. PropertyChanges { target: backgroundRectangle; color: UM.Theme.getColor("setting_control_highlight")}
  32. }
  33. ]
  34. background: Rectangle
  35. {
  36. id: backgroundRectangle
  37. color: UM.Theme.getColor("setting_control")
  38. radius: UM.Theme.getSize("setting_control_radius").width
  39. border.width: UM.Theme.getSize("default_lining").width
  40. border.color: UM.Theme.getColor("setting_control_border")
  41. }
  42. indicator: UM.RecolorImage
  43. {
  44. id: downArrow
  45. x: control.width - width - control.rightPadding
  46. y: control.topPadding + Math.round((control.availableHeight - height) / 2)
  47. source: UM.Theme.getIcon("ChevronSingleDown")
  48. width: UM.Theme.getSize("standard_arrow").width
  49. height: UM.Theme.getSize("standard_arrow").height
  50. sourceSize.width: width + 5 * screenScaleFactor
  51. sourceSize.height: width + 5 * screenScaleFactor
  52. color: UM.Theme.getColor("setting_control_button")
  53. }
  54. contentItem: Label
  55. {
  56. id: contentLabel
  57. anchors.left: parent.left
  58. anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width
  59. anchors.verticalCenter: parent.verticalCenter
  60. anchors.right: downArrow.left
  61. text:
  62. {
  63. if (control.delegateModel.count == 0)
  64. {
  65. return control.defaultTextOnEmptyModel != "" ? control.defaultTextOnEmptyModel : control.defaultTextOnEmptyIndex
  66. }
  67. else
  68. {
  69. return control.currentIndex == -1 ? control.defaultTextOnEmptyIndex : control.currentText
  70. }
  71. }
  72. textFormat: Text.PlainText
  73. renderType: Text.NativeRendering
  74. font: UM.Theme.getFont("default")
  75. color: control.currentIndex == -1 ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text")
  76. elide: Text.ElideRight
  77. verticalAlignment: Text.AlignVCenter
  78. }
  79. popup: Popup
  80. {
  81. y: control.height - UM.Theme.getSize("default_lining").height
  82. width: control.width
  83. implicitHeight: contentItem.implicitHeight + 2 * UM.Theme.getSize("default_lining").width
  84. bottomMargin: UM.Theme.getSize("default_margin").height
  85. padding: UM.Theme.getSize("default_lining").width
  86. contentItem: ListView
  87. {
  88. clip: true
  89. implicitHeight: contentHeight
  90. model: control.popup.visible ? control.delegateModel : null
  91. currentIndex: control.highlightedIndex
  92. ScrollIndicator.vertical: ScrollIndicator { }
  93. }
  94. background: Rectangle
  95. {
  96. color: UM.Theme.getColor("setting_control")
  97. border.color: UM.Theme.getColor("setting_control_border")
  98. }
  99. }
  100. delegate: ItemDelegate
  101. {
  102. id: delegateItem
  103. width: control.width - 2 * UM.Theme.getSize("default_lining").width
  104. height: control.height
  105. highlighted: control.highlightedIndex == index
  106. text:
  107. // FIXME: Maybe there is a better way to do this. Check model and modelData doc page:
  108. // https://doc.qt.io/qt-5/qtquick-modelviewsdata-modelview.html
  109. {
  110. var _val = undefined
  111. if (typeof _val === 'undefined') // try to get textRole from "model".
  112. {
  113. _val = model[textRole]
  114. }
  115. if (typeof _val === 'undefined') // try to get textRole from "modelData" if it's still undefined.
  116. {
  117. _val = modelData[textRole]
  118. }
  119. return (typeof _val !== 'undefined') ? _val : ""
  120. }
  121. contentItem: Label
  122. {
  123. id: delegateLabel
  124. // FIXME: Somehow the top/bottom anchoring is not correct on Linux and it results in invisible texts.
  125. anchors.fill: parent
  126. anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width
  127. anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width
  128. text: delegateItem.text
  129. textFormat: Text.PlainText
  130. renderType: Text.NativeRendering
  131. color: UM.Theme.getColor("setting_control_text")
  132. font: UM.Theme.getFont("default")
  133. elide: Text.ElideRight
  134. verticalAlignment: Text.AlignVCenter
  135. }
  136. background: UM.TooltipArea
  137. {
  138. Rectangle
  139. {
  140. color: delegateItem.highlighted ? UM.Theme.getColor("setting_control_highlight") : "transparent"
  141. border.color: delegateItem.highlighted ? UM.Theme.getColor("setting_control_border_highlight") : "transparent"
  142. anchors.fill: parent
  143. }
  144. text: delegateLabel.truncated ? delegateItem.text : ""
  145. }
  146. }
  147. }