ComboBox.qml 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. topPadding: 4
  39. leftPadding: 4 - control.padding
  40. rightPadding: 4 - control.padding
  41. bottomPadding: 4
  42. text: control.editable ? control.editText : control.displayText
  43. enabled: control.editable
  44. autoScroll: control.editable
  45. readOnly: control.down
  46. inputMethodHints: control.inputMethodHints
  47. validator: control.validator
  48. selectByMouse: control.selectTextByMouse
  49. color: control.editable ? control.palette.text : control.palette.buttonText
  50. selectionColor: control.palette.highlight
  51. selectedTextColor: control.palette.highlightedText
  52. verticalAlignment: Text.AlignVCenter
  53. background: PaddedRectangle {
  54. clip: true
  55. radius: 2
  56. padding: 1
  57. leftPadding: control.mirrored ? -2 : padding
  58. rightPadding: !control.mirrored ? -2 : padding
  59. color: control.palette.base
  60. visible: control.editable && !control.flat
  61. Rectangle {
  62. x: parent.width - width
  63. y: 1
  64. width: 1
  65. height: parent.height - 2
  66. color: Fusion.buttonOutline(control.palette, control.activeFocus, control.enabled)
  67. }
  68. Rectangle {
  69. x: 1
  70. y: 1
  71. width: parent.width - 3
  72. height: 1
  73. color: Fusion.topShadow
  74. }
  75. }
  76. Rectangle {
  77. x: 1 - control.leftPadding
  78. y: 1
  79. width: control.width - 2
  80. height: control.height - 2
  81. color: "transparent"
  82. border.color: Color.transparent(Fusion.highlightedOutline(control.palette), 40 / 255)
  83. visible: control.activeFocus
  84. radius: 1.7
  85. }
  86. }
  87. background: ButtonPanel {
  88. implicitWidth: 120
  89. implicitHeight: 24
  90. control: control
  91. visible: !control.flat || control.down
  92. // ### TODO: fix control.contentItem.activeFocus
  93. highlighted: control.visualFocus || control.contentItem.activeFocus
  94. }
  95. popup: T.Popup {
  96. width: control.width
  97. height: Math.min(contentItem.implicitHeight + 2, control.Window.height - topMargin - bottomMargin)
  98. topMargin: 6
  99. bottomMargin: 6
  100. padding: 1
  101. palette: control.palette
  102. contentItem: ListView {
  103. clip: true
  104. implicitHeight: contentHeight
  105. model: control.delegateModel
  106. currentIndex: control.highlightedIndex
  107. highlightRangeMode: ListView.ApplyRange
  108. highlightMoveDuration: 0
  109. T.ScrollBar.vertical: ScrollBar { }
  110. }
  111. background: Rectangle {
  112. color: control.popup.palette.window
  113. border.color: Fusion.outline(control.palette)
  114. Rectangle {
  115. z: -1
  116. x: 1; y: 1
  117. width: parent.width
  118. height: parent.height
  119. color: control.palette.shadow
  120. opacity: 0.2
  121. }
  122. }
  123. }
  124. }