ComboBox.qml 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // Copyright (c) 2022 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.5 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: background; color: UM.Theme.getColor("setting_control_disabled")}
  23. PropertyChanges { target: contentLabel; color: UM.Theme.getColor("setting_control_disabled_text")}
  24. },
  25. State
  26. {
  27. name: "highlighted"
  28. when: base.hovered || control.hovered || control.activeFocus
  29. PropertyChanges
  30. {
  31. target: background
  32. borderColor: UM.Theme.getColor("text_field_border_hovered")
  33. liningColor: UM.Theme.getColor("text_field_border_hovered")
  34. }
  35. }
  36. ]
  37. background: UM.UnderlineBackground{}
  38. indicator: UM.ColorImage
  39. {
  40. id: downArrow
  41. x: control.width - width - control.rightPadding
  42. y: control.topPadding + Math.round((control.availableHeight - height) / 2)
  43. source: UM.Theme.getIcon("ChevronSingleDown")
  44. width: UM.Theme.getSize("standard_arrow").width
  45. height: UM.Theme.getSize("standard_arrow").height
  46. color: UM.Theme.getColor("setting_control_button")
  47. }
  48. contentItem: UM.Label
  49. {
  50. id: contentLabel
  51. leftPadding: UM.Theme.getSize("setting_unit_margin").width + UM.Theme.getSize("default_margin").width
  52. anchors.right: downArrow.left
  53. wrapMode: Text.NoWrap
  54. text:
  55. {
  56. if (control.delegateModel.count == 0)
  57. {
  58. return control.defaultTextOnEmptyModel != "" ? control.defaultTextOnEmptyModel : control.defaultTextOnEmptyIndex
  59. }
  60. else
  61. {
  62. return control.currentIndex == -1 ? control.defaultTextOnEmptyIndex : control.currentText
  63. }
  64. }
  65. textFormat: Text.PlainText
  66. color: control.currentIndex == -1 ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text")
  67. elide: Text.ElideRight
  68. }
  69. popup: Popup
  70. {
  71. y: control.height - UM.Theme.getSize("default_lining").height
  72. width: control.width
  73. implicitHeight: contentItem.implicitHeight + 2 * UM.Theme.getSize("default_lining").width
  74. bottomMargin: UM.Theme.getSize("default_margin").height
  75. padding: UM.Theme.getSize("default_lining").width
  76. contentItem: ListView
  77. {
  78. implicitHeight: contentHeight
  79. ScrollBar.vertical: UM.ScrollBar {}
  80. clip: true
  81. model: control.popup.visible ? control.delegateModel : null
  82. currentIndex: control.highlightedIndex
  83. }
  84. background: Rectangle
  85. {
  86. color: UM.Theme.getColor("setting_control")
  87. border.color: UM.Theme.getColor("setting_control_border")
  88. }
  89. }
  90. delegate: ItemDelegate
  91. {
  92. id: delegateItem
  93. width: control.width - 2 * UM.Theme.getSize("default_lining").width
  94. height: control.height
  95. highlighted: control.highlightedIndex == index
  96. text:
  97. // FIXME: Maybe there is a better way to do this. Check model and modelData doc page:
  98. // https://doc.qt.io/qt-5/qtquick-modelviewsdata-modelview.html
  99. {
  100. var _val = undefined
  101. if (typeof _val === 'undefined') // try to get textRole from "model".
  102. {
  103. _val = model[textRole]
  104. }
  105. if (typeof _val === 'undefined') // try to get textRole from "modelData" if it's still undefined.
  106. {
  107. _val = modelData[textRole]
  108. }
  109. return (typeof _val !== 'undefined') ? _val : ""
  110. }
  111. contentItem: UM.Label
  112. {
  113. id: delegateLabel
  114. // FIXME: Somehow the top/bottom anchoring is not correct on Linux and it results in invisible texts.
  115. anchors.fill: parent
  116. anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width
  117. anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width
  118. text: delegateItem.text
  119. textFormat: Text.PlainText
  120. color: UM.Theme.getColor("setting_control_text")
  121. elide: Text.ElideRight
  122. wrapMode: Text.NoWrap
  123. }
  124. background: UM.TooltipArea
  125. {
  126. Rectangle
  127. {
  128. color: delegateItem.highlighted ? UM.Theme.getColor("setting_control_highlight") : "transparent"
  129. anchors.fill: parent
  130. }
  131. text: delegateLabel.truncated ? delegateItem.text : ""
  132. }
  133. }
  134. }