ComboBox.qml 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // Copyright (C) 2017 The Qt Company Ltd.
  2. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
  3. // Qt-Security score:significant reason:default
  4. pragma ComponentBehavior: Bound
  5. import QtQuick
  6. import QtQuick.Controls.impl
  7. import QtQuick.Controls.Basic.impl
  8. import QtQuick.Templates as T
  9. T.ComboBox {
  10. id: control
  11. implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
  12. implicitContentWidth + leftPadding + rightPadding)
  13. implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
  14. implicitContentHeight + topPadding + bottomPadding,
  15. implicitIndicatorHeight + topPadding + bottomPadding)
  16. leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
  17. rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
  18. delegate: ItemDelegate {
  19. required property var model
  20. required property int index
  21. width: ListView.view.width
  22. text: model[control.textRole]
  23. palette.text: control.palette.text
  24. palette.highlightedText: control.palette.highlightedText
  25. font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal
  26. highlighted: control.highlightedIndex === index
  27. hoverEnabled: control.hoverEnabled
  28. }
  29. indicator: ColorImage {
  30. x: control.mirrored ? control.padding : control.width - width - control.padding
  31. y: control.topPadding + (control.availableHeight - height) / 2
  32. color: control.palette.dark
  33. defaultColor: "#353637"
  34. source: "qrc:/qt-project.org/imports/QtQuick/Controls/Basic/images/double-arrow.png"
  35. opacity: enabled ? 1 : 0.3
  36. }
  37. contentItem: T.TextField {
  38. implicitHeight: contentHeight + topPadding + bottomPadding
  39. leftPadding: !control.mirrored ? 12 : control.editable && activeFocus ? 3 : 1
  40. rightPadding: control.mirrored ? 12 : control.editable && activeFocus ? 3 : 1
  41. topPadding: 6 - control.padding
  42. bottomPadding: 6 - control.padding
  43. text: control.editable ? control.editText : control.displayText
  44. enabled: control.editable
  45. autoScroll: control.editable
  46. readOnly: control.down
  47. inputMethodHints: control.inputMethodHints
  48. validator: control.validator
  49. selectByMouse: control.selectTextByMouse
  50. color: control.editable ? control.palette.text : control.palette.buttonText
  51. selectionColor: control.palette.highlight
  52. selectedTextColor: control.palette.highlightedText
  53. verticalAlignment: Text.AlignVCenter
  54. ContextMenu.menu: TextEditingContextMenu {
  55. editor: parent
  56. }
  57. background: Rectangle {
  58. visible: control.enabled && control.editable && !control.flat
  59. border.width: parent && parent.activeFocus ? 2 : 1
  60. border.color: parent && parent.activeFocus ? control.palette.highlight :
  61. Qt.styleHints.accessibility.contrastPreference === Qt.HighContrast ?
  62. control.palette.buttonText : control.palette.button
  63. color: control.palette.base
  64. }
  65. }
  66. background: Rectangle {
  67. implicitWidth: 140
  68. implicitHeight: 40
  69. color: control.down ? control.palette.mid : control.palette.button
  70. border.color: !control.editable && control.visualFocus ? control.palette.highlight : control.palette.buttonText
  71. border.width: (!control.editable && control.visualFocus) ? 2 :
  72. Qt.styleHints.accessibility.contrastPreference === Qt.HighContrast ? 1 : 0
  73. visible: !control.flat || control.down
  74. }
  75. popup: T.Popup {
  76. y: control.height
  77. width: control.width
  78. height: Math.min(contentItem.implicitHeight, control.Window.height - topMargin - bottomMargin)
  79. topMargin: 6
  80. bottomMargin: 6
  81. palette: control.palette
  82. contentItem: ListView {
  83. clip: true
  84. implicitHeight: contentHeight
  85. model: control.delegateModel
  86. currentIndex: control.highlightedIndex
  87. highlightMoveDuration: 0
  88. Rectangle {
  89. z: 10
  90. width: parent.width
  91. height: parent.height
  92. color: "transparent"
  93. border.color: control.palette.mid
  94. }
  95. // Show a contour around the highlighted item in high contrast mode
  96. Rectangle {
  97. property Item highlightedItem: parent ? parent.itemAtIndex(control.highlightedIndex) : null
  98. visible: Qt.styleHints.accessibility.contrastPreference === Qt.HighContrast && highlightedItem
  99. z: 11
  100. x: highlightedItem ? highlightedItem.x : 0
  101. y: highlightedItem ? highlightedItem.y : 0
  102. width: highlightedItem ? highlightedItem.width : 0
  103. height: highlightedItem ? highlightedItem.height : 0
  104. color: "transparent"
  105. border.color: control.palette.dark
  106. }
  107. T.ScrollIndicator.vertical: ScrollIndicator { }
  108. }
  109. background: Rectangle {
  110. color: control.palette.window
  111. }
  112. }
  113. }