SearchField.qml 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // Copyright (C) 2025 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.Templates as T
  8. T.SearchField {
  9. id: control
  10. implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
  11. implicitContentWidth + leftPadding + rightPadding)
  12. implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
  13. implicitContentHeight + topPadding + bottomPadding,
  14. searchIndicator.implicitIndicatorHeight + topPadding + bottomPadding,
  15. clearIndicator.implicitIndicatorHeight + topPadding + bottomPadding)
  16. leftPadding: padding + (control.mirrored || !searchIndicator.indicator || !searchIndicator.indicator.visible ? 0 : searchIndicator.indicator.width + spacing)
  17. rightPadding: padding + (control.mirrored || !clearIndicator.indicator || !clearIndicator.indicator.visible ? 0 : clearIndicator.indicator.width + spacing)
  18. delegate: ItemDelegate {
  19. width: ListView.view.width
  20. text: model[control.textRole]
  21. palette.text: control.palette.text
  22. palette.highlightedText: control.palette.highlightedText
  23. font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal
  24. highlighted: control.highlightedIndex === index
  25. hoverEnabled: control.hoverEnabled
  26. required property var model
  27. required property int index
  28. }
  29. searchIndicator.indicator: Rectangle {
  30. implicitWidth: 28
  31. implicitHeight: 28
  32. x: !control.mirrored ? 3 : control.width - width - 3
  33. y: control.topPadding + (control.availableHeight - height) / 2
  34. color: control.palette.button
  35. ColorImage {
  36. x: (parent.width - width) / 2
  37. y: (parent.height - height) / 2
  38. color: control.palette.dark
  39. defaultColor: "#353637"
  40. source: "qrc:/qt-project.org/imports/QtQuick/Controls/Basic/images/search-magnifier.png"
  41. opacity: enabled ? 1 : 0.3
  42. }
  43. }
  44. clearIndicator.indicator: Rectangle {
  45. implicitWidth: 28
  46. implicitHeight: 28
  47. x: control.mirrored ? 3 : control.width - width - 3
  48. y: control.topPadding + (control.availableHeight - height) / 2
  49. visible: control.text.length > 0
  50. color: control.palette.button
  51. ColorImage {
  52. x: (parent.width - width) / 2
  53. y: (parent.height - height) / 2
  54. color: control.palette.dark
  55. defaultColor: "#353637"
  56. source: "qrc:/qt-project.org/imports/QtQuick/Controls/Basic/images/close_circle.png"
  57. opacity: enabled ? 1 : 0.3
  58. }
  59. }
  60. contentItem: T.TextField {
  61. leftPadding: control.searchIndicator.indicator && !control.mirrored ? 6 : 0
  62. rightPadding: control.clearIndicator.indicator && !control.mirrored ? 6 : 0
  63. topPadding: 6 - control.padding
  64. bottomPadding: 6 - control.padding
  65. text: control.text
  66. color: control.palette.text
  67. selectionColor: control.palette.highlight
  68. selectedTextColor: control.palette.highlightedText
  69. verticalAlignment: TextInput.AlignVCenter
  70. }
  71. background: Rectangle {
  72. implicitWidth: 200
  73. implicitHeight: 40
  74. color: control.palette.button
  75. border.width: (control.activeFocus || control.contentItem.activeFocus) ? 2 : 1
  76. border.color: (control.activeFocus || control.contentItem.activeFocus) ? control.palette.highlight : control.palette.mid
  77. }
  78. popup: T.Popup {
  79. y: control.height
  80. width: control.width
  81. height: Math.min(contentItem.implicitHeight, control.Window.height - control.y - control.height - control.padding)
  82. topMargin: 6
  83. bottomMargin: 6
  84. palette: control.palette
  85. contentItem: ListView {
  86. clip: true
  87. implicitHeight: contentHeight
  88. model: control.delegateModel
  89. currentIndex: control.highlightedIndex
  90. highlightMoveDuration: 0
  91. Rectangle {
  92. z: 10
  93. width: parent.width
  94. height: parent.height
  95. color: "transparent"
  96. border.color: control.palette.mid
  97. }
  98. T.ScrollIndicator.vertical: ScrollIndicator { }
  99. }
  100. background: Rectangle {
  101. color: control.palette.window
  102. }
  103. }
  104. }