DoubleSpinBox.qml 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. import QtQuick
  5. import QtQuick.Templates as T
  6. import QtQuick.NativeStyle as NativeStyle
  7. import QtQuick.Controls.Windows.impl as WindowsImpl
  8. T.DoubleSpinBox {
  9. id: control
  10. property bool nativeIndicators: up.indicator.hasOwnProperty("_qt_default")
  11. && down.indicator.hasOwnProperty("_qt_default")
  12. readonly property bool __notCustomizable: true
  13. // Note: the indicators are inside the contentItem
  14. implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
  15. contentItem.implicitWidth + leftPadding + rightPadding)
  16. implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
  17. implicitContentHeight + topPadding + bottomPadding,
  18. up.implicitIndicatorHeight + down.implicitIndicatorHeight)
  19. spacing: 2
  20. validator: DoubleValidator {
  21. locale: control.locale.name
  22. bottom: Math.min(control.from, control.to)
  23. top: Math.max(control.from, control.to)
  24. decimals: control.decimals
  25. }
  26. contentItem: TextField {
  27. text: control.displayText
  28. font: control.font
  29. color: control.palette.text
  30. selectionColor: control.palette.highlight
  31. selectedTextColor: control.palette.highlightedText
  32. horizontalAlignment: Qt.AlignLeft
  33. verticalAlignment: Qt.AlignVCenter
  34. implicitWidth: Math.max(90 /* minimum */, contentWidth + leftPadding + rightPadding)
  35. topPadding: 0
  36. bottomPadding: 0
  37. leftPadding: 10
  38. rightPadding: up.indicator.width + 10
  39. readOnly: !control.editable
  40. validator: control.validator
  41. inputMethodHints: control.inputMethodHints
  42. clip: width < implicitWidth
  43. readonly property bool __ignoreNotCustomizable: true
  44. ContextMenu.menu: WindowsImpl.TextEditingContextMenu {
  45. editor: parent
  46. }
  47. // Since the indicators are embedded inside the TextField we need to avoid that
  48. // the TextField consumes mouse events for that area.
  49. // We achieve that by setting a containmentMask
  50. containmentMask: Item { height: contentItem.height; width: contentItem.width - upAndDown.width }
  51. }
  52. NativeStyle.DoubleSpinBox {
  53. id: upAndDown
  54. control: control
  55. subControl: NativeStyle.DoubleSpinBox.Up
  56. visible: nativeIndicators
  57. x: up.indicator.x
  58. y: up.indicator.y
  59. //implicitHeight: contentItem.implicitHeight-2
  60. height: parent.height-2
  61. useNinePatchImage: false
  62. z:99
  63. }
  64. up.indicator: Item {
  65. x: control.width - width - 2
  66. y: 1
  67. height: upAndDown.height >> 1
  68. implicitWidth: upAndDown.implicitWidth
  69. implicitHeight: (upAndDown.implicitHeight >> 1)
  70. property bool _qt_default
  71. readonly property bool __ignoreNotCustomizable: true
  72. }
  73. down.indicator: Item {
  74. x: control.width - width - 2
  75. y: up.indicator.y + (upAndDown.height >> 1)
  76. height: upAndDown.height - up.indicator.height
  77. implicitWidth: upAndDown.implicitWidth
  78. implicitHeight: upAndDown.implicitHeight >> 1
  79. property bool _qt_default
  80. readonly property bool __ignoreNotCustomizable: true
  81. }
  82. // No background, the TextField will cover the whole control
  83. background: Item {
  84. readonly property bool __ignoreNotCustomizable: true
  85. }
  86. }