ComboBox.qml 5.0 KB

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