ComboBox.qml 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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.Window
  7. import QtQuick.Templates as T
  8. import QtQuick.Controls.impl
  9. import QtQuick.Controls.Fusion
  10. import QtQuick.Controls.Fusion.impl
  11. T.ComboBox {
  12. id: control
  13. implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
  14. implicitContentWidth + leftPadding + rightPadding)
  15. implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
  16. implicitContentHeight + topPadding + bottomPadding,
  17. implicitIndicatorHeight + topPadding + bottomPadding)
  18. leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
  19. rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
  20. delegate: MenuItem {
  21. required property var model
  22. required property int index
  23. width: ListView.view.width
  24. text: model[control.textRole]
  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.editable ? control.palette.text : control.palette.buttonText
  33. source: "qrc:/qt-project.org/imports/QtQuick/Controls/Fusion/images/arrow.png"
  34. width: 20
  35. fillMode: Image.Pad
  36. }
  37. contentItem: T.TextField {
  38. implicitHeight: contentHeight + topPadding + bottomPadding
  39. topPadding: 4
  40. leftPadding: 4 - control.padding
  41. rightPadding: 4 - control.padding
  42. bottomPadding: 4
  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: PaddedRectangle {
  58. clip: true
  59. radius: 2
  60. padding: 1
  61. leftPadding: control.mirrored ? -2 : padding
  62. rightPadding: !control.mirrored ? -2 : padding
  63. color: control.palette.base
  64. visible: control.editable && !control.flat
  65. Rectangle {
  66. x: parent.width - width
  67. y: 1
  68. width: 1
  69. height: parent.height - 2
  70. color: Fusion.buttonOutline(control.palette, control.activeFocus, control.enabled)
  71. }
  72. Rectangle {
  73. x: 1
  74. y: 1
  75. width: parent.width - 3
  76. height: 1
  77. color: Fusion.topShadow
  78. }
  79. }
  80. Rectangle {
  81. x: 1 - control.leftPadding
  82. y: 1
  83. width: control.width - 2
  84. height: control.height - 2
  85. color: "transparent"
  86. border.color: Color.transparent(Fusion.highlightedOutline(control.palette), 40 / 255)
  87. visible: control.activeFocus
  88. radius: 1.7
  89. }
  90. }
  91. background: ButtonPanel {
  92. implicitWidth: 120
  93. implicitHeight: 24
  94. control: control
  95. visible: !control.flat || control.down
  96. // ### TODO: fix control.contentItem.activeFocus
  97. highlighted: control.visualFocus || control.contentItem.activeFocus
  98. }
  99. popup: T.Popup {
  100. width: control.width
  101. height: Math.min(contentItem.implicitHeight + 2, control.Window.height - topMargin - bottomMargin)
  102. topMargin: 6
  103. bottomMargin: 6
  104. padding: 1
  105. palette: control.palette
  106. contentItem: ListView {
  107. clip: true
  108. implicitHeight: contentHeight
  109. model: control.delegateModel
  110. currentIndex: control.highlightedIndex
  111. highlightRangeMode: ListView.ApplyRange
  112. highlightMoveDuration: 0
  113. T.ScrollBar.vertical: ScrollBar { }
  114. }
  115. background: Rectangle {
  116. color: control.popup.palette.window
  117. border.color: Fusion.outline(control.palette)
  118. Rectangle {
  119. z: -1
  120. x: 1; y: 1
  121. width: parent.width
  122. height: parent.height
  123. color: control.palette.shadow
  124. opacity: 0.2
  125. }
  126. }
  127. }
  128. }